record-compat: tell reach apart from permission in a refusal
"You are not an owner of account X" is not a permission the server is withholding; it is how far that identity can see. Answering it with "needs sysMaskedEmailGet" sends you off to grant something that changes nothing. A refusal that mentions ownership now says so, and says which account the run wants: the administrator with the run of the server, with tenant administrators passed as --tenant-admin.
This commit is contained in:
@@ -74,8 +74,18 @@ class Refused(Exception):
|
|||||||
super().__init__(str(self))
|
super().__init__(str(self))
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
needed = PERMISSION.get(self.method)
|
|
||||||
detail = self.error.get('description') or json.dumps(self.error)[:120]
|
detail = self.error.get('description') or json.dumps(self.error)[:120]
|
||||||
|
# "not an owner of account X" is reach, not a permission: the
|
||||||
|
# identity can see its own account and no further, and no permission
|
||||||
|
# granted to it changes that. Saying "needs sysMaskedEmailGet" there
|
||||||
|
# sends you to grant something that won't help.
|
||||||
|
if 'owner' in detail.lower():
|
||||||
|
return (f'{self.who} may not {self.method}: {detail}. '
|
||||||
|
f'That is reach, not a permission: this identity can only '
|
||||||
|
f'read its own account. Recording every account needs the '
|
||||||
|
f'administrator that has the run of the server; a tenant '
|
||||||
|
f'administrator belongs in --tenant-admin instead.')
|
||||||
|
needed = PERMISSION.get(self.method)
|
||||||
return (f'{self.who} may not {self.method}: {detail}'
|
return (f'{self.who} may not {self.method}: {detail}'
|
||||||
+ (f' (needs {needed})' if needed else ''))
|
+ (f' (needs {needed})' if needed else ''))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user