diff --git a/.gitignore b/.gitignore index ece291c..9603335 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ webcounter/webcounter authcookie/authcookie cert.pem key.pem +photoblog/photoblog diff --git a/photoblog/admin/admin.go b/photoblog/admin/admin.go new file mode 100644 index 0000000..ba4ef01 --- /dev/null +++ b/photoblog/admin/admin.go @@ -0,0 +1,52 @@ +package admin + +import ( + "html/template" + "net/http" + + "github.com/gorilla/sessions" +) + +type AuthCookie struct { + Templates *template.Template + Store *sessions.CookieStore +} + +func (app *AuthCookie) LoginPage(res http.ResponseWriter, req *http.Request) { + formErr := make(map[string]string) + switch req.Method { + case "POST": + username := req.FormValue("username") + if username == "" { + formErr["username"] = "Empty username" + } + password := req.FormValue("password") + if password == "" { + formErr["password"] = "Empty password" + } + if len(formErr) == 0 { + app.SaveUsername(username, res, req) + RedirectHome(res, req) + return + } + fallthrough + case "GET": + app.Templates.ExecuteTemplate(res, "login.html", formErr) + } +} +func (app *AuthCookie) LogoutPage(res http.ResponseWriter, req *http.Request) { + app.SaveUsername("", res, req) + RedirectHome(res, req) +} +func (app *AuthCookie) CurrentSession(res http.ResponseWriter, req *http.Request) *sessions.Session { + session, _ := app.Store.Get(req, "session") + return session +} +func (app *AuthCookie) SaveUsername(username string, res http.ResponseWriter, req *http.Request) { + session := app.CurrentSession(res, req) + session.Values["username"] = username + session.Save(req, res) +} +func RedirectHome(res http.ResponseWriter, req *http.Request) { + http.Redirect(res, req, "/", http.StatusSeeOther) +} diff --git a/photoblog/main.go b/photoblog/main.go new file mode 100644 index 0000000..658367d --- /dev/null +++ b/photoblog/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "html/template" + "log" + "net/http" + + "meutel.net/meutel/go-examples/photoblog/admin" + + "github.com/gorilla/sessions" +) + +type PhotoBlog struct { + *admin.AuthCookie + Templates *template.Template +} + +func (app *PhotoBlog) HomePage(res http.ResponseWriter, req *http.Request) { + app.Templates.ExecuteTemplate(res, "home.html", app.CurrentSession(res, req).Values) +} + +func main() { + tpl, err := template.ParseGlob("templates/*.html") + if err != nil { + log.Fatalln(err) + } + admin := admin.AuthCookie{ + Templates: tpl, + Store: sessions.NewCookieStore([]byte("flQ6QzM/c3Jtdl9ycDx6OXRIfFgK")), + } + app := PhotoBlog{ + AuthCookie: &admin, + Templates: tpl, + } + http.HandleFunc("/", app.HomePage) + http.HandleFunc("/login", app.LoginPage) + http.HandleFunc("/logout", app.LogoutPage) + http.ListenAndServeTLS(":9443", "../cert.pem", "../key.pem", nil) +} diff --git a/photoblog/templates/footer.html b/photoblog/templates/footer.html new file mode 100644 index 0000000..b605728 --- /dev/null +++ b/photoblog/templates/footer.html @@ -0,0 +1,2 @@ + + diff --git a/photoblog/templates/header.html b/photoblog/templates/header.html new file mode 100644 index 0000000..0fd7698 --- /dev/null +++ b/photoblog/templates/header.html @@ -0,0 +1,4 @@ + + + Auth cookie + diff --git a/photoblog/templates/home.html b/photoblog/templates/home.html new file mode 100644 index 0000000..737ae4f --- /dev/null +++ b/photoblog/templates/home.html @@ -0,0 +1,10 @@ +{{ template "header.html" }} +
+{{ if .username }} +Logout +{{ else }} +Login +{{ end }} +
+

Hello {{ .username }}

+{{ template "footer.html" }} diff --git a/photoblog/templates/login.html b/photoblog/templates/login.html new file mode 100644 index 0000000..78a6a8f --- /dev/null +++ b/photoblog/templates/login.html @@ -0,0 +1,16 @@ +{{ template "header.html" }} +

Authentification

+
+ +
+ +
+ +
+{{ template "footer.html" }}