jamlib 3.0.0b12.dev4__tar.gz → 3.0.0b13.dev0__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.dev4/src/jamlib.egg-info → jamlib-3.0.0b13.dev0}/PKG-INFO +1 -1
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/pyproject.toml +1 -1
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/__init__.py +1 -1
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/exceptions/__init__.py +8 -1
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/exceptions/plugins.py +13 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/ext/litestar/plugins.py +25 -14
- jamlib-3.0.0b13.dev0/src/jam/ext/starlette/__init__.py +6 -0
- jamlib-3.0.0b13.dev0/src/jam/ext/starlette/backends.py +65 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/__algorithms__.py +5 -1
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0/src/jamlib.egg-info}/PKG-INFO +1 -1
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jamlib.egg-info/SOURCES.txt +1 -2
- jamlib-3.0.0b12.dev4/src/jam/ext/starlette/__init__.py +0 -12
- jamlib-3.0.0b12.dev4/src/jam/ext/starlette/auth_backends.py +0 -143
- jamlib-3.0.0b12.dev4/src/jam/ext/starlette/value.py +0 -18
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/LICENSE.md +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/README.md +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/setup.cfg +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/__base__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/__base_encoder__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/__deprecated__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/__base__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/instance.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/jwt/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/oauth2/__base__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/oauth2/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/oauth2/builtin/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/oauth2/builtin/github.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/oauth2/builtin/gitlab.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/oauth2/builtin/google.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/oauth2/builtin/yandex.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/oauth2/client.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/sessions/__base__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/sessions/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/sessions/json.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/aio/sessions/redis.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/encoders.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/exceptions/base.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/exceptions/jwt.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/exceptions/oauth2.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/exceptions/paseto.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/exceptions/sessions.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/ext/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/ext/fastapi/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/ext/flask/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/ext/flask/extensions.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/ext/litestar/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/ext/litestar/middleware.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/ext/litestar/objects.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/instance.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/__base__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/__types__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/lists/__abc_list_repo__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/lists/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/lists/json.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/lists/redis.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/module.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/jwt/utils.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/logger.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/oauth2/__base__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/oauth2/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/oauth2/builtin/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/oauth2/builtin/github.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/oauth2/builtin/gitlab.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/oauth2/builtin/google.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/oauth2/builtin/yandex.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/oauth2/client.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/otp/__base__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/otp/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/otp/hotp.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/otp/totp.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/paseto/__base__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/paseto/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/paseto/utils.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/paseto/v1.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/paseto/v2.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/paseto/v3.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/paseto/v4.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/py.typed +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/sessions/__base__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/sessions/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/sessions/json.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/sessions/redis.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/tests/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/tests/clients.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/tests/fakers.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/__init__.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/aes.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/await_maybe.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/basic_auth.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/config_maker.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/ed.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/otp_keys.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/rsa.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/salt_hash.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/symmetric.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/xchacha20poly1305.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jam/utils/xor.py +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jamlib.egg-info/dependency_links.txt +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/src/jamlib.egg-info/requires.txt +0 -0
- {jamlib-3.0.0b12.dev4 → jamlib-3.0.0b13.dev0}/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.
|
|
3
|
+
Version: 3.0.0b13.dev0
|
|
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,12 @@ from .paseto import (
|
|
|
36
36
|
JamPASETOInvalidTokenFormat
|
|
37
37
|
)
|
|
38
38
|
|
|
39
|
-
from .plugins import
|
|
39
|
+
from .plugins import (
|
|
40
|
+
JamLitestarPluginConfigError,
|
|
41
|
+
JamLitestarPluginError,
|
|
42
|
+
JamStarlettePluginConfigError,
|
|
43
|
+
JamStarlettePluginError
|
|
44
|
+
)
|
|
40
45
|
|
|
41
46
|
from .sessions import (
|
|
42
47
|
JamSessionNotFound,
|
|
@@ -67,6 +72,8 @@ __all__ = [
|
|
|
67
72
|
"JamPASTOKeyVerificationError",
|
|
68
73
|
"JamLitestarPluginConfigError",
|
|
69
74
|
"JamLitestarPluginError",
|
|
75
|
+
"JamStarlettePluginConfigError",
|
|
76
|
+
"JamStarlettePluginError",
|
|
70
77
|
"JamSessionNotFound",
|
|
71
78
|
"JamSessionEmptyAESKey",
|
|
72
79
|
]
|
|
@@ -15,3 +15,16 @@ class JamLitestarPluginError(JamError):
|
|
|
15
15
|
|
|
16
16
|
default_message = "An error occurred for a litestar plugin."
|
|
17
17
|
default_code = "jam.plugin.litestar"
|
|
18
|
+
|
|
19
|
+
class JamStarlettePluginConfigError(JamConfigurationError):
|
|
20
|
+
"""Exception raised when a configuration error occurs for a starlette plugin."""
|
|
21
|
+
|
|
22
|
+
default_message = "Configuration error occurred for a starlette plugin."
|
|
23
|
+
default_code = "jam.configuration.plugin.starlette"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class JamStarlettePluginError(JamError):
|
|
27
|
+
"""Exception raised when an error occurs for a starlette plugin."""
|
|
28
|
+
|
|
29
|
+
default_message = "An error occurred for a starlette plugin."
|
|
30
|
+
default_code = "jam.plugin.starlette"
|
|
@@ -26,23 +26,34 @@ class BasePlugin(InitPlugin):
|
|
|
26
26
|
"""Base Litestar plugin."""
|
|
27
27
|
|
|
28
28
|
MODULE: Callable
|
|
29
|
-
|
|
29
|
+
MIDDLEWARE: type[BaseMiddleware]
|
|
30
30
|
_DI_KEY: str
|
|
31
31
|
_CONFIG_KEY: str
|
|
32
32
|
|
|
33
33
|
def _setup_config(self, config: dict[str, Any]) -> None:
|
|
34
34
|
self._auth = self.MODULE(**config)
|
|
35
35
|
|
|
36
|
-
def __init__(
|
|
36
|
+
def __init__(
|
|
37
37
|
self,
|
|
38
38
|
config: dict[str, Any] | str | None = None,
|
|
39
39
|
pointer: str = GENERIC_POINTER,
|
|
40
40
|
cookie_name: str | None = None,
|
|
41
41
|
header_name: str | None = None,
|
|
42
42
|
middleware: bool = True,
|
|
43
|
-
|
|
43
|
+
user: type[BaseUser] | None = None,
|
|
44
44
|
**kwargs,
|
|
45
45
|
) -> None:
|
|
46
|
+
"""Initialize the plugin.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
config (dict[str, Any] | str | None): Jam config as path/to/file or dict.
|
|
50
|
+
pointer (str): Config pointer
|
|
51
|
+
cookie_name (str | None): Cookie name to read token
|
|
52
|
+
header_name (str | None): Header name to read token
|
|
53
|
+
middleware (bool): Use middleware?
|
|
54
|
+
user (type[BaseUser]): User for request state. See: DOCUMENTATION
|
|
55
|
+
**kwargs: Config arguments if config=None
|
|
56
|
+
"""
|
|
46
57
|
if middleware and (not cookie_name and not header_name):
|
|
47
58
|
raise JamLitestarPluginConfigError(
|
|
48
59
|
message="Cookie name and header name cannot be both None.",
|
|
@@ -51,11 +62,11 @@ class BasePlugin(InitPlugin):
|
|
|
51
62
|
"header_name": header_name,
|
|
52
63
|
},
|
|
53
64
|
)
|
|
54
|
-
if middleware and not
|
|
65
|
+
if middleware and not user:
|
|
55
66
|
raise JamLitestarPluginConfigError(
|
|
56
67
|
message="Middleware user cannot be None when middleware is True.",
|
|
57
68
|
details={
|
|
58
|
-
"middleware_user":
|
|
69
|
+
"middleware_user": user,
|
|
59
70
|
},
|
|
60
71
|
)
|
|
61
72
|
|
|
@@ -68,11 +79,11 @@ class BasePlugin(InitPlugin):
|
|
|
68
79
|
self._middleware = None
|
|
69
80
|
|
|
70
81
|
if middleware:
|
|
71
|
-
_middleware = self.
|
|
82
|
+
_middleware = self.MIDDLEWARE
|
|
72
83
|
_middleware.COOKIE_NAME = cookie_name
|
|
73
84
|
_middleware.HEADER_NAME = header_name
|
|
74
85
|
_middleware.AUTH_MODULE = self._auth
|
|
75
|
-
_middleware.USER =
|
|
86
|
+
_middleware.USER = user # type: ignore
|
|
76
87
|
self._middleware = _middleware
|
|
77
88
|
|
|
78
89
|
def on_app_init(self, app_config: AppConfig) -> AppConfig: # noqa
|
|
@@ -89,7 +100,7 @@ class JamJWTPlugin(BasePlugin):
|
|
|
89
100
|
"""JWT plugin for litestar."""
|
|
90
101
|
|
|
91
102
|
MODULE = JWT
|
|
92
|
-
|
|
103
|
+
MIDDLEWARE = JWTMiddleware
|
|
93
104
|
_DI_KEY = "jwt"
|
|
94
105
|
_CONFIG_KEY = "jwt"
|
|
95
106
|
|
|
@@ -98,7 +109,7 @@ class JamSessionPlugin(BasePlugin):
|
|
|
98
109
|
"""Sessions plugin for litestar."""
|
|
99
110
|
|
|
100
111
|
MODULE = staticmethod(create_session)
|
|
101
|
-
|
|
112
|
+
MIDDLEWARE = SessionMiddleware
|
|
102
113
|
_DI_KEY = "session"
|
|
103
114
|
_CONFIG_KEY = "sessions"
|
|
104
115
|
|
|
@@ -107,13 +118,13 @@ class JamPASETOPlugin(BasePlugin):
|
|
|
107
118
|
"""PASETO plugin for litestar."""
|
|
108
119
|
|
|
109
120
|
MODULE = staticmethod(create_paseto)
|
|
110
|
-
|
|
121
|
+
MIDDLEWARE = PASETOMiddleware
|
|
111
122
|
_DI_KEY = "paseto"
|
|
112
123
|
_CONFIG_KEY = "paseto"
|
|
113
124
|
|
|
114
125
|
|
|
115
126
|
class JamOAuth2Plugin(BasePlugin):
|
|
116
|
-
"""OAuth2 plugin."""
|
|
127
|
+
"""OAuth2 plugin for litestar."""
|
|
117
128
|
|
|
118
129
|
MODULE = staticmethod(create_oauth2)
|
|
119
130
|
_DI_KEY = "oauth2"
|
|
@@ -128,9 +139,9 @@ class JamOAuth2Plugin(BasePlugin):
|
|
|
128
139
|
"""Initialize the OAuth2 plugin.
|
|
129
140
|
|
|
130
141
|
Args:
|
|
131
|
-
config (
|
|
132
|
-
pointer (str):
|
|
133
|
-
**kwargs:
|
|
142
|
+
config (dict[str, Any] | str | None): Jam config as path/to/file or dict.
|
|
143
|
+
pointer (str): Config pointer
|
|
144
|
+
**kwargs: Config arguments if config=None
|
|
134
145
|
"""
|
|
135
146
|
_config: dict[str, Any] | None = (
|
|
136
147
|
__config_maker__(config, pointer) if config else None
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from starlette.authentication import AuthenticationBackend, BaseUser
|
|
7
|
+
|
|
8
|
+
from jam.exceptions import JamStarlettePluginConfigError
|
|
9
|
+
from jam.utils.config_maker import GENERIC_POINTER, __config_maker__
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BaseBackend(AuthenticationBackend):
|
|
13
|
+
"""Base Jam backend."""
|
|
14
|
+
|
|
15
|
+
MODULE: Callable
|
|
16
|
+
_CONFIG_KEY: str
|
|
17
|
+
|
|
18
|
+
def __init__( # noqa
|
|
19
|
+
self,
|
|
20
|
+
config: str | dict[str, Any] | None = None,
|
|
21
|
+
pointer: str = GENERIC_POINTER,
|
|
22
|
+
cookie_name: str | None = None,
|
|
23
|
+
header_name: str | None = None,
|
|
24
|
+
user: type[BaseUser] | None = None,
|
|
25
|
+
**kwargs,
|
|
26
|
+
) -> None:
|
|
27
|
+
if not cookie_name and not header_name:
|
|
28
|
+
raise JamStarlettePluginConfigError(
|
|
29
|
+
message="cookie_name or header_name must be provided.",
|
|
30
|
+
details={
|
|
31
|
+
"cookie_name": cookie_name,
|
|
32
|
+
"header_name": header_name,
|
|
33
|
+
},
|
|
34
|
+
)
|
|
35
|
+
self._cookie_name = cookie_name
|
|
36
|
+
self._header_name = header_name
|
|
37
|
+
self._user = user
|
|
38
|
+
self._config_setup(config, pointer, kwargs)
|
|
39
|
+
|
|
40
|
+
def _config_setup(
|
|
41
|
+
self,
|
|
42
|
+
config: dict[str, Any] | str | None,
|
|
43
|
+
pointer: str,
|
|
44
|
+
kwargs: dict[str, Any],
|
|
45
|
+
) -> None:
|
|
46
|
+
try:
|
|
47
|
+
if config:
|
|
48
|
+
config_ = __config_maker__(config, pointer)[self._CONFIG_KEY]
|
|
49
|
+
self._auth = self.MODULE(**config_)
|
|
50
|
+
else:
|
|
51
|
+
self._auth = self.MODULE(**kwargs)
|
|
52
|
+
except Exception as e:
|
|
53
|
+
raise JamStarlettePluginConfigError(
|
|
54
|
+
message="Error while building auth modile.",
|
|
55
|
+
details={
|
|
56
|
+
"module": self.MODULE.__str__,
|
|
57
|
+
"config": {
|
|
58
|
+
"config": config,
|
|
59
|
+
"pointer": pointer,
|
|
60
|
+
"kwargs": kwargs,
|
|
61
|
+
},
|
|
62
|
+
"config_key": self._CONFIG_KEY,
|
|
63
|
+
"error": str(e),
|
|
64
|
+
},
|
|
65
|
+
)
|
|
@@ -100,7 +100,11 @@ class BaseAlgorithm(ABC):
|
|
|
100
100
|
from pathlib import Path
|
|
101
101
|
|
|
102
102
|
path = Path(data)
|
|
103
|
-
|
|
103
|
+
try:
|
|
104
|
+
is_file = path.is_file()
|
|
105
|
+
except OSError:
|
|
106
|
+
is_file = False
|
|
107
|
+
return path.read_bytes() if is_file else data.encode()
|
|
104
108
|
|
|
105
109
|
def _load_private_key(
|
|
106
110
|
self, key_bytes: bytes | None, key_obj: Any | None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jamlib
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.0b13.dev0
|
|
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
|
|
@@ -41,8 +41,7 @@ src/jam/ext/litestar/middleware.py
|
|
|
41
41
|
src/jam/ext/litestar/objects.py
|
|
42
42
|
src/jam/ext/litestar/plugins.py
|
|
43
43
|
src/jam/ext/starlette/__init__.py
|
|
44
|
-
src/jam/ext/starlette/
|
|
45
|
-
src/jam/ext/starlette/value.py
|
|
44
|
+
src/jam/ext/starlette/backends.py
|
|
46
45
|
src/jam/jwt/__algorithms__.py
|
|
47
46
|
src/jam/jwt/__base__.py
|
|
48
47
|
src/jam/jwt/__init__.py
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
from starlette.authentication import (
|
|
6
|
-
AuthCredentials,
|
|
7
|
-
AuthenticationBackend,
|
|
8
|
-
AuthenticationError,
|
|
9
|
-
BaseUser,
|
|
10
|
-
)
|
|
11
|
-
from starlette.requests import HTTPConnection
|
|
12
|
-
|
|
13
|
-
from jam.__base__ import BaseJam
|
|
14
|
-
from jam.utils.await_maybe import await_maybe
|
|
15
|
-
|
|
16
|
-
from .value import Payload
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class JWTBackend(AuthenticationBackend):
|
|
20
|
-
"""JWT Backend for Starlette AuthenticationMiddleware."""
|
|
21
|
-
|
|
22
|
-
def __init__(
|
|
23
|
-
self,
|
|
24
|
-
jam: BaseJam,
|
|
25
|
-
cookie_name: str | None = None,
|
|
26
|
-
header_name: str | None = "Authorization",
|
|
27
|
-
) -> None:
|
|
28
|
-
"""Constructor.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
jam (BaseJam): Jam instance
|
|
32
|
-
cookie_name (str | None): Access token cookie name
|
|
33
|
-
header_name (str | None): Access token header name
|
|
34
|
-
"""
|
|
35
|
-
self._jam = jam
|
|
36
|
-
self.cookie_name = cookie_name
|
|
37
|
-
self.header_name = header_name
|
|
38
|
-
self.__use_list = bool(getattr(self._jam.jwt, "list", False))
|
|
39
|
-
|
|
40
|
-
async def authenticate(
|
|
41
|
-
self, conn: HTTPConnection
|
|
42
|
-
) -> tuple[AuthCredentials, BaseUser] | None:
|
|
43
|
-
"""Starlette authentication handler."""
|
|
44
|
-
logger = self._jam._logger
|
|
45
|
-
token = None
|
|
46
|
-
|
|
47
|
-
logger.debug("JWTBackend: Attempting to extract token from request")
|
|
48
|
-
if self.cookie_name:
|
|
49
|
-
token = conn.cookies.get(self.cookie_name)
|
|
50
|
-
if token:
|
|
51
|
-
logger.debug(f"Token found in cookie '{self.cookie_name}'")
|
|
52
|
-
|
|
53
|
-
if not token and self.header_name:
|
|
54
|
-
header = conn.headers.get(self.header_name)
|
|
55
|
-
if header and header.startswith("Bearer "):
|
|
56
|
-
token = header.split("Bearer ")[1]
|
|
57
|
-
logger.debug(f"Token found in header '{self.header_name}'")
|
|
58
|
-
|
|
59
|
-
if not token:
|
|
60
|
-
logger.debug("No token found in request")
|
|
61
|
-
return None
|
|
62
|
-
|
|
63
|
-
logger.debug(
|
|
64
|
-
f"Verifying JWT token (length: {len(token)} chars), check_list={self.__use_list}"
|
|
65
|
-
)
|
|
66
|
-
try:
|
|
67
|
-
payload: dict[str, Any] = await await_maybe(
|
|
68
|
-
self._jam.jwt_verify_token(
|
|
69
|
-
token=token, check_exp=True, check_list=self.__use_list
|
|
70
|
-
)
|
|
71
|
-
)
|
|
72
|
-
logger.debug(
|
|
73
|
-
f"JWT token verified successfully, payload keys: {list(payload.keys())}"
|
|
74
|
-
)
|
|
75
|
-
except Exception as e:
|
|
76
|
-
logger.warning(f"Token verify error: {e}")
|
|
77
|
-
raise AuthenticationError("Token verification failed.")
|
|
78
|
-
|
|
79
|
-
return AuthCredentials(["authenticated"]), Payload(payload=payload)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
class SessionBackend(AuthenticationBackend):
|
|
83
|
-
"""Sessions backend for starlette."""
|
|
84
|
-
|
|
85
|
-
def __init__(
|
|
86
|
-
self,
|
|
87
|
-
jam: BaseJam,
|
|
88
|
-
cookie_name: str | None = "sessionId",
|
|
89
|
-
header_name: str | None = None,
|
|
90
|
-
) -> None:
|
|
91
|
-
"""Constructor.
|
|
92
|
-
|
|
93
|
-
Args:
|
|
94
|
-
jam (BaseJam): Jam instance
|
|
95
|
-
cookie_name (str | None): Session id cookie name
|
|
96
|
-
header_name (str | None): Session id header name
|
|
97
|
-
"""
|
|
98
|
-
self._jam = jam
|
|
99
|
-
self.cookie_name = cookie_name
|
|
100
|
-
self.header_name = header_name
|
|
101
|
-
|
|
102
|
-
async def authenticate(
|
|
103
|
-
self, conn: HTTPConnection
|
|
104
|
-
) -> tuple[AuthCredentials, BaseUser] | None:
|
|
105
|
-
"""Starlette authentication handler."""
|
|
106
|
-
logger = self._jam._logger
|
|
107
|
-
session_id = None
|
|
108
|
-
|
|
109
|
-
logger.debug(
|
|
110
|
-
"SessionBackend: Attempting to extract session ID from request"
|
|
111
|
-
)
|
|
112
|
-
if self.cookie_name:
|
|
113
|
-
session_id = conn.cookies.get(self.cookie_name)
|
|
114
|
-
if session_id:
|
|
115
|
-
logger.debug(f"Session ID found in cookie '{self.cookie_name}'")
|
|
116
|
-
|
|
117
|
-
if not session_id and self.header_name:
|
|
118
|
-
header = conn.headers.get(self.header_name)
|
|
119
|
-
if header and header.startswith("Bearer "):
|
|
120
|
-
session_id = header.split("Bearer ")[1]
|
|
121
|
-
logger.debug(f"Session ID found in header '{self.header_name}'")
|
|
122
|
-
|
|
123
|
-
if not session_id:
|
|
124
|
-
logger.debug("No session ID found in request")
|
|
125
|
-
return None
|
|
126
|
-
|
|
127
|
-
logger.debug(f"Getting session data for session ID: {session_id}")
|
|
128
|
-
try:
|
|
129
|
-
payload: dict[str, Any] | None = await await_maybe( # type: ignore[arg-type]
|
|
130
|
-
self._jam.session_get(session_id) # type: ignore[arg-type]
|
|
131
|
-
)
|
|
132
|
-
if payload:
|
|
133
|
-
logger.debug(
|
|
134
|
-
f"Session data retrieved successfully, keys: {list(payload.keys())}"
|
|
135
|
-
)
|
|
136
|
-
else:
|
|
137
|
-
logger.debug(f"Session {session_id} not found")
|
|
138
|
-
# TODO: Return unauthized user
|
|
139
|
-
except Exception as e:
|
|
140
|
-
logger.warning(f"Session retrieval error: {e}")
|
|
141
|
-
raise AuthenticationError("Token verification failed.")
|
|
142
|
-
|
|
143
|
-
return AuthCredentials(["authenticated"]), Payload(payload=payload)
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
from starlette.authentication import BaseUser
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class Payload(BaseUser):
|
|
9
|
-
"""Auth payload."""
|
|
10
|
-
|
|
11
|
-
def __init__(self, payload: dict[str, Any] | None):
|
|
12
|
-
"""Auth payload."""
|
|
13
|
-
self.payload = payload
|
|
14
|
-
|
|
15
|
-
@property
|
|
16
|
-
def is_authenticated(self) -> bool:
|
|
17
|
-
"""Auth checker."""
|
|
18
|
-
return True
|
|
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
|