1package web
2
3import (
4 "net/http"
5 "time"
6
7 "tug/internal/transport/web/text"
8)
9
10type AdminResetLink struct {
11 URL string
12 Username string
13 ExpiresAt time.Time
14}
15
16func resetConfirmPage(id string, username Ident, message text.Key) Confirm {
17 return Confirm{Title: text.AdminResetTitle, Body: text.AdminResetBody, Button: text.AdminUserReset, Subject: username, Action: "/users/" + id + "/reset-link", Cancel: "/users/" + id, Neutral: true, Message: message}
18}
19
20func (a *admin) resetConfirm(w http.ResponseWriter, r *http.Request) {
21 if _, id, u, ok := a.loadUser(w, r); ok {
22 a.kit.RenderConfirm(w, r, resetConfirmPage(id, Ident(u.Username), ""))
23 }
24}
25
26func (a *admin) resetIssue(w http.ResponseWriter, r *http.Request) {
27 p, id, u, ok := a.loadUser(w, r)
28 if !ok {
29 return
30 }
31 link, err := a.b.IssueResetLink(r.Context(), p.UserID, id)
32 if key, ok := adminProblemKey(err); ok {
33 cf := resetConfirmPage(id, Ident(u.Username), key)
34 cf.Refused = true
35 a.kit.RenderConfirm(w, r, cf)
36 return
37 }
38 if err != nil {
39 a.failed(w, r, "issue reset link", err)
40 return
41 }
42 a.kit.RenderOneTime(w, r, OneTime{Title: text.AdminResetOneTimeTitle, Subject: Ident(link.Username), Secret: Ident(link.URL), Expires: Ident(stamp(link.ExpiresAt)), Back: "/users/" + id, BackText: text.AdminResetBack})
43}