87 lines
2.0 KiB
Go
87 lines
2.0 KiB
Go
package router
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
|
|
"code.gitea.io/sdk/gitea"
|
|
"github.com/gorilla/sessions"
|
|
"github.com/markbates/goth/gothic"
|
|
)
|
|
|
|
const sessionCookie = "_invitea_session"
|
|
|
|
type SessionStore struct {
|
|
Store sessions.Store
|
|
GiteaURL string
|
|
}
|
|
|
|
func (s *SessionStore) Middleware(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
sess, err := s.Store.Get(r, sessionCookie)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
r = r.WithContext(context.WithValue(r.Context(), "isAdmin", sess.Values["isAdmin"]))
|
|
r = r.WithContext(context.WithValue(r.Context(), "username", sess.Values["username"]))
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
|
|
func (s *SessionStore) RequireAuth(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
sess, err := s.Store.Get(r, sessionCookie)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
if _, ok := sess.Values["authenticated"]; !ok {
|
|
gothic.BeginAuthHandler(w, r)
|
|
return
|
|
}
|
|
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
|
|
func (s *SessionStore) Auth(w http.ResponseWriter, r *http.Request, token string) error {
|
|
client, err := gitea.NewClient(s.GiteaURL, gitea.SetToken(token))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
profile, _, err := client.GetMyUserInfo()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
sess, err := s.Store.New(r, sessionCookie)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
sess.Values["authenticated"] = true
|
|
sess.Values["isAdmin"] = profile.IsAdmin
|
|
sess.Values["username"] = profile.UserName
|
|
return s.Store.Save(r, w, sess)
|
|
}
|
|
|
|
func (s *SessionStore) Logout(w http.ResponseWriter, r *http.Request) error {
|
|
sess, err := s.Store.Get(r, sessionCookie)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
sess.Options.MaxAge = -1
|
|
return s.Store.Save(r, w, sess)
|
|
}
|
|
|
|
func NewSessionStore(sessionSecret, giteURL string) *SessionStore {
|
|
store := sessions.NewCookieStore([]byte(sessionSecret))
|
|
store.MaxAge(0)
|
|
return &SessionStore{
|
|
Store: store,
|
|
GiteaURL: giteURL,
|
|
}
|
|
}
|