summaryrefslogtreecommitdiff
path: root/pkg/authz
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/authz')
-rw-r--r--pkg/authz/check_service.go52
-rw-r--r--pkg/authz/init.go58
-rw-r--r--pkg/authz/permission.go7
3 files changed, 68 insertions, 49 deletions
diff --git a/pkg/authz/check_service.go b/pkg/authz/check_service.go
index 4df0ebe7..75ba3963 100644
--- a/pkg/authz/check_service.go
+++ b/pkg/authz/check_service.go
@@ -11,6 +11,7 @@ import (
auth "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3"
types "github.com/envoyproxy/go-control-plane/envoy/type/v3"
"github.com/xlgmokha/x/pkg/log"
+ "github.com/xlgmokha/x/pkg/mapper"
"github.com/xlgmokha/x/pkg/x"
"gitlab.com/gitlab-org/software-supply-chain-security/authorization/authzd.git/pkg/pls"
status "google.golang.org/genproto/googleapis/rpc/status"
@@ -41,7 +42,7 @@ func (svc *CheckService) isAuthorized(ctx context.Context, r *auth.CheckRequest)
if !svc.validRequest(ctx, r) {
return false
}
- log.WithFields(ctx, svc.fieldsFor(r))
+ log.WithFields(ctx, mapper.MapFrom[*auth.CheckRequest, log.Fields](r))
if svc.isStaticAsset(ctx, r) {
return true
@@ -51,7 +52,7 @@ func (svc *CheckService) isAuthorized(ctx context.Context, r *auth.CheckRequest)
return false
}
- response, err := svc.client.CheckPermission(ctx, svc.mapFrom(ctx, r))
+ response, err := svc.client.CheckPermission(ctx, mapper.MapFrom[*auth.CheckRequest, *v1.CheckPermissionRequest](r))
if err != nil {
pls.LogError(ctx, err)
return false
@@ -109,50 +110,3 @@ func (svc *CheckService) Denied(ctx context.Context) *auth.CheckResponse {
},
}
}
-
-func (svc *CheckService) fieldsFor(r *auth.CheckRequest) log.Fields {
- return log.Fields{
- "host": r.Attributes.Request.Http.Host,
- "id": r.Attributes.Request.Http.Id,
- "method": r.Attributes.Request.Http.Method,
- "path": r.Attributes.Request.Http.Path,
- "protocol": r.Attributes.Request.Http.Protocol,
- "request_id": r.Attributes.Request.Http.Headers["x-request-id"],
- "scheme": r.Attributes.Request.Http.Scheme,
- "subject": r.Attributes.Request.Http.Headers["x-jwt-claim-username"],
- }
-}
-
-func (svc *CheckService) mapFrom(ctx context.Context, r *auth.CheckRequest) *v1.CheckPermissionRequest {
- return &v1.CheckPermissionRequest{
- Resource: svc.resourceFrom(ctx, r),
- Permission: svc.permissionFrom(ctx, r),
- Subject: svc.subjectFrom(ctx, r),
- }
-}
-
-func (svc *CheckService) resourceFrom(ctx context.Context, r *auth.CheckRequest) *v1.ObjectReference {
- return &v1.ObjectReference{
- ObjectType: "project",
- ObjectId: "1",
- }
-}
-
-func (svc *CheckService) subjectFrom(ctx context.Context, r *auth.CheckRequest) *v1.SubjectReference {
- //TODO:: username is not ideal but it works for demo purposes
- username := r.Attributes.Request.Http.Headers["x-jwt-claim-username"]
- if x.IsZero(username) {
- username = "public"
- }
-
- return &v1.SubjectReference{
- Object: &v1.ObjectReference{
- ObjectType: "user",
- ObjectId: username,
- },
- }
-}
-
-func (svc *CheckService) permissionFrom(ctx context.Context, r *auth.CheckRequest) string {
- return "read"
-}
diff --git a/pkg/authz/init.go b/pkg/authz/init.go
new file mode 100644
index 00000000..3ceb1412
--- /dev/null
+++ b/pkg/authz/init.go
@@ -0,0 +1,58 @@
+package authz
+
+import (
+ v1 "github.com/authzed/authzed-go/proto/authzed/api/v1"
+ auth "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3"
+ "github.com/xlgmokha/x/pkg/log"
+ "github.com/xlgmokha/x/pkg/mapper"
+ "github.com/xlgmokha/x/pkg/x"
+)
+
+func init() {
+ mapper.Register[*auth.CheckRequest, log.Fields](func(r *auth.CheckRequest) log.Fields {
+ return log.Fields{
+ "host": r.Attributes.Request.Http.Host,
+ "id": r.Attributes.Request.Http.Id,
+ "method": r.Attributes.Request.Http.Method,
+ "path": r.Attributes.Request.Http.Path,
+ "protocol": r.Attributes.Request.Http.Protocol,
+ "request_id": r.Attributes.Request.Http.Headers["x-request-id"],
+ "scheme": r.Attributes.Request.Http.Scheme,
+ "subject": r.Attributes.Request.Http.Headers["x-jwt-claim-username"],
+ }
+ })
+
+ mapper.Register[*auth.CheckRequest, *v1.ObjectReference](func(r *auth.CheckRequest) *v1.ObjectReference {
+ return &v1.ObjectReference{
+ ObjectType: "project",
+ ObjectId: "1",
+ }
+ })
+
+ mapper.Register[*auth.CheckRequest, *v1.SubjectReference](func(r *auth.CheckRequest) *v1.SubjectReference {
+ //TODO:: username is not ideal but it works for demo purposes
+ username := r.Attributes.Request.Http.Headers["x-jwt-claim-username"]
+ if x.IsZero(username) {
+ username = "public"
+ }
+
+ return &v1.SubjectReference{
+ Object: &v1.ObjectReference{
+ ObjectType: "user",
+ ObjectId: username,
+ },
+ }
+ })
+
+ mapper.Register[*auth.CheckRequest, Permission](func(r *auth.CheckRequest) Permission {
+ return "read"
+ })
+
+ mapper.Register[*auth.CheckRequest, *v1.CheckPermissionRequest](func(r *auth.CheckRequest) *v1.CheckPermissionRequest {
+ return &v1.CheckPermissionRequest{
+ Resource: mapper.MapFrom[*auth.CheckRequest, *v1.ObjectReference](r),
+ Permission: mapper.MapFrom[*auth.CheckRequest, Permission](r).String(),
+ Subject: mapper.MapFrom[*auth.CheckRequest, *v1.SubjectReference](r),
+ }
+ })
+}
diff --git a/pkg/authz/permission.go b/pkg/authz/permission.go
new file mode 100644
index 00000000..b97e7202
--- /dev/null
+++ b/pkg/authz/permission.go
@@ -0,0 +1,7 @@
+package authz
+
+type Permission string
+
+func (p Permission) String() string {
+ return string(p)
+}