@@ -959,6 +959,47 @@ def decorated_function(*args, **kwargs):
959959 return "Forbidden" , 403
960960 return decorated_function
961961
962+ def get_control_center_capabilities (user = None , settings = None ):
963+ """Return the Control Center permissions implied by the user's roles and settings."""
964+ user = session .get ('user' , {}) if user is None else user
965+ settings = get_settings () if settings is None else settings
966+ require_admin_role = settings .get ("require_member_of_control_center_admin" , False )
967+ require_dashboard_reader_role = settings .get (
968+ "require_member_of_control_center_dashboard_reader" , False
969+ )
970+
971+ has_control_center_admin_role = (
972+ 'roles' in user and 'ControlCenterAdmin' in user ['roles' ]
973+ if isinstance (user , dict )
974+ else False
975+ )
976+ has_dashboard_reader_role = (
977+ 'roles' in user and 'ControlCenterDashboardReader' in user ['roles' ]
978+ if isinstance (user , dict )
979+ else False
980+ )
981+ has_regular_admin_role = (
982+ 'roles' in user and 'Admin' in user ['roles' ]
983+ if isinstance (user , dict )
984+ else False
985+ )
986+
987+ has_full_access = (
988+ has_control_center_admin_role if require_admin_role else has_regular_admin_role
989+ )
990+ can_view_dashboard = has_full_access or (
991+ require_dashboard_reader_role and has_dashboard_reader_role
992+ )
993+ return {
994+ 'can_view_dashboard' : bool (can_view_dashboard ),
995+ 'can_manage_users' : bool (has_full_access ),
996+ 'can_manage_groups' : bool (has_full_access ),
997+ 'can_manage_workspaces' : bool (has_full_access ),
998+ 'can_view_activity_logs' : bool (has_full_access ),
999+ 'can_run_maintenance' : bool (has_full_access ),
1000+ }
1001+
1002+
9621003def control_center_required (access_level = 'admin' ):
9631004 """
9641005 Unified Control Center access control decorator.
@@ -984,48 +1025,34 @@ def decorated_function(*args, **kwargs):
9841025 user = session .get ('user' , {})
9851026 settings = get_settings ()
9861027 require_member_of_control_center_admin = settings .get ("require_member_of_control_center_admin" , False )
987- require_member_of_control_center_dashboard_reader = settings .get ("require_member_of_control_center_dashboard_reader" , False )
988-
989- has_control_center_admin_role = 'roles' in user and 'ControlCenterAdmin' in user ['roles' ]
990- has_dashboard_reader_role = 'roles' in user and 'ControlCenterDashboardReader' in user ['roles' ]
991- has_regular_admin_role = 'roles' in user and 'Admin' in user ['roles' ]
992-
993- # Check if ControlCenterAdmin role requirement is enforced
994- if require_member_of_control_center_admin :
995- # ControlCenterAdmin role is REQUIRED for access
996- # Only ControlCenterAdmin role grants full access
997- if has_control_center_admin_role :
998- return f (* args , ** kwargs )
999-
1000- # For dashboard access, check if DashboardReader role grants access
1001- if access_level == 'dashboard' :
1002- if require_member_of_control_center_dashboard_reader and has_dashboard_reader_role :
1003- return f (* args , ** kwargs )
1004-
1005- # User doesn't have ControlCenterAdmin role, deny access
1006- # Note: Regular Admin role does NOT grant access when this setting is enabled
1007- is_api_request = (request .accept_mimetypes .accept_json and not request .accept_mimetypes .accept_html ) or request .path .startswith ('/api/' )
1008- if is_api_request :
1009- return jsonify ({"error" : "Forbidden" , "message" : "Insufficient permissions (ControlCenterAdmin role required)" }), 403
1010- else :
1011- return "Forbidden: ControlCenterAdmin role required" , 403
1012-
1013- # ControlCenterAdmin requirement is NOT enforced (default behavior)
1014- # Only regular Admin role grants access - ControlCenterAdmin role is IGNORED
1015- if has_regular_admin_role :
1028+ capabilities = get_control_center_capabilities (user , settings )
1029+ permitted = (
1030+ capabilities ['can_view_dashboard' ]
1031+ if access_level == 'dashboard'
1032+ else capabilities ['can_manage_users' ]
1033+ )
1034+ if permitted :
10161035 return f (* args , ** kwargs )
10171036
1018- # For dashboard-only access, check if DashboardReader role is enabled and user has it
1019- if access_level == 'dashboard' :
1020- if require_member_of_control_center_dashboard_reader and has_dashboard_reader_role :
1021- return f (* args , ** kwargs )
1022-
10231037 # User is not an admin and doesn't have special roles - deny access
10241038 is_api_request = (request .accept_mimetypes .accept_json and not request .accept_mimetypes .accept_html ) or request .path .startswith ('/api/' )
10251039 if is_api_request :
1026- return jsonify ({"error" : "Forbidden" , "message" : "Insufficient permissions (Admin role required)" }), 403
1040+ required_role = (
1041+ "ControlCenterAdmin"
1042+ if require_member_of_control_center_admin
1043+ else "Admin"
1044+ )
1045+ return jsonify ({
1046+ "error" : "Forbidden" ,
1047+ "message" : f"Insufficient permissions ({ required_role } role required)" ,
1048+ }), 403
10271049 else :
1028- return "Forbidden: Admin role required" , 403
1050+ required_role = (
1051+ "ControlCenterAdmin"
1052+ if require_member_of_control_center_admin
1053+ else "Admin"
1054+ )
1055+ return f"Forbidden: { required_role } role required" , 403
10291056 return decorated_function
10301057 return decorator
10311058
0 commit comments