nlbone 0.7.14__tar.gz → 0.7.16__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 (116) hide show
  1. {nlbone-0.7.14 → nlbone-0.7.16}/PKG-INFO +1 -1
  2. {nlbone-0.7.14 → nlbone-0.7.16}/pyproject.toml +1 -1
  3. nlbone-0.7.16/src/nlbone/adapters/auth/auth_service.py +59 -0
  4. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/auth/token_provider.py +1 -1
  5. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/config/settings.py +3 -1
  6. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/container.py +3 -1
  7. nlbone-0.7.16/src/nlbone/interfaces/api/dependencies/client_credential.py +44 -0
  8. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/cache.py +9 -3
  9. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/cache_registry.py +0 -2
  10. nlbone-0.7.14/src/nlbone/adapters/auth/auth_service.py +0 -25
  11. {nlbone-0.7.14 → nlbone-0.7.16}/.gitignore +0 -0
  12. {nlbone-0.7.14 → nlbone-0.7.16}/LICENSE +0 -0
  13. {nlbone-0.7.14 → nlbone-0.7.16}/README.md +0 -0
  14. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/__init__.py +0 -0
  15. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/__init__.py +0 -0
  16. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/auth/__init__.py +0 -0
  17. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/auth/keycloak.py +0 -0
  18. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/cache/__init__.py +0 -0
  19. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/cache/async_redis.py +0 -0
  20. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/cache/memory.py +0 -0
  21. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/cache/pubsub_listener.py +0 -0
  22. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/cache/redis.py +0 -0
  23. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/__init__.py +0 -0
  24. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/postgres/__init__.py +0 -0
  25. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/postgres/audit.py +0 -0
  26. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/postgres/base.py +0 -0
  27. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/postgres/engine.py +0 -0
  28. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/postgres/query_builder.py +0 -0
  29. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/postgres/repository.py +0 -0
  30. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/postgres/schema.py +0 -0
  31. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/postgres/types.py +0 -0
  32. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/postgres/uow.py +0 -0
  33. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/redis/__init__.py +0 -0
  34. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/db/redis/client.py +0 -0
  35. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/http_clients/__init__.py +0 -0
  36. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/http_clients/pricing/__init__.py +0 -0
  37. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/http_clients/pricing/pricing_service.py +0 -0
  38. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/http_clients/uploadchi/__init__.py +0 -0
  39. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/http_clients/uploadchi/uploadchi.py +0 -0
  40. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/http_clients/uploadchi/uploadchi_async.py +0 -0
  41. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/messaging/__init__.py +0 -0
  42. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/messaging/event_bus.py +0 -0
  43. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/messaging/rabbitmq.py +0 -0
  44. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/outbox/__init__.py +0 -0
  45. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/outbox/outbox_consumer.py +0 -0
  46. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/outbox/outbox_repo.py +0 -0
  47. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/percolation/__init__.py +0 -0
  48. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/percolation/connection.py +0 -0
  49. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/repositories/__init__.py +0 -0
  50. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/snowflake.py +0 -0
  51. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/ticketing/__init__.py +0 -0
  52. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/adapters/ticketing/client.py +0 -0
  53. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/config/__init__.py +0 -0
  54. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/config/logging.py +0 -0
  55. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/__init__.py +0 -0
  56. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/application/__init__.py +0 -0
  57. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/application/base_worker.py +0 -0
  58. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/application/bus.py +0 -0
  59. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/application/di.py +0 -0
  60. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/application/registry.py +0 -0
  61. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/application/services/__init__.py +0 -0
  62. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/application/use_case.py +0 -0
  63. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/domain/__init__.py +0 -0
  64. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/domain/base.py +0 -0
  65. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/domain/models.py +0 -0
  66. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/ports/__init__.py +0 -0
  67. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/ports/auth.py +0 -0
  68. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/ports/cache.py +0 -0
  69. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/ports/event_bus.py +0 -0
  70. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/ports/files.py +0 -0
  71. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/ports/outbox.py +0 -0
  72. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/ports/repository.py +0 -0
  73. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/core/ports/uow.py +0 -0
  74. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/__init__.py +0 -0
  75. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/__init__.py +0 -0
  76. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/additional_filed/__init__.py +0 -0
  77. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/additional_filed/assembler.py +0 -0
  78. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/additional_filed/default_field_rules/__init__.py +0 -0
  79. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/additional_filed/default_field_rules/image_field_rules.py +0 -0
  80. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/additional_filed/field_registry.py +0 -0
  81. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/additional_filed/resolver.py +0 -0
  82. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/dependencies/__init__.py +0 -0
  83. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/dependencies/async_auth.py +0 -0
  84. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/dependencies/auth.py +0 -0
  85. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/dependencies/db.py +0 -0
  86. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/dependencies/uow.py +0 -0
  87. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/exception_handlers.py +0 -0
  88. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/exceptions.py +0 -0
  89. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/middleware/__init__.py +0 -0
  90. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/middleware/access_log.py +0 -0
  91. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/middleware/add_request_context.py +0 -0
  92. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/middleware/authentication.py +0 -0
  93. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/pagination/__init__.py +0 -0
  94. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/pagination/offset_base.py +0 -0
  95. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/routers.py +0 -0
  96. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/schema/__init__.py +0 -0
  97. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/schema/adaptive_schema.py +0 -0
  98. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/schema/base_response_model.py +0 -0
  99. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/api/schemas.py +0 -0
  100. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/cli/__init__.py +0 -0
  101. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/cli/crypto.py +0 -0
  102. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/cli/init_db.py +0 -0
  103. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/cli/main.py +0 -0
  104. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/cli/ticket.py +0 -0
  105. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/jobs/__init__.py +0 -0
  106. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/jobs/dispatch_outbox.py +0 -0
  107. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/interfaces/jobs/sync_tokens.py +0 -0
  108. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/types.py +0 -0
  109. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/__init__.py +0 -0
  110. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/cache_keys.py +0 -0
  111. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/context.py +0 -0
  112. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/crypto.py +0 -0
  113. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/http.py +0 -0
  114. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/normalize_mobile.py +0 -0
  115. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/redactor.py +0 -0
  116. {nlbone-0.7.14 → nlbone-0.7.16}/src/nlbone/utils/time.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nlbone
