unrealon 1.0.9__py3-none-any.whl → 1.1.1__py3-none-any.whl

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 (302) hide show
  1. unrealon/__init__.py +23 -21
  2. unrealon-1.1.1.dist-info/METADATA +722 -0
  3. unrealon-1.1.1.dist-info/RECORD +82 -0
  4. {unrealon-1.0.9.dist-info → unrealon-1.1.1.dist-info}/WHEEL +1 -1
  5. unrealon-1.1.1.dist-info/entry_points.txt +9 -0
  6. {unrealon-1.0.9.dist-info → unrealon-1.1.1.dist-info/licenses}/LICENSE +1 -1
  7. unrealon_bridge/__init__.py +114 -0
  8. unrealon_bridge/cli.py +316 -0
  9. unrealon_bridge/client/__init__.py +93 -0
  10. unrealon_bridge/client/base.py +78 -0
  11. unrealon_bridge/client/commands.py +89 -0
  12. unrealon_bridge/client/connection.py +90 -0
  13. unrealon_bridge/client/events.py +65 -0
  14. unrealon_bridge/client/health.py +38 -0
  15. unrealon_bridge/client/html_parser.py +146 -0
  16. unrealon_bridge/client/logging.py +139 -0
  17. unrealon_bridge/client/proxy.py +70 -0
  18. unrealon_bridge/client/scheduler.py +450 -0
  19. unrealon_bridge/client/session.py +70 -0
  20. unrealon_bridge/configs/__init__.py +14 -0
  21. unrealon_bridge/configs/bridge_config.py +212 -0
  22. unrealon_bridge/configs/bridge_config.yaml +39 -0
  23. unrealon_bridge/models/__init__.py +138 -0
  24. unrealon_bridge/models/base.py +28 -0
  25. unrealon_bridge/models/command.py +41 -0
  26. unrealon_bridge/models/events.py +40 -0
  27. unrealon_bridge/models/html_parser.py +79 -0
  28. unrealon_bridge/models/logging.py +55 -0
  29. unrealon_bridge/models/parser.py +63 -0
  30. unrealon_bridge/models/proxy.py +41 -0
  31. unrealon_bridge/models/requests.py +95 -0
  32. unrealon_bridge/models/responses.py +88 -0
  33. unrealon_bridge/models/scheduler.py +592 -0
  34. unrealon_bridge/models/session.py +28 -0
  35. unrealon_bridge/server/__init__.py +91 -0
  36. unrealon_bridge/server/base.py +171 -0
  37. unrealon_bridge/server/handlers/__init__.py +23 -0
  38. unrealon_bridge/server/handlers/command.py +110 -0
  39. unrealon_bridge/server/handlers/html_parser.py +139 -0
  40. unrealon_bridge/server/handlers/logging.py +95 -0
  41. unrealon_bridge/server/handlers/parser.py +95 -0
  42. unrealon_bridge/server/handlers/proxy.py +75 -0
  43. unrealon_bridge/server/handlers/scheduler.py +545 -0
  44. unrealon_bridge/server/handlers/session.py +66 -0
  45. unrealon_browser/__init__.py +61 -18
  46. unrealon_browser/{src/cli → cli}/browser_cli.py +6 -13
  47. unrealon_browser/{src/cli → cli}/cookies_cli.py +5 -1
  48. unrealon_browser/{src/core → core}/browser_manager.py +2 -2
  49. unrealon_browser/{src/managers → managers}/captcha.py +1 -1
  50. unrealon_browser/{src/managers → managers}/cookies.py +1 -1
  51. unrealon_browser/managers/logger_bridge.py +231 -0
  52. unrealon_browser/{src/managers → managers}/profile.py +1 -1
  53. unrealon_driver/__init__.py +73 -19
  54. unrealon_driver/browser/__init__.py +8 -0
  55. unrealon_driver/browser/config.py +74 -0
  56. unrealon_driver/browser/manager.py +416 -0
  57. unrealon_driver/exceptions.py +28 -0
  58. unrealon_driver/parser/__init__.py +55 -0
  59. unrealon_driver/parser/cli_manager.py +141 -0
  60. unrealon_driver/parser/daemon_manager.py +227 -0
  61. unrealon_driver/parser/managers/__init__.py +46 -0
  62. unrealon_driver/parser/managers/browser.py +51 -0
  63. unrealon_driver/parser/managers/config.py +281 -0
  64. unrealon_driver/parser/managers/error.py +412 -0
  65. unrealon_driver/parser/managers/html.py +732 -0
  66. unrealon_driver/parser/managers/logging.py +609 -0
  67. unrealon_driver/parser/managers/result.py +321 -0
  68. unrealon_driver/parser/parser_manager.py +628 -0
  69. unrealon/sdk_config.py +0 -88
  70. unrealon-1.0.9.dist-info/METADATA +0 -810
  71. unrealon-1.0.9.dist-info/RECORD +0 -246
  72. unrealon_browser/pyproject.toml +0 -182
  73. unrealon_browser/src/__init__.py +0 -62
  74. unrealon_browser/src/managers/logger_bridge.py +0 -395
  75. unrealon_driver/README.md +0 -204
  76. unrealon_driver/pyproject.toml +0 -187
  77. unrealon_driver/src/__init__.py +0 -90
  78. unrealon_driver/src/cli/__init__.py +0 -10
  79. unrealon_driver/src/cli/main.py +0 -66
  80. unrealon_driver/src/cli/simple.py +0 -510
  81. unrealon_driver/src/config/__init__.py +0 -11
  82. unrealon_driver/src/config/auto_config.py +0 -478
  83. unrealon_driver/src/core/__init__.py +0 -18
  84. unrealon_driver/src/core/exceptions.py +0 -289
  85. unrealon_driver/src/core/parser.py +0 -638
  86. unrealon_driver/src/dto/__init__.py +0 -66
  87. unrealon_driver/src/dto/cli.py +0 -119
  88. unrealon_driver/src/dto/config.py +0 -18
  89. unrealon_driver/src/dto/events.py +0 -237
  90. unrealon_driver/src/dto/execution.py +0 -313
  91. unrealon_driver/src/dto/services.py +0 -311
  92. unrealon_driver/src/execution/__init__.py +0 -23
  93. unrealon_driver/src/execution/daemon_mode.py +0 -317
  94. unrealon_driver/src/execution/interactive_mode.py +0 -88
  95. unrealon_driver/src/execution/modes.py +0 -45
  96. unrealon_driver/src/execution/scheduled_mode.py +0 -209
  97. unrealon_driver/src/execution/test_mode.py +0 -250
  98. unrealon_driver/src/logging/__init__.py +0 -24
  99. unrealon_driver/src/logging/driver_logger.py +0 -512
  100. unrealon_driver/src/services/__init__.py +0 -24
  101. unrealon_driver/src/services/browser_service.py +0 -726
  102. unrealon_driver/src/services/llm/__init__.py +0 -15
  103. unrealon_driver/src/services/llm/browser_llm_service.py +0 -363
  104. unrealon_driver/src/services/llm/llm.py +0 -195
  105. unrealon_driver/src/services/logger_service.py +0 -232
  106. unrealon_driver/src/services/metrics_service.py +0 -185
  107. unrealon_driver/src/services/scheduler_service.py +0 -489
  108. unrealon_driver/src/services/websocket_service.py +0 -362
  109. unrealon_driver/src/utils/__init__.py +0 -16
  110. unrealon_driver/src/utils/service_factory.py +0 -317
  111. unrealon_driver/src/utils/time_formatter.py +0 -338
  112. unrealon_llm/README.md +0 -44
  113. unrealon_llm/__init__.py +0 -26
  114. unrealon_llm/pyproject.toml +0 -154
  115. unrealon_llm/src/__init__.py +0 -228
  116. unrealon_llm/src/cli/__init__.py +0 -0
  117. unrealon_llm/src/core/__init__.py +0 -11
  118. unrealon_llm/src/core/smart_client.py +0 -438
  119. unrealon_llm/src/dto/__init__.py +0 -155
  120. unrealon_llm/src/dto/models/__init__.py +0 -0
  121. unrealon_llm/src/dto/models/config.py +0 -343
  122. unrealon_llm/src/dto/models/core.py +0 -328
  123. unrealon_llm/src/dto/models/enums.py +0 -123
  124. unrealon_llm/src/dto/models/html_analysis.py +0 -345
  125. unrealon_llm/src/dto/models/statistics.py +0 -473
  126. unrealon_llm/src/dto/models/translation.py +0 -383
  127. unrealon_llm/src/dto/models/type_conversion.py +0 -462
  128. unrealon_llm/src/dto/schemas/__init__.py +0 -0
  129. unrealon_llm/src/exceptions.py +0 -392
  130. unrealon_llm/src/llm_config/__init__.py +0 -20
  131. unrealon_llm/src/llm_config/logging_config.py +0 -178
  132. unrealon_llm/src/llm_logging/__init__.py +0 -42
  133. unrealon_llm/src/llm_logging/llm_events.py +0 -107
  134. unrealon_llm/src/llm_logging/llm_logger.py +0 -466
  135. unrealon_llm/src/managers/__init__.py +0 -15
  136. unrealon_llm/src/managers/cache_manager.py +0 -67
  137. unrealon_llm/src/managers/cost_manager.py +0 -107
  138. unrealon_llm/src/managers/request_manager.py +0 -298
  139. unrealon_llm/src/modules/__init__.py +0 -0
  140. unrealon_llm/src/modules/html_processor/__init__.py +0 -25
  141. unrealon_llm/src/modules/html_processor/base_processor.py +0 -415
  142. unrealon_llm/src/modules/html_processor/details_processor.py +0 -85
  143. unrealon_llm/src/modules/html_processor/listing_processor.py +0 -91
  144. unrealon_llm/src/modules/html_processor/models/__init__.py +0 -20
  145. unrealon_llm/src/modules/html_processor/models/processing_models.py +0 -40
  146. unrealon_llm/src/modules/html_processor/models/universal_model.py +0 -56
  147. unrealon_llm/src/modules/html_processor/processor.py +0 -102
  148. unrealon_llm/src/modules/llm/__init__.py +0 -0
  149. unrealon_llm/src/modules/translator/__init__.py +0 -0
  150. unrealon_llm/src/provider.py +0 -116
  151. unrealon_llm/src/utils/__init__.py +0 -95
  152. unrealon_llm/src/utils/common.py +0 -64
  153. unrealon_llm/src/utils/data_extractor.py +0 -188
  154. unrealon_llm/src/utils/html_cleaner.py +0 -767
  155. unrealon_llm/src/utils/language_detector.py +0 -308
  156. unrealon_llm/src/utils/models_cache.py +0 -592
  157. unrealon_llm/src/utils/smart_counter.py +0 -229
  158. unrealon_llm/src/utils/token_counter.py +0 -189
  159. unrealon_sdk/README.md +0 -25
  160. unrealon_sdk/__init__.py +0 -30
  161. unrealon_sdk/pyproject.toml +0 -231
  162. unrealon_sdk/src/__init__.py +0 -150
  163. unrealon_sdk/src/cli/__init__.py +0 -12
  164. unrealon_sdk/src/cli/commands/__init__.py +0 -22
  165. unrealon_sdk/src/cli/commands/benchmark.py +0 -42
  166. unrealon_sdk/src/cli/commands/diagnostics.py +0 -573
  167. unrealon_sdk/src/cli/commands/health.py +0 -46
  168. unrealon_sdk/src/cli/commands/integration.py +0 -498
  169. unrealon_sdk/src/cli/commands/reports.py +0 -43
  170. unrealon_sdk/src/cli/commands/security.py +0 -36
  171. unrealon_sdk/src/cli/commands/server.py +0 -483
  172. unrealon_sdk/src/cli/commands/servers.py +0 -56
  173. unrealon_sdk/src/cli/commands/tests.py +0 -55
  174. unrealon_sdk/src/cli/main.py +0 -126
  175. unrealon_sdk/src/cli/utils/reporter.py +0 -519
  176. unrealon_sdk/src/clients/openapi.yaml +0 -3347
  177. unrealon_sdk/src/clients/python_http/__init__.py +0 -3
  178. unrealon_sdk/src/clients/python_http/api_config.py +0 -228
  179. unrealon_sdk/src/clients/python_http/models/BaseModel.py +0 -12
  180. unrealon_sdk/src/clients/python_http/models/BroadcastDeliveryStats.py +0 -33
  181. unrealon_sdk/src/clients/python_http/models/BroadcastMessage.py +0 -17
  182. unrealon_sdk/src/clients/python_http/models/BroadcastMessageRequest.py +0 -35
  183. unrealon_sdk/src/clients/python_http/models/BroadcastPriority.py +0 -10
  184. unrealon_sdk/src/clients/python_http/models/BroadcastResponse.py +0 -21
  185. unrealon_sdk/src/clients/python_http/models/BroadcastResultResponse.py +0 -33
  186. unrealon_sdk/src/clients/python_http/models/BroadcastTarget.py +0 -11
  187. unrealon_sdk/src/clients/python_http/models/ConnectionStats.py +0 -27
  188. unrealon_sdk/src/clients/python_http/models/ConnectionsResponse.py +0 -21
  189. unrealon_sdk/src/clients/python_http/models/DeveloperMessageResponse.py +0 -23
  190. unrealon_sdk/src/clients/python_http/models/ErrorResponse.py +0 -25
  191. unrealon_sdk/src/clients/python_http/models/HTTPValidationError.py +0 -16
  192. unrealon_sdk/src/clients/python_http/models/HealthResponse.py +0 -23
  193. unrealon_sdk/src/clients/python_http/models/HealthStatus.py +0 -33
  194. unrealon_sdk/src/clients/python_http/models/LogLevel.py +0 -10
  195. unrealon_sdk/src/clients/python_http/models/LoggingRequest.py +0 -27
  196. unrealon_sdk/src/clients/python_http/models/LoggingResponse.py +0 -23
  197. unrealon_sdk/src/clients/python_http/models/MaintenanceMode.py +0 -9
  198. unrealon_sdk/src/clients/python_http/models/MaintenanceModeRequest.py +0 -33
  199. unrealon_sdk/src/clients/python_http/models/MaintenanceStatusResponse.py +0 -39
  200. unrealon_sdk/src/clients/python_http/models/ParserCommandRequest.py +0 -25
  201. unrealon_sdk/src/clients/python_http/models/ParserMessageResponse.py +0 -21
  202. unrealon_sdk/src/clients/python_http/models/ParserRegistrationRequest.py +0 -28
  203. unrealon_sdk/src/clients/python_http/models/ParserRegistrationResponse.py +0 -25
  204. unrealon_sdk/src/clients/python_http/models/ParserType.py +0 -10
  205. unrealon_sdk/src/clients/python_http/models/ProxyBlockRequest.py +0 -19
  206. unrealon_sdk/src/clients/python_http/models/ProxyEndpointResponse.py +0 -20
  207. unrealon_sdk/src/clients/python_http/models/ProxyListResponse.py +0 -19
  208. unrealon_sdk/src/clients/python_http/models/ProxyProvider.py +0 -10
  209. unrealon_sdk/src/clients/python_http/models/ProxyPurchaseRequest.py +0 -25
  210. unrealon_sdk/src/clients/python_http/models/ProxyResponse.py +0 -47
  211. unrealon_sdk/src/clients/python_http/models/ProxyRotationRequest.py +0 -23
  212. unrealon_sdk/src/clients/python_http/models/ProxyStatus.py +0 -10
  213. unrealon_sdk/src/clients/python_http/models/ProxyUsageRequest.py +0 -19
  214. unrealon_sdk/src/clients/python_http/models/ProxyUsageStatsResponse.py +0 -26
  215. unrealon_sdk/src/clients/python_http/models/ServiceRegistrationDto.py +0 -23
  216. unrealon_sdk/src/clients/python_http/models/ServiceStatsResponse.py +0 -31
  217. unrealon_sdk/src/clients/python_http/models/SessionStartRequest.py +0 -23
  218. unrealon_sdk/src/clients/python_http/models/SuccessResponse.py +0 -25
  219. unrealon_sdk/src/clients/python_http/models/SystemNotificationResponse.py +0 -23
  220. unrealon_sdk/src/clients/python_http/models/ValidationError.py +0 -18
  221. unrealon_sdk/src/clients/python_http/models/ValidationErrorResponse.py +0 -21
  222. unrealon_sdk/src/clients/python_http/models/WebSocketMetrics.py +0 -21
  223. unrealon_sdk/src/clients/python_http/models/__init__.py +0 -44
  224. unrealon_sdk/src/clients/python_http/services/None_service.py +0 -35
  225. unrealon_sdk/src/clients/python_http/services/ParserManagement_service.py +0 -190
  226. unrealon_sdk/src/clients/python_http/services/ProxyManagement_service.py +0 -289
  227. unrealon_sdk/src/clients/python_http/services/SocketLogging_service.py +0 -187
  228. unrealon_sdk/src/clients/python_http/services/SystemHealth_service.py +0 -119
  229. unrealon_sdk/src/clients/python_http/services/WebSocketAPI_service.py +0 -198
  230. unrealon_sdk/src/clients/python_http/services/__init__.py +0 -0
  231. unrealon_sdk/src/clients/python_http/services/admin_service.py +0 -125
  232. unrealon_sdk/src/clients/python_http/services/async_None_service.py +0 -35
  233. unrealon_sdk/src/clients/python_http/services/async_ParserManagement_service.py +0 -190
  234. unrealon_sdk/src/clients/python_http/services/async_ProxyManagement_service.py +0 -289
  235. unrealon_sdk/src/clients/python_http/services/async_SocketLogging_service.py +0 -189
  236. unrealon_sdk/src/clients/python_http/services/async_SystemHealth_service.py +0 -123
  237. unrealon_sdk/src/clients/python_http/services/async_WebSocketAPI_service.py +0 -200
  238. unrealon_sdk/src/clients/python_http/services/async_admin_service.py +0 -125
  239. unrealon_sdk/src/clients/python_websocket/__init__.py +0 -28
  240. unrealon_sdk/src/clients/python_websocket/client.py +0 -490
  241. unrealon_sdk/src/clients/python_websocket/events.py +0 -732
  242. unrealon_sdk/src/clients/python_websocket/example.py +0 -136
  243. unrealon_sdk/src/clients/python_websocket/types.py +0 -871
  244. unrealon_sdk/src/core/__init__.py +0 -64
  245. unrealon_sdk/src/core/client.py +0 -556
  246. unrealon_sdk/src/core/config.py +0 -465
  247. unrealon_sdk/src/core/exceptions.py +0 -239
  248. unrealon_sdk/src/core/metadata.py +0 -191
  249. unrealon_sdk/src/core/models.py +0 -142
  250. unrealon_sdk/src/core/types.py +0 -68
  251. unrealon_sdk/src/dto/__init__.py +0 -268
  252. unrealon_sdk/src/dto/authentication.py +0 -108
  253. unrealon_sdk/src/dto/cache.py +0 -208
  254. unrealon_sdk/src/dto/common.py +0 -19
  255. unrealon_sdk/src/dto/concurrency.py +0 -393
  256. unrealon_sdk/src/dto/events.py +0 -108
  257. unrealon_sdk/src/dto/health.py +0 -339
  258. unrealon_sdk/src/dto/load_balancing.py +0 -336
  259. unrealon_sdk/src/dto/logging.py +0 -230
  260. unrealon_sdk/src/dto/performance.py +0 -165
  261. unrealon_sdk/src/dto/rate_limiting.py +0 -295
  262. unrealon_sdk/src/dto/resource_pooling.py +0 -128
  263. unrealon_sdk/src/dto/structured_logging.py +0 -112
  264. unrealon_sdk/src/dto/task_scheduling.py +0 -121
  265. unrealon_sdk/src/dto/websocket.py +0 -55
  266. unrealon_sdk/src/enterprise/__init__.py +0 -59
  267. unrealon_sdk/src/enterprise/authentication.py +0 -401
  268. unrealon_sdk/src/enterprise/cache_manager.py +0 -578
  269. unrealon_sdk/src/enterprise/error_recovery.py +0 -494
  270. unrealon_sdk/src/enterprise/event_system.py +0 -549
  271. unrealon_sdk/src/enterprise/health_monitor.py +0 -747
  272. unrealon_sdk/src/enterprise/load_balancer.py +0 -964
  273. unrealon_sdk/src/enterprise/logging/__init__.py +0 -68
  274. unrealon_sdk/src/enterprise/logging/cleanup.py +0 -156
  275. unrealon_sdk/src/enterprise/logging/development.py +0 -744
  276. unrealon_sdk/src/enterprise/logging/service.py +0 -410
  277. unrealon_sdk/src/enterprise/multithreading_manager.py +0 -853
  278. unrealon_sdk/src/enterprise/performance_monitor.py +0 -539
  279. unrealon_sdk/src/enterprise/proxy_manager.py +0 -696
  280. unrealon_sdk/src/enterprise/rate_limiter.py +0 -652
  281. unrealon_sdk/src/enterprise/resource_pool.py +0 -763
  282. unrealon_sdk/src/enterprise/task_scheduler.py +0 -709
  283. unrealon_sdk/src/internal/__init__.py +0 -10
  284. unrealon_sdk/src/internal/command_router.py +0 -497
  285. unrealon_sdk/src/internal/connection_manager.py +0 -397
  286. unrealon_sdk/src/internal/http_client.py +0 -446
  287. unrealon_sdk/src/internal/websocket_client.py +0 -420
  288. unrealon_sdk/src/provider.py +0 -471
  289. unrealon_sdk/src/utils.py +0 -234
  290. /unrealon_browser/{src/cli → cli}/__init__.py +0 -0
  291. /unrealon_browser/{src/cli → cli}/interactive_mode.py +0 -0
  292. /unrealon_browser/{src/cli → cli}/main.py +0 -0
  293. /unrealon_browser/{src/core → core}/__init__.py +0 -0
  294. /unrealon_browser/{src/dto → dto}/__init__.py +0 -0
  295. /unrealon_browser/{src/dto → dto}/models/config.py +0 -0
  296. /unrealon_browser/{src/dto → dto}/models/core.py +0 -0
  297. /unrealon_browser/{src/dto → dto}/models/dataclasses.py +0 -0
  298. /unrealon_browser/{src/dto → dto}/models/detection.py +0 -0
  299. /unrealon_browser/{src/dto → dto}/models/enums.py +0 -0
  300. /unrealon_browser/{src/dto → dto}/models/statistics.py +0 -0
  301. /unrealon_browser/{src/managers → managers}/__init__.py +0 -0
  302. /unrealon_browser/{src/managers → managers}/stealth.py +0 -0
