Skip to content

Commit 292eb56

Browse files
Validate permission input consistently (#964)
1 parent 0b77aa3 commit 292eb56

2 files changed

Lines changed: 24 additions & 4 deletions

File tree

aiohttp_security/api.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,14 @@ async def authorized_userid(request: web.Request) -> Optional[str]:
6464
return user_id
6565

6666

67-
async def permits(request: web.Request, permission: Union[str, enum.Enum],
68-
context: Any = None) -> bool:
67+
def _validate_permission(permission: Union[str, enum.Enum]) -> None:
6968
if not permission or not isinstance(permission, (str, enum.Enum)):
7069
raise ValueError("Permission should be a str or enum value.")
70+
71+
72+
async def permits(request: web.Request, permission: Union[str, enum.Enum],
73+
context: Any = None) -> bool:
74+
_validate_permission(permission)
7175
identity_policy: _AIP = request.config_dict.get(IDENTITY_KEY)
7276
autz_policy: _AAP = request.config_dict.get(AUTZ_KEY)
7377
if identity_policy is None or autz_policy is None:
@@ -104,13 +108,14 @@ async def check_authorized(request: web.Request) -> str:
104108

105109
async def check_permission(request: web.Request, permission: Union[str, enum.Enum],
106110
context: Any = None) -> None:
107-
"""Checker that passes only to authoraised users with given permission.
111+
"""Checker that passes only to authorized users with given permission.
108112
109113
If user is not authorized - raises HTTPUnauthorized,
110114
if user is authorized and does not have permission -
111115
raises HTTPForbidden.
112116
"""
113117

118+
_validate_permission(permission)
114119
await check_authorized(request)
115120
allowed = await permits(request, permission, context)
116121
if not allowed:

tests/test_no_auth.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import pytest
12
from aiohttp import web
23

3-
from aiohttp_security import authorized_userid, permits
4+
from aiohttp_security import authorized_userid, check_permission, permits
45

56

67
async def test_authorized_userid(aiohttp_client):
@@ -33,3 +34,17 @@ async def check(request):
3334
client = await aiohttp_client(app)
3435
resp = await client.get('/')
3536
assert 200 == resp.status
37+
38+
39+
async def test_check_permission_rejects_invalid_value(aiohttp_client):
40+
41+
async def check(request):
42+
with pytest.raises(ValueError):
43+
await check_permission(request, None) # type: ignore[arg-type]
44+
return web.Response()
45+
46+
app = web.Application()
47+
app.router.add_route('GET', '/', check)
48+
client = await aiohttp_client(app)
49+
resp = await client.get('/')
50+
assert 200 == resp.status

0 commit comments

Comments
 (0)