Skip to content

Commit 36b8a0a

Browse files
Allow passing Fernet to Encrypted Cookie Storage (#448)
1 parent 984decc commit 36b8a0a

File tree

3 files changed

+27
-11
lines changed

3 files changed

+27
-11
lines changed

README.rst

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ A trivial usage example:
3232
.. code:: python
3333
3434
import time
35-
import base64
3635
from cryptography import fernet
3736
from aiohttp import web
3837
from aiohttp_session import setup, get_session
@@ -49,10 +48,9 @@ A trivial usage example:
4948
5049
def make_app():
5150
app = web.Application()
52-
# secret_key must be 32 url-safe base64-encoded bytes
5351
fernet_key = fernet.Fernet.generate_key()
54-
secret_key = base64.urlsafe_b64decode(fernet_key)
55-
setup(app, EncryptedCookieStorage(secret_key))
52+
fernet = fernet.Fernet(fernet_key)
53+
setup(app, EncryptedCookieStorage(fernet))
5654
app.router.add_get('/', handler)
5755
return app
5856

aiohttp_session/cookie_storage.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class EncryptedCookieStorage(AbstractStorage):
1515

1616
def __init__(
1717
self,
18-
secret_key: Union[str, bytes, bytearray],
18+
secret_key: Union[str, bytes, bytearray, fernet.Fernet],
1919
*,
2020
cookie_name: str = "AIOHTTP_SESSION",
2121
domain: Optional[str] = None,
@@ -39,11 +39,12 @@ def __init__(
3939
decoder=decoder,
4040
)
4141

42-
if isinstance(secret_key, str):
43-
pass
44-
elif isinstance(secret_key, (bytes, bytearray)):
45-
secret_key = base64.urlsafe_b64encode(secret_key)
46-
self._fernet = fernet.Fernet(secret_key)
42+
if isinstance(secret_key, fernet.Fernet):
43+
self._fernet = secret_key
44+
else:
45+
if isinstance(secret_key, (bytes, bytearray)):
46+
secret_key = base64.urlsafe_b64encode(secret_key)
47+
self._fernet = fernet.Fernet(secret_key)
4748

4849
async def load_session(self, request: web.Request) -> Session:
4950
cookie = self.load_cookie(request)

tests/test_encrypted_cookie_storage.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def make_cookie(client: TestClient, fernet: Fernet, data: Dict[str, Any]) -> Non
3232
client.session.cookie_jar.update_cookies({"AIOHTTP_SESSION": encrypted_data})
3333

3434

35-
def create_app(handler: Handler, key: Union[str, bytes, bytearray]) -> web.Application:
35+
def create_app(handler: Handler, key: Union[str, bytes, bytearray, Fernet]) -> web.Application:
3636
middleware = session_middleware(EncryptedCookieStorage(key))
3737
app = web.Application(middlewares=[middleware])
3838
app.router.add_route("GET", "/", handler)
@@ -102,6 +102,23 @@ async def handler(request: web.Request) -> web.StreamResponse:
102102
assert resp.status == 200
103103

104104

105+
async def test_load_existing_session_with_fernet(
106+
aiohttp_client: AiohttpClient, fernet: Fernet
107+
) -> None:
108+
async def handler(request: web.Request) -> web.StreamResponse:
109+
session = await get_session(request)
110+
assert isinstance(session, Session)
111+
assert not session.new
112+
assert not session._changed
113+
assert {"a": 1, "b": 12} == session # type: ignore[comparison-overlap]
114+
return web.Response(body=b"OK")
115+
116+
client = await aiohttp_client(create_app(handler, fernet))
117+
make_cookie(client, fernet, {"a": 1, "b": 12})
118+
resp = await client.get("/")
119+
assert resp.status == 200
120+
121+
105122
async def test_change_session(
106123
aiohttp_client: AiohttpClient, fernet: Fernet, key: bytes
107124
) -> None:

0 commit comments

Comments
 (0)