Skip to content

Commit 9d1060d

Browse files
committed
Add the updatable fields to the permissions instead of adding a new field in user model
1 parent 93b6cce commit 9d1060d

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

jupyter_server/services/api/handlers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from jupyter_server._tz import isoformat, utcfromtimestamp
1313
from jupyter_server.auth.decorator import authorized
14-
from jupyter_server.auth.identity import IdentityProvider, UpdatableField, User
14+
from jupyter_server.auth.identity import IdentityProvider, UpdatableField
1515

1616
from ...base.handlers import APIHandler, JupyterHandler
1717

@@ -107,11 +107,13 @@ async def get(self):
107107
if authorized:
108108
allowed.append(action)
109109

110+
# Add permission to user to update their own identity
111+
permissions["updatable_fields"] = self.identity_provider.updatable_fields
112+
110113
identity: dict[str, Any] = self.identity_provider.identity_model(user)
111114
model = {
112115
"identity": identity,
113116
"permissions": permissions,
114-
"updatable_fields": self.identity_provider.updatable_fields,
115117
}
116118
self.write(json.dumps(model))
117119

tests/services/api/test_api.py

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ async def test_identity(jp_fetch, identity, expected, identity_provider):
136136

137137
assert r.code == 200
138138
response = json.loads(r.body.decode())
139-
assert set(response.keys()) == {"identity", "permissions", "updatable_fields"}
139+
assert set(response.keys()) == {"identity", "permissions"}
140140
identity_model = response["identity"]
141141
print(identity_model)
142142
for key, value in expected.items():
@@ -266,7 +266,7 @@ async def test_update_user_success_custom_updatable_fields(
266266
@pytest.mark.parametrize(
267267
"have_permissions, check_permissions, expected",
268268
[
269-
("*", None, {}),
269+
("*", None, {"updatable_fields": ["color"]}),
270270
(
271271
{
272272
"contents": ["read"],
@@ -282,9 +282,10 @@ async def test_update_user_success_custom_updatable_fields(
282282
"contents": ["read"],
283283
"kernels": ["read", "write"],
284284
"terminals": [],
285+
"updatable_fields": ["color"],
285286
},
286287
),
287-
("*", {"contents": ["write"]}, {"contents": ["write"]}),
288+
("*", {"contents": ["write"]}, {"contents": ["write"], "updatable_fields": ["color"]}),
288289
],
289290
)
290291
async def test_identity_permissions(
@@ -303,7 +304,45 @@ async def test_identity_permissions(
303304
assert r is not None
304305
assert r.code == 200
305306
response = json.loads(r.body.decode())
306-
assert set(response.keys()) == {"identity", "permissions", "updatable_fields"}
307+
assert set(response.keys()) == {"identity", "permissions"}
308+
assert response["permissions"] == expected
309+
310+
311+
@pytest.mark.parametrize(
312+
"have_permissions, check_permissions, expected",
313+
[
314+
(
315+
"*",
316+
None,
317+
{
318+
"updatable_fields": [
319+
"name",
320+
"display_name",
321+
"initials",
322+
"avatar_url",
323+
"color",
324+
]
325+
},
326+
),
327+
],
328+
)
329+
async def test_password_identity_permissions(
330+
jp_fetch, have_permissions, check_permissions, expected, password_identity_provider
331+
):
332+
user = MockUser("username")
333+
user.permissions = have_permissions
334+
password_identity_provider.mock_user = user
335+
336+
if check_permissions is not None:
337+
params = {"permissions": json.dumps(check_permissions)}
338+
else:
339+
params = None
340+
341+
r = await jp_fetch("api/me", params=params)
342+
assert r is not None
343+
assert r.code == 200
344+
response = json.loads(r.body.decode())
345+
assert set(response.keys()) == {"identity", "permissions"}
307346
assert response["permissions"] == expected
308347

309348

0 commit comments

Comments
 (0)