exonware-xwsystem 0.0.1.411__py3-none-any.whl → 0.1.0.3__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.
- exonware/__init__.py +2 -1
- exonware/conf.py +2 -2
- exonware/xwsystem/__init__.py +115 -43
- exonware/xwsystem/base.py +30 -0
- exonware/xwsystem/caching/__init__.py +39 -13
- exonware/xwsystem/caching/base.py +24 -6
- exonware/xwsystem/caching/bloom_cache.py +2 -2
- exonware/xwsystem/caching/cache_manager.py +2 -1
- exonware/xwsystem/caching/conditional.py +2 -2
- exonware/xwsystem/caching/contracts.py +85 -139
- exonware/xwsystem/caching/decorators.py +6 -19
- exonware/xwsystem/caching/defs.py +2 -1
- exonware/xwsystem/caching/disk_cache.py +2 -1
- exonware/xwsystem/caching/distributed.py +2 -1
- exonware/xwsystem/caching/errors.py +2 -1
- exonware/xwsystem/caching/events.py +110 -27
- exonware/xwsystem/caching/eviction_strategies.py +2 -2
- exonware/xwsystem/caching/external_caching_python.py +701 -0
- exonware/xwsystem/caching/facade.py +253 -0
- exonware/xwsystem/caching/factory.py +300 -0
- exonware/xwsystem/caching/fluent.py +14 -12
- exonware/xwsystem/caching/integrity.py +21 -6
- exonware/xwsystem/caching/lfu_cache.py +2 -1
- exonware/xwsystem/caching/lfu_optimized.py +18 -6
- exonware/xwsystem/caching/lru_cache.py +7 -4
- exonware/xwsystem/caching/memory_bounded.py +2 -2
- exonware/xwsystem/caching/metrics_exporter.py +2 -2
- exonware/xwsystem/caching/observable_cache.py +2 -2
- exonware/xwsystem/caching/pluggable_cache.py +2 -2
- exonware/xwsystem/caching/rate_limiter.py +2 -2
- exonware/xwsystem/caching/read_through.py +2 -2
- exonware/xwsystem/caching/secure_cache.py +81 -28
- exonware/xwsystem/caching/serializable.py +9 -7
- exonware/xwsystem/caching/stats.py +2 -2
- exonware/xwsystem/caching/tagging.py +2 -2
- exonware/xwsystem/caching/ttl_cache.py +4 -3
- exonware/xwsystem/caching/two_tier_cache.py +6 -3
- exonware/xwsystem/caching/utils.py +30 -12
- exonware/xwsystem/caching/validation.py +2 -2
- exonware/xwsystem/caching/warming.py +6 -3
- exonware/xwsystem/caching/write_behind.py +15 -6
- exonware/xwsystem/config/__init__.py +11 -17
- exonware/xwsystem/config/base.py +5 -5
- exonware/xwsystem/config/contracts.py +93 -153
- exonware/xwsystem/config/defaults.py +3 -2
- exonware/xwsystem/config/defs.py +3 -2
- exonware/xwsystem/config/errors.py +2 -5
- exonware/xwsystem/config/logging.py +12 -8
- exonware/xwsystem/config/logging_setup.py +3 -2
- exonware/xwsystem/config/performance.py +73 -391
- exonware/xwsystem/config/performance_modes.py +9 -8
- exonware/xwsystem/config/version_manager.py +1 -0
- exonware/xwsystem/config.py +27 -0
- exonware/xwsystem/console/__init__.py +53 -0
- exonware/xwsystem/console/base.py +133 -0
- exonware/xwsystem/console/cli/__init__.py +61 -0
- exonware/xwsystem/{cli → console/cli}/args.py +27 -24
- exonware/xwsystem/{cli → console/cli}/base.py +18 -87
- exonware/xwsystem/{cli → console/cli}/colors.py +15 -13
- exonware/xwsystem/console/cli/console.py +98 -0
- exonware/xwsystem/{cli → console/cli}/contracts.py +51 -69
- exonware/xwsystem/console/cli/defs.py +87 -0
- exonware/xwsystem/console/cli/encoding.py +69 -0
- exonware/xwsystem/{cli → console/cli}/errors.py +8 -3
- exonware/xwsystem/console/cli/event_logger.py +166 -0
- exonware/xwsystem/{cli → console/cli}/progress.py +25 -21
- exonware/xwsystem/{cli → console/cli}/prompts.py +3 -2
- exonware/xwsystem/{cli → console/cli}/tables.py +27 -24
- exonware/xwsystem/console/contracts.py +113 -0
- exonware/xwsystem/console/defs.py +154 -0
- exonware/xwsystem/console/errors.py +34 -0
- exonware/xwsystem/console/event_logger.py +385 -0
- exonware/xwsystem/console/writer.py +132 -0
- exonware/xwsystem/contracts.py +28 -0
- exonware/xwsystem/data_structures/__init__.py +23 -0
- exonware/xwsystem/data_structures/trie.py +34 -0
- exonware/xwsystem/data_structures/union_find.py +144 -0
- exonware/xwsystem/defs.py +17 -0
- exonware/xwsystem/errors.py +23 -0
- exonware/xwsystem/facade.py +62 -0
- exonware/xwsystem/http_client/__init__.py +22 -1
- exonware/xwsystem/http_client/advanced_client.py +8 -5
- exonware/xwsystem/http_client/base.py +3 -2
- exonware/xwsystem/http_client/client.py +7 -4
- exonware/xwsystem/http_client/contracts.py +42 -56
- exonware/xwsystem/http_client/defs.py +2 -1
- exonware/xwsystem/http_client/errors.py +2 -1
- exonware/xwsystem/http_client/facade.py +156 -0
- exonware/xwsystem/io/__init__.py +22 -3
- exonware/xwsystem/io/archive/__init__.py +8 -2
- exonware/xwsystem/io/archive/archive.py +1 -1
- exonware/xwsystem/io/archive/archive_files.py +4 -7
- exonware/xwsystem/io/archive/archivers.py +120 -10
- exonware/xwsystem/io/archive/base.py +4 -5
- exonware/xwsystem/io/archive/codec_integration.py +1 -2
- exonware/xwsystem/io/archive/compression.py +1 -2
- exonware/xwsystem/io/archive/facade.py +263 -0
- exonware/xwsystem/io/archive/formats/__init__.py +2 -3
- exonware/xwsystem/io/archive/formats/brotli_format.py +20 -7
- exonware/xwsystem/io/archive/formats/lz4_format.py +20 -7
- exonware/xwsystem/io/archive/formats/rar.py +11 -5
- exonware/xwsystem/io/archive/formats/sevenzip.py +12 -6
- exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -2
- exonware/xwsystem/io/archive/formats/tar.py +52 -7
- exonware/xwsystem/io/archive/formats/wim_format.py +11 -5
- exonware/xwsystem/io/archive/formats/zip.py +1 -2
- exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -2
- exonware/xwsystem/io/archive/formats/zstandard.py +20 -7
- exonware/xwsystem/io/base.py +119 -115
- exonware/xwsystem/io/codec/__init__.py +4 -2
- exonware/xwsystem/io/codec/base.py +19 -13
- exonware/xwsystem/io/codec/contracts.py +59 -2
- exonware/xwsystem/io/codec/registry.py +67 -21
- exonware/xwsystem/io/common/__init__.py +1 -1
- exonware/xwsystem/io/common/atomic.py +29 -16
- exonware/xwsystem/io/common/base.py +11 -10
- exonware/xwsystem/io/common/lock.py +6 -5
- exonware/xwsystem/io/common/path_manager.py +2 -1
- exonware/xwsystem/io/common/watcher.py +1 -2
- exonware/xwsystem/io/contracts.py +301 -433
- exonware/xwsystem/io/contracts_1.py +1180 -0
- exonware/xwsystem/io/data_operations.py +279 -14
- exonware/xwsystem/io/defs.py +4 -3
- exonware/xwsystem/io/errors.py +3 -2
- exonware/xwsystem/io/facade.py +87 -61
- exonware/xwsystem/io/file/__init__.py +1 -1
- exonware/xwsystem/io/file/base.py +8 -9
- exonware/xwsystem/io/file/conversion.py +2 -3
- exonware/xwsystem/io/file/file.py +61 -18
- exonware/xwsystem/io/file/paged_source.py +8 -8
- exonware/xwsystem/io/file/paging/__init__.py +1 -2
- exonware/xwsystem/io/file/paging/byte_paging.py +4 -5
- exonware/xwsystem/io/file/paging/line_paging.py +2 -3
- exonware/xwsystem/io/file/paging/record_paging.py +2 -3
- exonware/xwsystem/io/file/paging/registry.py +1 -2
- exonware/xwsystem/io/file/source.py +13 -17
- exonware/xwsystem/io/filesystem/__init__.py +1 -1
- exonware/xwsystem/io/filesystem/base.py +1 -2
- exonware/xwsystem/io/filesystem/local.py +3 -4
- exonware/xwsystem/io/folder/__init__.py +1 -1
- exonware/xwsystem/io/folder/base.py +1 -2
- exonware/xwsystem/io/folder/folder.py +16 -7
- exonware/xwsystem/io/indexing/__init__.py +14 -0
- exonware/xwsystem/io/indexing/facade.py +443 -0
- exonware/xwsystem/io/path_parser.py +98 -0
- exonware/xwsystem/io/serialization/__init__.py +21 -3
- exonware/xwsystem/io/serialization/auto_serializer.py +146 -20
- exonware/xwsystem/io/serialization/base.py +84 -34
- exonware/xwsystem/io/serialization/contracts.py +50 -73
- exonware/xwsystem/io/serialization/defs.py +2 -1
- exonware/xwsystem/io/serialization/errors.py +2 -1
- exonware/xwsystem/io/serialization/flyweight.py +154 -7
- exonware/xwsystem/io/serialization/format_detector.py +15 -14
- exonware/xwsystem/io/serialization/formats/__init__.py +8 -5
- exonware/xwsystem/io/serialization/formats/binary/bson.py +15 -6
- exonware/xwsystem/io/serialization/formats/binary/cbor.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/marshal.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/msgpack.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/pickle.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/plistlib.py +5 -5
- exonware/xwsystem/io/serialization/formats/database/dbm.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/shelve.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/sqlite3.py +7 -7
- exonware/xwsystem/io/serialization/formats/tabular/__init__.py +27 -0
- exonware/xwsystem/io/serialization/formats/tabular/base.py +89 -0
- exonware/xwsystem/io/serialization/formats/tabular/csv.py +319 -0
- exonware/xwsystem/io/serialization/formats/tabular/df.py +249 -0
- exonware/xwsystem/io/serialization/formats/tabular/excel.py +291 -0
- exonware/xwsystem/io/serialization/formats/tabular/googlesheets.py +374 -0
- exonware/xwsystem/io/serialization/formats/text/__init__.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/append_only_log.py +199 -0
- exonware/xwsystem/io/serialization/formats/text/configparser.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/csv.py +7 -5
- exonware/xwsystem/io/serialization/formats/text/formdata.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/json.py +65 -33
- exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
- exonware/xwsystem/io/serialization/formats/text/jsonlines.py +113 -25
- exonware/xwsystem/io/serialization/formats/text/multipart.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/toml.py +8 -6
- exonware/xwsystem/io/serialization/formats/text/xml.py +25 -20
- exonware/xwsystem/io/serialization/formats/text/yaml.py +8 -6
- exonware/xwsystem/io/serialization/parsers/__init__.py +16 -0
- exonware/xwsystem/io/serialization/parsers/base.py +60 -0
- exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +48 -0
- exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +54 -0
- exonware/xwsystem/io/serialization/parsers/orjson_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +55 -0
- exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +53 -0
- exonware/xwsystem/io/serialization/parsers/registry.py +91 -0
- exonware/xwsystem/io/serialization/parsers/standard.py +44 -0
- exonware/xwsystem/io/serialization/parsers/ujson_parser.py +53 -0
- exonware/xwsystem/io/serialization/registry.py +4 -4
- exonware/xwsystem/io/serialization/serializer.py +168 -79
- exonware/xwsystem/io/serialization/universal_options.py +367 -0
- exonware/xwsystem/io/serialization/utils/__init__.py +1 -2
- exonware/xwsystem/io/serialization/utils/path_ops.py +5 -6
- exonware/xwsystem/io/source_reader.py +223 -0
- exonware/xwsystem/io/stream/__init__.py +1 -1
- exonware/xwsystem/io/stream/async_operations.py +61 -14
- exonware/xwsystem/io/stream/base.py +1 -2
- exonware/xwsystem/io/stream/codec_io.py +6 -7
- exonware/xwsystem/ipc/__init__.py +1 -0
- exonware/xwsystem/ipc/async_fabric.py +4 -4
- exonware/xwsystem/ipc/base.py +6 -5
- exonware/xwsystem/ipc/contracts.py +41 -66
- exonware/xwsystem/ipc/defs.py +2 -1
- exonware/xwsystem/ipc/errors.py +2 -1
- exonware/xwsystem/ipc/message_queue.py +5 -2
- exonware/xwsystem/ipc/pipes.py +70 -34
- exonware/xwsystem/ipc/process_manager.py +7 -5
- exonware/xwsystem/ipc/process_pool.py +6 -5
- exonware/xwsystem/ipc/shared_memory.py +64 -11
- exonware/xwsystem/monitoring/__init__.py +7 -0
- exonware/xwsystem/monitoring/base.py +11 -8
- exonware/xwsystem/monitoring/contracts.py +86 -144
- exonware/xwsystem/monitoring/defs.py +2 -1
- exonware/xwsystem/monitoring/error_recovery.py +16 -3
- exonware/xwsystem/monitoring/errors.py +2 -1
- exonware/xwsystem/monitoring/facade.py +183 -0
- exonware/xwsystem/monitoring/memory_monitor.py +1 -0
- exonware/xwsystem/monitoring/metrics.py +1 -0
- exonware/xwsystem/monitoring/performance_manager_generic.py +7 -7
- exonware/xwsystem/monitoring/performance_monitor.py +1 -0
- exonware/xwsystem/monitoring/performance_validator.py +1 -0
- exonware/xwsystem/monitoring/system_monitor.py +6 -5
- exonware/xwsystem/monitoring/tracing.py +18 -16
- exonware/xwsystem/monitoring/tracker.py +2 -1
- exonware/xwsystem/operations/__init__.py +5 -50
- exonware/xwsystem/operations/base.py +3 -44
- exonware/xwsystem/operations/contracts.py +25 -15
- exonware/xwsystem/operations/defs.py +1 -1
- exonware/xwsystem/operations/diff.py +5 -4
- exonware/xwsystem/operations/errors.py +1 -1
- exonware/xwsystem/operations/merge.py +6 -4
- exonware/xwsystem/operations/patch.py +5 -4
- exonware/xwsystem/patterns/__init__.py +1 -0
- exonware/xwsystem/patterns/base.py +2 -1
- exonware/xwsystem/patterns/context_manager.py +2 -1
- exonware/xwsystem/patterns/contracts.py +215 -256
- exonware/xwsystem/patterns/defs.py +2 -1
- exonware/xwsystem/patterns/dynamic_facade.py +1 -0
- exonware/xwsystem/patterns/errors.py +2 -4
- exonware/xwsystem/patterns/handler_factory.py +2 -3
- exonware/xwsystem/patterns/import_registry.py +1 -0
- exonware/xwsystem/patterns/object_pool.py +1 -0
- exonware/xwsystem/patterns/registry.py +4 -43
- exonware/xwsystem/plugins/__init__.py +2 -1
- exonware/xwsystem/plugins/base.py +6 -5
- exonware/xwsystem/plugins/contracts.py +94 -158
- exonware/xwsystem/plugins/defs.py +2 -1
- exonware/xwsystem/plugins/errors.py +2 -1
- exonware/xwsystem/py.typed +3 -0
- exonware/xwsystem/query/__init__.py +36 -0
- exonware/xwsystem/query/contracts.py +56 -0
- exonware/xwsystem/query/errors.py +22 -0
- exonware/xwsystem/query/registry.py +128 -0
- exonware/xwsystem/runtime/__init__.py +2 -1
- exonware/xwsystem/runtime/base.py +4 -3
- exonware/xwsystem/runtime/contracts.py +39 -60
- exonware/xwsystem/runtime/defs.py +2 -1
- exonware/xwsystem/runtime/env.py +11 -9
- exonware/xwsystem/runtime/errors.py +2 -1
- exonware/xwsystem/runtime/reflection.py +3 -2
- exonware/xwsystem/security/__init__.py +68 -11
- exonware/xwsystem/security/audit.py +167 -0
- exonware/xwsystem/security/base.py +121 -24
- exonware/xwsystem/security/contracts.py +91 -146
- exonware/xwsystem/security/crypto.py +17 -16
- exonware/xwsystem/security/defs.py +2 -1
- exonware/xwsystem/security/errors.py +2 -1
- exonware/xwsystem/security/facade.py +321 -0
- exonware/xwsystem/security/file_security.py +330 -0
- exonware/xwsystem/security/hazmat.py +11 -8
- exonware/xwsystem/security/monitor.py +372 -0
- exonware/xwsystem/security/path_validator.py +140 -18
- exonware/xwsystem/security/policy.py +357 -0
- exonware/xwsystem/security/resource_limits.py +1 -0
- exonware/xwsystem/security/validator.py +455 -0
- exonware/xwsystem/shared/__init__.py +14 -1
- exonware/xwsystem/shared/base.py +285 -2
- exonware/xwsystem/shared/contracts.py +415 -126
- exonware/xwsystem/shared/defs.py +2 -1
- exonware/xwsystem/shared/errors.py +2 -2
- exonware/xwsystem/shared/xwobject.py +316 -0
- exonware/xwsystem/structures/__init__.py +1 -0
- exonware/xwsystem/structures/base.py +3 -2
- exonware/xwsystem/structures/circular_detector.py +15 -14
- exonware/xwsystem/structures/contracts.py +53 -76
- exonware/xwsystem/structures/defs.py +2 -1
- exonware/xwsystem/structures/errors.py +2 -1
- exonware/xwsystem/structures/tree_walker.py +2 -1
- exonware/xwsystem/threading/__init__.py +21 -4
- exonware/xwsystem/threading/async_primitives.py +6 -5
- exonware/xwsystem/threading/base.py +3 -2
- exonware/xwsystem/threading/contracts.py +87 -143
- exonware/xwsystem/threading/defs.py +2 -1
- exonware/xwsystem/threading/errors.py +2 -1
- exonware/xwsystem/threading/facade.py +175 -0
- exonware/xwsystem/threading/locks.py +1 -0
- exonware/xwsystem/threading/safe_factory.py +1 -0
- exonware/xwsystem/utils/__init__.py +40 -0
- exonware/xwsystem/utils/base.py +22 -21
- exonware/xwsystem/utils/contracts.py +50 -73
- exonware/xwsystem/utils/dt/__init__.py +19 -3
- exonware/xwsystem/utils/dt/base.py +5 -4
- exonware/xwsystem/utils/dt/contracts.py +22 -29
- exonware/xwsystem/utils/dt/defs.py +2 -1
- exonware/xwsystem/utils/dt/errors.py +2 -5
- exonware/xwsystem/utils/dt/formatting.py +88 -2
- exonware/xwsystem/utils/dt/humanize.py +10 -9
- exonware/xwsystem/utils/dt/parsing.py +56 -5
- exonware/xwsystem/utils/dt/timezone_utils.py +2 -24
- exonware/xwsystem/utils/errors.py +2 -4
- exonware/xwsystem/utils/paths.py +1 -0
- exonware/xwsystem/utils/string.py +49 -0
- exonware/xwsystem/utils/test_runner.py +139 -480
- exonware/xwsystem/utils/utils_contracts.py +2 -1
- exonware/xwsystem/utils/web.py +110 -0
- exonware/xwsystem/validation/__init__.py +25 -1
- exonware/xwsystem/validation/base.py +6 -5
- exonware/xwsystem/validation/contracts.py +29 -41
- exonware/xwsystem/validation/data_validator.py +1 -0
- exonware/xwsystem/validation/declarative.py +11 -8
- exonware/xwsystem/validation/defs.py +2 -1
- exonware/xwsystem/validation/errors.py +2 -1
- exonware/xwsystem/validation/facade.py +198 -0
- exonware/xwsystem/validation/fluent_validator.py +22 -19
- exonware/xwsystem/validation/schema_discovery.py +210 -0
- exonware/xwsystem/validation/type_safety.py +2 -1
- exonware/xwsystem/version.py +4 -4
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/METADATA +71 -4
- exonware_xwsystem-0.1.0.3.dist-info/RECORD +337 -0
- exonware/xwsystem/caching/USAGE_GUIDE.md +0 -779
- exonware/xwsystem/cli/__init__.py +0 -43
- exonware/xwsystem/cli/console.py +0 -113
- exonware/xwsystem/cli/defs.py +0 -134
- exonware/xwsystem/conf.py +0 -44
- exonware/xwsystem/security/auth.py +0 -484
- exonware_xwsystem-0.0.1.411.dist-info/RECORD +0 -274
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/security/__init__.py
|
|
1
2
|
"""
|
|
2
3
|
XSystem Security Package
|
|
3
4
|
|
|
4
5
|
Provides security utilities including:
|
|
5
6
|
- Path validation and resource limits
|
|
6
|
-
-
|
|
7
|
+
- Security contracts and interfaces (IAuthenticatable, IAuthorization, ISecurityToken)
|
|
8
|
+
- Abstract base classes for authentication (AAuthProvider, ATokenInfo, AUserInfo)
|
|
7
9
|
- Cryptography and encryption
|
|
10
|
+
- Security errors and definitions
|
|
8
11
|
"""
|
|
9
12
|
|
|
10
13
|
from .path_validator import PathValidator, PathSecurityError
|
|
@@ -14,17 +17,31 @@ from .resource_limits import (
|
|
|
14
17
|
get_resource_limits,
|
|
15
18
|
reset_resource_limits,
|
|
16
19
|
)
|
|
17
|
-
from .
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
from .file_security import (
|
|
21
|
+
FileSecurity,
|
|
22
|
+
FileSecurityError,
|
|
23
|
+
FileSizeLimitError,
|
|
24
|
+
FileIOError,
|
|
25
|
+
get_file_security,
|
|
26
|
+
set_file_security,
|
|
22
27
|
)
|
|
28
|
+
from .audit import SecurityAuditor, SecurityLevel, SecurityIssue, audit_security
|
|
29
|
+
# Security implementations
|
|
30
|
+
from .validator import SecurityValidator
|
|
31
|
+
from .monitor import SecurityMonitor
|
|
32
|
+
from .policy import SecurityPolicy
|
|
33
|
+
# Base classes and contracts (kept in xwsystem - foundation layer)
|
|
23
34
|
from .base import (
|
|
24
35
|
AAuthProvider,
|
|
25
36
|
ATokenInfo,
|
|
26
37
|
AUserInfo,
|
|
38
|
+
ASecurityValidatorBase,
|
|
39
|
+
ASecurityMonitorBase,
|
|
40
|
+
ASecurityPolicyBase,
|
|
27
41
|
)
|
|
42
|
+
# Unified Facades
|
|
43
|
+
from .facade import XWSecurity, XWCrypto
|
|
44
|
+
|
|
28
45
|
from .errors import (
|
|
29
46
|
AuthenticationError,
|
|
30
47
|
AuthorizationError,
|
|
@@ -34,8 +51,22 @@ from .errors import (
|
|
|
34
51
|
SAMLError,
|
|
35
52
|
)
|
|
36
53
|
from .defs import OAuth2GrantType
|
|
54
|
+
# Contracts/interfaces (kept in xwsystem - foundation layer)
|
|
55
|
+
from .contracts import (
|
|
56
|
+
IAuthenticatable,
|
|
57
|
+
IAuthorization,
|
|
58
|
+
ISecurityToken,
|
|
59
|
+
ISecure,
|
|
60
|
+
IAuditable,
|
|
61
|
+
ISecurityValidator,
|
|
62
|
+
ISecurityMonitor,
|
|
63
|
+
ISecurityPolicy,
|
|
64
|
+
)
|
|
37
65
|
|
|
38
66
|
__all__ = [
|
|
67
|
+
# Unified Facades
|
|
68
|
+
"XWSecurity",
|
|
69
|
+
"XWCrypto",
|
|
39
70
|
# Path & Resources
|
|
40
71
|
"PathValidator",
|
|
41
72
|
"PathSecurityError",
|
|
@@ -43,19 +74,45 @@ __all__ = [
|
|
|
43
74
|
"GenericLimitError",
|
|
44
75
|
"get_resource_limits",
|
|
45
76
|
"reset_resource_limits",
|
|
46
|
-
#
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
77
|
+
# File Security
|
|
78
|
+
"FileSecurity",
|
|
79
|
+
"FileSecurityError",
|
|
80
|
+
"FileSizeLimitError",
|
|
81
|
+
"FileIOError",
|
|
82
|
+
"get_file_security",
|
|
83
|
+
"set_file_security",
|
|
84
|
+
# Security Implementations
|
|
85
|
+
"SecurityValidator",
|
|
86
|
+
"SecurityMonitor",
|
|
87
|
+
"SecurityPolicy",
|
|
88
|
+
# Authentication Base Classes (foundation - kept in xwsystem)
|
|
51
89
|
"AAuthProvider",
|
|
52
90
|
"ATokenInfo",
|
|
53
91
|
"AUserInfo",
|
|
92
|
+
"ASecurityValidatorBase",
|
|
93
|
+
"ASecurityMonitorBase",
|
|
94
|
+
"ASecurityPolicyBase",
|
|
95
|
+
# Security Errors
|
|
54
96
|
"AuthenticationError",
|
|
55
97
|
"AuthorizationError",
|
|
56
98
|
"TokenExpiredError",
|
|
57
99
|
"OAuth2Error",
|
|
58
100
|
"JWTError",
|
|
59
101
|
"SAMLError",
|
|
102
|
+
# Security Definitions
|
|
60
103
|
"OAuth2GrantType",
|
|
104
|
+
# Security Audit
|
|
105
|
+
"SecurityAuditor",
|
|
106
|
+
"SecurityLevel",
|
|
107
|
+
"SecurityIssue",
|
|
108
|
+
"audit_security",
|
|
109
|
+
# Security Contracts/Interfaces (foundation - kept in xwsystem)
|
|
110
|
+
"IAuthenticatable",
|
|
111
|
+
"IAuthorization",
|
|
112
|
+
"ISecurityToken",
|
|
113
|
+
"ISecure",
|
|
114
|
+
"IAuditable",
|
|
115
|
+
"ISecurityValidator",
|
|
116
|
+
"ISecurityMonitor",
|
|
117
|
+
"ISecurityPolicy",
|
|
61
118
|
]
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
#exonware/xwsystem/src/exonware/xwsystem/security/audit.py
|
|
4
|
+
|
|
5
|
+
Generic Security Audit Utilities for xwsystem.
|
|
6
|
+
|
|
7
|
+
Provides generic security auditing that can be used by any library:
|
|
8
|
+
- Security issue detection
|
|
9
|
+
- Security audit reporting
|
|
10
|
+
- Generic security level definitions
|
|
11
|
+
|
|
12
|
+
Company: eXonware.com
|
|
13
|
+
Author: Eng. Muhammad AlShehri
|
|
14
|
+
Email: connect@exonware.com
|
|
15
|
+
Version: 0.1.0.3
|
|
16
|
+
Generation Date: 26-Jan-2025
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from typing import Any, Optional
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from enum import Enum
|
|
22
|
+
from exonware.xwsystem import get_logger
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class SecurityLevel(Enum):
|
|
28
|
+
"""Security issue severity levels."""
|
|
29
|
+
CRITICAL = "critical"
|
|
30
|
+
HIGH = "high"
|
|
31
|
+
MEDIUM = "medium"
|
|
32
|
+
LOW = "low"
|
|
33
|
+
INFO = "info"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass
|
|
37
|
+
class SecurityIssue:
|
|
38
|
+
"""A security issue found during audit."""
|
|
39
|
+
level: SecurityLevel
|
|
40
|
+
category: str
|
|
41
|
+
description: str
|
|
42
|
+
recommendation: str
|
|
43
|
+
location: Optional[str] = None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class SecurityAuditor:
|
|
47
|
+
"""
|
|
48
|
+
Generic security audit utilities.
|
|
49
|
+
|
|
50
|
+
Can be used by any library to audit security issues.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def audit_object(obj: Any, object_type: str = "object") -> list[SecurityIssue]:
|
|
55
|
+
"""
|
|
56
|
+
Audit an object for security issues.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
obj: Object instance to audit
|
|
60
|
+
object_type: Type name of the object (e.g., "strategy", "node", "component")
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
List of SecurityIssue objects
|
|
64
|
+
"""
|
|
65
|
+
issues = []
|
|
66
|
+
obj_name = getattr(obj, '__class__', {}).__name__ if hasattr(obj, '__class__') else 'Unknown'
|
|
67
|
+
|
|
68
|
+
# Check for input validation
|
|
69
|
+
if not hasattr(obj, 'validate_input'):
|
|
70
|
+
issues.append(SecurityIssue(
|
|
71
|
+
level=SecurityLevel.MEDIUM,
|
|
72
|
+
category="Input Validation",
|
|
73
|
+
description=f"{object_type.capitalize()} {obj_name} does not have explicit input validation",
|
|
74
|
+
recommendation="Add validate_input method to check inputs before processing",
|
|
75
|
+
location=f"{obj_name}.validate_input"
|
|
76
|
+
))
|
|
77
|
+
|
|
78
|
+
# Check for bounds checking (if applicable)
|
|
79
|
+
if hasattr(obj, 'get') and not hasattr(obj, '_check_bounds'):
|
|
80
|
+
issues.append(SecurityIssue(
|
|
81
|
+
level=SecurityLevel.LOW,
|
|
82
|
+
category="Bounds Checking",
|
|
83
|
+
description=f"{object_type.capitalize()} {obj_name} may not check bounds on get operations",
|
|
84
|
+
recommendation="Ensure all index/key access operations validate bounds",
|
|
85
|
+
location=f"{obj_name}.get"
|
|
86
|
+
))
|
|
87
|
+
|
|
88
|
+
# Check for error handling
|
|
89
|
+
methods = [m for m in dir(obj) if not m.startswith('_') and callable(getattr(obj, m, None))]
|
|
90
|
+
error_handling_count = sum(1 for m in methods if 'error' in m.lower() or 'exception' in m.lower())
|
|
91
|
+
if error_handling_count == 0:
|
|
92
|
+
issues.append(SecurityIssue(
|
|
93
|
+
level=SecurityLevel.MEDIUM,
|
|
94
|
+
category="Error Handling",
|
|
95
|
+
description=f"{object_type.capitalize()} {obj_name} may lack comprehensive error handling",
|
|
96
|
+
recommendation="Add explicit error handling for edge cases and invalid inputs",
|
|
97
|
+
location=f"{obj_name}"
|
|
98
|
+
))
|
|
99
|
+
|
|
100
|
+
# Check for data sanitization (if applicable)
|
|
101
|
+
if hasattr(obj, 'put') or hasattr(obj, 'set'):
|
|
102
|
+
issues.append(SecurityIssue(
|
|
103
|
+
level=SecurityLevel.INFO,
|
|
104
|
+
category="Data Sanitization",
|
|
105
|
+
description=f"{object_type.capitalize()} {obj_name} should sanitize data before storage",
|
|
106
|
+
recommendation="Consider adding data sanitization for user-provided inputs",
|
|
107
|
+
location=f"{obj_name}.put/set"
|
|
108
|
+
))
|
|
109
|
+
|
|
110
|
+
return issues
|
|
111
|
+
|
|
112
|
+
@staticmethod
|
|
113
|
+
def generate_report(issues: list[SecurityIssue]) -> dict[str, Any]:
|
|
114
|
+
"""
|
|
115
|
+
Generate a security audit report.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
issues: List of security issues
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Dictionary with report data
|
|
122
|
+
"""
|
|
123
|
+
by_level = {}
|
|
124
|
+
by_category = {}
|
|
125
|
+
|
|
126
|
+
for issue in issues:
|
|
127
|
+
# Group by level
|
|
128
|
+
level = issue.level.value
|
|
129
|
+
if level not in by_level:
|
|
130
|
+
by_level[level] = []
|
|
131
|
+
by_level[level].append(issue)
|
|
132
|
+
|
|
133
|
+
# Group by category
|
|
134
|
+
if issue.category not in by_category:
|
|
135
|
+
by_category[issue.category] = []
|
|
136
|
+
by_category[issue.category].append(issue)
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
'total_issues': len(issues),
|
|
140
|
+
'by_level': {k: len(v) for k, v in by_level.items()},
|
|
141
|
+
'by_category': {k: len(v) for k, v in by_category.items()},
|
|
142
|
+
'issues': [
|
|
143
|
+
{
|
|
144
|
+
'level': issue.level.value,
|
|
145
|
+
'category': issue.category,
|
|
146
|
+
'description': issue.description,
|
|
147
|
+
'recommendation': issue.recommendation,
|
|
148
|
+
'location': issue.location
|
|
149
|
+
}
|
|
150
|
+
for issue in issues
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def audit_security(obj: Any, object_type: str = "object") -> dict[str, Any]:
|
|
156
|
+
"""
|
|
157
|
+
Convenience function to audit an object's security.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
obj: Object instance to audit
|
|
161
|
+
object_type: Type name of the object
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
Security audit report
|
|
165
|
+
"""
|
|
166
|
+
issues = SecurityAuditor.audit_object(obj, object_type)
|
|
167
|
+
return SecurityAuditor.generate_report(issues)
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/security/base.py
|
|
1
2
|
#exonware/xwsystem/security/base.py
|
|
2
3
|
"""
|
|
3
4
|
Company: eXonware.com
|
|
4
5
|
Author: Eng. Muhammad AlShehri
|
|
5
6
|
Email: connect@exonware.com
|
|
6
|
-
Version: 0.0.
|
|
7
|
+
Version: 0.1.0.3
|
|
7
8
|
Generation Date: September 04, 2025
|
|
8
9
|
|
|
9
10
|
Security module base classes - abstract classes for security functionality.
|
|
10
11
|
"""
|
|
11
12
|
|
|
12
13
|
from abc import ABC, abstractmethod
|
|
13
|
-
from typing import Any, Optional
|
|
14
|
+
from typing import Any, Optional
|
|
14
15
|
from .defs import HashAlgorithm, EncryptionAlgorithm, SecurityLevel
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
class ACryptographicBase(ABC):
|
|
18
19
|
"""Abstract base class for cryptographic operations."""
|
|
19
20
|
|
|
20
|
-
def __init__(self, algorithm:
|
|
21
|
+
def __init__(self, algorithm: HashAlgorithm | EncryptionAlgorithm):
|
|
21
22
|
"""
|
|
22
23
|
Initialize cryptographic base.
|
|
23
24
|
|
|
@@ -44,32 +45,32 @@ class ACryptographicBase(ABC):
|
|
|
44
45
|
pass
|
|
45
46
|
|
|
46
47
|
@abstractmethod
|
|
47
|
-
def encrypt(self, data:
|
|
48
|
+
def encrypt(self, data: str | bytes) -> bytes:
|
|
48
49
|
"""Encrypt data."""
|
|
49
50
|
pass
|
|
50
51
|
|
|
51
52
|
@abstractmethod
|
|
52
|
-
def decrypt(self, encrypted_data: bytes) ->
|
|
53
|
+
def decrypt(self, encrypted_data: bytes) -> str | bytes:
|
|
53
54
|
"""Decrypt data."""
|
|
54
55
|
pass
|
|
55
56
|
|
|
56
57
|
@abstractmethod
|
|
57
|
-
def hash(self, data:
|
|
58
|
+
def hash(self, data: str | bytes) -> str:
|
|
58
59
|
"""Hash data."""
|
|
59
60
|
pass
|
|
60
61
|
|
|
61
62
|
@abstractmethod
|
|
62
|
-
def verify_hash(self, data:
|
|
63
|
+
def verify_hash(self, data: str | bytes, hash_value: str) -> bool:
|
|
63
64
|
"""Verify data hash."""
|
|
64
65
|
pass
|
|
65
66
|
|
|
66
67
|
@abstractmethod
|
|
67
|
-
def sign(self, data:
|
|
68
|
+
def sign(self, data: str | bytes) -> bytes:
|
|
68
69
|
"""Sign data."""
|
|
69
70
|
pass
|
|
70
71
|
|
|
71
72
|
@abstractmethod
|
|
72
|
-
def verify_signature(self, data:
|
|
73
|
+
def verify_signature(self, data: str | bytes, signature: bytes) -> bool:
|
|
73
74
|
"""Verify data signature."""
|
|
74
75
|
pass
|
|
75
76
|
|
|
@@ -88,17 +89,17 @@ class AHashBase(ABC):
|
|
|
88
89
|
self._salt: Optional[bytes] = None
|
|
89
90
|
|
|
90
91
|
@abstractmethod
|
|
91
|
-
def hash(self, data:
|
|
92
|
+
def hash(self, data: str | bytes, salt: Optional[bytes] = None) -> str:
|
|
92
93
|
"""Hash data."""
|
|
93
94
|
pass
|
|
94
95
|
|
|
95
96
|
@abstractmethod
|
|
96
|
-
def hash_file(self, file_path:
|
|
97
|
+
def hash_file(self, file_path: str | bytes) -> str:
|
|
97
98
|
"""Hash file content."""
|
|
98
99
|
pass
|
|
99
100
|
|
|
100
101
|
@abstractmethod
|
|
101
|
-
def verify_hash(self, data:
|
|
102
|
+
def verify_hash(self, data: str | bytes, hash_value: str, salt: Optional[bytes] = None) -> bool:
|
|
102
103
|
"""Verify data hash."""
|
|
103
104
|
pass
|
|
104
105
|
|
|
@@ -118,7 +119,7 @@ class AHashBase(ABC):
|
|
|
118
119
|
pass
|
|
119
120
|
|
|
120
121
|
@abstractmethod
|
|
121
|
-
def hash_with_salt(self, data:
|
|
122
|
+
def hash_with_salt(self, data: str | bytes) -> tuple[str, bytes]:
|
|
122
123
|
"""Hash data with generated salt."""
|
|
123
124
|
pass
|
|
124
125
|
|
|
@@ -158,22 +159,22 @@ class AEncryptionBase(ABC):
|
|
|
158
159
|
pass
|
|
159
160
|
|
|
160
161
|
@abstractmethod
|
|
161
|
-
def encrypt(self, data:
|
|
162
|
+
def encrypt(self, data: str | bytes, key: Optional[bytes] = None, iv: Optional[bytes] = None) -> bytes:
|
|
162
163
|
"""Encrypt data."""
|
|
163
164
|
pass
|
|
164
165
|
|
|
165
166
|
@abstractmethod
|
|
166
|
-
def decrypt(self, encrypted_data: bytes, key: Optional[bytes] = None, iv: Optional[bytes] = None) ->
|
|
167
|
+
def decrypt(self, encrypted_data: bytes, key: Optional[bytes] = None, iv: Optional[bytes] = None) -> str | bytes:
|
|
167
168
|
"""Decrypt data."""
|
|
168
169
|
pass
|
|
169
170
|
|
|
170
171
|
@abstractmethod
|
|
171
|
-
def encrypt_file(self, file_path:
|
|
172
|
+
def encrypt_file(self, file_path: str | bytes, output_path: str | bytes) -> bool:
|
|
172
173
|
"""Encrypt file."""
|
|
173
174
|
pass
|
|
174
175
|
|
|
175
176
|
@abstractmethod
|
|
176
|
-
def decrypt_file(self, encrypted_file_path:
|
|
177
|
+
def decrypt_file(self, encrypted_file_path: str | bytes, output_path: str | bytes) -> bool:
|
|
177
178
|
"""Decrypt file."""
|
|
178
179
|
pass
|
|
179
180
|
|
|
@@ -193,37 +194,37 @@ class APathValidatorBase(ABC):
|
|
|
193
194
|
self._blocked_paths: list[str] = []
|
|
194
195
|
|
|
195
196
|
@abstractmethod
|
|
196
|
-
def validate_path(self, path:
|
|
197
|
+
def validate_path(self, path: str | bytes) -> bool:
|
|
197
198
|
"""Validate file path."""
|
|
198
199
|
pass
|
|
199
200
|
|
|
200
201
|
@abstractmethod
|
|
201
|
-
def sanitize_path(self, path:
|
|
202
|
+
def sanitize_path(self, path: str | bytes) -> str:
|
|
202
203
|
"""Sanitize file path."""
|
|
203
204
|
pass
|
|
204
205
|
|
|
205
206
|
@abstractmethod
|
|
206
|
-
def is_safe_path(self, path:
|
|
207
|
+
def is_safe_path(self, path: str | bytes) -> bool:
|
|
207
208
|
"""Check if path is safe."""
|
|
208
209
|
pass
|
|
209
210
|
|
|
210
211
|
@abstractmethod
|
|
211
|
-
def is_absolute_path(self, path:
|
|
212
|
+
def is_absolute_path(self, path: str | bytes) -> bool:
|
|
212
213
|
"""Check if path is absolute."""
|
|
213
214
|
pass
|
|
214
215
|
|
|
215
216
|
@abstractmethod
|
|
216
|
-
def is_relative_path(self, path:
|
|
217
|
+
def is_relative_path(self, path: str | bytes) -> bool:
|
|
217
218
|
"""Check if path is relative."""
|
|
218
219
|
pass
|
|
219
220
|
|
|
220
221
|
@abstractmethod
|
|
221
|
-
def contains_path_traversal(self, path:
|
|
222
|
+
def contains_path_traversal(self, path: str | bytes) -> bool:
|
|
222
223
|
"""Check if path contains traversal sequences."""
|
|
223
224
|
pass
|
|
224
225
|
|
|
225
226
|
@abstractmethod
|
|
226
|
-
def normalize_path(self, path:
|
|
227
|
+
def normalize_path(self, path: str | bytes) -> str:
|
|
227
228
|
"""Normalize file path."""
|
|
228
229
|
pass
|
|
229
230
|
|
|
@@ -398,6 +399,102 @@ class AUserInfo:
|
|
|
398
399
|
attributes: dict[str, Any] = field(default_factory=dict)
|
|
399
400
|
|
|
400
401
|
|
|
402
|
+
class ASecurityMonitorBase(ABC):
|
|
403
|
+
"""Abstract base class for security monitoring."""
|
|
404
|
+
|
|
405
|
+
def __init__(self):
|
|
406
|
+
"""Initialize security monitor."""
|
|
407
|
+
pass
|
|
408
|
+
|
|
409
|
+
@abstractmethod
|
|
410
|
+
def detect_intrusion(self, event_data: dict[str, Any]) -> bool:
|
|
411
|
+
"""Detect intrusion attempts."""
|
|
412
|
+
pass
|
|
413
|
+
|
|
414
|
+
@abstractmethod
|
|
415
|
+
def monitor_failed_logins(self, user: str, max_attempts: int = 5) -> bool:
|
|
416
|
+
"""Monitor failed login attempts."""
|
|
417
|
+
pass
|
|
418
|
+
|
|
419
|
+
@abstractmethod
|
|
420
|
+
def detect_anomaly(self, behavior_data: dict[str, Any]) -> bool:
|
|
421
|
+
"""Detect anomalous behavior."""
|
|
422
|
+
pass
|
|
423
|
+
|
|
424
|
+
@abstractmethod
|
|
425
|
+
def get_security_alerts(self) -> list[dict[str, Any]]:
|
|
426
|
+
"""Get security alerts."""
|
|
427
|
+
pass
|
|
428
|
+
|
|
429
|
+
@abstractmethod
|
|
430
|
+
def clear_security_alerts(self) -> None:
|
|
431
|
+
"""Clear security alerts."""
|
|
432
|
+
pass
|
|
433
|
+
|
|
434
|
+
@abstractmethod
|
|
435
|
+
def get_threat_level(self) -> SecurityLevel:
|
|
436
|
+
"""Get current threat level."""
|
|
437
|
+
pass
|
|
438
|
+
|
|
439
|
+
@abstractmethod
|
|
440
|
+
def set_threat_level(self, level: SecurityLevel) -> None:
|
|
441
|
+
"""Set threat level."""
|
|
442
|
+
pass
|
|
443
|
+
|
|
444
|
+
@abstractmethod
|
|
445
|
+
def get_security_metrics(self) -> dict[str, Any]:
|
|
446
|
+
"""Get security metrics."""
|
|
447
|
+
pass
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
class ASecurityPolicyBase(ABC):
|
|
451
|
+
"""Abstract base class for security policies."""
|
|
452
|
+
|
|
453
|
+
def __init__(self):
|
|
454
|
+
"""Initialize security policy manager."""
|
|
455
|
+
self._policies: dict[str, dict[str, Any]] = {}
|
|
456
|
+
|
|
457
|
+
@abstractmethod
|
|
458
|
+
def get_policy(self, policy_name: str) -> dict[str, Any]:
|
|
459
|
+
"""Get security policy."""
|
|
460
|
+
pass
|
|
461
|
+
|
|
462
|
+
@abstractmethod
|
|
463
|
+
def set_policy(self, policy_name: str, policy: dict[str, Any]) -> None:
|
|
464
|
+
"""Set security policy."""
|
|
465
|
+
pass
|
|
466
|
+
|
|
467
|
+
@abstractmethod
|
|
468
|
+
def validate_policy(self, policy: dict[str, Any]) -> tuple[bool, list[str]]:
|
|
469
|
+
"""Validate security policy."""
|
|
470
|
+
pass
|
|
471
|
+
|
|
472
|
+
@abstractmethod
|
|
473
|
+
def apply_policy(self, policy_name: str, context: dict[str, Any]) -> bool:
|
|
474
|
+
"""Apply security policy."""
|
|
475
|
+
pass
|
|
476
|
+
|
|
477
|
+
@abstractmethod
|
|
478
|
+
def list_policies(self) -> list[str]:
|
|
479
|
+
"""List all security policies."""
|
|
480
|
+
pass
|
|
481
|
+
|
|
482
|
+
@abstractmethod
|
|
483
|
+
def remove_policy(self, policy_name: str) -> bool:
|
|
484
|
+
"""Remove security policy."""
|
|
485
|
+
pass
|
|
486
|
+
|
|
487
|
+
@abstractmethod
|
|
488
|
+
def get_policy_violations(self) -> list[dict[str, Any]]:
|
|
489
|
+
"""Get policy violations."""
|
|
490
|
+
pass
|
|
491
|
+
|
|
492
|
+
@abstractmethod
|
|
493
|
+
def clear_policy_violations(self) -> None:
|
|
494
|
+
"""Clear policy violations."""
|
|
495
|
+
pass
|
|
496
|
+
|
|
497
|
+
|
|
401
498
|
class AAuthProvider(ABC):
|
|
402
499
|
"""Abstract base class for authentication providers."""
|
|
403
500
|
|