From 0fe336b08f7868d0f7b531cb30c9facfea0f25f2 Mon Sep 17 00:00:00 2001 From: Kevin Chabowski Date: Thu, 12 Sep 2013 22:40:52 +0200 Subject: Added settings page --- main.go | 1 + settings.go | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ tpls.go | 2 ++ tpls/master.tpl | 1 + tpls/settings.tpl | 32 ++++++++++++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 settings.go create mode 100644 tpls/settings.tpl diff --git a/main.go b/main.go index ac295d5..e4102fa 100644 --- a/main.go +++ b/main.go @@ -94,6 +94,7 @@ func main() { router.HandleFunc("/jobs", mkHttpHandler(jobs, tplJobs)) router.HandleFunc("/jobedit", mkHttpHandler(jobedit, tplJobedit)) router.HandleFunc("/jobedit/{ID}", mkHttpHandler(jobedit, tplJobedit)) + router.HandleFunc("/settings", mkHttpHandler(settings, tplSettings)) http.Handle("/", router) 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 +} diff --git a/tpls.go b/tpls.go index 8d337cf..ff355fb 100644 --- a/tpls.go +++ b/tpls.go @@ -25,6 +25,7 @@ var ( tplForgotpw *template.Template tplJobs *template.Template tplJobedit *template.Template + tplSettings *template.Template ) func initTpls() { @@ -41,6 +42,7 @@ func initTpls() { tplForgotpw = loadTpl(tplpath, "forgotpw") tplJobs = loadTpl(tplpath, "jobs") tplJobedit = loadTpl(tplpath, "jobedit") + tplSettings = loadTpl(tplpath, "settings") } type msgTpldata struct { diff --git a/tpls/master.tpl b/tpls/master.tpl index a79f5c6..7d6a249 100644 --- a/tpls/master.tpl +++ b/tpls/master.tpl @@ -13,6 +13,7 @@ {{if .Mail}}
  • new job
  • list jobs
  • +
  • settings
  • logout
  • {{else}}
  • register
  • diff --git a/tpls/settings.tpl b/tpls/settings.tpl new file mode 100644 index 0000000..605a596 --- /dev/null +++ b/tpls/settings.tpl @@ -0,0 +1,32 @@ +{{define "title"}}User Settings{{end}} + +{{define "content"}} + {{if .Error}}
    {{.Error}}
    {{end}} + + {{if not .Fatal}} + {{if .Success}}
    {{.Success}}
    {{end}} + +
    +

    Set Password

    + +

    Password:

    +

    Repeat Password:

    +

    +
    + +
    +

    Set Timezone

    + +

    + Timezone: + +

    +

    +
    + +

    Delete Account

    +

    Delete Account

    + {{end}} +{{end}} \ No newline at end of file -- cgit v1.2.3-54-g00ecf