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.
Files changed (103) hide show
  1. {jamlib-3.0.0b12.dev0/src/jamlib.egg-info → jamlib-3.0.0b12.dev2}/PKG-INFO +1 -1
  2. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/pyproject.toml +1 -1
  3. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/__init__.py +1 -1
  4. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/__init__.py +2 -1
  5. jamlib-3.0.0b12.dev2/src/jam/exceptions/plugins.py +17 -0
  6. jamlib-3.0.0b12.dev2/src/jam/ext/litestar/__init__.py +24 -0
  7. jamlib-3.0.0b12.dev2/src/jam/ext/litestar/middleware.py +81 -0
  8. jamlib-3.0.0b12.dev2/src/jam/ext/litestar/objects.py +44 -0
  9. jamlib-3.0.0b12.dev2/src/jam/ext/litestar/plugins.py +100 -0
  10. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2/src/jamlib.egg-info}/PKG-INFO +1 -1
  11. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jamlib.egg-info/SOURCES.txt +2 -0
  12. jamlib-3.0.0b12.dev0/src/jam/exceptions/plugins.py +0 -10
  13. jamlib-3.0.0b12.dev0/src/jam/ext/litestar/__init__.py +0 -7
  14. jamlib-3.0.0b12.dev0/src/jam/ext/litestar/plugins.py +0 -59
  15. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/LICENSE.md +0 -0
  16. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/README.md +0 -0
  17. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/setup.cfg +0 -0
  18. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/__base__.py +0 -0
  19. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/__base_encoder__.py +0 -0
  20. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/__deprecated__.py +0 -0
  21. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/__base__.py +0 -0
  22. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/__init__.py +0 -0
  23. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/instance.py +0 -0
  24. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/jwt/__init__.py +0 -0
  25. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/__base__.py +0 -0
  26. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/__init__.py +0 -0
  27. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/__init__.py +0 -0
  28. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/github.py +0 -0
  29. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/gitlab.py +0 -0
  30. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/google.py +0 -0
  31. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/builtin/yandex.py +0 -0
  32. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/oauth2/client.py +0 -0
  33. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/sessions/__base__.py +0 -0
  34. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/sessions/__init__.py +0 -0
  35. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/sessions/json.py +0 -0
  36. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/aio/sessions/redis.py +0 -0
  37. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/encoders.py +0 -0
  38. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/base.py +0 -0
  39. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/jwt.py +0 -0
  40. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/oauth2.py +0 -0
  41. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/paseto.py +0 -0
  42. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/exceptions/sessions.py +0 -0
  43. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/__init__.py +0 -0
  44. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/fastapi/__init__.py +0 -0
  45. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/flask/__init__.py +0 -0
  46. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/flask/extensions.py +0 -0
  47. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/starlette/__init__.py +0 -0
  48. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/starlette/auth_backends.py +0 -0
  49. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/ext/starlette/value.py +0 -0
  50. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/instance.py +0 -0
  51. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/__algorithms__.py +0 -0
  52. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/__base__.py +0 -0
  53. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/__init__.py +0 -0
  54. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/__types__.py +0 -0
  55. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/lists/__abc_list_repo__.py +0 -0
  56. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/lists/__init__.py +0 -0
  57. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/lists/json.py +0 -0
  58. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/lists/redis.py +0 -0
  59. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/module.py +0 -0
  60. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/jwt/utils.py +0 -0
  61. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/logger.py +0 -0
  62. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/__base__.py +0 -0
  63. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/__init__.py +0 -0
  64. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/__init__.py +0 -0
  65. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/github.py +0 -0
  66. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/gitlab.py +0 -0
  67. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/google.py +0 -0
  68. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/builtin/yandex.py +0 -0
  69. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/oauth2/client.py +0 -0
  70. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/otp/__base__.py +0 -0
  71. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/otp/__init__.py +0 -0
  72. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/otp/hotp.py +0 -0
  73. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/otp/totp.py +0 -0
  74. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/__base__.py +0 -0
  75. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/__init__.py +0 -0
  76. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/utils.py +0 -0
  77. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/v1.py +0 -0
  78. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/v2.py +0 -0
  79. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/v3.py +0 -0
  80. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/paseto/v4.py +0 -0
  81. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/py.typed +0 -0
  82. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/sessions/__base__.py +0 -0
  83. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/sessions/__init__.py +0 -0
  84. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/sessions/json.py +0 -0
  85. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/sessions/redis.py +0 -0
  86. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/tests/__init__.py +0 -0
  87. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/tests/clients.py +0 -0
  88. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/tests/fakers.py +0 -0
  89. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/__init__.py +0 -0
  90. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/aes.py +0 -0
  91. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/await_maybe.py +0 -0
  92. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/basic_auth.py +0 -0
  93. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/config_maker.py +0 -0
  94. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/ed.py +0 -0
  95. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/otp_keys.py +0 -0
  96. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/rsa.py +0 -0
  97. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/salt_hash.py +0 -0
  98. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/symmetric.py +0 -0
  99. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/xchacha20poly1305.py +0 -0
  100. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jam/utils/xor.py +0 -0
  101. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jamlib.egg-info/dependency_links.txt +0 -0
  102. {jamlib-3.0.0b12.dev0 → jamlib-3.0.0b12.dev2}/src/jamlib.egg-info/requires.txt +0 -0
  103. {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.dev0
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "jamlib"
3
- version = "3.0.0b12.dev0"
3
+ version = "3.0.0b12.dev2"
4
4
  description = "Simple and universal library for authorization."
5
5
  authors = [
6
6
  {name = "Makridenko Adrian",email = "adrianmakridenko@duck.com"},
@@ -12,5 +12,5 @@ from jam.encoders import JsonEncoder
12
12
  from jam.instance import Jam
13
13
 
14
14
 
15
- __version__ = "3.0.0b12.dev0"
15
+ __version__ = "3.0.0b12.dev2"
16
16
  __all__ = ["Jam", "JsonEncoder", "BaseJam", "BaseEncoder"]
@@ -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.dev0
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,7 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- """
4
- Litestar integration.
5
-
6
- Litestar docs: https://docs.litestar.dev
7
- """
@@ -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