103 lines
2.2 KiB
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,
|
|
}
|
|
}
|