-
Notifications
You must be signed in to change notification settings - Fork 809
Add new options like INHERIT and SET to the Role's membership tab. #6451 #9539
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -207,80 +207,65 @@ def _process_rolemembership(self, id, data): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| :param id: id of role | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| :param data: input role data | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def _part_dict_list(dict_list, condition, list_key=None): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def _part_dict_list(dict_list, condition): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ret_val = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for d in dict_list: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if condition(d): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ret_val.append(d[list_key]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ret_val.append(d) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return ret_val | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if id == -1: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['members'] = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['admins'] = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['admins'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'], lambda d: d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['members'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'], lambda d: not d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership_list'] = data['rolmembership'] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['admins'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'].get('added', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['members'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'].get('added', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: not d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['admins'].extend(_part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'].get('changed', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: d['admin'], 'role')) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['revoked_admins'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'].get('changed', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: not d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['revoked'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'].get('deleted', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda _: True, 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership_list'] = data['rolmembership'].get('added', []) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if self.manager.version < 160000: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership_list'].extend(_part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'].get('changed', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: d['admin'])) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership_revoked_admins'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'].get('changed', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: not d['admin']) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership_list'].extend( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'].get('changed', [])) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership_revoked_list'] = ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'].get('deleted', [])) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def _process_rolmembers(self, id, data): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Parser role members. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| :param id: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| :param data: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def _part_dict_list(dict_list, condition, list_key=None): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def _part_dict_list(dict_list, condition): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ret_val = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for d in dict_list: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if condition(d): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ret_val.append(d[list_key]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ret_val.append(d) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return ret_val | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if id == -1: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_members'] = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_admins'] = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_members_list'] = data['rolmembers'] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_admins'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'], lambda d: d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_members'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'], lambda d: not d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_admins'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'].get('added', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_members'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'].get('added', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: not d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_admins'].extend(_part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'].get('changed', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: d['admin'], 'role')) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_revoked_admins'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'].get('changed', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: not d['admin'], 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_revoked'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'].get('deleted', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda _: True, 'role') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_members_list'] = data['rolmembers'].get('added', []) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if self.manager.version < 160000: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_members_list'].extend(_part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'].get('changed', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: d['admin'])) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_members_revoked_admins'] = _part_dict_list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'].get('changed', []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda d: not d['admin']) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_members_list'].extend( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'].get('changed', [])) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rol_members_revoked_list'] = ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'].get('deleted', [])) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def _validate_rolemembers(self, id, data): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -298,13 +283,21 @@ def _validate_rolemembers(self, id, data): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rolmembers:[{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role: [rolename], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inherit: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ]""") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if not self._validate_input_dict_for_new(data['rolmembers'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ['role', 'admin']): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (self.manager.version < 160000 and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not self._validate_input_dict_for_new( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'], ['role', 'admin'])): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| elif (self.manager.version >= 160000 and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not self._validate_input_dict_for_new( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ['role', 'admin', 'inherit', 'set'])): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| self._process_rolmembers(id, data) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -316,26 +309,38 @@ def _validate_rolemembers(self, id, data): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rolmembers:{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'added': [{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role: [rolename], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inherit: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'deleted': [{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role: [rolename], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inherit: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'updated': [{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role: [rolename], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inherit: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| """) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if not self._validate_input_dict_for_update(data['rolmembers'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ['role', 'admin'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ['role']): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (self.manager.version < 160000 and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not self._validate_input_dict_for_update( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'], ['role', 'admin'], ['role'])): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| elif (self.manager.version >= 160000 and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not self._validate_input_dict_for_update( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembers'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ['role', 'admin', 'inherit', 'set'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ['role'])): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| self._process_rolmembers(id, data) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -357,13 +362,21 @@ def _validate_rolemembership(self, id, data): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rolmembership:[{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role: [rolename], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inherit: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ]""") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if not self._validate_input_dict_for_new( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'], ['role', 'admin']): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (self.manager.version < 160000 and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not self._validate_input_dict_for_new( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'], ['role', 'admin'])): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| elif (self.manager.version >= 160000 and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not self._validate_input_dict_for_new( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ['role', 'admin', 'inherit', 'set'])): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| self._process_rolemembership(id, data) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -375,25 +388,38 @@ def _validate_rolemembership(self, id, data): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rolmembership:{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'added': [{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role: [rolename], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inherit: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'deleted': [{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role: [rolename], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inherit: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'updated': [{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role: [rolename], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| admin: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inherit: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set: True/False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| """) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if not self._validate_input_dict_for_update( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'], ['role', 'admin'], ['role']): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (self.manager.version < 160000 and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not self._validate_input_dict_for_update( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'], ['role', 'admin'], ['role'])): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| elif (self.manager.version >= 160000 and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not self._validate_input_dict_for_update( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data['rolmembership'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ['role', 'admin', 'inherit', 'set'], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ['role'])): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| self._process_rolemembership(id, data) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -792,16 +818,25 @@ def _set_seclabels(self, row): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| row['seclabels'] = res | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def _set_rolemembership(self, row): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def _set_rolemembers(self, row): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if 'rolmembers' in row and row['rolmembers'] is not None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rolmembers = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for role in row['rolmembers']: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role = re.search(r'([01])(.+)', role) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rolmembers.append({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'role': role.group(2), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'admin': True if role.group(1) == '1' else False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if self.manager.version < 160000: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role = re.search(r'([01])(.+)', role) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rolmembers.append({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'role': role.group(2), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'admin': True if role.group(1) == '1' else False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role = re.search(r'([01])([01])([01])(.+)', role) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rolmembers.append({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'role': role.group(4), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'admin': True if role.group(1) == '1' else False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'inherit': True if role.group(2) == '1' else False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'set': True if role.group(3) == '1' else False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| row['rolmembers'] = rolmembers | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+821
to
841
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Harden Proposed hardening (use anchored match + guard) def _set_rolemembers(self, row):
@@
for role in row['rolmembers']:
if self.manager.version < 160000:
- role = re.search(r'([01])(.+)', role)
+ m = re.match(r'^([01])(.+)$', role or '')
+ if not m:
+ continue
rolmembers.append({
- 'role': role.group(2),
- 'admin': True if role.group(1) == '1' else False
+ 'role': m.group(2),
+ 'admin': m.group(1) == '1'
})
else:
- role = re.search(r'([01])([01])([01])(.+)', role)
+ m = re.match(r'^([01])([01])([01])(.+)$', role or '')
+ if not m:
+ continue
rolmembers.append({
- 'role': role.group(4),
- 'admin': True if role.group(1) == '1' else False,
- 'inherit': True if role.group(2) == '1' else False,
- 'set': True if role.group(3) == '1' else False
+ 'role': m.group(4),
+ 'admin': m.group(1) == '1',
+ 'inherit': m.group(2) == '1',
+ 'set': m.group(3) == '1'
}) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def transform(self, rset): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -810,14 +845,23 @@ def transform(self, rset): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| roles = row['rolmembership'] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| row['rolpassword'] = '' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for role in roles: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role = re.search(r'([01])(.+)', role) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| res.append({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'role': role.group(2), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'admin': True if role.group(1) == '1' else False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if self.manager.version < 160000: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role = re.search(r'([01])(.+)', role) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| res.append({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'role': role.group(2), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'admin': True if role.group(1) == '1' else False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| role = re.search(r'([01])([01])([01])(.+)', role) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| res.append({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'role': role.group(4), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'admin': True if role.group(1) == '1' else False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'inherit': True if role.group(2) == '1' else False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'set': True if role.group(3) == '1' else False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+848
to
+861
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same regex The 🐛 Proposed fix for role in roles:
if self.manager.version < 160000:
- role = re.search(r'([01])(.+)', role)
+ m = re.match(r'^([01])(.+)$', role or '')
+ if not m:
+ continue
res.append({
- 'role': role.group(2),
- 'admin': True if role.group(1) == '1' else False
+ 'role': m.group(2),
+ 'admin': m.group(1) == '1'
})
else:
- role = re.search(r'([01])([01])([01])(.+)', role)
+ m = re.match(r'^([01])([01])([01])(.+)$', role or '')
+ if not m:
+ continue
res.append({
- 'role': role.group(4),
- 'admin': True if role.group(1) == '1' else False,
- 'inherit': True if role.group(2) == '1' else False,
- 'set': True if role.group(3) == '1' else False
+ 'role': m.group(4),
+ 'admin': m.group(1) == '1',
+ 'inherit': m.group(2) == '1',
+ 'set': m.group(3) == '1'
})📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| row['rolmembership'] = res | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| self._set_seclabels(row) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| self._set_rolemembership(row) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| self._set_rolemembers(row) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @check_precondition(action='properties') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def properties(self, gid, sid, rid): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -58,12 +58,12 @@ export default class RoleSchema extends BaseUISchema { | |
| memberDataFormatter(rawData) { | ||
| let members = ''; | ||
| if(_.isObject(rawData)) { | ||
| const serverVersion = this.nodeInfo && this.nodeInfo.server && this.nodeInfo.server.version || 0; | ||
| rawData.forEach(member => { | ||
| let withAdmin = ''; | ||
| if(member.admin) { withAdmin = ' [WITH ADMIN]';} | ||
| let badges = serverVersion >= 160000 ? ` [WITH ADMIN ${member.admin.toString().toUpperCase()}, INHERIT ${member.inherit.toString().toUpperCase()}, SET ${member.set.toString().toUpperCase()}]` : member.admin ? ' [WITH ADMIN OPTION]' : ''; | ||
|
|
||
| if (members.length > 0) { members += ', '; } | ||
| members = members + (member.role + withAdmin); | ||
| members = members + (member.role + badges); | ||
|
Comment on lines
+61
to
+66
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add defensive checks for potentially undefined member properties. For PostgreSQL 16+, the code accesses 🔧 Suggested defensive fix- const serverVersion = this.nodeInfo && this.nodeInfo.server && this.nodeInfo.server.version || 0;
+ const serverVersion = this.nodeInfo?.server?.version || 0;
rawData.forEach(member => {
- let badges = serverVersion >= 160000 ? ` [WITH ADMIN ${member.admin.toString().toUpperCase()}, INHERIT ${member.inherit.toString().toUpperCase()}, SET ${member.set.toString().toUpperCase()}]` : member.admin ? ' [WITH ADMIN OPTION]' : '';
+ let badges = '';
+ if (serverVersion >= 160000) {
+ const admin = (member.admin ?? false).toString().toUpperCase();
+ const inherit = (member.inherit ?? false).toString().toUpperCase();
+ const set = (member.set ?? true).toString().toUpperCase();
+ badges = ` [WITH ADMIN ${admin}, INHERIT ${inherit}, SET ${set}]`;
+ } else {
+ badges = member.admin ? ' [WITH ADMIN OPTION]' : '';
+ }
if (members.length > 0) { members += ', '; }
members = members + (member.role + badges);🤖 Prompt for AI Agents |
||
| }); | ||
| } | ||
| return members; | ||
|
|
@@ -177,7 +177,7 @@ export default class RoleSchema extends BaseUISchema { | |
| type: 'text', | ||
| controlProps: { | ||
| formatter: { | ||
| fromRaw: obj.memberDataFormatter, | ||
| fromRaw: (raw) => obj.memberDataFormatter(raw), | ||
| }, | ||
| } | ||
| }, | ||
|
|
@@ -198,7 +198,7 @@ export default class RoleSchema extends BaseUISchema { | |
| type: 'text', | ||
| controlProps: { | ||
| formatter: { | ||
| fromRaw: obj.memberDataFormatter, | ||
| fromRaw: (raw) => obj.memberDataFormatter(raw), | ||
| }, | ||
| } | ||
| }, | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 5901
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 3434
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 5592
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 369
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 2446
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 2473
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 3165
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 4366
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 4112
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 4440
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 3851
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 4006
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 1340
🏁 Script executed:
Repository: pgadmin-org/pgadmin4
Length of output: 3035
Consider defensive copy in list assignments, but naming is intentional
The aliasing concern at lines 251 and 254 is valid—assigning
data['rolmembers'].get('added', [])directly creates a reference that gets mutated via.extend()at lines 257 and 264. A defensive copy withlist()is reasonable for safety.However, the naming inconsistency claim is inaccurate. The two patterns (
rolmembership_*vsrol_members_*) are intentional and required by templates: they correspond to the input dictionary keys (data['rolmembership']vsdata['rolmembers']). Template usage confirms both patterns are correctly wired throughoutcreate.sqlandupdate.sql.Proposed adjustment (defensive copy)
Note: The same aliasing pattern exists in
_process_rolemembership(lines 219, 221–232) and warrants the same treatment.🤖 Prompt for AI Agents