Compare commits

...

70 Commits

Author SHA1 Message Date
Pedro Costa
1b39bcaedf Merge remote-tracking branch 'origin/feature/users-roles-endpoint' into feature/users-roles-endpoint 2025-05-07 10:41:51 +01:00
Pedro Costa
0701095da1 Merge branch 'main' into feature/users-roles-endpoint 2025-05-07 10:41:51 +01:00
Pedro Costa
af7d099c96 Merge branch 'main' into feature/users-roles-endpoint 2025-05-05 16:17:38 +01:00
Pedro Costa
09a30b9299 Merge branch 'main' into feature/users-roles-endpoint 2025-05-05 14:25:17 +01:00
Pedro Costa
b582720ca1 Merge branch 'main' into feature/users-roles-endpoint 2025-05-05 11:39:26 +01:00
Pedro Costa
3c68614946 Merge branch 'main' into feature/users-roles-endpoint 2025-05-05 09:14:46 +01:00
Pedro Costa
2b88961b6b Merge branch 'main' into feature/users-roles-endpoint
# Conflicts:
#	management/server/http/handlers/users/users_handler.go
#	management/server/permissions/manager.go
#	management/server/permissions/manager_mock.go
2025-05-01 11:29:10 +01:00
Pedro Costa
5337fc15db Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-05-01 08:52:32 +01:00
Pedro Costa
6e0d23443a Merge branch 'main' into feature/user-info-with-role-permissions 2025-05-01 08:52:30 +01:00
Pedro Costa
e8bdbaa5eb Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-30 16:09:56 +01:00
Pedro Costa
43dd250a0e openapi remove enums for a description instead 2025-04-30 16:09:43 +01:00
Pedro Costa
76d35b10cf update openapi permissions example to crud 2025-04-30 16:02:07 +01:00
Pedro Costa
85a0608f34 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-30 15:54:08 +01:00
Pedro Costa
0741acf8ed Merge branch 'main' into feature/user-info-with-role-permissions 2025-04-30 15:54:06 +01:00
Pedro Costa
b2d79a62d7 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint
# Conflicts:
#	management/server/http/api/openapi.yml
2025-04-30 13:16:54 +01:00
Pedro Costa
1c3d9486af Merge branch 'fix/auditor-view-all-peers' into feature/user-info-with-role-permissions
# Conflicts:
#	management/server/http/api/types.gen.go
2025-04-30 13:16:27 +01:00
Pedro Costa
d48ebc48a3 Merge branch 'main' into fix/auditor-view-all-peers 2025-04-30 13:14:36 +01:00
Pedro Costa
f8ff406d53 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-29 19:27:39 +01:00
Pedro Costa
f049433094 Merge branch 'fix/auditor-view-all-peers' into feature/user-info-with-role-permissions 2025-04-29 19:27:37 +01:00
Pedro Costa
b12f6d08f5 Merge branch 'main' into fix/auditor-view-all-peers 2025-04-29 19:27:35 +01:00
Pedro Costa
4988032f87 prevent child account user from being restricted 2025-04-29 19:27:08 +01:00
Pedro Costa
a404bb1ef4 only restrictable roles get restricted peers views 2025-04-29 10:15:24 +01:00
Pedro Costa
f463f8508a Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-29 10:03:02 +01:00
Pedro Costa
8246dddb07 Merge branch 'fix/auditor-view-all-peers' into feature/user-info-with-role-permissions 2025-04-29 10:02:58 +01:00
Pedro Costa
a5318690a6 shift all peers logic to filter by user only if it does not have read permission 2025-04-29 10:02:44 +01:00
Pedro Costa
9b46e8a70d Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-29 09:37:35 +01:00
Pedro Costa
bf709eb698 Merge branch 'fix/auditor-view-all-peers' into feature/user-info-with-role-permissions 2025-04-29 09:37:33 +01:00
Pedro Costa
a5a8aa7131 [management] auditor allow view all peers 2025-04-29 09:37:04 +01:00
Pedro Costa
c0a8c47a58 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-29 08:43:27 +01:00
Pedro Costa
e82597d0ea Merge branch 'main' into feature/user-info-with-role-permissions 2025-04-29 08:43:24 +01:00
Pedro Costa
cb3aa34915 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-28 08:53:32 +01:00
Pedro Costa
60dcab048e Merge branch 'main' into feature/user-info-with-role-permissions 2025-04-28 08:53:30 +01:00
Pedro Costa
083dacb063 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-25 15:44:43 +01:00
Pedro Costa
c08901a8fb Merge branch 'main' into feature/user-info-with-role-permissions 2025-04-25 15:44:41 +01:00
Pedro Costa
0264073ad1 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-25 14:45:54 +01:00
Pedro Costa
e877d3646f Merge branch 'main' into feature/user-info-with-role-permissions 2025-04-25 14:45:51 +01:00
Pedro Costa
69ba195537 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-24 19:03:53 +01:00
Pedro Costa
32463ac604 Merge branch 'main' into feature/user-info-with-role-permissions 2025-04-24 19:03:51 +01:00
Pedro Costa
6716701a92 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-24 15:18:42 +01:00
Pedro Costa
73176e7bff Merge branch 'main' into feature/user-info-with-role-permissions 2025-04-24 15:18:40 +01:00
Pedro Costa
0b392aa833 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-24 08:47:30 +01:00
Pedro Costa
67f7d7e870 Merge branch 'main' into feature/user-info-with-role-permissions
# Conflicts:
#	management/server/mock_server/account_mock.go
2025-04-24 08:47:28 +01:00
Pedro Costa
dd3bf0deb7 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-23 15:13:28 +01:00
Pedro Costa
546e2cc0c3 Merge branch 'feature/additional-roles' into feature/user-info-with-role-permissions 2025-04-23 15:13:26 +01:00
Pedro Costa
ce08732d95 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-23 10:17:33 +01:00
Pedro Costa
b3572abc26 Merge branch 'feature/additional-roles' into feature/user-info-with-role-permissions 2025-04-23 10:17:30 +01:00
Pedro Costa
6f68fdee16 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-22 09:01:08 +01:00
Pedro Costa
e32e74ed5d Merge branch 'feature/additional-roles' into feature/user-info-with-role-permissions 2025-04-22 09:01:06 +01:00
Pedro Costa
17b4a6bfcb Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint
# Conflicts:
#	management/server/permissions/manager.go
#	management/server/permissions/manager_mock.go
2025-04-17 19:29:17 +01:00
Pedro Costa
808b7703aa better method name 2025-04-17 19:25:09 +01:00
Pedro Costa
a4de398b08 include all modules in roles response 2025-04-17 19:23:45 +01:00
Pedro Costa
8551ffc44d Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint
# Conflicts:
#	management/server/http/handlers/users/users_handler.go
#	management/server/permissions/manager.go
2025-04-17 18:58:58 +01:00
Pedro Costa
d9ad20fd0e get role permissions for all modules 2025-04-17 18:55:44 +01:00
Pedro Costa
0a1c8b2f94 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint
# Conflicts:
#	management/server/http/handlers/users/users_handler.go
2025-04-17 15:34:05 +01:00
Pedro Costa
a01a8174ba Merge branch 'feature/additional-roles' into feature/user-info-with-role-permissions 2025-04-17 15:33:07 +01:00
Pedro Costa
82ab78d176 make user permissions optional 2025-04-17 15:32:44 +01:00
Pedro Costa
1a145eda47 common response transforms 2025-04-16 21:58:54 +01:00
Pedro Costa
c69d4e40c4 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-16 21:25:11 +01:00
Pedro Costa
e42d4c06c2 fix rest test 2025-04-16 21:24:39 +01:00
Pedro Costa
92929d227d Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-16 19:34:52 +01:00
Pedro Costa
ab391ed9fa [management] restrict dashboard only to restrictable roles 2025-04-16 19:34:20 +01:00
Pedro Costa
22b06fff0b Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-16 17:03:18 +01:00
Pedro Costa
974f297022 Merge branch 'feature/additional-roles' into feature/user-info-with-role-permissions 2025-04-16 17:03:15 +01:00
Pedro Costa
f8804ec6d8 Merge branch 'feature/user-info-with-role-permissions' into feature/users-roles-endpoint 2025-04-16 12:42:41 +01:00
Pedro Costa
ca356f1dae fix rest test 2025-04-16 12:42:22 +01:00
Pedro Costa
42f088b80f [management] users roles endpoint 2025-04-16 12:39:58 +01:00
Pedro Costa
96b22d5140 Merge branch 'feature/additional-roles' into feature/user-info-with-role-permissions 2025-04-16 11:48:25 +01:00
Pedro Costa
467b0f94b1 better naming of exposed user permissions 2025-04-16 11:48:10 +01:00
Pedro Costa
f6d6cd61a5 Merge branch 'feature/additional-roles' into feature/user-info-with-role-permissions 2025-04-15 22:26:59 +01:00
Pedro Costa
5e989dff4f [management] user info with role permissions 2025-04-15 22:26:41 +01:00
10 changed files with 265 additions and 42 deletions

