summaryrefslogtreecommitdiff
path: root/system/admin/handlers.go
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2016-12-02 11:32:27 -0800
committerSteve Manuel <nilslice@gmail.com>2016-12-02 11:32:27 -0800
commit6dd68233865e98fe8db60f8f29e0fb82f4e011a6 (patch)
treee9a7245586b318e7f16bfe90e294580e7966b813 /system/admin/handlers.go
parent6dfd02c84f125a6defe082d31a6f20672979f4d3 (diff)
updating print errors to log, more implementation of account recovery
Diffstat (limited to 'system/admin/handlers.go')
-rw-r--r--system/admin/handlers.go69
1 files changed, 57 insertions, 12 deletions
diff --git a/system/admin/handlers.go b/system/admin/handlers.go
index 82f8ae0..c42b76b 100644
--- a/system/admin/handlers.go
+++ b/system/admin/handlers.go
@@ -607,7 +607,7 @@ func forgotPasswordHandler(res http.ResponseWriter, req *http.Request) {
`, email, domain, key, domain)
msg := emailer.Message{
To: email,
- From: fmt.Sprintf("Ponzu CMS <ponzu-cms@%s", domain),
+ From: fmt.Sprintf("Ponzu CMS <ponzu-cms@%s>", domain),
Subject: fmt.Sprintf("Account Recovery [%s]", domain),
Body: body,
}
@@ -648,33 +648,78 @@ func recoveryKeyHandler(res http.ResponseWriter, req *http.Request) {
view, err := RecoveryKey()
if err != nil {
res.WriteHeader(http.StatusInternalServerError)
- errView, err := Error500()
- if err != nil {
- return
- }
-
- res.Write(errView)
return
}
res.Write(view)
case http.MethodPost:
+ err := req.ParseMultipartForm(1024 * 1024 * 4) // maxMemory 4MB
+ if err != nil {
+ res.WriteHeader(http.StatusInternalServerError)
+ log.Println("Error parsing recovery key form:", err)
+ return
+ }
// check for email & key match
+ email := strings.ToLower(req.FormValue("email"))
+ key := req.FormValue("key")
+
+ var actual string
+ if actual, err = db.RecoveryKey(email); err != nil {
+ res.WriteHeader(http.StatusInternalServerError)
+ log.Println("Error getting recovery key from database:", err)
+ return
+ }
+
+ if key != actual {
+ res.WriteHeader(http.StatusBadRequest)
+ log.Println("Bad recovery key submitted:", key)
+ return
+ }
// set user with new password
+ usr := &user.User{}
+ u, err := db.User(email)
+ if err != nil {
+ res.WriteHeader(http.StatusInternalServerError)
+ log.Println("Error finding user by email:", email, err)
+ return
+ }
- // redirect to /admin/login
+ if u == nil {
+ res.WriteHeader(http.StatusBadRequest)
+ log.Println("No user found with email:", email)
+ return
+ }
- default:
- res.WriteHeader(http.StatusMethodNotAllowed)
- errView, err := Error405()
+ err = json.Unmarshal(u, usr)
if err != nil {
+ res.WriteHeader(http.StatusInternalServerError)
+ log.Println("Error decoding user from database:", err)
return
}
- res.Write(errView)
+ update := &user.User{
+ ID: usr.ID,
+ Email: usr.Email,
+ Hash: usr.Hash,
+ Salt: usr.Salt,
+ }
+
+ err = db.UpdateUser(usr, update)
+ if err != nil {
+ res.WriteHeader(http.StatusInternalServerError)
+ log.Println("Error updating user:", err)
+ return
+ }
+
+ // redirect to /admin/login
+ redir := req.URL.Scheme + req.URL.Host + "/admin/login"
+ http.Redirect(res, req, redir, http.StatusFound)
+
+ default:
+ res.WriteHeader(http.StatusMethodNotAllowed)
return
}
}