jamlib 3.0.0b12.dev0__tar.gz → 3.0.0b12.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {jamlib-3.0.0b12.dev0/src/jamlib.egg-info → jamlib-3.0.0b12.dev2}/PKG-INFO +1 -1
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/pyproject.toml +1 -1
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/__init__.py +1 -1
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/__init__.py +2 -1
- jamlib-3.0.0b12.dev2/src/jam/exceptions/plugins.py +17 -0
- jamlib-3.0.0b12.dev2/src/jam/ext/litestar/__init__.py +24 -0
- jamlib-3.0.0b12.dev2/src/jam/ext/litestar/middleware.py +81 -0
- jamlib-3.0.0b12.dev2/src/jam/ext/litestar/objects.py +44 -0
- jamlib-3.0.0b12.dev2/src/jam/ext/litestar/plugins.py +100 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2/src/jamlib.egg-info}/PKG-INFO +1 -1
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jamlib.egg-info/SOURCES.txt +2 -0
- jamlib-3.0.0b12.dev0/src/jam/exceptions/plugins.py +0 -10
- jamlib-3.0.0b12.dev0/src/jam/ext/litestar/__init__.py +0 -7
- jamlib-3.0.0b12.dev0/src/jam/ext/litestar/plugins.py +0 -59
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/LICENSE.md +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/README.md +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/setup.cfg +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/__base__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/__base_encoder__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/__deprecated__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/__base__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/instance.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/jwt/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/__base__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/github.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/gitlab.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/google.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/yandex.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/client.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/sessions/__base__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/sessions/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/sessions/json.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/sessions/redis.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/encoders.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/base.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/jwt.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/oauth2.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/paseto.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/sessions.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/fastapi/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/flask/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/flask/extensions.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/starlette/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/starlette/auth_backends.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/starlette/value.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/instance.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/__algorithms__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/__base__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/__types__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/lists/__abc_list_repo__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/lists/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/lists/json.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/lists/redis.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/module.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/utils.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/logger.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/__base__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/github.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/gitlab.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/google.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/yandex.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/client.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/otp/__base__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/otp/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/otp/hotp.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/otp/totp.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/__base__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/utils.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/v1.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/v2.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/v3.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/v4.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/py.typed +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/sessions/__base__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/sessions/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/sessions/json.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/sessions/redis.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/tests/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/tests/clients.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/tests/fakers.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/__init__.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/aes.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/await_maybe.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/basic_auth.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/config_maker.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/ed.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/otp_keys.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/rsa.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/salt_hash.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/symmetric.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/xchacha20poly1305.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/xor.py +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jamlib.egg-info/dependency_links.txt +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jamlib.egg-info/requires.txt +0 -0
- {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jamlib.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jamlib
|
|
3
|
-
Version: 3.0.0b12.
|
|
3
|
+
Version: 3.0.0b12.dev2
|
|
4
4
|
Summary: Simple and universal library for authorization.
|
|
5
5
|
Author-email: Makridenko Adrian <adrianmakridenko@duck.com>, Ksenia Travnikova <kseniatravnikova@duck.com>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -36,7 +36,7 @@ from .paseto import (
|
|
|
36
36
|
JamPASETOInvalidTokenFormat
|
|
37
37
|
)
|
|
38
38
|
|
|
39
|
-
from .plugins import JamLitestarPluginConfigError
|
|
39
|
+
from .plugins import JamLitestarPluginConfigError, JamLitestarPluginError
|
|
40
40
|
|
|
41
41
|
from .sessions import (
|
|
42
42
|
JamSessionNotFound,
|
|
@@ -66,6 +66,7 @@ __all__ = [
|
|
|
66
66
|
"JamPASETOInvalidTokenFormat",
|
|
67
67
|
"JamPASTOKeyVerificationError",
|
|
68
68
|
"JamLitestarPluginConfigError",
|
|
69
|
+
"JamLitestarPluginError",
|
|
69
70
|
"JamSessionNotFound",
|
|
70
71
|
"JamSessionEmptyAESKey",
|
|
71
72
|
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from jam.exceptions.base import JamConfigurationError, JamError
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class JamLitestarPluginConfigError(JamConfigurationError):
|
|
7
|
+
"""Exception raised when a configuration error occurs for a litestar plugin."""
|
|
8
|
+
|
|
9
|
+
default_message = "Configuration error occurred for a litestar plugin."
|
|
10
|
+
default_code = "jam.configuration.plugin.litestar"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class JamLitestarPluginError(JamError):
|
|
14
|
+
"""Exception raised when an error occurs for a litestar plugin."""
|
|
15
|
+
|
|
16
|
+
default_message = "An error occurred for a litestar plugin."
|
|
17
|
+
default_code = "jam.plugin.litestar"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Litestar integration.
|
|
5
|
+
|
|
6
|
+
Litestar docs: https://docs.litestar.dev
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .objects import (
|
|
10
|
+
BaseUser,
|
|
11
|
+
SimpleUser,
|
|
12
|
+
Token
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
from .plugins import BasePlugin, JamJWTPlugin, JamSessionPlugin
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"BaseUser",
|
|
19
|
+
"SimpleUser",
|
|
20
|
+
"Token",
|
|
21
|
+
"BasePlugin",
|
|
22
|
+
"JamJWTPlugin",
|
|
23
|
+
"JamSessionPlugin",
|
|
24
|
+
]
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
|
|
5
|
+
from litestar.connection import ASGIConnection
|
|
6
|
+
from litestar.middleware import (
|
|
7
|
+
AbstractAuthenticationMiddleware,
|
|
8
|
+
AuthenticationResult,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
from jam.aio.sessions.__base__ import BaseAsyncSessionModule
|
|
12
|
+
from jam.exceptions import JamLitestarPluginConfigError, JamLitestarPluginError
|
|
13
|
+
from jam.ext.litestar.objects import BaseUser, Token
|
|
14
|
+
from jam.jwt import JWT
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BaseMiddleware(AbstractAuthenticationMiddleware):
|
|
18
|
+
"""Base Jam middleware for litestar."""
|
|
19
|
+
|
|
20
|
+
AUTH_MODULE: Callable
|
|
21
|
+
HEADER_NAME: str | None
|
|
22
|
+
COOKIE_NAME: str | None
|
|
23
|
+
USER: type[BaseUser]
|
|
24
|
+
|
|
25
|
+
def _get_auth_token(self, connection: ASGIConnection) -> str | None:
|
|
26
|
+
if self.HEADER_NAME:
|
|
27
|
+
token = connection.headers.get(self.HEADER_NAME, None)
|
|
28
|
+
elif self.COOKIE_NAME:
|
|
29
|
+
token = connection.cookies.get(self.COOKIE_NAME, None)
|
|
30
|
+
else:
|
|
31
|
+
raise JamLitestarPluginConfigError(
|
|
32
|
+
message="No header or cookie name provided for JWT authentication.",
|
|
33
|
+
details={
|
|
34
|
+
"header_name": self.HEADER_NAME,
|
|
35
|
+
"cookie_name": self.COOKIE_NAME,
|
|
36
|
+
},
|
|
37
|
+
)
|
|
38
|
+
return token
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class JWTMiddleware(BaseMiddleware):
|
|
42
|
+
"""JWT Middleware for litestar."""
|
|
43
|
+
|
|
44
|
+
AUTH_MODULE: JWT
|
|
45
|
+
|
|
46
|
+
async def authenticate_request( # noqa
|
|
47
|
+
self, connection: ASGIConnection
|
|
48
|
+
) -> AuthenticationResult:
|
|
49
|
+
token = self._get_auth_token(connection)
|
|
50
|
+
token_model = Token(token=token)
|
|
51
|
+
if not token:
|
|
52
|
+
return AuthenticationResult(user=None, auth=token_model)
|
|
53
|
+
try:
|
|
54
|
+
data = self.AUTH_MODULE.decode(token)
|
|
55
|
+
user = self.USER.from_payload(data)
|
|
56
|
+
|
|
57
|
+
return AuthenticationResult(user=user, auth=token_model)
|
|
58
|
+
except Exception as e:
|
|
59
|
+
raise JamLitestarPluginError(message=str(e))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class SessionMiddleware(BaseMiddleware):
|
|
63
|
+
"""Session middleware for litestar."""
|
|
64
|
+
|
|
65
|
+
AUTH_MODULE: BaseAsyncSessionModule
|
|
66
|
+
|
|
67
|
+
async def authenticate_request( # noqa
|
|
68
|
+
self, connection: ASGIConnection
|
|
69
|
+
) -> AuthenticationResult:
|
|
70
|
+
token = self._get_auth_token(connection)
|
|
71
|
+
token_model = Token(token=token)
|
|
72
|
+
if not token:
|
|
73
|
+
return AuthenticationResult(None, auth=token_model)
|
|
74
|
+
try:
|
|
75
|
+
data = await self.AUTH_MODULE.get(token)
|
|
76
|
+
if not data:
|
|
77
|
+
return AuthenticationResult(None, auth=token_model)
|
|
78
|
+
user = self.USER.from_payload(data)
|
|
79
|
+
return AuthenticationResult(user, token)
|
|
80
|
+
except Exception as e:
|
|
81
|
+
raise JamLitestarPluginError(message=str(e))
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Any, TypeVar
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
User = TypeVar("User", bound="BaseUser")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(slots=True)
|
|
14
|
+
class Token:
|
|
15
|
+
"""Data for Authresult."""
|
|
16
|
+
|
|
17
|
+
token: str | None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class BaseUser(ABC):
|
|
22
|
+
"""Abstract user model for AuthResult."""
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
@abstractmethod
|
|
26
|
+
def from_payload(cls, payload: dict[str, Any]) -> User:
|
|
27
|
+
"""Build model from payload.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
payload (dict[str, Any]): Payload for your data.
|
|
31
|
+
"""
|
|
32
|
+
raise NotImplementedError
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class SimpleUser(BaseUser):
|
|
37
|
+
"""Simple user with payload."""
|
|
38
|
+
|
|
39
|
+
payload: dict[str, Any]
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def from_payload(cls, payload: dict[str, Any]) -> SimpleUser:
|
|
43
|
+
"""Set payload=payload."""
|
|
44
|
+
return cls(payload)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from litestar.config.app import AppConfig
|
|
7
|
+
from litestar.di import Provide
|
|
8
|
+
from litestar.plugins import InitPlugin
|
|
9
|
+
|
|
10
|
+
from jam.aio.sessions import create_instance
|
|
11
|
+
from jam.exceptions import JamLitestarPluginConfigError
|
|
12
|
+
from jam.ext.litestar.middleware import (
|
|
13
|
+
BaseMiddleware,
|
|
14
|
+
JWTMiddleware,
|
|
15
|
+
SessionMiddleware,
|
|
16
|
+
)
|
|
17
|
+
from jam.ext.litestar.objects import BaseUser
|
|
18
|
+
from jam.jwt import JWT
|
|
19
|
+
from jam.utils.config_maker import GENERIC_POINTER, __config_maker__
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class BasePlugin(InitPlugin):
|
|
23
|
+
"""Base Litestar plugin."""
|
|
24
|
+
|
|
25
|
+
MODULE: Callable
|
|
26
|
+
_MIDDLEWARE: type[BaseMiddleware]
|
|
27
|
+
_DI_KEY: str
|
|
28
|
+
_CONFIG_KEY: str
|
|
29
|
+
|
|
30
|
+
def _setup_config(self, config: dict[str, Any]) -> None:
|
|
31
|
+
self._auth = self.MODULE(**config)
|
|
32
|
+
|
|
33
|
+
def __init__( # noqa
|
|
34
|
+
self,
|
|
35
|
+
config: dict[str, Any] | str | None = None,
|
|
36
|
+
pointer: str = GENERIC_POINTER,
|
|
37
|
+
cookie_name: str | None = None,
|
|
38
|
+
header_name: str | None = None,
|
|
39
|
+
middleware: bool = True,
|
|
40
|
+
middleware_user: type[BaseUser] | None = None,
|
|
41
|
+
**kwargs,
|
|
42
|
+
) -> None:
|
|
43
|
+
if middleware and (not cookie_name and not header_name):
|
|
44
|
+
raise JamLitestarPluginConfigError(
|
|
45
|
+
message="Cookie name and header name cannot be both None.",
|
|
46
|
+
details={
|
|
47
|
+
"cookie_name": cookie_name,
|
|
48
|
+
"header_name": header_name,
|
|
49
|
+
},
|
|
50
|
+
)
|
|
51
|
+
if middleware and not middleware_user:
|
|
52
|
+
raise JamLitestarPluginConfigError(
|
|
53
|
+
message="Middleware user cannot be None when middleware is True.",
|
|
54
|
+
details={
|
|
55
|
+
"middleware_user": middleware_user,
|
|
56
|
+
},
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
_config: dict[str, Any] | None = (
|
|
60
|
+
__config_maker__(config, pointer) if config else None
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
params = _config.pop(self._CONFIG_KEY) if _config else kwargs
|
|
64
|
+
self._setup_config(params)
|
|
65
|
+
self._middleware = None
|
|
66
|
+
|
|
67
|
+
if middleware:
|
|
68
|
+
_middleware = self._MIDDLEWARE
|
|
69
|
+
_middleware.COOKIE_NAME = cookie_name
|
|
70
|
+
_middleware.HEADER_NAME = header_name
|
|
71
|
+
_middleware.AUTH_MODULE = self._auth
|
|
72
|
+
_middleware.USER = middleware_user # type: ignore
|
|
73
|
+
self._middleware = _middleware
|
|
74
|
+
|
|
75
|
+
def on_app_init(self, app_config: AppConfig) -> AppConfig: # noqa
|
|
76
|
+
app_config.dependencies[self._DI_KEY] = Provide(
|
|
77
|
+
lambda: self._auth, sync_to_thread=True
|
|
78
|
+
)
|
|
79
|
+
app_config.middleware.append(
|
|
80
|
+
self._middleware
|
|
81
|
+
) if self._middleware else None
|
|
82
|
+
return app_config
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class JamJWTPlugin(BasePlugin):
|
|
86
|
+
"""JWT plugin for litestar."""
|
|
87
|
+
|
|
88
|
+
MODULE = JWT
|
|
89
|
+
_MIDDLEWARE = JWTMiddleware
|
|
90
|
+
_DI_KEY = "jwt"
|
|
91
|
+
_CONFIG_KEY = "jwt"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class JamSessionPlugin(BasePlugin):
|
|
95
|
+
"""Redis sessions plugin for litestar."""
|
|
96
|
+
|
|
97
|
+
MODULE = staticmethod(create_instance)
|
|
98
|
+
_MIDDLEWARE = SessionMiddleware
|
|
99
|
+
_DI_KEY = "session"
|
|
100
|
+
_CONFIG_KEY = "sessions"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jamlib
|
|
3
|
-
Version: 3.0.0b12.
|
|
3
|
+
Version: 3.0.0b12.dev2
|
|
4
4
|
Summary: Simple and universal library for authorization.
|
|
5
5
|
Author-email: Makridenko Adrian <adrianmakridenko@duck.com>, Ksenia Travnikova <kseniatravnikova@duck.com>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -37,6 +37,8 @@ src/jam/ext/fastapi/__init__.py
|
|
|
37
37
|
src/jam/ext/flask/__init__.py
|
|
38
38
|
src/jam/ext/flask/extensions.py
|
|
39
39
|
src/jam/ext/litestar/__init__.py
|
|
40
|
+
src/jam/ext/litestar/middleware.py
|
|
41
|
+
src/jam/ext/litestar/objects.py
|
|
40
42
|
src/jam/ext/litestar/plugins.py
|
|
41
43
|
src/jam/ext/starlette/__init__.py
|
|
42
44
|
src/jam/ext/starlette/auth_backends.py
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
from jam.exceptions.base import JamConfigurationError
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class JamLitestarPluginConfigError(JamConfigurationError):
|
|
7
|
-
"""Exception raised when a configuration error occurs for a litestar plugin."""
|
|
8
|
-
|
|
9
|
-
default_message = "Configuration error occurred for a litestar plugin."
|
|
10
|
-
default_code = "jam.configuration.plugin"
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
from collections.abc import Callable
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
from litestar.config.app import AppConfig
|
|
7
|
-
from litestar.di import Provide
|
|
8
|
-
from litestar.plugins import InitPlugin
|
|
9
|
-
|
|
10
|
-
from jam.exceptions import JamLitestarPluginConfigError
|
|
11
|
-
from jam.jwt import JWT
|
|
12
|
-
from jam.utils.config_maker import GENERIC_POINTER, __config_maker__
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class BasePlugin(InitPlugin):
|
|
16
|
-
"""Base Litestar plugin."""
|
|
17
|
-
|
|
18
|
-
MODULE: Callable
|
|
19
|
-
|
|
20
|
-
def _setup_config(self, config: dict[str, Any]) -> None:
|
|
21
|
-
self._auth = self.MODULE(**config)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class JamJWTPlugin(BasePlugin):
|
|
25
|
-
"""JWT plugin for litestar."""
|
|
26
|
-
|
|
27
|
-
MODULE = JWT
|
|
28
|
-
|
|
29
|
-
def __init__( # noqa
|
|
30
|
-
self,
|
|
31
|
-
config: dict[str, Any] | str | None = None,
|
|
32
|
-
pointer: str = GENERIC_POINTER,
|
|
33
|
-
cookie_name: str | None = None,
|
|
34
|
-
header_name: str | None = None,
|
|
35
|
-
middleware: bool = True,
|
|
36
|
-
**kwargs,
|
|
37
|
-
) -> None:
|
|
38
|
-
if middleware and (not cookie_name and not header_name):
|
|
39
|
-
raise JamLitestarPluginConfigError(
|
|
40
|
-
message="Cookie name and header name cannot be both None.",
|
|
41
|
-
details={
|
|
42
|
-
"cookie_name": cookie_name,
|
|
43
|
-
"header_name": header_name,
|
|
44
|
-
},
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
_config: dict[str, Any] | None = (
|
|
48
|
-
__config_maker__(config, pointer) if config else None
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
# TODO: Middleware setup
|
|
52
|
-
|
|
53
|
-
self._auth = self.MODULE(**(_config if _config else kwargs))
|
|
54
|
-
|
|
55
|
-
def on_app_init(self, app_config: AppConfig) -> AppConfig: # noqa
|
|
56
|
-
app_config.dependencies["jwt"] = Provide(
|
|
57
|
-
lambda: self._auth, sync_to_thread=True
|
|
58
|
-
)
|
|
59
|
-
return app_config
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|