71 lines
1.9 KiB
Go
71 lines
1.9 KiB
Go
package api
|
|
|
|
import (
|
|
"errors"
|
|
"git.lumeweb.com/LumeWeb/gitea-github-proxy/config"
|
|
"go.uber.org/zap"
|
|
"net/http"
|
|
)
|
|
|
|
type setupApi struct {
|
|
config *config.Config
|
|
logger *zap.Logger
|
|
oauth *oauth
|
|
}
|
|
|
|
func newSetupApi(config *config.Config, logger *zap.Logger, oauth *oauth) *setupApi {
|
|
return &setupApi{config: config, logger: logger, oauth: oauth}
|
|
}
|
|
|
|
func (s setupApi) setupHandler(w http.ResponseWriter, r *http.Request) {
|
|
status := getAuthedStatusFromRequest(r)
|
|
|
|
if status {
|
|
redirectCookie := getCookie(r, REDIRECT_AFTER_AUTH)
|
|
if redirectCookie != "" {
|
|
deleteCookie(w, REDIRECT_AFTER_AUTH)
|
|
http.Redirect(w, r, redirectCookie, http.StatusFound)
|
|
return
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "text/plain")
|
|
w.WriteHeader(http.StatusOK)
|
|
w.Write([]byte("Setup is complete, you are authorized to use the proxy."))
|
|
return
|
|
}
|
|
|
|
http.Redirect(w, r, s.oauth.authUrl(), http.StatusFound)
|
|
}
|
|
func (s setupApi) callbackHandler(w http.ResponseWriter, r *http.Request) {
|
|
if r.URL.Query().Get("error") != "" {
|
|
http.Error(w, errors.Join(errors.New("Error authorizing with Gitea: "), errors.New(r.URL.Query().Get("error"))).Error(), http.StatusBadRequest)
|
|
}
|
|
|
|
code := r.URL.Query().Get("code")
|
|
if len(code) == 0 {
|
|
http.Error(w, "No code provided", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
token, err := s.oauth.config().Exchange(r.Context(), code)
|
|
if err != nil {
|
|
http.Error(w, "Failed to exchange code for token", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
setAuthCookie(token.AccessToken, s.config.Domain, w)
|
|
|
|
http.Redirect(w, r, "/setup", http.StatusFound)
|
|
}
|
|
|
|
func setupApiRoutes(params RouteParams) {
|
|
r := params.R
|
|
|
|
setupRouter := r.PathPrefix("/setup").Subrouter()
|
|
setupRouter.Use(giteaOauthVerifyMiddleware(params.Config))
|
|
|
|
setupApi := newSetupApi(params.Config, params.Logger, newOauth(params.Config, params.Logger))
|
|
setupRouter.HandleFunc("", setupApi.setupHandler).Methods("GET")
|
|
setupRouter.HandleFunc("/callback", setupApi.callbackHandler).Methods("GET")
|
|
}
|