package router import ( "fmt" "net/http" "code.gitea.io/sdk/gitea" "github.com/gorilla/sessions" "github.com/markbates/goth/gothic" ) const sessionCookie = "_gistea_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 } 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 } org := fmt.Sprintf("%s-gists", profile.UserName) _, resp, err := client.GetOrg(org) if err != nil { if resp != nil && resp.StatusCode == http.StatusNotFound { if _, _, err := client.CreateOrg(gitea.CreateOrgOption{ Name: org, Visibility: gitea.VisibleTypePublic, }); err != nil { return err } } else { return err } } sess, err := s.Store.New(r, sessionCookie) if err != nil { return err } sess.Values["authenticated"] = true sess.Values["org"] = org sess.Values["token"] = token return s.Store.Save(r, w, sess) } func (s *SessionStore) client(r *http.Request) (*gitea.Client, error) { sess, err := s.Store.Get(r, sessionCookie) if err != nil { return nil, err } return gitea.NewClient(s.GiteaURL, gitea.SetToken(sess.Values["token"].(string))) } func (s *SessionStore) Repos(r *http.Request) ([]*gitea.Repository, error) { sess, err := s.Store.Get(r, sessionCookie) if err != nil { return nil, err } client, err := s.client(r) if err != nil { return nil, err } repos, _, err := client.ListOrgRepos(sess.Values["org"].(string), gitea.ListOrgReposOptions{}) return repos, err } func NewSessionStore(sessionSecret, giteURL string) *SessionStore { store := sessions.NewCookieStore([]byte(sessionSecret)) return &SessionStore{ Store: store, GiteaURL: giteURL, } }