aboutsummaryrefslogtreecommitdiffstats
path: root/api/auth
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2020-06-21 22:12:04 +0200
committerMichael Muré <batolettre@gmail.com>2020-06-27 23:03:05 +0200
commit2ab6381a94d55fa22b80acdbb18849d6b24951f9 (patch)
tree99942b000955623ea7466b9fa4cc7dab37645df6 /api/auth
parent5f72b04ef8e84b1c367ca6874519706318e351f5 (diff)
downloadgit-bug-2ab6381a94d55fa22b80acdbb18849d6b24951f9.tar.gz
Reorganize the webUI and API code
Included in the changes: - create a new /api root package to hold all API code, migrate /graphql in there - git API handlers all use the cache instead of the repo directly - git API handlers are now tested - git API handlers now require a "repo" mux parameter - lots of untangling of API/handlers/middleware - less code in commands/webui.go
Diffstat (limited to 'api/auth')
-rw-r--r--api/auth/context.go28
-rw-r--r--api/auth/errors.go6
-rw-r--r--api/auth/middleware.go16
3 files changed, 50 insertions, 0 deletions
diff --git a/api/auth/context.go b/api/auth/context.go
new file mode 100644
index 00000000..17171261
--- /dev/null
+++ b/api/auth/context.go
@@ -0,0 +1,28 @@
+// Package auth contains helpers for managing identities within the GraphQL API.
+package auth
+
+import (
+ "context"
+
+ "github.com/MichaelMure/git-bug/cache"
+ "github.com/MichaelMure/git-bug/entity"
+)
+
+// identityCtxKey is a unique context key, accessible only in this package.
+var identityCtxKey = &struct{}{}
+
+// CtxWithUser attaches an Identity to a context.
+func CtxWithUser(ctx context.Context, userId entity.Id) context.Context {
+ return context.WithValue(ctx, identityCtxKey, userId)
+}
+
+// UserFromCtx retrieves an IdentityCache from the context.
+// If there is no identity in the context, ErrNotAuthenticated is returned.
+// If an error occurs while resolving the identity (e.g. I/O error), then it will be returned.
+func UserFromCtx(ctx context.Context, r *cache.RepoCache) (*cache.IdentityCache, error) {
+ id, ok := ctx.Value(identityCtxKey).(entity.Id)
+ if !ok {
+ return nil, ErrNotAuthenticated
+ }
+ return r.ResolveIdentity(id)
+}
diff --git a/api/auth/errors.go b/api/auth/errors.go
new file mode 100644
index 00000000..9675afbf
--- /dev/null
+++ b/api/auth/errors.go
@@ -0,0 +1,6 @@
+package auth
+
+import "errors"
+
+// ErrNotAuthenticated is returned to the client if the user requests an action requiring authentication, and they are not authenticated.
+var ErrNotAuthenticated = errors.New("not authenticated or read-only")
diff --git a/api/auth/middleware.go b/api/auth/middleware.go
new file mode 100644
index 00000000..d1d654ce
--- /dev/null
+++ b/api/auth/middleware.go
@@ -0,0 +1,16 @@
+package auth
+
+import (
+ "net/http"
+
+ "github.com/MichaelMure/git-bug/entity"
+)
+
+func Middleware(fixedUserId entity.Id) func(http.Handler) http.Handler {
+ return func(next http.Handler) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ ctx := CtxWithUser(r.Context(), fixedUserId)
+ next.ServeHTTP(w, r.WithContext(ctx))
+ })
+ }
+}