gistea/router/session.go

103 lines
2.2 KiB
Go

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,
}
}