✨ Add user management

This commit is contained in:
2020-10-31 11:46:02 +01:00
parent 1f91686d25
commit 762d43c330
5 changed files with 185 additions and 15 deletions
+81
View File
@@ -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