12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- package api
- import (
- "errors"
- "log"
- "net/http"
- "net/url"
- "time"
- jwt "github.com/dgrijalva/jwt-go"
- "gogs.carducci-dante.gov.it/karmen/config"
- "gogs.carducci-dante.gov.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, url.Values{"tpl_layout": []string{"login"}, "tpl_content": []string{"login"}})
- }
- if r.Method == "POST" {
- r.ParseForm()
- token, err := getToken(r.FormValue("username"), r.FormValue("password"))
- if err != nil {
- panic(err)
- } 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 queryDB(username string, password string) (*User, error) {
- log.Println(username, config.Config.Admin.Username, password, config.Config.Admin.Password)
- 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 := queryDB(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
- }
|