Skip to content

Commit 73cb026

Browse files
committed
HasWritePermissions.
1 parent b1fdbd3 commit 73cb026

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

auth/service/api/v1/permission.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,35 @@ func (r *Router) requireUserHasCustodian(targetParamUserID string, handlerFunc r
3333
}
3434
return api.RequireUser(fn)
3535
}
36+
37+
// requireWriteAccess aborts with an error if the request isn't a server request
38+
// or the authenticated user doesn't have access to the user id in the url param,
39+
// targetParamUserID
40+
func (r *Router) requireWriteAccess(targetParamUserID string, handlerFunc rest.HandlerFunc) rest.HandlerFunc {
41+
return func(res rest.ResponseWriter, req *rest.Request) {
42+
if handlerFunc != nil && res != nil && req != nil {
43+
targetUserID := req.PathParam(targetParamUserID)
44+
responder := request.MustNewResponder(res, req)
45+
ctx := req.Context()
46+
details := request.GetAuthDetails(ctx)
47+
if details == nil {
48+
responder.Empty(http.StatusUnauthorized)
49+
return
50+
}
51+
if details.IsService() {
52+
handlerFunc(res, req)
53+
return
54+
}
55+
hasPerms, err := r.PermissionsClient().HasWritePermissions(ctx, details.UserID(), targetUserID)
56+
if err != nil {
57+
responder.InternalServerError(err)
58+
return
59+
}
60+
if !hasPerms {
61+
responder.Empty(http.StatusForbidden)
62+
return
63+
}
64+
handlerFunc(res, req)
65+
}
66+
}
67+
}

auth/service/api/v1/profile.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import (
1515
func (r *Router) ProfileRoutes() []*rest.Route {
1616
return []*rest.Route{
1717
rest.Get("/v1/profiles/:userId", api.RequireUser(r.GetProfile)),
18-
rest.Put("/v1/profiles/:userId", r.requireUserHasCustodian("userId", r.UpdateProfile)),
19-
rest.Delete("/v1/profiles/:userId", r.requireUserHasCustodian("userId", r.DeleteProfile)),
18+
// The following modification routes required custodian access in seagull, but I'm not sure that's quite right - it seems it should be if the user can modify the userId.
19+
rest.Put("/v1/profiles/:userId", r.requireWriteAccess("userId", r.UpdateProfile)),
20+
rest.Delete("/v1/profiles/:userId", r.requireWriteAccess("userId", r.DeleteProfile)),
2021
}
2122
}
2223

permission/client/client.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,15 @@ func (c *Client) HasCustodianPermissions(ctx context.Context, granteeUserID, gra
7272
}
7373
return len(perms[permission.Custodian]) > 0, nil
7474
}
75+
76+
func (c *Client) HasWritePermissions(ctx context.Context, granteeUserID, grantorUserID string) (has bool, err error) {
77+
if granteeUserID != "" && granteeUserID == grantorUserID {
78+
return true, nil
79+
}
80+
perms, err := c.GetUserPermissions(ctx, granteeUserID, grantorUserID)
81+
if err != nil {
82+
return false, err
83+
}
84+
return len(perms[permission.Custodian]) > 0 || len(perms[permission.Write]) > 0 || len(perms[permission.Owner]) > 0, nil
85+
86+
}

permission/permission.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type Client interface {
2020
// Not sure whether to put these methods in platform/permission or go-common/clients
2121
HasMembershipRelationship(ctx context.Context, granteeUserID, grantorUserID string) (has bool, err error)
2222
HasCustodianPermissions(ctx context.Context, granteeUserID, grantorUserID string) (has bool, err error)
23+
HasWritePermissions(ctx context.Context, granteeUserID, grantorUserID string) (has bool, err error)
2324
}
2425

2526
func FixOwnerPermissions(permissions Permissions) Permissions {

0 commit comments

Comments
 (0)