51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"io/fs"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
"github.com/mstarongithub/passkey"
|
|
"github.com/rs/zerolog/log"
|
|
"gitlab.com/mstarongitlab/linstrom/storage"
|
|
)
|
|
|
|
type Server struct {
|
|
store *storage.Storage
|
|
router http.Handler
|
|
}
|
|
|
|
func NewServer(store *storage.Storage, pkey *passkey.Passkey, reactiveFS, staticFS fs.FS) *Server {
|
|
handler := buildRootHandler(pkey, reactiveFS, staticFS)
|
|
handler = ChainMiddlewares(handler, LoggingMiddleware, ContextValsMiddleware(map[any]any{
|
|
ContextKeyStorage: store,
|
|
}))
|
|
return &Server{
|
|
store: store,
|
|
router: handler,
|
|
}
|
|
}
|
|
|
|
func buildRootHandler(pkey *passkey.Passkey, reactiveFS, staticFS fs.FS) http.Handler {
|
|
mux := http.NewServeMux()
|
|
pkey.MountRoutes(mux, "/webauthn/")
|
|
mux.Handle("/", setupFrontendRouter(reactiveFS, staticFS))
|
|
mux.Handle("/pk/", http.StripPrefix("/pk", http.FileServer(http.Dir("pk-auth"))))
|
|
mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, true) })
|
|
mux.Handle(
|
|
"/authonly/",
|
|
pkey.Auth(
|
|
ContextKeyPasskeyUsername,
|
|
nil,
|
|
passkey.RedirectUnauthorized(url.URL{Path: "/"}),
|
|
)(ChainMiddlewares(setupTestEndpoints(), passkeyIdToAccountIdTransformerMiddleware)),
|
|
)
|
|
|
|
return mux
|
|
}
|
|
|
|
func (s *Server) Start(addr string) error {
|
|
log.Info().Str("addr", addr).Msg("Starting server")
|
|
return http.ListenAndServe(addr, s.router)
|
|
}
|