mirror of
https://github.com/osmarks/mycorrhiza.git
synced 2024-12-04 18:19:54 +00:00
implement admin form to change a user's password
This commit is contained in:
parent
5ed9e6d9ef
commit
4629f39e99
@ -93,6 +93,49 @@ func handlerAdminUserEdit(w http.ResponseWriter, rq *http.Request) {
|
|||||||
viewEditUser(viewutil.MetaFrom(w, rq), f, u)
|
viewEditUser(viewutil.MetaFrom(w, rq), f, u)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handlerAdminUserChangePassword(w http.ResponseWriter, rq *http.Request) {
|
||||||
|
vars := mux.Vars(rq)
|
||||||
|
u := user.ByName(vars["username"])
|
||||||
|
if u == nil {
|
||||||
|
util.HTTP404Page(w, "404 page not found")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
f := util.FormDataFromRequest(rq, []string{"password", "password_confirm"})
|
||||||
|
|
||||||
|
password := f.Get("password")
|
||||||
|
passwordConfirm := f.Get("password_confirm")
|
||||||
|
// server side validation
|
||||||
|
if password == "" {
|
||||||
|
err := fmt.Errorf("passwords should not be empty")
|
||||||
|
f = f.WithError(err)
|
||||||
|
}
|
||||||
|
if password == passwordConfirm {
|
||||||
|
previousPassword := u.Password // for rollback
|
||||||
|
if err := u.ChangePassword(password); err != nil {
|
||||||
|
f = f.WithError(err)
|
||||||
|
} else {
|
||||||
|
if err := user.SaveUserDatabase(); err != nil {
|
||||||
|
u.Password = previousPassword
|
||||||
|
f = f.WithError(err)
|
||||||
|
} else {
|
||||||
|
http.Redirect(w, rq, "/admin/users/", http.StatusSeeOther)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err := fmt.Errorf("passwords do not match")
|
||||||
|
f = f.WithError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if f.HasError() {
|
||||||
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", mime.TypeByExtension(".html"))
|
||||||
|
|
||||||
|
viewEditUser(viewutil.MetaFrom(w, rq), f, u)
|
||||||
|
}
|
||||||
|
|
||||||
func handlerAdminUserDelete(w http.ResponseWriter, rq *http.Request) {
|
func handlerAdminUserDelete(w http.ResponseWriter, rq *http.Request) {
|
||||||
vars := mux.Vars(rq)
|
vars := mux.Vars(rq)
|
||||||
u := user.ByName(vars["username"])
|
u := user.ByName(vars["username"])
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TODO: translate some untranslated strings
|
||||||
const adminTranslationRu = `
|
const adminTranslationRu = `
|
||||||
{{define "panel title"}}Панель админстратора{{end}}
|
{{define "panel title"}}Панель админстратора{{end}}
|
||||||
{{define "panel safe section title"}}Безопасная секция{{end}}
|
{{define "panel safe section title"}}Безопасная секция{{end}}
|
||||||
@ -33,6 +34,9 @@ const adminTranslationRu = `
|
|||||||
|
|
||||||
{{define "new user"}}Новый пользователь{{end}}
|
{{define "new user"}}Новый пользователь{{end}}
|
||||||
{{define "password"}}Пароль{{end}}
|
{{define "password"}}Пароль{{end}}
|
||||||
|
{{define "confirm password"}}Confirm password{{end}}
|
||||||
|
{{define "change password"}}Change password{{end}}
|
||||||
|
{{define "non local password change"}}Non-local accounts cannot have their passwords changed.{{end}}
|
||||||
{{define "create"}}Создать{{end}}
|
{{define "create"}}Создать{{end}}
|
||||||
|
|
||||||
{{define "change group"}}Изменить группу{{end}}
|
{{define "change group"}}Изменить группу{{end}}
|
||||||
@ -57,6 +61,7 @@ func Init(rtr *mux.Router) {
|
|||||||
|
|
||||||
rtr.HandleFunc("/new-user", handlerAdminUserNew).Methods(http.MethodGet, http.MethodPost)
|
rtr.HandleFunc("/new-user", handlerAdminUserNew).Methods(http.MethodGet, http.MethodPost)
|
||||||
rtr.HandleFunc("/users/{username}/edit", handlerAdminUserEdit).Methods(http.MethodGet, http.MethodPost)
|
rtr.HandleFunc("/users/{username}/edit", handlerAdminUserEdit).Methods(http.MethodGet, http.MethodPost)
|
||||||
|
rtr.HandleFunc("/users/{username}/change-password", handlerAdminUserChangePassword).Methods(http.MethodPost)
|
||||||
rtr.HandleFunc("/users/{username}/delete", handlerAdminUserDelete).Methods(http.MethodGet, http.MethodPost)
|
rtr.HandleFunc("/users/{username}/delete", handlerAdminUserDelete).Methods(http.MethodGet, http.MethodPost)
|
||||||
rtr.HandleFunc("/users", handlerAdminUsers)
|
rtr.HandleFunc("/users", handlerAdminUsers)
|
||||||
|
|
||||||
|
@ -33,6 +33,26 @@
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<h2>{{block "change password" .}}Change password{{end}}</h2>
|
||||||
|
|
||||||
|
{{if eq .U.Source "local"}}
|
||||||
|
<form action="/admin/users/{{.U.Name}}/change-password" method="post">
|
||||||
|
<div class="form-field">
|
||||||
|
<label for="pass">{{block "password" .}}Password{{end}}</label>
|
||||||
|
<input required type="password" autocomplete="new-password" id="pass" name="password">
|
||||||
|
<br>
|
||||||
|
<label for="pass_confirm">{{block "confirm password" .}}Confirm password{{end}}</label>
|
||||||
|
<input required type="password" autocomplete="new-password" id="pass_confirm" name="password_confirm">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field">
|
||||||
|
<input class="btn" type="submit" value='{{block "submit" .}}Submit{{end}}'>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{{else}}
|
||||||
|
<p>{{block "non local password change" .}}Non-local accounts cannot have their passwords changed.{{end}}</p>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
<h2>{{block "delete user" .}}Delete user{{end}}</h2>
|
<h2>{{block "delete user" .}}Delete user{{end}}</h2>
|
||||||
<p>{{block "delete user tip" .}}Remove the user from the database. Changes made by the user will be preserved. It will be possible to take this username later.{{end}}</p>
|
<p>{{block "delete user tip" .}}Remove the user from the database. Changes made by the user will be preserved. It will be possible to take this username later.{{end}}</p>
|
||||||
<a class="btn btn_destructive" href="/admin/users/{{.U.Name}}/delete">{{template "delete"}}</a>
|
<a class="btn btn_destructive" href="/admin/users/{{.U.Name}}/delete">{{template "delete"}}</a>
|
||||||
|
Loading…
Reference in New Issue
Block a user