diff options
Diffstat (limited to 'settings.go')
-rw-r--r-- | settings.go | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/settings.go b/settings.go new file mode 100644 index 0000000..a10b901 --- /dev/null +++ b/settings.go @@ -0,0 +1,79 @@ +package main + +import ( + "code.google.com/p/go.crypto/bcrypt" + "github.com/gorilla/sessions" + "kch42.de/gostuff/mailremind/model" + "log" + "net/http" + "time" +) + +type settingsTpldata struct { + Success, Error string + Fatal bool + Timezones map[string]bool +} + +func settings(user model.User, sess *sessions.Session, req *http.Request) (interface{}, model.User) { + if user == nil { + return &settingsTpldata{Error: "You need to be logged in to do that.", Fatal: true}, nil + } + + outdata := &settingsTpldata{Timezones: make(map[string]bool)} + tznow := user.Location().String() + for _, tz := range timeLocs { + outdata.Timezones[tz] = (tz == tznow) + } + + if req.Method != "POST" { + return outdata, user + } + + if err := req.ParseForm(); err != nil { + outdata.Error = "Could not parse form" + return outdata, user + } + + switch req.FormValue("M") { + case "setpasswd": + if req.FormValue("Password") == "" { + outdata.Error = "Password must not be empty." + return outdata, user + } + + if req.FormValue("Password") != req.FormValue("RepeatPassword") { + outdata.Error = "Passwords must be equal." + return outdata, user + } + + hash, err := bcrypt.GenerateFromPassword([]byte(req.FormValue("Password")), bcrypt.DefaultCost) + if err != nil { + log.Printf("Error hashing password: %s", err) + outdata.Error = "Error while hashing password data." + return outdata.Error, user + } + + if err := user.SetPWHash(hash); err != nil { + log.Printf("Error setting pwhash: %s", err) + outdata.Error = "Could not save new password." + } else { + outdata.Success = "Password changed" + } + case "settimezone": + loc, err := time.LoadLocation(req.FormValue("Timezone")) + if err != nil { + outdata.Error = "Unknown Timezone" + return outdata, user + } + + if err := user.SetLocation(loc); err != nil { + log.Printf("Error setting location: %s", err) + outdata.Error = "Could not save new timezone." + } else { + outdata.Success = "New timezone saved." + } + } + + return outdata, user +} |