@@ -1,401 +0,0 @@
1
- """
2
- Enterprise Authentication System for UnrealOn SDK v1.0
3
-
4
- Layer 2: Enterprise Services - Secure authentication with:
5
- - API key validation and management
6
- - Token lifecycle management
7
- - Rate limiting and security monitoring
8
- - Authentication audit trails
9
- - Automatic token refresh
10
- - Security breach detection
11
-
12
- Enterprise Features:
13
- - Multi-environment API key support (dev/prod)
14
- - Token caching and automatic refresh
15
- - Authentication rate limiting
16
- - Security event logging and monitoring
17
- - Audit trails for compliance
18
- - Intrusion detection and alerts
19
- - Role-based access control integration
20
- """
21
-
22
- import asyncio
23
- import logging
24
- from datetime import datetime, timezone, timedelta
25
- from typing import Dict, List, Optional, Callable, Any, Union
26
- from collections import defaultdict, deque
27
- from enum import Enum
28
- import re
29
- import hashlib
30
- import hmac
31
- import time
32
-
33
- # Pydantic v2 for all data models
34
- from pydantic import BaseModel, Field, ConfigDict
35
-
36
- # Use existing auto-generated models - NO duplication!
37
- from unrealon_sdk.src.clients.python_http.models import (
38
- ParserRegistrationRequest,
39
- ParserRegistrationResponse,
40
- ParserType,
41
- ErrorResponse,
42
- SuccessResponse,
43
- )
44
- from unrealon_sdk.src.clients.python_http.api_config import APIConfig
45
-
46
- # Auto-generated services for authentication
47
- from unrealon_sdk.src.clients.python_http.services.async_ParserManagement_service import (
48
- register_parser_api_v1_parsers_register_post,
49
- )
50
-
51
- # DTO models for type-safe data structures
52
- from unrealon_sdk.src.dto.authentication import (
53
- AuthenticationStatus,
54
- SecurityEventType,
55
- AuthenticationContext,
56
- SecurityEvent,
57
- RateLimitConfig,
58
- )
59
-
60
- # Core SDK components
61
- from unrealon_sdk.src.core.config import AdapterConfig
62
- from unrealon_sdk.src.core.exceptions import AuthenticationError, ConnectionError
63
- from unrealon_sdk.src.utils import generate_correlation_id, validate_api_key
64
-
65
- # Development logging
66
- from typing import TYPE_CHECKING
67
-
68
- if TYPE_CHECKING:
69
- from unrealon_sdk.src.enterprise.logging.development import DevelopmentLogger
70
-
71
- logger = logging.getLogger(__name__)
72
-
73
-
74
- # Authentication models moved to unrealon_sdk.dto.authentication
75
-
76
-
77
- class EnterpriseAuthenticationSystem:
78
- """
79
- Enterprise-grade authentication system for UnrealOn SDK.
80
-
81
- Features:
82
- - API key validation with enterprise security
83
- - Token lifecycle management with automatic refresh
84
- - Rate limiting and intrusion detection
85
- - Comprehensive audit trails for compliance
86
- - Multi-environment support (dev/prod)
87
- - Security monitoring and alerting
88
- """
89
-
90
- def __init__(self, config: AdapterConfig):
91
- """
92
- Initialize Enterprise Authentication System.
93
-
94
- Args:
95
- config: Adapter configuration with API credentials
96
- """
97
- self.config = config
98
- self.logger = logger
99
-
100
- # Authentication state
101
- self._context = AuthenticationContext(
102
- api_key=None,
103
- access_token=None,
104
- session_id=None,
105
- parser_id=None,
106
- authenticated_at=None,
107
- expires_at=None,
108
- last_login_attempt=None,
109
- rate_limit_reset_time=None,
110
- )
111
- self._api_config = APIConfig()
112
-
113
- # Security monitoring
114
- self._security_events: deque[SecurityEvent] = deque(maxlen=1000)
115
- self._rate_limits: Dict[str, List[datetime]] = defaultdict(list)
116
- self._rate_limit_config = RateLimitConfig()
117
-
118
- # Background tasks for token refresh and monitoring
119
- self._background_tasks: List[asyncio.Task[Any]] = []
120
- self._shutdown_event = asyncio.Event()
121
-
122
- self.logger.info("Enterprise Authentication System initialized")
123
-
124
- async def authenticate(self) -> bool:
125
- """
126
- Authenticate using configured API key.
127
-
128
- Returns:
129
- True if authentication successful
130
-
131
- Raises:
132
- AuthenticationError: If authentication fails
133
- """
134
- try:
135
- # Check rate limiting
136
- if not self._check_rate_limit():
137
- await self._log_security_event(
138
- SecurityEventType.RATE_LIMIT_EXCEEDED,
139
- success=False,
140
- error_message="Rate limit exceeded",
141
- )
142
- raise AuthenticationError("Rate limit exceeded. Please try again later.")
143
-
144
- # Update context
145
- self._context.status = AuthenticationStatus.AUTHENTICATING
146
- self._context.login_attempts += 1
147
- self._context.last_login_attempt = datetime.now(timezone.utc)
148
-
149
- # Validate API key format
150
- if not validate_api_key(self.config.api_key):
151
- await self._handle_authentication_failure("Invalid API key format")
152
- return False
153
-
154
- # Extract environment from API key
155
- environment = "prod" if self.config.api_key.startswith("up_prod_") else "dev"
156
- self._context.environment = environment
157
-
158
- # Mask API key for logging
159
- self._context.api_key = self._mask_api_key(self.config.api_key)
160
-
161
- # Create registration request using auto-generated model
162
- registration_request = ParserRegistrationRequest(
163
- api_key=self.config.api_key,
164
- parser_id=self.config.parser_id,
165
- parser_name=self.config.parser_name,
166
- parser_type=ParserType.GENERAL, # Use available type
167
- metadata={
168
- "sdk_version": "1.0.0",
169
- "environment": environment,
170
- "authentication_method": "api_key",
171
- "session_id": generate_correlation_id(),
172
- },
173
- )
174
-
175
- # Configure API client
176
- self._api_config.access_token = self.config.api_key
177
-
178
- # Attempt registration/authentication
179
- response = await register_parser_api_v1_parsers_register_post(
180
- data=registration_request,
181
- authorization=f"Bearer {self.config.api_key}",
182
- api_config_override=self._api_config,
183
- )
184
-
185
- # Handle successful authentication
186
- await self._handle_authentication_success(response)
187
-
188
- # Log security event
189
- await self._log_security_event(
190
- SecurityEventType.LOGIN_SUCCESS,
191
- success=True,
192
- metadata={"parser_id": self.config.parser_id, "environment": environment},
193
- )
194
-
195
- return True
196
-
197
- except Exception as e:
198
- await self._handle_authentication_failure(str(e))
199
- return False
200
-
201
- async def _handle_authentication_success(self, response: ParserRegistrationResponse) -> None:
202
- """Handle successful authentication response."""
203
- self._context.status = AuthenticationStatus.AUTHENTICATED
204
- self._context.authenticated_at = datetime.now(timezone.utc)
205
- self._context.session_id = generate_correlation_id()
206
- self._context.parser_id = self.config.parser_id
207
-
208
- # Reset failure counters
209
- self._context.failed_attempts = 0
210
-
211
- # Set token expiration (default 24 hours for enterprise)
212
- self._context.expires_at = datetime.now(timezone.utc) + timedelta(hours=24)
213
-
214
- self.logger.info(f"Authentication successful for parser: {self.config.parser_id}")
215
-
216
- async def _handle_authentication_failure(self, error_message: str) -> None:
217
- """Handle authentication failure with security monitoring."""
218
- self._context.status = AuthenticationStatus.FAILED
219
- self._context.failed_attempts += 1
220
-
221
- # Check for account lockout
222
- if self._context.failed_attempts >= self._rate_limit_config.max_attempts:
223
- self._context.status = AuthenticationStatus.LOCKED
224
- self._context.rate_limit_reset_time = datetime.now(timezone.utc) + timedelta(
225
- seconds=self._rate_limit_config.lockout_duration_seconds
226
- )
227
-
228
- await self._log_security_event(
229
- SecurityEventType.ACCOUNT_LOCKED,
230
- success=False,
231
- error_message=f"Account locked after {self._context.failed_attempts} failures",
232
- )
233
-
234
- # Log authentication failure
235
- await self._log_security_event(
236
- SecurityEventType.LOGIN_FAILURE, success=False, error_message=error_message
237
- )
238
-
239
- self.logger.warning(f"Authentication failed: {error_message}")
240
- raise AuthenticationError(f"Authentication failed: {error_message}")
241
-
242
- def _check_rate_limit(self) -> bool:
243
- """Check if current request is within rate limits."""
244
- now = datetime.now(timezone.utc)
245
- api_key_hash = self._hash_api_key(self.config.api_key)
246
-
247
- # Clean old attempts
248
- cutoff = now - timedelta(seconds=self._rate_limit_config.window_seconds)
249
- self._rate_limits[api_key_hash] = [
250
- attempt for attempt in self._rate_limits[api_key_hash] if attempt > cutoff
251
- ]
252
-
253
- # Check if under limit
254
- current_attempts = len(self._rate_limits[api_key_hash])
255
- if current_attempts >= self._rate_limit_config.max_attempts:
256
- return False
257
-
258
- # Add current attempt
259
- self._rate_limits[api_key_hash].append(now)
260
- return True
261
-
262
- def _mask_api_key(self, api_key: str) -> str:
263
- """Mask API key for secure logging."""
264
- if len(api_key) <= 8:
265
- return "*" * len(api_key)
266
- return api_key[:4] + "*" * (len(api_key) - 8) + api_key[-4:]
267
-
268
- def _hash_api_key(self, api_key: str) -> str:
269
- """Create secure hash of API key for rate limiting."""
270
- return hashlib.sha256(api_key.encode()).hexdigest()[:16]
271
-
272
- async def _log_security_event(
273
- self,
274
- event_type: SecurityEventType,
275
- success: bool,
276
- error_message: Optional[str] = None,
277
- metadata: Optional[Dict[str, Any]] = None,
278
- ) -> None:
279
- """Log security event for audit trails."""
280
- event = SecurityEvent(
281
- event_id=generate_correlation_id(),
282
- event_type=event_type,
283
- session_id=self._context.session_id,
284
- api_key_hash=self._hash_api_key(self.config.api_key) if self.config.api_key else None,
285
- ip_address=None, # Could be enhanced to get actual IP
286
- user_agent=None, # Could be enhanced to get actual user agent
287
- success=success,
288
- error_message=error_message,
289
- metadata=metadata or {},
290
- )
291
-
292
- self._security_events.append(event)
293
-
294
- # Log at appropriate level
295
- if success:
296
- self.logger.info(f"Security event: {event_type.value}")
297
- else:
298
- self.logger.warning(f"Security event: {event_type.value} - {error_message}")
299
-
300
- def is_authenticated(self) -> bool:
301
- """Check if currently authenticated."""
302
- if self._context.status != AuthenticationStatus.AUTHENTICATED:
303
- return False
304
-
305
- # Check token expiration
306
- if self._context.expires_at and datetime.now(timezone.utc) > self._context.expires_at:
307
- self._context.status = AuthenticationStatus.EXPIRED
308
- return False
309
-
310
- return True
311
-
312
- def get_authentication_context(self) -> AuthenticationContext:
313
- """Get current authentication context."""
314
- return self._context
315
-
316
- def get_security_events(
317
- self, event_types: Optional[List[SecurityEventType]] = None, limit: int = 100
318
- ) -> List[SecurityEvent]:
319
- """Get recent security events for monitoring."""
320
- events = list(self._security_events)
321
-
322
- if event_types:
323
- events = [e for e in events if e.event_type in event_types]
324
-
325
- return events[-limit:]
326
-
327
- async def refresh_authentication(self) -> bool:
328
- """Refresh authentication if needed."""
329
- if not self.is_authenticated():
330
- return await self.authenticate()
331
-
332
- # Check if refresh is needed (refresh 1 hour before expiration)
333
- if self._context.expires_at and datetime.now(
334
- timezone.utc
335
- ) > self._context.expires_at - timedelta(hours=1):
336
-
337
- await self._log_security_event(
338
- SecurityEventType.TOKEN_REFRESH,
339
- success=True,
340
- metadata={"reason": "proactive_refresh"},
341
- )
342
-
343
- return await self.authenticate()
344
-
345
- return True
346
-
347
- async def logout(self) -> None:
348
- """Logout and clear authentication state."""
349
- self._context.status = AuthenticationStatus.UNAUTHENTICATED
350
- self._context.access_token = None
351
- self._context.session_id = None
352
- self._context.authenticated_at = None
353
- self._context.expires_at = None
354
-
355
- self.logger.info("Logged out successfully")
356
-
357
- async def shutdown(self) -> None:
358
- """Shutdown authentication system gracefully."""
359
- self.logger.info("Shutting down Enterprise Authentication System...")
360
-
361
- # Signal shutdown
362
- self._shutdown_event.set()
363
-
364
- # Cancel background tasks
365
- for task in self._background_tasks:
366
- task.cancel()
367
-
368
- # Wait for tasks to complete
369
- if self._background_tasks:
370
- await asyncio.gather(*self._background_tasks, return_exceptions=True)
371
-
372
- self.logger.info("Enterprise Authentication System shutdown complete")
373
-
374
-
375
- # Convenience function for creating authentication system
376
- def create_authentication_system(config: AdapterConfig) -> EnterpriseAuthenticationSystem:
377
- """
378
- Create and configure Enterprise Authentication System.
379
-
380
- Args:
381
- config: Adapter configuration with API credentials
382
-
383
- Returns:
384
- Configured authentication system instance
385
- """
386
- return EnterpriseAuthenticationSystem(config)
387
-
388
-
389
- # Export all public components
390
- __all__ = [
391
- # Core system
392
- "EnterpriseAuthenticationSystem",
393
- "create_authentication_system",
394
- # Models (using auto-generated when possible)
395
- "AuthenticationContext",
396
- "SecurityEvent",
397
- "RateLimitConfig",
398
- # Enums
399
- "AuthenticationStatus",
400
- "SecurityEventType",
401
- ]