✨ Add user management
This commit is contained in:
+81
@@ -54,6 +54,7 @@ type webAdminHandler struct {
|
||||
tplShareAddUser *template.Template
|
||||
tplShareAddLogin *template.Template
|
||||
tplCreateShare *template.Template
|
||||
tplCreateUser *template.Template
|
||||
}
|
||||
|
||||
type sessionContext struct {
|
||||
@@ -107,6 +108,7 @@ func newWebAdminHandler(app *app) *webAdminHandler {
|
||||
tplShareAddUser: loadTemplate("share-add-user"),
|
||||
tplShareAddLogin: loadTemplate("share-add-login"),
|
||||
tplCreateShare: loadTemplate("create-share"),
|
||||
tplCreateUser: loadTemplate("create-user"),
|
||||
}
|
||||
|
||||
r := chi.NewRouter()
|
||||
@@ -519,6 +521,85 @@ Are you sure you want to continue?`, share.UUID, share.Name)
|
||||
}
|
||||
sessionContext.Redirect("shares")
|
||||
})
|
||||
ar.Route("/create-user", func(r chi.Router) {
|
||||
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
|
||||
sessionContext := h.buildSessionContext(w, r)
|
||||
|
||||
if sessionContext.user.Role != GlobalRoleAdmin {
|
||||
sessionContext.Unauthorized()
|
||||
return
|
||||
}
|
||||
|
||||
sessionContext.RenderPage(h.tplCreateUser, nil)
|
||||
})
|
||||
r.Post("/", func(w http.ResponseWriter, r *http.Request) {
|
||||
sessionContext := h.buildSessionContext(w, r)
|
||||
|
||||
if sessionContext.user.Role != GlobalRoleAdmin {
|
||||
sessionContext.Unauthorized()
|
||||
return
|
||||
}
|
||||
|
||||
returnURL := "users"
|
||||
|
||||
pwHash, err := bcrypt.GenerateFromPassword([]byte(r.FormValue("password")), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
sessionContext.RenderError(template.HTML("Internal error: "+err.Error()), returnURL)
|
||||
return
|
||||
}
|
||||
|
||||
user := User{
|
||||
Username: r.FormValue("username"),
|
||||
Password: string(pwHash),
|
||||
Role: GlobalRole(r.FormValue("role")),
|
||||
}
|
||||
|
||||
switch user.Role {
|
||||
case GlobalRoleUser:
|
||||
case GlobalRoleAdmin:
|
||||
default:
|
||||
sessionContext.RenderError(template.HTML("Invalid role."), "")
|
||||
return
|
||||
}
|
||||
|
||||
err = app.userStore.AddUser(user)
|
||||
if err != nil {
|
||||
sessionContext.RenderError(template.HTML("Cannot create user: "+err.Error()), "")
|
||||
return
|
||||
}
|
||||
|
||||
sessionContext.Redirect("users#user-" + user.Username)
|
||||
})
|
||||
})
|
||||
ar.Post("/delete-user", func(w http.ResponseWriter, r *http.Request) {
|
||||
sessionContext := h.buildSessionContext(w, r)
|
||||
|
||||
if sessionContext.user.Role != GlobalRoleAdmin {
|
||||
sessionContext.Unauthorized()
|
||||
return
|
||||
}
|
||||
|
||||
user, err := app.userStore.GetUser(r.FormValue("user"))
|
||||
if err != nil {
|
||||
sessionContext.RenderError(template.HTML("Cannot delete user: "+err.Error()), "users")
|
||||
return
|
||||
}
|
||||
|
||||
message := fmt.Sprintf(`You are about to delete the user %s (<i>%s</i>).<br/>
|
||||
This will delete all share associations and logins.<br/><br/>
|
||||
Are you sure you want to continue?`, user.Username, user.Role)
|
||||
if confirmStatus := sessionContext.RequestConfirmation(template.HTML(message), "delete-user"); confirmStatus == confirmRequested {
|
||||
// We have already rendered. Nothing to do.
|
||||
return
|
||||
} else if confirmStatus == confirmAccepted {
|
||||
cmd := CmdUserDelete{Username: user.Username}
|
||||
if err := cmd.Run(app); err != nil {
|
||||
sessionContext.RenderError(template.HTML("Cannot delete user: "+err.Error()), "users")
|
||||
return
|
||||
}
|
||||
}
|
||||
sessionContext.Redirect("users")
|
||||
})
|
||||
h.router = r
|
||||
|
||||
return h
|
||||
|
||||
Reference in New Issue
Block a user