Skip to content

Commit 7b64953

Browse files
authored
[management] user info with role permissions (#3728)
1 parent 9bc7d78 commit 7b64953

File tree

16 files changed

+446
-291
lines changed

16 files changed

+446
-291
lines changed

management/client/rest/users_test.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,8 @@ var (
3030
Issued: ptr("api"),
3131
LastLogin: &time.Time{},
3232
Name: "M. Essam",
33-
Permissions: &api.UserPermissions{
34-
DashboardView: ptr(api.UserPermissionsDashboardViewFull),
35-
},
36-
Role: "user",
37-
Status: api.UserStatusActive,
33+
Role: "user",
34+
Status: api.UserStatusActive,
3835
}
3936
)
4037

management/server/account/manager.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/netbirdio/netbird/management/server/posture"
1717
"github.com/netbirdio/netbird/management/server/store"
1818
"github.com/netbirdio/netbird/management/server/types"
19+
"github.com/netbirdio/netbird/management/server/users"
1920
"github.com/netbirdio/netbird/route"
2021
)
2122

@@ -115,5 +116,5 @@ type Manager interface {
115116
CreateAccountByPrivateDomain(ctx context.Context, initiatorId, domain string) (*types.Account, error)
116117
UpdateToPrimaryAccount(ctx context.Context, accountId string) (*types.Account, error)
117118
GetOwnerInfo(ctx context.Context, accountId string) (*types.UserInfo, error)
118-
GetCurrentUserInfo(ctx context.Context, accountID, userID string) (*types.UserInfo, error)
119+
GetCurrentUserInfo(ctx context.Context, userAuth nbcontext.UserAuth) (*users.UserInfoWithPermissions, error)
119120
}

management/server/http/api/openapi.yml

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,11 +216,25 @@ components:
216216
UserPermissions:
217217
type: object
218218
properties:
219-
dashboard_view:
220-
description: User's permission to view the dashboard
221-
type: string
222-
enum: [ "limited", "blocked", "full" ]
223-
example: limited
219+
is_restricted:
220+
type: boolean
221+
description: Indicates whether this User's Peers view is restricted
222+
modules:
223+
type: object
224+
additionalProperties:
225+
type: object
226+
additionalProperties:
227+
type: boolean
228+
propertyNames:
229+
type: string
230+
description: The operation type
231+
propertyNames:
232+
type: string
233+
description: The module name
234+
example: {"networks": { "read": true, "create": false, "update": false, "delete": false}, "peers": { "read": false, "create": false, "update": false, "delete": false} }
235+
required:
236+
- modules
237+
- is_restricted
224238
UserRequest:
225239
type: object
226240
properties:

management/server/http/api/types.gen.go

Lines changed: 3 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

management/server/http/handlers/users/users_handler.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/netbirdio/netbird/management/server/http/util"
1414
"github.com/netbirdio/netbird/management/server/status"
1515
"github.com/netbirdio/netbird/management/server/types"
16+
"github.com/netbirdio/netbird/management/server/users"
1617

1718
nbcontext "github.com/netbirdio/netbird/management/server/context"
1819
)
@@ -272,15 +273,33 @@ func (h *handler) getCurrentUser(w http.ResponseWriter, r *http.Request) {
272273
return
273274
}
274275

275-
accountID, userID := userAuth.AccountId, userAuth.UserId
276-
277-
user, err := h.accountManager.GetCurrentUserInfo(ctx, accountID, userID)
276+
user, err := h.accountManager.GetCurrentUserInfo(ctx, userAuth)
278277
if err != nil {
279278
util.WriteError(r.Context(), err, w)
280279
return
281280
}
282281

283-
util.WriteJSONObject(r.Context(), w, toUserResponse(user, userID))
282+
util.WriteJSONObject(r.Context(), w, toUserWithPermissionsResponse(user, userAuth.UserId))
283+
}
284+
285+
func toUserWithPermissionsResponse(user *users.UserInfoWithPermissions, userID string) *api.User {
286+
response := toUserResponse(user.UserInfo, userID)
287+
288+
// stringify modules and operations keys
289+
modules := make(map[string]map[string]bool)
290+
for module, operations := range user.Permissions {
291+
modules[string(module)] = make(map[string]bool)
292+
for op, val := range operations {
293+
modules[string(module)][string(op)] = val
294+
}
295+
}
296+
297+
response.Permissions = &api.UserPermissions{
298+
IsRestricted: user.Restricted,
299+
Modules: modules,
300+
}
301+
302+
return response
284303
}
285304

286305
func toUserResponse(user *types.UserInfo, currenUserID string) *api.User {
@@ -316,8 +335,5 @@ func toUserResponse(user *types.UserInfo, currenUserID string) *api.User {
316335
IsBlocked: user.IsBlocked,
317336
LastLogin: &user.LastLogin,
318337
Issued: &user.Issued,
319-
Permissions: &api.UserPermissions{
320-
DashboardView: (*api.UserPermissionsDashboardView)(&user.Permissions.DashboardView),
321-
},
322338
}
323339
}

0 commit comments

Comments
 (0)