Skip to content

Commit 723d480

Browse files
committed
fix User.get_teams()
1 parent 6f8af6d commit 723d480

5 files changed

Lines changed: 38 additions & 19 deletions

File tree

validation_service_api/validation_service/auth.py

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import asyncio
12
import base64
23
import requests
34
import logging
@@ -88,15 +89,16 @@ def __init__(self, token, allow_anonymous=False):
8889
self._teams = None
8990
self._collab_info = {}
9091
self._connection_error = False
92+
self.username = None
9193

9294
@property
9395
def is_anonymous(self):
9496
return self.token is None or self.token.credentials == "undefined"
9597

96-
async def get_identity(self):
98+
def get_identity(self):
9799
if self._identity is None:
98100
payload = _decode_jwt_payload(self.token.credentials)
99-
username = payload.get("preferred_username", "unknown")
101+
username = payload.get("preferred_username", None)
100102
self._identity = {
101103
"sub": payload["sub"],
102104
"id": payload["sub"],
@@ -105,19 +107,45 @@ async def get_identity(self):
105107
"given_name": payload.get("given_name", ""),
106108
"family_name": payload.get("family_name", ""),
107109
}
110+
self.username = username
108111
return self._identity
109112

110113
async def get_teams(self):
111114
if self._teams is None:
112-
identity = await self.get_identity()
115+
identity = self.get_identity()
113116
url = f"{settings.EBRAINS_IDM_API_URL}/teams"
114117
headers = {"Authorization": f"Bearer {self.token.credentials}"}
115118
params = {"username": identity["username"]}
116119
async with AsyncClient() as client:
117120
res = await client.get(url, headers=headers, params=params,
118121
timeout=settings.AUTHENTICATION_TIMEOUT)
119122
res.raise_for_status()
120-
self._teams = [t["name"] for t in res.json() if isinstance(t, dict) and "name" in t]
123+
self._teams = []
124+
collab_names = set(
125+
item["name"] for item in res.json()
126+
if not (
127+
item["name"].startswith("d-") # ignore dataset collabs
128+
or item["name"].startswith("nmc-test") # ignore NMC test collabs
129+
)
130+
)
131+
for role in ("administrator", "editor"):
132+
for collab_name in collab_names.copy():
133+
roles_url = f"{settings.EBRAINS_IDM_API_URL}/teams/{collab_name}/{role}/users"
134+
# todo: get groups as well and check for group membership
135+
async with AsyncClient() as client:
136+
res2 = await client.get(roles_url, headers=headers,
137+
timeout=settings.AUTHENTICATION_TIMEOUT)
138+
res2.raise_for_status() # do we want to raise an exception, or just log an error?
139+
# for robustness, perhaps just log
140+
for user in res2.json():
141+
if self.username == user["username"]:
142+
self._teams.append(f"collab-{collab_name}-{role}")
143+
collab_names.discard(collab_name)
144+
print(collab_name)
145+
break
146+
# we assume user must have viewer permissions for any collab still in collab_names
147+
for collab_name in collab_names:
148+
self._teams.append(f"collab-{collab_name}-viewer")
121149
return self._teams
122150

123151
async def get_collab_info(self, collab_id):
@@ -134,8 +162,8 @@ async def get_collab_info(self, collab_id):
134162
self._collab_info[collab_id] = {}
135163
return self._collab_info[collab_id]
136164

137-
async def get_person(self, kg_client):
138-
identity = await self.get_identity()
165+
def get_person(self, kg_client):
166+
identity = self.get_identity()
139167
family_name = identity["family_name"]
140168
given_name = identity["given_name"]
141169
person = omcore.Person.list(kg_client, family_name=family_name, given_name=given_name, release_status="any")
@@ -195,12 +223,3 @@ async def can_edit_collab(self, collab_id):
195223
async def is_admin(self):
196224
return await self.can_edit_collab(settings.ADMIN_COLLAB_ID)
197225
# todo: replace this check with a group membership check
198-
199-
async def get_editable_collabs(self):
200-
teams = await self.get_teams()
201-
editable_collab_ids = set()
202-
for team_name in teams:
203-
if team_name.endswith("-editor") or team_name.endswith("-administrator"):
204-
collab_id = "-".join(team_name.split("-")[1:-1])
205-
editable_collab_ids.add(collab_id)
206-
return sorted(editable_collab_ids)

validation_service_api/validation_service/resources/auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ async def get_person(
9696
):
9797
kg_user_client = get_kg_client_for_user_account(token)
9898
user = User(token, allow_anonymous=False)
99-
kg_person = await user.get_person(kg_user_client)
99+
kg_person = user.get_person(kg_user_client)
100100
if kg_person:
101101
return Person.from_kg_object(kg_person, kg_user_client)
102102
else:

validation_service_api/validation_service/resources/comments.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ async def create_comment(
7878
):
7979
kg_user_client = get_kg_client_for_user_account(token)
8080
user = User(token, allow_anonymous=False)
81-
commenter = await user.get_person(kg_user_client)
81+
commenter = user.get_person(kg_user_client)
8282
if commenter is None:
8383
raise HTTPException(
8484
status_code=status_codes.HTTP_404_NOT_FOUND,

validation_service_api/validation_service/resources/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ async def api_status(token: HTTPAuthorizationCredentials = Depends(auth)):
5353
}
5454
}
5555
if token:
56-
identity = await User(token).get_identity()
56+
identity = User(token).get_identity()
5757
info["user"] = identity["preferred_username"]
5858
service_status = getattr(settings, "SERVICE_STATUS", "ok")
5959
return info

validation_service_api/validation_service/resources/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ async def create_test(test: ValidationTest, token: HTTPAuthorizationCredentials
263263
try:
264264
test_definition.save(kg_user_client, recursive=True, space=kg_space, ignore_duplicates=True)
265265
except AuthenticationError as err:
266-
identity = await user.get_identity()
266+
identity = user.get_identity()
267267
raise HTTPException(
268268
status_code=status.HTTP_403_FORBIDDEN,
269269
detail=f"User {identity['username']} cannot access space {kg_space}. Error message: {err}"

0 commit comments

Comments
 (0)