summaryrefslogtreecommitdiff
path: root/app/middleware
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-04-25 21:25:40 -0600
committermo khan <mo@mokhan.ca>2025-04-28 09:07:31 -0600
commit9b01d1616e130a589151bf1273e41181ecc727f4 (patch)
tree639ec3b3c3857042a551c8e88b09413f590ebcec /app/middleware
parent13ab8de7d09b5d4b10132828277d17ba0543b901 (diff)
feat: use htmx to render partials
Diffstat (limited to 'app/middleware')
-rw-r--r--app/middleware/id_token.go26
-rw-r--r--app/middleware/id_token_test.go2
-rw-r--r--app/middleware/require_user.go2
-rw-r--r--app/middleware/require_user_test.go4
-rw-r--r--app/middleware/token_parser.go26
-rw-r--r--app/middleware/user.go2
6 files changed, 36 insertions, 26 deletions
diff --git a/app/middleware/id_token.go b/app/middleware/id_token.go
index da39f43..f0a3c74 100644
--- a/app/middleware/id_token.go
+++ b/app/middleware/id_token.go
@@ -7,38 +7,20 @@ import (
"github.com/xlgmokha/x/pkg/x"
xcfg "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/app/cfg"
"gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/oidc"
+ "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/web/cookie"
)
-type TokenParser func(*http.Request) oidc.RawToken
-
-func IDTokenFromSessionCookie(r *http.Request) oidc.RawToken {
- cookies := r.CookiesNamed("session")
-
- if len(cookies) != 1 {
- return ""
- }
-
- tokens, err := oidc.TokensFromBase64String(cookies[0].Value)
- if err != nil {
- log.WithFields(r.Context(), log.Fields{"error": err})
- return ""
- }
-
- return tokens.IDToken
-}
-
-func IDToken(cfg *oidc.OpenID) func(http.Handler) http.Handler {
- parsers := []TokenParser{IDTokenFromSessionCookie}
-
+func IDToken(cfg *oidc.OpenID, parsers ...TokenParser) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
for _, parser := range parsers {
rawIDToken := parser(r)
- if !x.IsZero(rawIDToken) {
+ if x.IsPresent(rawIDToken) {
verifier := cfg.Provider.VerifierContext(r.Context(), cfg.OIDCConfig)
idToken, err := verifier.Verify(r.Context(), rawIDToken.String())
if err != nil {
log.WithFields(r.Context(), log.Fields{"error": err})
+ cookie.Expire(w, r, "session")
} else {
log.WithFields(r.Context(), log.Fields{"id_token": idToken})
next.ServeHTTP(
diff --git a/app/middleware/id_token_test.go b/app/middleware/id_token_test.go
index 607c028..53ac126 100644
--- a/app/middleware/id_token_test.go
+++ b/app/middleware/id_token_test.go
@@ -36,7 +36,7 @@ func TestIDToken(t *testing.T) {
)
require.NoError(t, err)
- middleware := IDToken(openID)
+ middleware := IDToken(openID, IDTokenFromSessionCookie)
t.Run("when an active session cookie is provided", func(t *testing.T) {
t.Run("attaches the token to the request context", func(t *testing.T) {
diff --git a/app/middleware/require_user.go b/app/middleware/require_user.go
index d0d5355..8f54a04 100644
--- a/app/middleware/require_user.go
+++ b/app/middleware/require_user.go
@@ -10,7 +10,7 @@ func RequireUser() func(http.Handler) http.Handler {
if IsLoggedIn(r) {
next.ServeHTTP(w, r)
} else {
- w.WriteHeader(http.StatusNotFound)
+ http.Redirect(w, r, "/", http.StatusFound)
}
})
}
diff --git a/app/middleware/require_user_test.go b/app/middleware/require_user_test.go
index 48afff7..794f347 100644
--- a/app/middleware/require_user_test.go
+++ b/app/middleware/require_user_test.go
@@ -4,6 +4,7 @@ import (
"net/http"
"testing"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/app/cfg"
"gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/app/domain"
@@ -22,7 +23,8 @@ func TestRequireUser(t *testing.T) {
}))
server.ServeHTTP(w, r)
- require.Equal(t, http.StatusNotFound, w.Code)
+ require.Equal(t, http.StatusFound, w.Code)
+ assert.Equal(t, "/", w.Header().Get("Location"))
})
})
diff --git a/app/middleware/token_parser.go b/app/middleware/token_parser.go
new file mode 100644
index 0000000..a719b2f
--- /dev/null
+++ b/app/middleware/token_parser.go
@@ -0,0 +1,26 @@
+package middleware
+
+import (
+ "net/http"
+
+ "github.com/xlgmokha/x/pkg/log"
+ "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/oidc"
+)
+
+type TokenParser func(*http.Request) oidc.RawToken
+
+func IDTokenFromSessionCookie(r *http.Request) oidc.RawToken {
+ cookies := r.CookiesNamed("session")
+
+ if len(cookies) != 1 {
+ return ""
+ }
+
+ tokens, err := oidc.TokensFromBase64String(cookies[0].Value)
+ if err != nil {
+ log.WithFields(r.Context(), log.Fields{"error": err})
+ return ""
+ }
+
+ return tokens.IDToken
+}
diff --git a/app/middleware/user.go b/app/middleware/user.go
index e2f1ce3..21455ba 100644
--- a/app/middleware/user.go
+++ b/app/middleware/user.go
@@ -21,7 +21,7 @@ func User(db domain.Repository[*domain.User]) func(http.Handler) http.Handler {
}
user := db.Find(domain.ID(idToken.Subject))
- if x.IsZero(user) {
+ if !x.IsPresent(user) {
user = mapper.MapFrom[*oidc.IDToken, *domain.User](idToken)
if err := db.Save(user); err != nil {
log.WithFields(r.Context(), log.Fields{"error": err})