From 3782afd539d8fbe792c5b5e6650a9b08a22665cb Mon Sep 17 00:00:00 2001 From: jan Date: Sat, 19 Dec 2015 17:43:20 +0100 Subject: actual login diff --git a/charakterin.go b/charakterin.go index bb7323d..202e8b2 100644 --- a/charakterin.go +++ b/charakterin.go @@ -2,8 +2,11 @@ package charakterin import ( "database/sql" + "io/ioutil" "log" "net/http" + "net/url" + "time" _ "github.com/lib/pq" ) @@ -39,8 +42,8 @@ func (c *Charakterin) UseRenderer(renderer Renderer) { c.renderer = renderer } -// DisplayLogin zeigt die Route für den Login an, wenn der User nicht bereits eingeloggt ist. -func (c *Charakterin) DisplayLogin(w http.ResponseWriter, r *http.Request) { +// DisplayLoginWithData rendert die Loginseite mit Daten (vorheriger Benutzer, Fehlermeldung) +func (c *Charakterin) DisplayLoginWithData(w http.ResponseWriter, r *http.Request, data map[string]interface{}) { if c.IsLoggedIn(r) { http.Redirect(w, r, c.FallbackRoute, 302) return @@ -51,17 +54,66 @@ func (c *Charakterin) DisplayLogin(w http.ResponseWriter, r *http.Request) { return } - http.SetCookie(w, &http.Cookie{ - Name: "session", - Value: "benis", - }) + if _, ok := data["previous_user"]; !ok { + data["previous_user"] = "" + } + if _, ok := data["error"]; !ok { + data["error"] = "" + } + + c.renderer.RenderLoginPage(w, data) +} - c.renderer.RenderLoginPage(w, make(map[string]interface{})) +// DisplayLogin zeigt die Route für den Login an, wenn der User nicht bereits eingeloggt ist. +func (c *Charakterin) DisplayLogin(w http.ResponseWriter, r *http.Request) { + c.DisplayLoginWithData(w, r, make(map[string]interface{})) } // Login versucht einen User einzuloggen. func (c *Charakterin) Login(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + return + } + + // POST-Data lesen + defer r.Body.Close() + data, err := ioutil.ReadAll(r.Body) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + values, err := url.ParseQuery(string(data)) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + username := values.Get("username") + var result string + err = c.Database.QueryRow("SELECT * FROM login.new_session($1, $2)", username, values.Get("password")).Scan(&result) + if err != nil { + errStr := err.Error() + + if errStr == "pq: no_such_user" || errStr == "pq: invalid_password" { + log.Printf("invalid login attempt by '%s': %s\n", username, errStr[4:]) + data := make(map[string]interface{}) + data["previous_user"] = username + data["error"] = "Ungültiger Benutzername oder Passwort. Oder Lukas hats mal wieder kaputt gemacht." + c.DisplayLoginWithData(w, r, data) + return + } + http.Error(w, errStr, http.StatusInternalServerError) + return + } + + http.SetCookie(w, &http.Cookie{ + Name: "session", + Value: result, + Expires: time.Now().AddDate(1, 0, 0), + }) + http.Redirect(w, r, c.FallbackRoute, 302) } // IsLoggedIn überprüft anhand eines Request, ob der User eingeloggt ist. -- cgit v0.10.1