From acbe0c9841bcbe6cadc3300fef092ce551e76421 Mon Sep 17 00:00:00 2001 From: Jonni Liljamo Date: Tue, 3 Oct 2023 13:28:21 +0300 Subject: [PATCH] feat: error.tmpl --- handlers/auth.go | 29 ++++++++++++++++++----------- handlers/link.go | 5 +++-- template/templates/404.tmpl | 3 --- template/templates/error.tmpl | 3 +++ tixe.go | 2 +- util/error.go | 25 +++++++++++++++++++++++++ 6 files changed, 50 insertions(+), 17 deletions(-) delete mode 100644 template/templates/404.tmpl create mode 100644 template/templates/error.tmpl create mode 100644 util/error.go diff --git a/handlers/auth.go b/handlers/auth.go index ae8d8ea..bf499a2 100644 --- a/handlers/auth.go +++ b/handlers/auth.go @@ -13,6 +13,7 @@ import ( "tixe/auth" "tixe/db" "tixe/types" + "tixe/util" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" @@ -24,26 +25,29 @@ func AuthCallback(auth *auth.Auth) gin.HandlerFunc { return func(c *gin.Context) { session := sessions.Default(c) if c.Query("state") != session.Get("state") { - c.String(http.StatusBadRequest, "Invalid state parameter!") + errStr := "Invalid state parameter" + util.RenderError(c, "state error", errStr, nil) return } token, err := auth.Exchange(c.Request.Context(), c.Query("code")) if err != nil { - c.String(http.StatusUnauthorized, "Failed to exchange authorization code for token!") + errStr := "Failed to exchange authorization code for token" + util.RenderError(c, "token error", errStr, nil) return } idToken, err := auth.VerifyIDToken(c.Request.Context(), token) if err != nil { - c.String(http.StatusInternalServerError, "Failed to verify ID token!") + errStr := "Failed to verify ID token" + util.RenderError(c, "token error", errStr, nil) return } var profile map[string]interface{} if err := idToken.Claims(&profile); err != nil { - log.Printf("[tixe/auth] ERROR: Failed to get claims") - c.String(http.StatusInternalServerError, "Failed to get claims!") + errStr := "Failed to get claims" + util.RenderError(c, "claims error", errStr, nil) return } @@ -62,14 +66,16 @@ func AuthCallback(auth *auth.Auth) gin.HandlerFunc { "INSERT INTO users(id, display_name, oidc_subject) VALUES($1, $2, $3)", userId, userDisplayName, idToken.Subject) if err != nil { - log.Printf("[tixe/auth] ERROR: Could not create database entry for oidc user") - c.String(http.StatusInternalServerError, "Could not create database entry for oidc user") + errStr := "Could not create database entry for oidc user" + log.Printf("[tixe/auth] ERROR: %s", errStr) + util.RenderError(c, "db error", errStr, nil) return } } else if scanErr != nil { // scanErr was some other error than ErrNoRows - log.Printf("[tixe/auth] ERROR: Could not query database for oidc user: %v", scanErr) - c.String(http.StatusInternalServerError, "Could not query database for oidc user") + errStr := "Could not query database for oidc user" + log.Printf("[tixe/auth] ERROR: %s: %v", errStr, scanErr) + util.RenderError(c, "db error", errStr, nil) return } @@ -78,8 +84,9 @@ func AuthCallback(auth *auth.Auth) gin.HandlerFunc { session.Set("access_token", token.AccessToken) session.Set("profile", profile) if err := session.Save(); err != nil { - log.Printf("[tixe/auth] ERROR: Failed to save session: %v", err) - c.String(http.StatusInternalServerError, "Failed to save session!") + errStr := "Failed to save session" + log.Printf("[tixe/auth] ERROR: %s: %v", errStr, err) + util.RenderError(c, "session error", errStr, nil) return } diff --git a/handlers/link.go b/handlers/link.go index 31dddad..7f845a4 100644 --- a/handlers/link.go +++ b/handlers/link.go @@ -12,6 +12,7 @@ import ( "tixe/db" "tixe/template" "tixe/types" + "tixe/util" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" @@ -28,8 +29,8 @@ func LinkEdit(c *gin.Context) { "SELECT visual, link FROM links WHERE id = $1 AND user_id = $2", linkId, user.Id).Scan(&link.Visual, &link.Link) if err != nil { - // something something show error page and abort i guess - c.Abort() + errStr := "Could not query link entry from database" + util.RenderError(c, "db error", errStr, user) return } diff --git a/template/templates/404.tmpl b/template/templates/404.tmpl deleted file mode 100644 index 9b50131..0000000 --- a/template/templates/404.tmpl +++ /dev/null @@ -1,3 +0,0 @@ -{{ define "content" }} -

404

-{{ end }} diff --git a/template/templates/error.tmpl b/template/templates/error.tmpl new file mode 100644 index 0000000..34cf5e0 --- /dev/null +++ b/template/templates/error.tmpl @@ -0,0 +1,3 @@ +{{ define "content" }} +

{{ .error }}

+{{ end }} diff --git a/tixe.go b/tixe.go index 18236af..b79f214 100644 --- a/tixe.go +++ b/tixe.go @@ -32,7 +32,7 @@ func handleNoRoute(c *gin.Context) { session := sessions.Default(c) user := session.Get("user") - html := template.TmplEngine.Render("404.tmpl", map[string]interface{}{"title": "404", "user": user}) + html := template.TmplEngine.Render("error.tmpl", map[string]interface{}{"title": "404", "user": user, "error": "404"}) c.Data(http.StatusNotFound, "text/html", html) } diff --git a/util/error.go b/util/error.go new file mode 100644 index 0000000..a765b2b --- /dev/null +++ b/util/error.go @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2023 Jonni Liljamo + * + * This file is licensed under AGPL-3.0-or-later, see NOTICE and LICENSE for + * more information. + */ +package util + +import ( + "net/http" + "tixe/template" + + "github.com/gin-gonic/gin" +) + +func RenderError(c *gin.Context, title string, errStr string, user interface{}) { + var html []byte + if user == nil { + html = template.TmplEngine.Render("error.tmpl", map[string]interface{}{"title": title, "error": errStr, "notauthed": true}) + } else { + html = template.TmplEngine.Render("error.tmpl", map[string]interface{}{"title": title, "error": errStr, "user": user}) + } + c.Data(http.StatusInternalServerError, "text/html", html) + c.Abort() +} -- 2.44.1