Skip to content

Commit 5b2ff77

Browse files
committed
Switch to async/await syntax
1 parent b9dee12 commit 5b2ff77

16 files changed

+257
-393
lines changed

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
language: python
22
python:
3-
- 3.4.3
43
- 3.5
54
- 3.6
65
- 3.7-dev

aiohttp_security/abc.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
import abc
2-
import asyncio
32

43
# see http://plope.com/pyramid_auth_design_api_postmortem
54

65

76
class AbstractIdentityPolicy(metaclass=abc.ABCMeta):
87

9-
@asyncio.coroutine
108
@abc.abstractmethod
11-
def identify(self, request):
9+
async def identify(self, request):
1210
"""Return the claimed identity of the user associated request or
1311
``None`` if no identity can be found associated with the request."""
1412
pass
1513

16-
@asyncio.coroutine
1714
@abc.abstractmethod
18-
def remember(self, request, response, identity, **kwargs):
15+
async def remember(self, request, response, identity, **kwargs):
1916
"""Remember identity.
2017
2118
Modify response object by filling it's headers with remembered user.
@@ -25,29 +22,26 @@ def remember(self, request, response, identity, **kwargs):
2522
"""
2623
pass
2724

28-
@asyncio.coroutine
2925
@abc.abstractmethod
30-
def forget(self, request, response):
26+
async def forget(self, request, response):
3127
""" Modify response which can be used to 'forget' the
3228
current identity on subsequent requests."""
3329
pass
3430

3531

3632
class AbstractAuthorizationPolicy(metaclass=abc.ABCMeta):
3733

38-
@asyncio.coroutine
3934
@abc.abstractmethod
40-
def permits(self, identity, permission, context=None):
35+
async def permits(self, identity, permission, context=None):
4136
"""Check user permissions.
4237
4338
Return True if the identity is allowed the permission in the
4439
current context, else return False.
4540
"""
4641
pass
4742

48-
@asyncio.coroutine
4943
@abc.abstractmethod
50-
def authorized_userid(self, identity):
44+
async def authorized_userid(self, identity):
5145
"""Retrieve authorized user id.
5246
5347
Return the user_id of the user identified by the identity

aiohttp_security/api.py

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import asyncio
21
import enum
32
from aiohttp import web
43
from aiohttp_security.abc import (AbstractIdentityPolicy,
@@ -9,8 +8,7 @@
98
AUTZ_KEY = 'aiohttp_security_autz_policy'
109

1110

12-
@asyncio.coroutine
13-
def remember(request, response, identity, **kwargs):
11+
async def remember(request, response, identity, **kwargs):
1412
"""Remember identity into response.
1513
1614
The action is performed by identity_policy.remember()
@@ -28,11 +26,10 @@ def remember(request, response, identity, **kwargs):
2826
# output and rendered page we add same message to *reason* and
2927
# *text* arguments.
3028
raise web.HTTPInternalServerError(reason=text, text=text)
31-
yield from identity_policy.remember(request, response, identity, **kwargs)
29+
await identity_policy.remember(request, response, identity, **kwargs)
3230

3331

