package handlers import ( "errors" "net/http" "time" "git.jamestombleson.com/jtom38/newsbot-portal/internal/domain" "github.com/a-h/templ" "github.com/golang-jwt/jwt/v4" "github.com/labstack/echo/v4" ) func SetCookie(c echo.Context, key, value, path string) { cookie := new(http.Cookie) cookie.Name = key cookie.Value = value if path != "" { cookie.Path = path } c.SetCookie(cookie) } type jwtToken struct { Exp time.Time `json:"exp"` Iss string `json:"iss"` Authorized bool `json:"authorized"` UserName string `json:"username"` Scopes []string `json:"scopes"` jwt.RegisteredClaims } func ValidateJwt(ctx echo.Context, sharedSecret, issuer string) (jwtToken, error) { cookie, err := ctx.Cookie(domain.CookieToken) if err != nil { return jwtToken{}, err } if cookie.Value == "" { return jwtToken{}, errors.New("JWT Bearer Token is missing") } token, err := jwt.ParseWithClaims(cookie.Value, &jwtToken{}, func(token *jwt.Token) (interface{}, error) { return []byte(sharedSecret), nil }) if err != nil { return jwtToken{}, err } if !token.Valid { return jwtToken{}, errors.New("invalid jwt token") } claims := token.Claims.(*jwtToken) if !claims.Exp.After(time.Now()) { return jwtToken{}, errors.New("the jwt token has expired") } //if claims.Iss != issuer { // return jwtToken{}, errors.New("the issuer was invalid") //} return *claims, nil } func Render(ctx echo.Context, statusCode int, t templ.Component) error { ctx.Response().Writer.WriteHeader(statusCode) ctx.Response().Header().Set(echo.HeaderContentType, echo.MIMETextHTML) // take the request context and make it a var request := ctx.Request().Context() //Check to see if we the echo context has the cookie we are looking for, if so, create a new context based on what we had and add the value //darkMode, err := ctx.Cookie(domain.CookieSettingsDarkMode) //if err == nil { // request = context.WithValue(request, domain.CookieSettingsDarkMode, darkMode.Value) //} return t.Render(request, ctx.Response().Writer) }