3
- Version: 0.7.14
3
+ Version: 0.7.16
4
4
  Summary: Backbone package for interfaces and infrastructure in Python projects
5
5
  Author-email: Amir Hosein Kahkbazzadeh <a.khakbazzadeh@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nlbone"
7
- version = "0.7.14"
7
+ version = "0.7.16"
8
8
  description = "Backbone package for interfaces and infrastructure in Python projects"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,59 @@
1
+ import requests
2
+
3
+ from nlbone.config.settings import get_settings
4
+ from nlbone.core.ports.auth import AuthService as BaseAuthService
5
+ from nlbone.utils.http import normalize_https_base
6
+ from nlbone.utils.cache import cached
7
+
8
+
9
+ class AuthService(BaseAuthService):
10
+ def __init__(self):
11
+ s = get_settings()
12
+ self.client_id = s.KEYCLOAK_CLIENT_ID
13
+ self.client_secret = s.CLIENT_SECRET.get_secret_value().strip()
14
+ self._base_url = normalize_https_base(s.AUTH_SERVICE_URL.unicode_string(), enforce_https=False)
15
+ self._timeout = float(s.HTTP_TIMEOUT_SECONDS)
16
+ self._client = requests.session()
17
+
18
+ def has_access(self, token: str, permissions: list[str]) -> bool:
19
+ ...
20
+
21
+ @cached(ttl=15 * 60)
22
+ def verify_token(self, token: str) -> dict:
23
+ url = f"{self._base_url}/introspect"
24
+ result = self._client.post(url, data={
25
+ "token": token
26
+ })
27
+ if result.status_code == 200:
28
+ return result.json()
29
+ return None
30
+
31
+ def get_client_id(self, token: str):
32
+ data = self.verify_token(token)
33
+ if data:
34
+ return data["sub"] if data["sub"].startswith('service-account') else None
35
+ return None
36
+
37
+ def get_client_token(self) -> dict | None:
38
+ url = f"{self._base_url}/introspect"
39
+ result = self._client.post(url, data={
40
+ "client_id": self.client_id,
41
+ "client_secret": self.client_secret,
42
+ "grant_type": "client_credentials"
43
+ })
44
+ if result.status_code == 200:
45
+ return result.json()
46
+ return None
47
+
48
+ def is_client_token(self, token: str, allowed_clients: set[str] | None = None) -> bool:
49
+ ...
50
+
51
+ def client_has_access(self, token: str, permissions: list[str], allowed_clients: set[str] | None = None) -> bool:
52
+ data = self.verify_token(token)
53
+ if not data:
54
+ return False
55
+ has_access = [perm in data.get("allowed_permissions", []) for perm in permissions]
56
+ return all(has_access)
57
+
58
+ def get_permissions(self, token: str) -> list[str]:
59
+ ...
@@ -31,7 +31,7 @@ class ClientTokenProvider:
31
31
  access_token = data.get("access_token")
