unrealon 1.0.9__py3-none-any.whl → 1.1.0__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.
- unrealon/__init__.py +23 -21
- unrealon-1.1.0.dist-info/METADATA +164 -0
- unrealon-1.1.0.dist-info/RECORD +82 -0
- {unrealon-1.0.9.dist-info → unrealon-1.1.0.dist-info}/WHEEL +1 -1
- unrealon-1.1.0.dist-info/entry_points.txt +9 -0
- {unrealon-1.0.9.dist-info → unrealon-1.1.0.dist-info/licenses}/LICENSE +1 -1
- unrealon_bridge/__init__.py +114 -0
- unrealon_bridge/cli.py +316 -0
- unrealon_bridge/client/__init__.py +93 -0
- unrealon_bridge/client/base.py +78 -0
- unrealon_bridge/client/commands.py +89 -0
- unrealon_bridge/client/connection.py +90 -0
- unrealon_bridge/client/events.py +65 -0
- unrealon_bridge/client/health.py +38 -0
- unrealon_bridge/client/html_parser.py +146 -0
- unrealon_bridge/client/logging.py +139 -0
- unrealon_bridge/client/proxy.py +70 -0
- unrealon_bridge/client/scheduler.py +450 -0
- unrealon_bridge/client/session.py +70 -0
- unrealon_bridge/configs/__init__.py +14 -0
- unrealon_bridge/configs/bridge_config.py +212 -0
- unrealon_bridge/configs/bridge_config.yaml +39 -0
- unrealon_bridge/models/__init__.py +138 -0
- unrealon_bridge/models/base.py +28 -0
- unrealon_bridge/models/command.py +41 -0
- unrealon_bridge/models/events.py +40 -0
- unrealon_bridge/models/html_parser.py +79 -0
- unrealon_bridge/models/logging.py +55 -0
- unrealon_bridge/models/parser.py +63 -0
- unrealon_bridge/models/proxy.py +41 -0
- unrealon_bridge/models/requests.py +95 -0
- unrealon_bridge/models/responses.py +88 -0
- unrealon_bridge/models/scheduler.py +592 -0
- unrealon_bridge/models/session.py +28 -0
- unrealon_bridge/server/__init__.py +91 -0
- unrealon_bridge/server/base.py +171 -0
- unrealon_bridge/server/handlers/__init__.py +23 -0
- unrealon_bridge/server/handlers/command.py +110 -0
- unrealon_bridge/server/handlers/html_parser.py +139 -0
- unrealon_bridge/server/handlers/logging.py +95 -0
- unrealon_bridge/server/handlers/parser.py +95 -0
- unrealon_bridge/server/handlers/proxy.py +75 -0
- unrealon_bridge/server/handlers/scheduler.py +545 -0
- unrealon_bridge/server/handlers/session.py +66 -0
- unrealon_browser/__init__.py +61 -18
- unrealon_browser/{src/cli → cli}/browser_cli.py +6 -13
- unrealon_browser/{src/cli → cli}/cookies_cli.py +5 -1
- unrealon_browser/{src/core → core}/browser_manager.py +2 -2
- unrealon_browser/{src/managers → managers}/captcha.py +1 -1
- unrealon_browser/{src/managers → managers}/cookies.py +1 -1
- unrealon_browser/managers/logger_bridge.py +231 -0
- unrealon_browser/{src/managers → managers}/profile.py +1 -1
- unrealon_driver/__init__.py +73 -19
- unrealon_driver/browser/__init__.py +8 -0
- unrealon_driver/browser/config.py +74 -0
- unrealon_driver/browser/manager.py +416 -0
- unrealon_driver/exceptions.py +28 -0
- unrealon_driver/parser/__init__.py +55 -0
- unrealon_driver/parser/cli_manager.py +141 -0
- unrealon_driver/parser/daemon_manager.py +227 -0
- unrealon_driver/parser/managers/__init__.py +46 -0
- unrealon_driver/parser/managers/browser.py +51 -0
- unrealon_driver/parser/managers/config.py +281 -0
- unrealon_driver/parser/managers/error.py +412 -0
- unrealon_driver/parser/managers/html.py +732 -0
- unrealon_driver/parser/managers/logging.py +609 -0
- unrealon_driver/parser/managers/result.py +321 -0
- unrealon_driver/parser/parser_manager.py +628 -0
- unrealon/sdk_config.py +0 -88
- unrealon-1.0.9.dist-info/METADATA +0 -810
- unrealon-1.0.9.dist-info/RECORD +0 -246
- unrealon_browser/pyproject.toml +0 -182
- unrealon_browser/src/__init__.py +0 -62
- unrealon_browser/src/managers/logger_bridge.py +0 -395
- unrealon_driver/README.md +0 -204
- unrealon_driver/pyproject.toml +0 -187
- unrealon_driver/src/__init__.py +0 -90
- unrealon_driver/src/cli/__init__.py +0 -10
- unrealon_driver/src/cli/main.py +0 -66
- unrealon_driver/src/cli/simple.py +0 -510
- unrealon_driver/src/config/__init__.py +0 -11
- unrealon_driver/src/config/auto_config.py +0 -478
- unrealon_driver/src/core/__init__.py +0 -18
- unrealon_driver/src/core/exceptions.py +0 -289
- unrealon_driver/src/core/parser.py +0 -638
- unrealon_driver/src/dto/__init__.py +0 -66
- unrealon_driver/src/dto/cli.py +0 -119
- unrealon_driver/src/dto/config.py +0 -18
- unrealon_driver/src/dto/events.py +0 -237
- unrealon_driver/src/dto/execution.py +0 -313
- unrealon_driver/src/dto/services.py +0 -311
- unrealon_driver/src/execution/__init__.py +0 -23
- unrealon_driver/src/execution/daemon_mode.py +0 -317
- unrealon_driver/src/execution/interactive_mode.py +0 -88
- unrealon_driver/src/execution/modes.py +0 -45
- unrealon_driver/src/execution/scheduled_mode.py +0 -209
- unrealon_driver/src/execution/test_mode.py +0 -250
- unrealon_driver/src/logging/__init__.py +0 -24
- unrealon_driver/src/logging/driver_logger.py +0 -512
- unrealon_driver/src/services/__init__.py +0 -24
- unrealon_driver/src/services/browser_service.py +0 -726
- unrealon_driver/src/services/llm/__init__.py +0 -15
- unrealon_driver/src/services/llm/browser_llm_service.py +0 -363
- unrealon_driver/src/services/llm/llm.py +0 -195
- unrealon_driver/src/services/logger_service.py +0 -232
- unrealon_driver/src/services/metrics_service.py +0 -185
- unrealon_driver/src/services/scheduler_service.py +0 -489
- unrealon_driver/src/services/websocket_service.py +0 -362
- unrealon_driver/src/utils/__init__.py +0 -16
- unrealon_driver/src/utils/service_factory.py +0 -317
- unrealon_driver/src/utils/time_formatter.py +0 -338
- unrealon_llm/README.md +0 -44
- unrealon_llm/__init__.py +0 -26
- unrealon_llm/pyproject.toml +0 -154
- unrealon_llm/src/__init__.py +0 -228
- unrealon_llm/src/cli/__init__.py +0 -0
- unrealon_llm/src/core/__init__.py +0 -11
- unrealon_llm/src/core/smart_client.py +0 -438
- unrealon_llm/src/dto/__init__.py +0 -155
- unrealon_llm/src/dto/models/__init__.py +0 -0
- unrealon_llm/src/dto/models/config.py +0 -343
- unrealon_llm/src/dto/models/core.py +0 -328
- unrealon_llm/src/dto/models/enums.py +0 -123
- unrealon_llm/src/dto/models/html_analysis.py +0 -345
- unrealon_llm/src/dto/models/statistics.py +0 -473
- unrealon_llm/src/dto/models/translation.py +0 -383
- unrealon_llm/src/dto/models/type_conversion.py +0 -462
- unrealon_llm/src/dto/schemas/__init__.py +0 -0
- unrealon_llm/src/exceptions.py +0 -392
- unrealon_llm/src/llm_config/__init__.py +0 -20
- unrealon_llm/src/llm_config/logging_config.py +0 -178
- unrealon_llm/src/llm_logging/__init__.py +0 -42
- unrealon_llm/src/llm_logging/llm_events.py +0 -107
- unrealon_llm/src/llm_logging/llm_logger.py +0 -466
- unrealon_llm/src/managers/__init__.py +0 -15
- unrealon_llm/src/managers/cache_manager.py +0 -67
- unrealon_llm/src/managers/cost_manager.py +0 -107
- unrealon_llm/src/managers/request_manager.py +0 -298
- unrealon_llm/src/modules/__init__.py +0 -0
- unrealon_llm/src/modules/html_processor/__init__.py +0 -25
- unrealon_llm/src/modules/html_processor/base_processor.py +0 -415
- unrealon_llm/src/modules/html_processor/details_processor.py +0 -85
- unrealon_llm/src/modules/html_processor/listing_processor.py +0 -91
- unrealon_llm/src/modules/html_processor/models/__init__.py +0 -20
- unrealon_llm/src/modules/html_processor/models/processing_models.py +0 -40
- unrealon_llm/src/modules/html_processor/models/universal_model.py +0 -56
- unrealon_llm/src/modules/html_processor/processor.py +0 -102
- unrealon_llm/src/modules/llm/__init__.py +0 -0
- unrealon_llm/src/modules/translator/__init__.py +0 -0
- unrealon_llm/src/provider.py +0 -116
- unrealon_llm/src/utils/__init__.py +0 -95
- unrealon_llm/src/utils/common.py +0 -64
- unrealon_llm/src/utils/data_extractor.py +0 -188
- unrealon_llm/src/utils/html_cleaner.py +0 -767
- unrealon_llm/src/utils/language_detector.py +0 -308
- unrealon_llm/src/utils/models_cache.py +0 -592
- unrealon_llm/src/utils/smart_counter.py +0 -229
- unrealon_llm/src/utils/token_counter.py +0 -189
- unrealon_sdk/README.md +0 -25
- unrealon_sdk/__init__.py +0 -30
- unrealon_sdk/pyproject.toml +0 -231
- unrealon_sdk/src/__init__.py +0 -150
- unrealon_sdk/src/cli/__init__.py +0 -12
- unrealon_sdk/src/cli/commands/__init__.py +0 -22
- unrealon_sdk/src/cli/commands/benchmark.py +0 -42
- unrealon_sdk/src/cli/commands/diagnostics.py +0 -573
- unrealon_sdk/src/cli/commands/health.py +0 -46
- unrealon_sdk/src/cli/commands/integration.py +0 -498
- unrealon_sdk/src/cli/commands/reports.py +0 -43
- unrealon_sdk/src/cli/commands/security.py +0 -36
- unrealon_sdk/src/cli/commands/server.py +0 -483
- unrealon_sdk/src/cli/commands/servers.py +0 -56
- unrealon_sdk/src/cli/commands/tests.py +0 -55
- unrealon_sdk/src/cli/main.py +0 -126
- unrealon_sdk/src/cli/utils/reporter.py +0 -519
- unrealon_sdk/src/clients/openapi.yaml +0 -3347
- unrealon_sdk/src/clients/python_http/__init__.py +0 -3
- unrealon_sdk/src/clients/python_http/api_config.py +0 -228
- unrealon_sdk/src/clients/python_http/models/BaseModel.py +0 -12
- unrealon_sdk/src/clients/python_http/models/BroadcastDeliveryStats.py +0 -33
- unrealon_sdk/src/clients/python_http/models/BroadcastMessage.py +0 -17
- unrealon_sdk/src/clients/python_http/models/BroadcastMessageRequest.py +0 -35
- unrealon_sdk/src/clients/python_http/models/BroadcastPriority.py +0 -10
- unrealon_sdk/src/clients/python_http/models/BroadcastResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/BroadcastResultResponse.py +0 -33
- unrealon_sdk/src/clients/python_http/models/BroadcastTarget.py +0 -11
- unrealon_sdk/src/clients/python_http/models/ConnectionStats.py +0 -27
- unrealon_sdk/src/clients/python_http/models/ConnectionsResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/DeveloperMessageResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ErrorResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/HTTPValidationError.py +0 -16
- unrealon_sdk/src/clients/python_http/models/HealthResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/HealthStatus.py +0 -33
- unrealon_sdk/src/clients/python_http/models/LogLevel.py +0 -10
- unrealon_sdk/src/clients/python_http/models/LoggingRequest.py +0 -27
- unrealon_sdk/src/clients/python_http/models/LoggingResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/MaintenanceMode.py +0 -9
- unrealon_sdk/src/clients/python_http/models/MaintenanceModeRequest.py +0 -33
- unrealon_sdk/src/clients/python_http/models/MaintenanceStatusResponse.py +0 -39
- unrealon_sdk/src/clients/python_http/models/ParserCommandRequest.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ParserMessageResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/ParserRegistrationRequest.py +0 -28
- unrealon_sdk/src/clients/python_http/models/ParserRegistrationResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ParserType.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyBlockRequest.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyEndpointResponse.py +0 -20
- unrealon_sdk/src/clients/python_http/models/ProxyListResponse.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyProvider.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyPurchaseRequest.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ProxyResponse.py +0 -47
- unrealon_sdk/src/clients/python_http/models/ProxyRotationRequest.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ProxyStatus.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyUsageRequest.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyUsageStatsResponse.py +0 -26
- unrealon_sdk/src/clients/python_http/models/ServiceRegistrationDto.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ServiceStatsResponse.py +0 -31
- unrealon_sdk/src/clients/python_http/models/SessionStartRequest.py +0 -23
- unrealon_sdk/src/clients/python_http/models/SuccessResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/SystemNotificationResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ValidationError.py +0 -18
- unrealon_sdk/src/clients/python_http/models/ValidationErrorResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/WebSocketMetrics.py +0 -21
- unrealon_sdk/src/clients/python_http/models/__init__.py +0 -44
- unrealon_sdk/src/clients/python_http/services/None_service.py +0 -35
- unrealon_sdk/src/clients/python_http/services/ParserManagement_service.py +0 -190
- unrealon_sdk/src/clients/python_http/services/ProxyManagement_service.py +0 -289
- unrealon_sdk/src/clients/python_http/services/SocketLogging_service.py +0 -187
- unrealon_sdk/src/clients/python_http/services/SystemHealth_service.py +0 -119
- unrealon_sdk/src/clients/python_http/services/WebSocketAPI_service.py +0 -198
- unrealon_sdk/src/clients/python_http/services/__init__.py +0 -0
- unrealon_sdk/src/clients/python_http/services/admin_service.py +0 -125
- unrealon_sdk/src/clients/python_http/services/async_None_service.py +0 -35
- unrealon_sdk/src/clients/python_http/services/async_ParserManagement_service.py +0 -190
- unrealon_sdk/src/clients/python_http/services/async_ProxyManagement_service.py +0 -289
- unrealon_sdk/src/clients/python_http/services/async_SocketLogging_service.py +0 -189
- unrealon_sdk/src/clients/python_http/services/async_SystemHealth_service.py +0 -123
- unrealon_sdk/src/clients/python_http/services/async_WebSocketAPI_service.py +0 -200
- unrealon_sdk/src/clients/python_http/services/async_admin_service.py +0 -125
- unrealon_sdk/src/clients/python_websocket/__init__.py +0 -28
- unrealon_sdk/src/clients/python_websocket/client.py +0 -490
- unrealon_sdk/src/clients/python_websocket/events.py +0 -732
- unrealon_sdk/src/clients/python_websocket/example.py +0 -136
- unrealon_sdk/src/clients/python_websocket/types.py +0 -871
- unrealon_sdk/src/core/__init__.py +0 -64
- unrealon_sdk/src/core/client.py +0 -556
- unrealon_sdk/src/core/config.py +0 -465
- unrealon_sdk/src/core/exceptions.py +0 -239
- unrealon_sdk/src/core/metadata.py +0 -191
- unrealon_sdk/src/core/models.py +0 -142
- unrealon_sdk/src/core/types.py +0 -68
- unrealon_sdk/src/dto/__init__.py +0 -268
- unrealon_sdk/src/dto/authentication.py +0 -108
- unrealon_sdk/src/dto/cache.py +0 -208
- unrealon_sdk/src/dto/common.py +0 -19
- unrealon_sdk/src/dto/concurrency.py +0 -393
- unrealon_sdk/src/dto/events.py +0 -108
- unrealon_sdk/src/dto/health.py +0 -339
- unrealon_sdk/src/dto/load_balancing.py +0 -336
- unrealon_sdk/src/dto/logging.py +0 -230
- unrealon_sdk/src/dto/performance.py +0 -165
- unrealon_sdk/src/dto/rate_limiting.py +0 -295
- unrealon_sdk/src/dto/resource_pooling.py +0 -128
- unrealon_sdk/src/dto/structured_logging.py +0 -112
- unrealon_sdk/src/dto/task_scheduling.py +0 -121
- unrealon_sdk/src/dto/websocket.py +0 -55
- unrealon_sdk/src/enterprise/__init__.py +0 -59
- unrealon_sdk/src/enterprise/authentication.py +0 -401
- unrealon_sdk/src/enterprise/cache_manager.py +0 -578
- unrealon_sdk/src/enterprise/error_recovery.py +0 -494
- unrealon_sdk/src/enterprise/event_system.py +0 -549
- unrealon_sdk/src/enterprise/health_monitor.py +0 -747
- unrealon_sdk/src/enterprise/load_balancer.py +0 -964
- unrealon_sdk/src/enterprise/logging/__init__.py +0 -68
- unrealon_sdk/src/enterprise/logging/cleanup.py +0 -156
- unrealon_sdk/src/enterprise/logging/development.py +0 -744
- unrealon_sdk/src/enterprise/logging/service.py +0 -410
- unrealon_sdk/src/enterprise/multithreading_manager.py +0 -853
- unrealon_sdk/src/enterprise/performance_monitor.py +0 -539
- unrealon_sdk/src/enterprise/proxy_manager.py +0 -696
- unrealon_sdk/src/enterprise/rate_limiter.py +0 -652
- unrealon_sdk/src/enterprise/resource_pool.py +0 -763
- unrealon_sdk/src/enterprise/task_scheduler.py +0 -709
- unrealon_sdk/src/internal/__init__.py +0 -10
- unrealon_sdk/src/internal/command_router.py +0 -497
- unrealon_sdk/src/internal/connection_manager.py +0 -397
- unrealon_sdk/src/internal/http_client.py +0 -446
- unrealon_sdk/src/internal/websocket_client.py +0 -420
- unrealon_sdk/src/provider.py +0 -471
- unrealon_sdk/src/utils.py +0 -234
- /unrealon_browser/{src/cli → cli}/__init__.py +0 -0
- /unrealon_browser/{src/cli → cli}/interactive_mode.py +0 -0
- /unrealon_browser/{src/cli → cli}/main.py +0 -0
- /unrealon_browser/{src/core → core}/__init__.py +0 -0
- /unrealon_browser/{src/dto → dto}/__init__.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/config.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/core.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/dataclasses.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/detection.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/enums.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/statistics.py +0 -0
- /unrealon_browser/{src/managers → managers}/__init__.py +0 -0
- /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
|
-
]
|