package handles import ( "strconv" "github.com/alist-org/alist/v3/internal/model" "github.com/alist-org/alist/v3/internal/op" "github.com/alist-org/alist/v3/server/common" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" ) func ListUsers(c *gin.Context) { var req model.PageReq if err := c.ShouldBind(&req); err != nil { common.ErrorResp(c, err, 400) return } req.Validate() log.Debugf("%+v", req) users, total, err := op.GetUsers(req.Page, req.PerPage) if err != nil { common.ErrorResp(c, err, 500, true) return } common.SuccessResp(c, common.PageResp{ Content: users, Total: total, }) } func CreateUser(c *gin.Context) { var req model.User if err := c.ShouldBind(&req); err != nil { common.ErrorResp(c, err, 400) return } if req.IsAdmin() || req.IsGuest() { common.ErrorStrResp(c, "admin or guest user can not be created", 400, true) return } req.SetPassword(req.Password) req.Password = "" req.Authn = "[]" if err := op.CreateUser(&req); err != nil { common.ErrorResp(c, err, 500, true) } else { common.SuccessResp(c) } } func UpdateUser(c *gin.Context) { var req model.User if err := c.ShouldBind(&req); err != nil { common.ErrorResp(c, err, 400) return } user, err := op.GetUserById(req.ID) if err != nil { common.ErrorResp(c, err, 500) return } if user.Role != req.Role { common.ErrorStrResp(c, "role can not be changed", 400) return } if req.Password == "" { req.PwdHash = user.PwdHash req.Salt = user.Salt } else { req.SetPassword(req.Password) req.Password = "" } if req.OtpSecret == "" { req.OtpSecret = user.OtpSecret } if req.Disabled && req.IsAdmin() { common.ErrorStrResp(c, "admin user can not be disabled", 400) return } if err := op.UpdateUser(&req); err != nil { common.ErrorResp(c, err, 500) } else { common.SuccessResp(c) } } func DeleteUser(c *gin.Context) { idStr := c.Query("id") id, err := strconv.Atoi(idStr) if err != nil { common.ErrorResp(c, err, 400) return } if err := op.DeleteUserById(uint(id)); err != nil { common.ErrorResp(c, err, 500) return } common.SuccessResp(c) } func GetUser(c *gin.Context) { idStr := c.Query("id") id, err := strconv.Atoi(idStr) if err != nil { common.ErrorResp(c, err, 400) return } user, err := op.GetUserById(uint(id)) if err != nil { common.ErrorResp(c, err, 500, true) return } common.SuccessResp(c, user) } func Cancel2FAById(c *gin.Context) { idStr := c.Query("id") id, err := strconv.Atoi(idStr) if err != nil { common.ErrorResp(c, err, 400) return } if err := op.Cancel2FAById(uint(id)); err != nil { common.ErrorResp(c, err, 500) return } common.SuccessResp(c) } func DelUserCache(c *gin.Context) { username := c.Query("username") err := op.DelUserCache(username) if err != nil { common.ErrorResp(c, err, 500) return } common.SuccessResp(c) }