Show groups in member for API, CLI and TUI (#82)
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
Closes #69. Tests are failing locally with many `assert os.geteuid() == 0` errors even on the master branch. I will add tests after I figure this out. Reviewed-on: #82 Co-authored-by: Jonathan Leung <j23leung@csclub.uwaterloo.ca> Co-committed-by: Jonathan Leung <j23leung@csclub.uwaterloo.ca>
This commit is contained in:
parent
c0c9736593
commit
b507c56136
|
@ -136,6 +136,8 @@ def user_dict_kv(d: Dict) -> List[Tuple[str]]:
|
||||||
pairs.append(('non-member terms', ','.join(_terms)))
|
pairs.append(('non-member terms', ','.join(_terms)))
|
||||||
if 'password' in d:
|
if 'password' in d:
|
||||||
pairs.append(('password', d['password']))
|
pairs.append(('password', d['password']))
|
||||||
|
if 'groups' in d:
|
||||||
|
pairs.append(('groups', ','.join(d['groups'])))
|
||||||
return pairs
|
return pairs
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,9 @@ def get_user(auth_user: str, username: str):
|
||||||
get_forwarding_addresses = True
|
get_forwarding_addresses = True
|
||||||
ldap_srv = component.getUtility(ILDAPService)
|
ldap_srv = component.getUtility(ILDAPService)
|
||||||
user = ldap_srv.get_user(username)
|
user = ldap_srv.get_user(username)
|
||||||
return user.to_dict(get_forwarding_addresses)
|
user_dict = user.to_dict(get_forwarding_addresses)
|
||||||
|
user_dict['groups'] = ldap_srv.get_groups_for_user(username)
|
||||||
|
return user_dict
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/<username>', methods=['PATCH'])
|
@bp.route('/<username>', methods=['PATCH'])
|
||||||
|
|
|
@ -103,7 +103,7 @@ class LDAPService:
|
||||||
conn.search(self.ldap_groups_base,
|
conn.search(self.ldap_groups_base,
|
||||||
f'(uniqueMember={self.uid_to_dn(username)})',
|
f'(uniqueMember={self.uid_to_dn(username)})',
|
||||||
attributes=['cn'])
|
attributes=['cn'])
|
||||||
return [entry.cn.value for entry in conn.entries]
|
return sorted([entry.cn.value for entry in conn.entries])
|
||||||
|
|
||||||
def get_display_info_for_users(self, usernames: List[str]) -> List[Dict[str, str]]:
|
def get_display_info_for_users(self, usernames: List[str]) -> List[Dict[str, str]]:
|
||||||
if not usernames:
|
if not usernames:
|
||||||
|
|
|
@ -942,6 +942,11 @@ components:
|
||||||
$ref: "#/components/schemas/NonMemberTerms"
|
$ref: "#/components/schemas/NonMemberTerms"
|
||||||
forwarding_addresses:
|
forwarding_addresses:
|
||||||
$ref: "#/components/schemas/ForwardingAddresses"
|
$ref: "#/components/schemas/ForwardingAddresses"
|
||||||
|
groups:
|
||||||
|
type: array
|
||||||
|
description: Groups for which this user is a member of
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/GroupCN"
|
||||||
UWLDAPUser:
|
UWLDAPUser:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -26,8 +26,9 @@ def test_members_get(cli_setup, ldap_user):
|
||||||
f"home directory: {ldap_user.home_directory}\n"
|
f"home directory: {ldap_user.home_directory}\n"
|
||||||
f"is a club: {ldap_user.is_club()}\n"
|
f"is a club: {ldap_user.is_club()}\n"
|
||||||
f"is a club rep: {ldap_user.is_club_rep}\n"
|
f"is a club rep: {ldap_user.is_club_rep}\n"
|
||||||
"forwarding addresses: \n"
|
f"forwarding addresses: \n"
|
||||||
f"member terms: {','.join(ldap_user.terms)}\n"
|
f"member terms: {','.join(ldap_user.terms)}\n"
|
||||||
|
f"groups: \n"
|
||||||
)
|
)
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert result.output == expected
|
assert result.output == expected
|
||||||
|
|
|
@ -127,6 +127,7 @@ def test_api_get_user(cfg, client, create_user_result):
|
||||||
del old_data['password']
|
del old_data['password']
|
||||||
|
|
||||||
status, data = client.get(f'/api/members/{uid}')
|
status, data = client.get(f'/api/members/{uid}')
|
||||||
|
del data['groups']
|
||||||
assert status == 200
|
assert status == 200
|
||||||
assert data == old_data
|
assert data == old_data
|
||||||
|
|
||||||
|
@ -262,6 +263,7 @@ def test_authz_check(client, create_user_result):
|
||||||
del old_data['password']
|
del old_data['password']
|
||||||
del old_data['forwarding_addresses']
|
del old_data['forwarding_addresses']
|
||||||
_, data = client.get(f'/api/members/{uid}', principal='regular1')
|
_, data = client.get(f'/api/members/{uid}', principal='regular1')
|
||||||
|
del data['groups']
|
||||||
assert data == old_data
|
assert data == old_data
|
||||||
|
|
||||||
# If we're syscom but we don't pass credentials, the request should fail
|
# If we're syscom but we don't pass credentials, the request should fail
|
||||||
|
|
Loading…
Reference in New Issue