lavender/server/server.go

77 lines
1.7 KiB
Go

package server
import (
"fmt"
"github.com/1f349/cache"
"github.com/1f349/lavender/issuer"
"github.com/MrMelon54/mjwt"
"github.com/julienschmidt/httprouter"
"log"
"net/http"
"time"
)
type HttpServer struct {
r *httprouter.Router
conf Conf
manager *issuer.Manager
signer mjwt.Signer
flowState *cache.Cache[string, flowStateData]
services map[string]struct{}
}
type flowStateData struct {
sso *issuer.WellKnownOIDC
targetOrigin string
}
func NewHttpServer(conf Conf, signer mjwt.Signer) *http.Server {
r := httprouter.New()
// remove last slash from baseUrl
{
l := len(conf.BaseUrl)
if conf.BaseUrl[l-1] == '/' {
conf.BaseUrl = conf.BaseUrl[:l-1]
}
}
manager, err := issuer.NewManager(conf.SsoServices)
if err != nil {
log.Fatal("[Lavender] Failed to create SSO service manager: ", err)
}
services := make(map[string]struct{})
for _, i := range conf.AllowedClients {
services[i.String()] = struct{}{}
}
hs := &HttpServer{
r: r,
conf: conf,
manager: manager,
signer: signer,
flowState: cache.New[string, flowStateData](),
services: services,
}
r.GET("/", func(rw http.ResponseWriter, req *http.Request, _ httprouter.Params) {
rw.WriteHeader(http.StatusOK)
_, _ = fmt.Fprintln(rw, "What is this?")
})
r.POST("/verify", hs.verifyHandler)
r.GET("/popup", hs.flowPopup)
r.POST("/popup", hs.flowPopupPost)
r.GET("/callback", hs.flowCallback)
return &http.Server{
Addr: conf.Listen,
Handler: r,
ReadTimeout: time.Minute,
ReadHeaderTimeout: time.Minute,
WriteTimeout: time.Minute,
IdleTimeout: time.Minute,
MaxHeaderBytes: 2500,
}
}