32
32
  if not access_token:
33
33
  raise RuntimeError("Keycloak: missing access_token")
34
- expires_in = int(data.get("expires_in", 60))
34
+ expires_in = int(data.get("expires_in", 15 * 60))
35
35
  self._token = access_token
36
36
  self._expires_at = time.time() + max(1, expires_in)
37
37
  return self._token
@@ -3,7 +3,7 @@ from functools import lru_cache
3
3
  from pathlib import Path
4
4
  from typing import Literal
5
5
 
6
- from pydantic import AnyHttpUrl, Field, SecretStr
6
+ from pydantic import AnyHttpUrl, Field, SecretStr, AliasChoices
7
7
  from pydantic_settings import BaseSettings, SettingsConfigDict
8
8
 
9
9
 
@@ -63,6 +63,8 @@ class Settings(BaseSettings):
63
63
  PRICING_API_SECRET: str = ''
64
64
 
65
65
  AUTH_SERVICE_URL: AnyHttpUrl = Field(default="https://auth.numberland.ir")
66
+ CLIENT_ID: str = Field(default="", validation_alias=AliasChoices("KEYCLOAK_CLIENT_ID"))
67
+ CLIENT_SECRET: SecretStr = Field(default="", validation_alias=AliasChoices("KEYCLOAK_CLIENT_SECRET"))
66
68
 
67
69
  # ---------------------------
68
70
  # Database
@@ -5,6 +5,8 @@ from typing import Dict, Optional
5
5
  from dependency_injector import containers, providers
6
6
  from pydantic_settings import BaseSettings
7
7
 
8
+ from nlbone.adapters.auth.auth_service import AuthService as AuthService_IMP
9
+ from nlbone.core.ports.auth import AuthService
8
10
  from nlbone.adapters.auth.keycloak import KeycloakAuthService
9
11
  from nlbone.adapters.auth.token_provider import ClientTokenProvider
10
12
  from nlbone.adapters.cache.async_redis import AsyncRedisCache
@@ -28,7 +30,7 @@ class Container(containers.DeclarativeContainer):
28
30
  # event_bus: providers.Singleton[EventBusPort] = providers.Singleton(InMemoryEventBus)
29
31
 
30
32
  # --- Services ---
31
- auth: providers.Singleton[KeycloakAuthService] = providers.Singleton(KeycloakAuthService)
33
+ auth: providers.Singleton[AuthService] = providers.Singleton(AuthService_IMP)
32
34
  token_provider = providers.Singleton(ClientTokenProvider, auth=auth, skew_seconds=30)
