diff options
Diffstat (limited to 'web')
| -rw-r--r-- | web/handler/auth.go | 11 | ||||
| -rw-r--r-- | web/handler/index.go | 19 | ||||
| -rw-r--r-- | web/middleware/auth.go | 5 | ||||
| -rw-r--r-- | web/views/auth.html | 4 |
4 files changed, 24 insertions, 15 deletions
diff --git a/web/handler/auth.go b/web/handler/auth.go index 29bd47c..fcaaadf 100644 --- a/web/handler/auth.go +++ b/web/handler/auth.go @@ -5,6 +5,7 @@ import ( "html/template" "log/slog" "net/http" + "net/url" "time" "git.leonardobishop.net/instancer/pkg/auth" @@ -13,12 +14,17 @@ import ( func GetAuth(tmpl *template.Template, authProvider *auth.OIDCAuthProvider) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - w.Header().Add("HX-Redirect", "/auth") + errMessage := r.URL.Query().Get("error") + if errMessage != "" { + w.Header().Add("HX-Redirect", "/auth?error="+url.QueryEscape(errMessage)) + } else { + w.Header().Add("HX-Redirect", "/auth") + } tmpl.ExecuteTemplate(w, "auth.html", struct { Error string OidcIdPName string }{ - Error: "", + Error: errMessage, OidcIdPName: authProvider.Name, }) } @@ -156,7 +162,6 @@ func GetAuthCallback(tmpl *template.Template, session *session.MemoryStore, auth func GetLogout(session *session.MemoryStore) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { //TODO expire session here - http.SetCookie(w, &http.Cookie{ Name: "instancer-session", Value: "", diff --git a/web/handler/index.go b/web/handler/index.go index 9279151..8b3d43c 100644 --- a/web/handler/index.go +++ b/web/handler/index.go @@ -2,7 +2,7 @@ package handler import ( "html/template" - "log" + "log/slog" "net/http" "git.leonardobishop.net/instancer/pkg/registry" @@ -13,14 +13,20 @@ func GetIndex(tmpl *template.Template, registryClient *registry.RegistryClient) return func(w http.ResponseWriter, r *http.Request) { challenges, err := registryClient.ListRepositories() if err != nil { - log.Printf("Could not list repositories: %v", err) - http.Error(w, "Internal server error", http.StatusInternalServerError) + slog.Error("could not list repositories", "cause", err) + tmpl.ExecuteTemplate(w, "problem.html", struct { + Error string + ShowLogout bool + }{ + Error: "Error occured fetching available challenges. Please try again.", + ShowLogout: false, + }) return } session := r.Context().Value("session").(*session.UserSession) - if err := tmpl.ExecuteTemplate(w, "index.html", struct { + tmpl.ExecuteTemplate(w, "index.html", struct { Challenges []string Name string Team string @@ -28,9 +34,6 @@ func GetIndex(tmpl *template.Template, registryClient *registry.RegistryClient) Challenges: challenges, Name: session.Name, Team: session.TeamName, - }); err != nil { - http.Error(w, "Internal server error", http.StatusInternalServerError) - return - } + }) } } diff --git a/web/middleware/auth.go b/web/middleware/auth.go index c0257e2..5feccfe 100644 --- a/web/middleware/auth.go +++ b/web/middleware/auth.go @@ -6,6 +6,7 @@ import ( "html/template" "log/slog" "net/http" + "net/url" "git.leonardobishop.net/instancer/pkg/auth" "git.leonardobishop.net/instancer/pkg/session" @@ -22,14 +23,14 @@ func MustAuthenticate(tmpl *template.Template, store *session.MemoryStore, authP s := store.GetByToken(sessionCookie.Value) if s == nil { - http.Redirect(w, r, "/auth", http.StatusFound) + http.Redirect(w, r, "/auth?error="+url.QueryEscape("Session does not exist"), http.StatusFound) return } err = authProvider.UpdateUserInfo(r.Context(), s) if err != nil { if errors.Is(err, auth.ErrInvalidToken) { - http.Redirect(w, r, "/auth", http.StatusFound) + http.Redirect(w, r, "/auth?error="+url.QueryEscape("OIDC authentication has expired"), http.StatusFound) return } slog.Error("error updating user info", "cause", err) diff --git a/web/views/auth.html b/web/views/auth.html index 17ca83d..4a0391d 100644 --- a/web/views/auth.html +++ b/web/views/auth.html @@ -20,14 +20,14 @@ <div class="card-body"> <h4 class="card-title mb-3">Welcome</h4> - <p>Please authenticate to spawn challenge instances.</p> - {{if .Error}} <div class="alert alert-danger" role="alert"> {{.Error}} </div> {{end}} + <p>Please authenticate to spawn challenge instances.</p> + <form method="POST"> <button type="submit" class="btn btn-primary w-100"> Login with {{ .OidcIdPName }} |
