Skip to content

Commit 7da0566

Browse files
committed
extends coverage and rm unsued functionality
1 parent abe71de commit 7da0566

File tree

3 files changed

+8
-43
lines changed

3 files changed

+8
-43
lines changed

services/web/server/src/simcore_service_webserver/security/_authz_access_model.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import inspect
99
import logging
10-
import re
1110
from collections.abc import Awaitable, Callable
1211
from dataclasses import dataclass, field
1312
from typing import TypeAlias, TypedDict
@@ -148,32 +147,10 @@ def from_rawdata(cls, raw: dict):
148147
return RoleBasedAccessModel(roles)
149148

150149

151-
_OPERATORS_REGEX_PATTERN = re.compile(r"(&|\||\bAND\b|\bOR\b)")
152-
153-
154150
async def has_access_by_role(
155151
model: RoleBasedAccessModel,
156152
role: UserRole,
157-
operations: str,
153+
operation: str,
158154
context: OptionalContext = None,
159155
) -> bool:
160-
"""Extends `RoleBasedAccessModel.can` to check access to boolean expressions of operations
161-
162-
Returns True if a user with a role has permission on a given context
163-
"""
164-
tokens = _OPERATORS_REGEX_PATTERN.split(operations)
165-
if len(tokens) == 1:
166-
return await model.can(role, tokens[0], context)
167-
168-
if len(tokens) == 3:
169-
tokens = [t.strip() for t in tokens if t.strip() != ""]
170-
lhs, op, rhs = tokens
171-
can_lhs = await model.can(role, lhs, context)
172-
if op in ["AND", "&"]:
173-
if can_lhs:
174-
return await model.can(role, rhs, context)
175-
return False
176-
return can_lhs or (await model.can(role, rhs, context))
177-
178-
msg = f"Invalid expression '{operations}': only supports at most two operands"
179-
raise NotImplementedError(msg)
156+
return await model.can(role=role, operation=operation, context=context)

services/web/server/src/simcore_service_webserver/security/_authz_policy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,6 @@ async def permits(
172172
return await has_access_by_role(
173173
self._access_model,
174174
role=user_role,
175-
operations=permission,
175+
operation=permission,
176176
context=context,
177177
)

services/web/server/tests/unit/isolated/test_security__authz.py

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -258,18 +258,6 @@ async def test_check_access_expressions(access_model: RoleBasedAccessModel):
258258

259259
assert await has_access_by_role(access_model, R.ANONYMOUS, "study.stop")
260260

261-
assert await has_access_by_role(
262-
access_model, R.ANONYMOUS, "study.stop |study.node.create"
263-
)
264-
265-
assert not await has_access_by_role(
266-
access_model, R.ANONYMOUS, "study.stop & study.node.create"
267-
)
268-
269-
assert await has_access_by_role(
270-
access_model, R.USER, "study.stop & study.node.create"
271-
)
272-
273261

274262
@pytest.fixture
275263
def mock_db(mocker: MockerFixture) -> MagicMock:
@@ -314,17 +302,17 @@ async def test_authorization_policy_cache(mocker: MockerFixture, mock_db: MagicM
314302
# pylint: disable=no-member
315303
autz_cache: BaseCache = authz_policy._get_authorized_user_or_none.cache
316304

317-
assert not (await autz_cache.exists("_get_auth_or_none/[email protected]"))
305+
assert not (await autz_cache.exists("_get_authorized_user_or_none/[email protected]"))
318306
for _ in range(3):
319307
got = await authz_policy._get_authorized_user_or_none(email="[email protected]")
320308
assert mock_db.call_count == 1
321309
assert got["id"] == 1
322310

323-
assert await autz_cache.exists("_get_auth_or_none/[email protected]")
311+
assert await autz_cache.exists("_get_authorized_user_or_none/[email protected]")
324312

325313
# new value in db
326314
mock_db.users_db["[email protected]"]["id"] = 2
327-
got = await autz_cache.get("_get_auth_or_none/[email protected]")
315+
got = await autz_cache.get("_get_authorized_user_or_none/[email protected]")
328316
assert got["id"] == 1
329317

330318
# gets cache, db is NOT called
@@ -341,12 +329,12 @@ async def test_authorization_policy_cache(mocker: MockerFixture, mock_db: MagicM
341329
assert got["id"] == 2
342330

343331
# other email has other key
344-
assert not (await autz_cache.exists("_get_auth_or_none/[email protected]"))
332+
assert not (await autz_cache.exists("_get_authorized_user_or_none/[email protected]"))
345333

346334
for _ in range(4):
347335
# NOTE: None
348336
assert await authz_policy._get_authorized_user_or_none(email="[email protected]")
349-
assert await autz_cache.exists("_get_auth_or_none/[email protected]")
337+
assert await autz_cache.exists("_get_authorized_user_or_none/[email protected]")
350338
assert mock_db.call_count == 3
351339

352340
# should raise web.HTTPServiceUnavailable on db failure

0 commit comments

Comments
 (0)