3131import sonar .logging as log
3232from sonar import utilities , errcodes
3333from sonar .util import types
34+ from sonar .audit .rules import get_rule , RuleId
35+ from sonar .audit .problem import Problem
3436
3537COMMUNITY_GLOBAL_PERMISSIONS = {
3638 "admin" : "Administer System" ,
@@ -71,11 +73,15 @@ class Permissions(ABC):
7173 Abstraction of sonar objects permissions
7274 """
7375
74- def __init__ (self , endpoint : object ) -> None :
75- self .endpoint = endpoint
76+ def __init__ (self , concerned_object : object ) -> None :
77+ self .concerned_object = concerned_object
78+ self .endpoint = concerned_object .endpoint
7679 self .permissions = None
7780 self .read ()
7881
82+ def __str__ (self ) -> str :
83+ return f"permissions of { str (self .concerned_object )} "
84+
7985 def to_json (self , perm_type : str = None , csv : bool = False ) -> types .JsonPermissions :
8086 """Converts a permission object to JSON"""
8187 if not csv :
@@ -98,10 +104,6 @@ def export(self, export_settings: types.ConfigSettings) -> types.ObjectJsonRepr:
98104 return None
99105 return perms
100106
101- @abstractmethod
102- def __str__ (self ) -> str :
103- pass
104-
105107 @abstractmethod
106108 def read (self ) -> Permissions :
107109 """
@@ -130,21 +132,6 @@ def set_group_permissions(self, group_perms: dict[str, list[str]]) -> Permission
130132 """
131133 return self .set ({"groups" : group_perms })
132134
133- """
134- @abstractmethod
135- def remove_user_permissions(self, user_perms_dict):
136- pass
137-
138- @abstractmethod
139- def remove_group_permissions(self, group_perms_dict):
140- pass
141-
142-
143- def remove_permissions(self, perms_dict):
144- self.remove_user_permissions(perms_dict.get("users", None))
145- self.remove_group_permissions(perms_dict.get("groups", None))
146- """
147-
148135 def clear (self ) -> Permissions :
149136 """Clears all permissions of an object
150137 :return: self
@@ -206,6 +193,18 @@ def _filter_permissions_for_edition(self, perms: types.JsonPermissions) -> types
206193 perms .remove (p )
207194 return perms
208195
196+ def audit_nbr_permissions (self , audit_settings : types .ConfigSettings ) -> list [Problem ]:
197+ """Audits that at least one permission is granted to a user or a group
198+ and that at least one group or user has admin permission on the object"""
199+ if self .count () == 0 :
200+ return [Problem (get_rule (RuleId .OBJECT_WITH_NO_PERMISSIONS ), self .concerned_object , str (self .concerned_object ))]
201+ elif self .count (perm_filter = ["admin" ]) == 0 :
202+ return [Problem (get_rule (RuleId .OBJECT_WITH_NO_ADMIN_PERMISSION ), self .concerned_object , str (self .concerned_object ))]
203+ return []
204+
205+ def audit (self , audit_settings : types .ConfigSettings ) -> list [Problem ]:
206+ return self .audit_nbr_permissions (audit_settings )
207+
209208 def count (self , perm_type : Optional [str ] = None , perm_filter : Optional [list [str ]] = None ) -> int :
210209 """Counts number of permissions of an object
211210
@@ -221,7 +220,6 @@ def count(self, perm_type: Optional[str] = None, perm_filter: Optional[list[str]
221220 if perm_filter is None :
222221 continue
223222 perm_counter += len ([1 for p in elem_perms if p in perm_filter ])
224- log .debug ("Perm counts = %d" , (elem_counter if perm_filter is None else perm_counter ))
225223 return elem_counter if perm_filter is None else perm_counter
226224
227225 def _get_api (self , api : str , perm_type : str , ret_field : str , ** extra_params ) -> types .JsonPermissions :
0 commit comments