View File

@@ -203,7 +203,7 @@ var (
}
permissionsManager := integrations.InitPermissionsManager(store)
userManager := users.NewManager(store)
userManager := users.NewManager(store, permissionsManager)
extraSettingsManager := integrations.NewManager(eventStore)
settingsManager := settings.NewManager(store, userManager, extraSettingsManager, permissionsManager)
peersManager := peers.NewManager(store, permissionsManager)
@@ -275,8 +275,9 @@ var (
resourcesManager := resources.NewManager(store, permissionsManager, groupsManager, accountManager)
routersManager := routers.NewManager(store, permissionsManager, accountManager)
networksManager := networks.NewManager(store, permissionsManager, resourcesManager, routersManager, accountManager)
usersManager := users.NewManager(store, permissionsManager)
httpAPIHandler, err := nbhttp.NewAPIHandler(ctx, accountManager, networksManager, resourcesManager, routersManager, groupsManager, geo, authManager, appMetrics, integratedPeerValidator, proxyController, permissionsManager, peersManager, settingsManager)
httpAPIHandler, err := nbhttp.NewAPIHandler(ctx, accountManager, networksManager, resourcesManager, routersManager, groupsManager, geo, authManager, appMetrics, integratedPeerValidator, proxyController, permissionsManager, peersManager, settingsManager, usersManager)
if err != nil {
return fmt.Errorf("failed creating HTTP API handler: %v", err)

View File

@@ -2055,6 +2055,42 @@ components:
- page_size
- total_records
- total_pages
RolePermissions:
type: object
properties:
role:
type: string
example: admin
modules:
type: object
additionalProperties:
type: object
additionalProperties:
type: boolean
propertyNames:
type: string
enum:
- read
- write
propertyNames:
type: string
enum:
- read
- write
example: {"networks": { "read": true, "write": false}, "peers": { "read": false, "write": false} }
default:
type: object
additionalProperties:
type: boolean
propertyNames:
type: string
enum:
- read
- write
required:
- default
- modules
- role
responses:
not_found:
description: Resource not found
@@ -2485,6 +2521,31 @@ paths:
"$ref": "#/components/responses/forbidden"
'500':
"$ref": "#/components/responses/internal_error"
/api/users/roles:
get:
summary: Retrieves user roles and permissions
description: Get permissions for user roles
tags: [ Users ]
security:
- BearerAuth: [ ]
- TokenAuth: [ ]
responses:
'200':
description: A JSON Array of RolePermissions objects
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/RolePermissions'
'400':
"$ref": "#/components/responses/bad_request"
'401':
"$ref": "#/components/responses/requires_authentication"
'403':
"$ref": "#/components/responses/forbidden"
'500':
"$ref": "#/components/responses/internal_error"
/api/peers:
get:
summary: List all Peers

View File

@@ -1447,6 +1447,13 @@ type Resource struct {
// ResourceType defines model for ResourceType.
type ResourceType string
// RolePermissions defines model for RolePermissions.
type RolePermissions struct {
Default map[string]bool `json:"default"`
Modules map[string]map[string]bool `json:"modules"`
Role string `json:"role"`
}
// Route defines model for Route.
type Route struct {
// AccessControlGroups Access control group identifier associated with route.

View File

@@ -36,6 +36,7 @@ import (
"github.com/netbirdio/netbird/management/server/networks/routers"
nbpeers "github.com/netbirdio/netbird/management/server/peers"
"github.com/netbirdio/netbird/management/server/telemetry"
musers "github.com/netbirdio/netbird/management/server/users"
)
const apiPrefix = "/api"
@@ -56,6 +57,7 @@ func NewAPIHandler(
permissionsManager permissions.Manager,
peersManager nbpeers.Manager,
settingsManager settings.Manager,
usersManager musers.Manager,
) (http.Handler, error) {
authMiddleware := middleware.NewAuthMiddleware(
@@ -81,7 +83,7 @@ func NewAPIHandler(
accounts.AddEndpoints(accountManager, settingsManager, router)
peers.AddEndpoints(accountManager, router)
users.AddEndpoints(accountManager, router)
users.AddEndpoints(accountManager, usersManager, router)
setup_keys.AddEndpoints(accountManager, router)
policies.AddEndpoints(accountManager, LocationManager, router)
policies.AddPostureCheckEndpoints(accountManager, LocationManager, router)

View File

@@ -11,6 +11,8 @@ import (
"github.com/netbirdio/netbird/management/server/account"
"github.com/netbirdio/netbird/management/server/http/api"
"github.com/netbirdio/netbird/management/server/http/util"
"github.com/netbirdio/netbird/management/server/permissions/operations"
"github.com/netbirdio/netbird/management/server/permissions/roles"
"github.com/netbirdio/netbird/management/server/status"
"github.com/netbirdio/netbird/management/server/types"
"github.com/netbirdio/netbird/management/server/users"
@@ -21,23 +23,26 @@ import (
// handler is a handler that returns users of the account
type handler struct {
accountManager account.Manager
usersManager users.Manager
}
func AddEndpoints(accountManager account.Manager, router *mux.Router) {
userHandler := newHandler(accountManager)
func AddEndpoints(accountManager account.Manager, usersManager users.Manager, router *mux.Router) {
userHandler := newHandler(accountManager, usersManager)
router.HandleFunc("/users", userHandler.getAllUsers).Methods("GET", "OPTIONS")
router.HandleFunc("/users/current", userHandler.getCurrentUser).Methods("GET", "OPTIONS")
router.HandleFunc("/users/{userId}", userHandler.updateUser).Methods("PUT", "OPTIONS")
router.HandleFunc("/users/{userId}", userHandler.deleteUser).Methods("DELETE", "OPTIONS")
router.HandleFunc("/users", userHandler.createUser).Methods("POST", "OPTIONS")
router.HandleFunc("/users/{userId}/invite", userHandler.inviteUser).Methods("POST", "OPTIONS")
router.HandleFunc("/users/roles", userHandler.getRoles).Methods("GET", "OPTIONS")
addUsersTokensEndpoint(accountManager, router)
}
// newHandler creates a new UsersHandler HTTP handler
func newHandler(accountManager account.Manager) *handler {
func newHandler(accountManager account.Manager, usersManager users.Manager) *handler {
return &handler{
accountManager: accountManager,
usersManager: usersManager,
}
}
@@ -282,21 +287,66 @@ func (h *handler) getCurrentUser(w http.ResponseWriter, r *http.Request) {
util.WriteJSONObject(r.Context(), w, toUserWithPermissionsResponse(user, userAuth.UserId))
}
func (h *handler) getRoles(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
util.WriteErrorResponse("wrong HTTP method", http.StatusMethodNotAllowed, w)
return
}
ctx := r.Context()
userAuth, err := nbcontext.GetUserAuthFromContext(ctx)
if err != nil {
util.WriteError(r.Context(), err, w)
return
}
accountID, userID := userAuth.AccountId, userAuth.UserId
roles, err := h.usersManager.GetRoles(ctx, accountID, userID)
if err != nil {
util.WriteError(r.Context(), err, w)
return
}
util.WriteJSONObject(r.Context(), w, toRolesResponse(roles))
}
func toRolesResponse(roles []roles.RolePermissions) []api.RolePermissions {
result := make([]api.RolePermissions, 0, len(roles))
for _, permissions := range roles {
rolePermissions := api.RolePermissions{
Role: string(permissions.Role),
Default: toOperationsMapResponse(permissions.AutoAllowNew),
Modules: toModulesMapResponse(permissions.Permissions),
}
result = append(result, rolePermissions)
}
return result
}
func toOperationsMapResponse(operations map[operations.Operation]bool) map[string]bool {
result := make(map[string]bool)
for op, val := range operations {
result[string(op)] = val
}
return result
}
func toModulesMapResponse(permissions roles.Permissions) map[string]map[string]bool {
// stringify modules and operations keys
modules := make(map[string]map[string]bool)
for module, operations := range permissions {
modules[string(module)] = toOperationsMapResponse(operations)
}
return modules
}
func toUserWithPermissionsResponse(user *users.UserInfoWithPermissions, userID string) *api.User {
response := toUserResponse(user.UserInfo, userID)
// stringify modules and operations keys
modules := make(map[string]map[string]bool)
for module, operations := range user.Permissions {
modules[string(module)] = make(map[string]bool)
for op, val := range operations {
modules[string(module)][string(op)] = val
}
}
response.Permissions = &api.UserPermissions{
IsRestricted: user.Restricted,
Modules: modules,
Modules: toModulesMapResponse(user.Permissions),
}
return response

View File

@@ -135,9 +135,9 @@ func BuildApiBlackBoxWithDBState(t TB, sqlFile string, expectedPeerUpdate *serve
geoMock := &geolocation.Mock{}
validatorMock := server.MocIntegratedValidator{}
proxyController := integrations.NewController(store)
userManager := users.NewManager(store)
permissionsManager := permissions.NewManager(store)
settingsManager := settings.NewManager(store, userManager, integrations.NewManager(&activity.InMemoryEventStore{}), permissionsManager)
usersManager := users.NewManager(store, permissionsManager)
settingsManager := settings.NewManager(store, usersManager, integrations.NewManager(&activity.InMemoryEventStore{}), permissionsManager)
am, err := server.BuildManager(context.Background(), store, peersUpdateManager, nil, "", "", &activity.InMemoryEventStore{}, geoMock, false, validatorMock, metrics, proxyController, settingsManager, permissionsManager)
if err != nil {
t.Fatalf("Failed to create manager: %v", err)
@@ -158,7 +158,7 @@ func BuildApiBlackBoxWithDBState(t TB, sqlFile string, expectedPeerUpdate *serve
groupsManagerMock := groups.NewManagerMock()
peersManager := peers.NewManager(store, permissionsManager)
apiHandler, err := nbhttp.NewAPIHandler(context.Background(), am, networksManagerMock, resourcesManagerMock, routersManagerMock, groupsManagerMock, geoMock, authManagerMock, metrics, validatorMock, proxyController, permissionsManager, peersManager, settingsManager)
apiHandler, err := nbhttp.NewAPIHandler(context.Background(), am, networksManagerMock, resourcesManagerMock, routersManagerMock, groupsManagerMock, geoMock, authManagerMock, metrics, validatorMock, proxyController, permissionsManager, peersManager, settingsManager, usersManager)
if err != nil {
t.Fatalf("Failed to create API handler: %v", err)
}

View File

@@ -22,6 +22,7 @@ type Manager interface {
ValidateAccountAccess(ctx context.Context, accountID string, user *types.User, allowOwnerAndAdmin bool) error
GetPermissionsByRole(ctx context.Context, role types.UserRole) (roles.Permissions, error)
GetPermissions(ctx context.Context) []roles.RolePermissions
}
type managerImpl struct {
@@ -117,3 +118,17 @@ func (m *managerImpl) GetPermissionsByRole(ctx context.Context, role types.UserR
return permissions, nil
}
func (m *managerImpl) GetPermissions(ctx context.Context) []roles.RolePermissions {
permissions := make([]roles.RolePermissions, 0, len(roles.RolesMap))
for role, roleMap := range roles.RolesMap {
rolePermissions, _ := m.GetPermissionsByRole(ctx, role)
permissions = append(permissions, roles.RolePermissions{
Role: role,
Permissions: rolePermissions,
AutoAllowNew: roleMap.AutoAllowNew,
})
}
return permissions
}

View File

@@ -38,6 +38,20 @@ func (m *MockManager) EXPECT() *MockManagerMockRecorder {
return m.recorder
}
// GetPermissions mocks base method.
func (m *MockManager) GetPermissions(ctx context.Context) []roles.RolePermissions {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetPermissions", ctx)
ret0, _ := ret[0].([]roles.RolePermissions)
return ret0
}
// GetPermissions indicates an expected call of GetPermissions.
func (mr *MockManagerMockRecorder) GetPermissions(ctx interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPermissions", reflect.TypeOf((*MockManager)(nil).GetPermissions), ctx)
}
// GetPermissionsByRole mocks base method.
func (m *MockManager) GetPermissionsByRole(ctx context.Context, role types.UserRole) (roles.Permissions, error) {
m.ctrl.T.Helper()

View File

@@ -1,27 +1,31 @@
package users
//go:generate go run github.com/golang/mock/mockgen -package users -destination=manager_mock.go -source=./manager.go -build_flags=-mod=mod
import (
"context"
"errors"
"github.com/netbirdio/netbird/management/server/permissions"
"github.com/netbirdio/netbird/management/server/permissions/roles"
"github.com/netbirdio/netbird/management/server/status"
"github.com/netbirdio/netbird/management/server/store"
"github.com/netbirdio/netbird/management/server/types"
)
type Manager interface {
GetUser(ctx context.Context, userID string) (*types.User, error)
GetRoles(ctx context.Context, accountId, userId string) ([]roles.RolePermissions, error)
}
type managerImpl struct {
store store.Store
store store.Store
permissionsManager permissions.Manager
}
type managerMock struct {
}
func NewManager(store store.Store) Manager {
func NewManager(store store.Store, permissionsManager permissions.Manager) Manager {
return &managerImpl{
store: store,
store: store,
permissionsManager: permissionsManager,
}
}
@@ -29,21 +33,23 @@ func (m *managerImpl) GetUser(ctx context.Context, userID string) (*types.User,
return m.store.GetUserByUserID(ctx, store.LockingStrengthShare, userID)
}
func NewManagerMock() Manager {
return &managerMock{}
}
func (m *managerMock) GetUser(ctx context.Context, userID string) (*types.User, error) {
switch userID {
case "adminUser":
return &types.User{Id: userID, Role: types.UserRoleAdmin}, nil
case "regularUser":
return &types.User{Id: userID, Role: types.UserRoleUser}, nil
case "ownerUser":
return &types.User{Id: userID, Role: types.UserRoleOwner}, nil
case "billingUser":
return &types.User{Id: userID, Role: types.UserRoleBillingAdmin}, nil
default:
return nil, errors.New("user not found")
func (m *managerImpl) GetRoles(ctx context.Context, accountId, userId string) ([]roles.RolePermissions, error) {
user, err := m.store.GetUserByUserID(ctx, store.LockingStrengthShare, userId)
if err != nil {
return nil, err
}
if user.IsBlocked() {
return nil, status.NewUserBlockedError()
}
if user.IsServiceUser {
return nil, status.NewPermissionDeniedError()
}
if err := m.permissionsManager.ValidateAccountAccess(ctx, accountId, user, false); err != nil {
return nil, err
}
return m.permissionsManager.GetPermissions(ctx), nil
}

View File

@@ -0,0 +1,67 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: ./manager.go
// Package users is a generated GoMock package.
package users
import (
context "context"
reflect "reflect"
gomock "github.com/golang/mock/gomock"
roles "github.com/netbirdio/netbird/management/server/permissions/roles"
types "github.com/netbirdio/netbird/management/server/types"
)
// MockManager is a mock of Manager interface.
type MockManager struct {
ctrl *gomock.Controller
recorder *MockManagerMockRecorder
}
// MockManagerMockRecorder is the mock recorder for MockManager.
type MockManagerMockRecorder struct {
mock *MockManager
}
// NewMockManager creates a new mock instance.
func NewMockManager(ctrl *gomock.Controller) *MockManager {
mock := &MockManager{ctrl: ctrl}
mock.recorder = &MockManagerMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockManager) EXPECT() *MockManagerMockRecorder {
return m.recorder
}
// GetRoles mocks base method.
func (m *MockManager) GetRoles(ctx context.Context, accountId, userId string) (map[types.UserRole]roles.RolePermissions, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetRoles", ctx, accountId, userId)
ret0, _ := ret[0].(map[types.UserRole]roles.RolePermissions)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetRoles indicates an expected call of GetRoles.
func (mr *MockManagerMockRecorder) GetRoles(ctx, accountId, userId interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRoles", reflect.TypeOf((*MockManager)(nil).GetRoles), ctx, accountId, userId)
}
// GetUser mocks base method.
func (m *MockManager) GetUser(ctx context.Context, userID string) (*types.User, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetUser", ctx, userID)
ret0, _ := ret[0].(*types.User)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetUser indicates an expected call of GetUser.
func (mr *MockManagerMockRecorder) GetUser(ctx, userID interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUser", reflect.TypeOf((*MockManager)(nil).GetUser), ctx, userID)
}