34-
@asyncio.coroutine
35-
def forget(request, response):
32+
async def forget(request, response):
3633
"""Forget previously remembered identity.
3734
3835
Usually it clears cookie or server-side storage to forget user
@@ -46,38 +43,35 @@ def forget(request, response):
4643
# output and rendered page we add same message to *reason* and
4744
# *text* arguments.
4845
raise web.HTTPInternalServerError(reason=text, text=text)
49-
yield from identity_policy.forget(request, response)
46+
await identity_policy.forget(request, response)
5047

5148

52-
@asyncio.coroutine
53-
def authorized_userid(request):
49+
async def authorized_userid(request):
5450
identity_policy = request.app.get(IDENTITY_KEY)
5551
autz_policy = request.app.get(AUTZ_KEY)
5652
if identity_policy is None or autz_policy is None:
5753
return None
58-
identity = yield from identity_policy.identify(request)
54+
identity = await identity_policy.identify(request)
5955
if identity is None:
6056
return None # non-registered user has None user_id
61-
user_id = yield from autz_policy.authorized_userid(identity)
57+
user_id = await autz_policy.authorized_userid(identity)
6258
return user_id
6359

6460

65-
@asyncio.coroutine
66-
def permits(request, permission, context=None):
61+
async def permits(request, permission, context=None):
6762
assert isinstance(permission, (str, enum.Enum)), permission
6863
assert permission
6964
identity_policy = request.app.get(IDENTITY_KEY)
7065
autz_policy = request.app.get(AUTZ_KEY)
7166
if identity_policy is None or autz_policy is None:
7267
return True
73-
identity = yield from identity_policy.identify(request)
68+
identity = await identity_policy.identify(request)
7469
# non-registered user still may has some permissions
75-
access = yield from autz_policy.permits(identity, permission, context)
70+
access = await autz_policy.permits(identity, permission, context)
7671
return access
7772

7873

79-
@asyncio.coroutine
80-
def is_anonymous(request):
74+
async def is_anonymous(request):
8175
"""Check if user is anonymous.
8276
8377
User is considered anonymous if there is not identity
@@ -86,7 +80,7 @@ def is_anonymous(request):
8680
identity_policy = request.app.get(IDENTITY_KEY)
8781
if identity_policy is None:
8882
return True
89-
identity = yield from identity_policy.identify(request)
83+
identity = await identity_policy.identify(request)
9084
if identity is None:
9185
return True
9286
return False
@@ -98,21 +92,20 @@ def login_required(fn):
9892
User is considered authorized if authorized_userid
9993
returns some value.
10094
"""
101-
@asyncio.coroutine
10295
@wraps(fn)
103-
def wrapped(*args, **kwargs):
96+
async def wrapped(*args, **kwargs):
10497
request = args[-1]
10598
if not isinstance(request, web.BaseRequest):
10699
msg = ("Incorrect decorator usage. "
107100
"Expecting `def handler(request)` "
108101
"or `def handler(self, request)`.")
109102
raise RuntimeError(msg)
110103

111-
userid = yield from authorized_userid(request)
104+
userid = await authorized_userid(request)
112105
if userid is None:
113106
raise web.HTTPUnauthorized
114107

115-
ret = yield from fn(*args, **kwargs)
108+
ret = await fn(*args, **kwargs)
116109
return ret
117110

118111
return wrapped
@@ -130,24 +123,23 @@ def has_permission(
130123
raises HTTPForbidden.
131124
"""
132125
def wrapper(fn):
133-
@asyncio.coroutine
134126
@wraps(fn)
135-
def wrapped(*args, **kwargs):
127+
async def wrapped(*args, **kwargs):
136128
request = args[-1]
137129
if not isinstance(request, web.BaseRequest):
138130
msg = ("Incorrect decorator usage. "
139131
"Expecting `def handler(request)` "
140132
"or `def handler(self, request)`.")
141133
raise RuntimeError(msg)
142134

143-
userid = yield from authorized_userid(request)
135+
userid = await authorized_userid(request)
144136
if userid is None:
145137
raise web.HTTPUnauthorized
146138

147-
allowed = yield from permits(request, permission, context)
139+
allowed = await permits(request, permission, context)
148140
if not allowed:
149141
raise web.HTTPForbidden
150-
ret = yield from fn(*args, **kwargs)
142+
ret = await fn(*args, **kwargs)
151143
return ret
152144

153145
return wrapped

aiohttp_security/cookies_identity.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
66
"""
77

8-
import asyncio
9-
108
from .abc import AbstractIdentityPolicy
119

1210

@@ -19,19 +17,16 @@ def __init__(self):
1917
self._cookie_name = 'AIOHTTP_SECURITY'
2018
self._max_age = 30 * 24 * 3600
2119

22-
@asyncio.coroutine
23-
def identify(self, request):
20+
async def identify(self, request):
2421
identity = request.cookies.get(self._cookie_name)
2522
return identity
2623

27-
@asyncio.coroutine
28-
def remember(self, request, response, identity, max_age=sentinel,
29-
**kwargs):
24+
async def remember(self, request, response, identity, max_age=sentinel,
25+
**kwargs):
3026
if max_age is sentinel:
3127
max_age = self._max_age
3228
response.set_cookie(self._cookie_name, identity,
3329
max_age=max_age, **kwargs)
3430

35-
@asyncio.coroutine
36-
def forget(self, request, response):
31+
async def forget(self, request, response):
3732
response.del_cookie(self._cookie_name)

aiohttp_security/session_identity.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
to configure aiohttp_session properly.
55
"""
66

