98 lines
2.1 KiB
Go
98 lines
2.1 KiB
Go
package routers
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"crypto/tls"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
|
|
"gitea.com/gitea/pr-deployer/pkgs/proxy"
|
|
"gitea.com/gitea/pr-deployer/pkgs/settings"
|
|
"gitea.com/go-chi/session"
|
|
log "github.com/sirupsen/logrus"
|
|
"golang.org/x/oauth2"
|
|
)
|
|
|
|
func Home(w http.ResponseWriter, r *http.Request) {
|
|
sess := session.GetSession(r)
|
|
user := sess.Get("user")
|
|
oriState := "111111" // TODO: use a random
|
|
|
|
if user == nil {
|
|
sess.Set("state", oriState)
|
|
|
|
url := settings.OAuth2Conf.AuthCodeURL(oriState, oauth2.AccessTypeOffline)
|
|
fmt.Printf("Visit the URL for the auth dialog: %v", url)
|
|
|
|
http.Redirect(w, r, url, http.StatusFound)
|
|
return
|
|
}
|
|
|
|
http.Redirect(w, r, "/prs", http.StatusFound)
|
|
}
|
|
|
|
func OAuth2Callback(w http.ResponseWriter, r *http.Request) {
|
|
sess := session.GetSession(r)
|
|
oriState := sess.Get("state")
|
|
state := r.FormValue("state")
|
|
if state != oriState {
|
|
log.Error("state is not equal")
|
|
return
|
|
}
|
|
|
|
ctx := context.Background()
|
|
httpClient := &http.Client{
|
|
Timeout: 20 * time.Second,
|
|
Transport: &http.Transport{
|
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
|
Proxy: func(req *http.Request) (*url.URL, error) {
|
|
return proxy.Proxy()(req)
|
|
},
|
|
},
|
|
}
|
|
ctx = context.WithValue(ctx, oauth2.HTTPClient, httpClient)
|
|
|
|
code := r.FormValue("code")
|
|
tok, err := settings.OAuth2Conf.Exchange(ctx, code)
|
|
if err != nil {
|
|
log.Error(err)
|
|
return
|
|
}
|
|
fmt.Println(tok)
|
|
sess.Set("token", tok)
|
|
|
|
client := settings.OAuth2Conf.Client(ctx, tok)
|
|
var url string
|
|
if settings.ServiceType == "gitea" {
|
|
url = settings.OAuth2ServerURL + "/api/v1/user"
|
|
} else if settings.ServiceType == "github" {
|
|
url = "https://api.github.com/user"
|
|
}
|
|
resp, err := client.Get(url)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
bs, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(string(bs))
|
|
|
|
var user = make(map[string]interface{})
|
|
err = json.NewDecoder(bytes.NewReader(bs)).Decode(&user)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(user)
|
|
sess.Set("user", user)
|
|
|
|
http.Redirect(w, r, "/", 302)
|
|
}
|