33
35
  file_service: providers.Singleton[FileServicePort] = providers.Singleton(
34
36
  UploadchiClient, token_provider=token_provider
@@ -0,0 +1,44 @@
1
+ import asyncio
2
+ import functools
3
+ from typing import Callable
4
+
5
+ from makefun import wraps as mf_wraps
6
+
7
+ from nlbone.adapters.auth.auth_service import AuthService
8
+ from nlbone.interfaces.api.exceptions import UnauthorizedException, ForbiddenException
9
+ from nlbone.utils.context import current_request
10
+
11
+
12
+ def current_client_id() -> str:
13
+ request = current_request()
14
+ if client_id := AuthService().get_client_id(request.state.token):
15
+ return str(client_id)
16
+ raise UnauthorizedException()
17
+
18
+
19
+ def client_has_access_func(*, permissions=None):
20
+ request = current_request()
21
+ if not AuthService().client_has_access(request.state.token, permissions=permissions):
22
+ raise ForbiddenException(f"Forbidden {permissions}")
23
+ return True
24
+
25
+
26
+ def client_has_access(*, permissions=None):
27
+ def deco(func: Callable):
28
+ is_async_func = asyncio.iscoroutinefunction(func)
29
+
30
+ if is_async_func:
31
+ @mf_wraps(func)
32
+ async def aw(*args, **kwargs):
33
+ client_has_access_func(permissions=permissions)
34
+ return await func(*args, **kwargs)
35
+
36
+ return aw
37
+
38
+ @mf_wraps(func)
39
+ def sw(*args, **kwargs):
40
+ client_has_access_func(permissions=permissions)
41
+ return func(*args, **kwargs)
42
+
43
+ return sw
44
+ return deco
@@ -5,8 +5,7 @@ from typing import Any, Callable, Iterable, Optional, Mapping
5
5
  import hashlib
6
6
  from makefun import wraps as mf_wraps
7
7
 
8
- from nlbone.interfaces.api.additional_filed import AdditionalFieldsRequest
9
- from nlbone.interfaces.api.pagination import PaginateRequest
8
+
10
9
  from nlbone.utils.cache_registry import get_cache
11
10
 
12
11
  try:
@@ -31,6 +30,9 @@ PRIMITIVES = (str, int, float, bool, type(None))
31
30
 
32
31
 
33
32
  def to_jsonable(obj):
33
+ from nlbone.interfaces.api.additional_filed import AdditionalFieldsRequest
34
+ from nlbone.interfaces.api.pagination import PaginateRequest
35
+
34
36
  if isinstance(obj, PRIMITIVES):
35
37
  return obj
36
38
 
@@ -78,7 +80,7 @@ def _key_from_template(
78
80
  payload,
79
81
  sort_keys=True,
80
82
  )
81
- return f"{func.__module__}:{func.__qualname__}:{hashlib.sha1(payload.encode("utf-8")).hexdigest()}"
83
+ return f"{func.__module__}:{func.__qualname__}:{hashlib.sha1(payload.encode('utf-8')).hexdigest()}"
82
84
 
83
85
 
84
86
  def _format_tags(
@@ -147,6 +149,8 @@ def cached(
147
149
  @mf_wraps(func)
148
150
  async def aw(*args, **kwargs):
149
151
  cache = (cache_resolver or get_cache)()
152
+ if not cache:
153
+ return await func(*args, **kwargs)
150
154
  k = _key_from_template(key, func, args, kwargs)
151
155
  tg = _format_tags(tags, func, args, kwargs)
152
156
 
@@ -177,6 +181,8 @@ def cached(
177
181
  @mf_wraps(func)
178
182
  def sw(*args, **kwargs):
179
183
  cache = (cache_resolver or get_cache)()
184
+ if not cache:
185
+ return func(*args, **kwargs)
180
186
  k = _key_from_template(key, func, args, kwargs)
181
187
  tg = _format_tags(tags, func, args, kwargs)
182
188
 
@@ -21,6 +21,4 @@ def set_context_cache_resolver(fn: Optional[Callable[[], T]]) -> None:
21
21
 
22
22
  def get_cache() -> T:
23
23
  fn = _ctx_resolver.get() or _global_resolver
24
- if fn is None:
25
- raise RuntimeError("Cache resolver not configured. Call set_cache_resolver(...) first.")
26
24
  return fn()
@@ -1,25 +0,0 @@
1
- import requests
2
-
3
- from nlbone.config.settings import get_settings
4
- from nlbone.core.ports.auth import AuthService as BaseAuthService
5
- from nlbone.utils.http import normalize_https_base
6
-
7
-
8
- class AuthService(BaseAuthService):
9
- def __init__(self):
10
- s = get_settings()
11
- self._base_url = normalize_https_base(s.AUTH_SERVICE_URL.unicode_string())
12
- self._timeout = float(s.HTTP_TIMEOUT_SECONDS)
13
- self._client = requests.session()
14
-
15
- def has_access(self, token: str, permissions: list[str]) -> bool: ...
16
- def verify_token(self, token: str) -> dict | None:
17
- url = f"{self._base_url}/introspect"
18
- result = self._client.post(url, data={
19
- "token": token
20
- })
21
- return result.json()
22
- def get_client_token(self) -> dict | None: ...
23
- def is_client_token(self, token: str, allowed_clients: set[str] | None = None) -> bool: ...
24
- def client_has_access(self, token: str, perms: list[str], allowed_clients: set[str] | None = None) -> bool: ...
25
- def get_permissions(self, token: str) -> list[str]: ...
File without changes
File without changes
File without changes
File without changes
File without changes