7-
import asyncio
8-
97
try:
108
from aiohttp_session import get_session
119
HAS_AIOHTTP_SESSION = True
@@ -24,17 +22,14 @@ def __init__(self, session_key='AIOHTTP_SECURITY'):
2422
raise ImportError(
2523
'SessionIdentityPolicy requires `aiohttp_session`')
2624

27-
@asyncio.coroutine
28-
def identify(self, request):
29-
session = yield from get_session(request)
25+
async def identify(self, request):
26+
session = await get_session(request)
3027
return session.get(self._session_key)
3128

32-
@asyncio.coroutine
33-
def remember(self, request, response, identity, **kwargs):
34-
session = yield from get_session(request)
29+
async def remember(self, request, response, identity, **kwargs):
30+
session = await get_session(request)
3531
session[self._session_key] = identity
3632

37-
@asyncio.coroutine
38-
def forget(self, request, response):
39-
session = yield from get_session(request)
33+
async def forget(self, request, response):
34+
session = await get_session(request)
4035
session.pop(self._session_key, None)

demo/database_auth/db_auth.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import asyncio
2-
31
import sqlalchemy as sa
42

53
from aiohttp_security.abc import AbstractAuthorizationPolicy
@@ -12,29 +10,27 @@ class DBAuthorizationPolicy(AbstractAuthorizationPolicy):
1210
def __init__(self, dbengine):
1311
self.dbengine = dbengine
1412

15-
@asyncio.coroutine
1613
def authorized_userid(self, identity):
17-
with (yield from self.dbengine) as conn:
14+
async with self.dbengine as conn:
1815
where = sa.and_(db.users.c.login == identity,
1916
sa.not_(db.users.c.disabled))
2017
query = db.users.count().where(where)
21-
ret = yield from conn.scalar(query)
18+
ret = await conn.scalar(query)
2219
if ret:
2320
return identity
2421
else:
2522
return None
2623

27-
@asyncio.coroutine
28-
def permits(self, identity, permission, context=None):
24+
async def permits(self, identity, permission, context=None):
2925
if identity is None:
3026
return False
3127

32-
with (yield from self.dbengine) as conn:
28+
async with self.dbengine as conn:
3329
where = sa.and_(db.users.c.login == identity,
3430
sa.not_(db.users.c.disabled))
3531
query = db.users.select().where(where)
36-
ret = yield from conn.execute(query)
37-
user = yield from ret.fetchone()
32+
ret = await conn.execute(query)
33+
user = await ret.fetchone()
3834
if user is not None:
3935
user_id = user[0]
4036
is_superuser = user[3]
@@ -43,8 +39,8 @@ def permits(self, identity, permission, context=None):
4339

4440
where = db.permissions.c.user_id == user_id
4541
query = db.permissions.select().where(where)
46-
ret = yield from conn.execute(query)
47-
result = yield from ret.fetchall()
42+
ret = await conn.execute(query)
43+
result = await ret.fetchall()
4844
if ret is not None:
4945
for record in result:
5046
if record.perm_name == permission:
@@ -53,14 +49,13 @@ def permits(self, identity, permission, context=None):
5349
return False
5450

5551

56-
@asyncio.coroutine
57-
def check_credentials(db_engine, username, password):
58-
with (yield from db_engine) as conn:
52+
async def check_credentials(db_engine, username, password):
53+
async with db_engine as conn:
5954
where = sa.and_(db.users.c.login == username,
6055
sa.not_(db.users.c.disabled))
6156
query = db.users.select().where(where)
62-
ret = yield from conn.execute(query)
63-
user = yield from ret.fetchone()
57+
ret = await conn.execute(query)
58+
user = await ret.fetchone()
6459
if user is not None:
6560
hash = user[2]
6661
return sha256_crypt.verify(password, hash)

0 commit comments

Comments
 (0)