123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- package handlers
- import (
- "errors"
- "fmt"
- "net/http"
- "time"
- jwt "github.com/dgrijalva/jwt-go"
- "gogs.carduccidante.edu.it/karmen/core/config"
- "gogs.carduccidante.edu.it/karmen/core/renderer"
- )
- func logoutHandler() http.Handler {
- fn := func(w http.ResponseWriter, r *http.Request) {
- session, err := store.Get(r, "login-session")
- if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- session.Values["token"] = []uint8{}
- session.Save(r, w)
- http.Redirect(w, r, "/", http.StatusSeeOther)
- }
- return http.HandlerFunc(fn)
- }
- func loginHandler() http.Handler {
- fn := func(w http.ResponseWriter, r *http.Request) {
- if r.Method == "GET" {
- renderer.Render["html"](w, r, nil, r.URL.Query())
- }
- if r.Method == "POST" {
- r.ParseForm()
- token, err := getToken(r.FormValue("username"), r.FormValue("password"))
- if err != nil {
- http.Redirect(w, r, "/login?tpl_layout=login&tpl_content=login&failed=true", http.StatusSeeOther)
- } else {
- session, err := store.Get(r, "login-session")
- if err != nil {
- panic(err)
- }
- session.Values["token"] = token
- session.Save(r, w)
- r.Method = "GET"
- http.Redirect(w, r, "/teachers?format=html&tpl_layout=base&tpl_content=teachers", http.StatusSeeOther)
- }
- }
- }
- return http.HandlerFunc(fn)
- }
- func checkCredential(username string, password string) (*User, error) {
- if username == config.Config.Admin.Username && password == config.Config.Admin.Password {
- return &User{username, true}, nil
- }
- return nil, errors.New("Authentication failed!")
- }
- func getToken(username string, password string) ([]byte, error) {
- user, err := checkCredential(username, password)
- if err != nil {
- return nil, err
- }
- /* Set token claims */
- claims := make(map[string]interface{})
- claims["admin"] = user.Admin
- claims["name"] = user.Name
- claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
- /* Create the token */
- token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims(claims))
- /* Sign the token with our secret */
- tokenString, err := token.SignedString(signingKey)
- if err != nil {
- return nil, err
- }
- return []byte(tokenString), nil
- }
- func tokenHandler() http.Handler {
- fn := func(w http.ResponseWriter, r *http.Request) {
- username, password, _ := r.BasicAuth()
- user, err := checkCredential(username, password)
- if err != nil {
- panic(err)
- }
- /* Set token claims */
- claims := make(map[string]interface{})
- claims["admin"] = true
- claims["name"] = user.Name
- claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
- /* Create the token */
- token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims(claims))
- /* Sign the token with our secret */
- tokenString, err := token.SignedString(signingKey)
- if err != nil {
- panic(err)
- }
- w.Header().Set("Content-Type", "application/json; charset=utf-8")
- w.Write([]byte(fmt.Sprintf("{\"Token\":\"%s\",\"User\":\"%s\"}", tokenString, user.Name)))
- }
- return http.HandlerFunc(fn)
- }
|