exonware-xwsystem 0.1.0.1__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.
Files changed (341) hide show
  1. exonware/__init__.py +2 -1
  2. exonware/conf.py +2 -2
  3. exonware/xwsystem/__init__.py +115 -43
  4. exonware/xwsystem/base.py +30 -0
  5. exonware/xwsystem/caching/__init__.py +39 -13
  6. exonware/xwsystem/caching/base.py +24 -6
  7. exonware/xwsystem/caching/bloom_cache.py +2 -2
  8. exonware/xwsystem/caching/cache_manager.py +2 -1
  9. exonware/xwsystem/caching/conditional.py +2 -2
  10. exonware/xwsystem/caching/contracts.py +85 -139
  11. exonware/xwsystem/caching/decorators.py +6 -19
  12. exonware/xwsystem/caching/defs.py +2 -1
  13. exonware/xwsystem/caching/disk_cache.py +2 -1
  14. exonware/xwsystem/caching/distributed.py +2 -1
  15. exonware/xwsystem/caching/errors.py +2 -1
  16. exonware/xwsystem/caching/events.py +110 -27
  17. exonware/xwsystem/caching/eviction_strategies.py +2 -2
  18. exonware/xwsystem/caching/external_caching_python.py +701 -0
  19. exonware/xwsystem/caching/facade.py +253 -0
  20. exonware/xwsystem/caching/factory.py +300 -0
  21. exonware/xwsystem/caching/fluent.py +14 -12
  22. exonware/xwsystem/caching/integrity.py +21 -6
  23. exonware/xwsystem/caching/lfu_cache.py +2 -1
  24. exonware/xwsystem/caching/lfu_optimized.py +18 -6
  25. exonware/xwsystem/caching/lru_cache.py +7 -4
  26. exonware/xwsystem/caching/memory_bounded.py +2 -2
  27. exonware/xwsystem/caching/metrics_exporter.py +2 -2
  28. exonware/xwsystem/caching/observable_cache.py +2 -2
  29. exonware/xwsystem/caching/pluggable_cache.py +2 -2
  30. exonware/xwsystem/caching/rate_limiter.py +2 -2
  31. exonware/xwsystem/caching/read_through.py +2 -2
  32. exonware/xwsystem/caching/secure_cache.py +81 -28
  33. exonware/xwsystem/caching/serializable.py +9 -7
  34. exonware/xwsystem/caching/stats.py +2 -2
  35. exonware/xwsystem/caching/tagging.py +2 -2
  36. exonware/xwsystem/caching/ttl_cache.py +4 -3
  37. exonware/xwsystem/caching/two_tier_cache.py +6 -3
  38. exonware/xwsystem/caching/utils.py +30 -12
  39. exonware/xwsystem/caching/validation.py +2 -2
  40. exonware/xwsystem/caching/warming.py +6 -3
  41. exonware/xwsystem/caching/write_behind.py +15 -6
  42. exonware/xwsystem/config/__init__.py +11 -17
  43. exonware/xwsystem/config/base.py +5 -5
  44. exonware/xwsystem/config/contracts.py +93 -153
  45. exonware/xwsystem/config/defaults.py +3 -2
  46. exonware/xwsystem/config/defs.py +3 -2
  47. exonware/xwsystem/config/errors.py +2 -5
  48. exonware/xwsystem/config/logging.py +12 -8
  49. exonware/xwsystem/config/logging_setup.py +3 -2
  50. exonware/xwsystem/config/performance.py +1 -46
  51. exonware/xwsystem/config/performance_modes.py +9 -8
  52. exonware/xwsystem/config/version_manager.py +1 -0
  53. exonware/xwsystem/config.py +27 -0
  54. exonware/xwsystem/console/__init__.py +53 -0
  55. exonware/xwsystem/console/base.py +133 -0
  56. exonware/xwsystem/console/cli/__init__.py +61 -0
  57. exonware/xwsystem/{cli → console/cli}/args.py +27 -24
  58. exonware/xwsystem/{cli → console/cli}/base.py +18 -87
  59. exonware/xwsystem/{cli → console/cli}/colors.py +15 -13
  60. exonware/xwsystem/console/cli/console.py +98 -0
  61. exonware/xwsystem/{cli → console/cli}/contracts.py +51 -69
  62. exonware/xwsystem/console/cli/defs.py +87 -0
  63. exonware/xwsystem/console/cli/encoding.py +69 -0
  64. exonware/xwsystem/{cli → console/cli}/errors.py +8 -3
  65. exonware/xwsystem/console/cli/event_logger.py +166 -0
  66. exonware/xwsystem/{cli → console/cli}/progress.py +25 -21
  67. exonware/xwsystem/{cli → console/cli}/prompts.py +3 -2
  68. exonware/xwsystem/{cli → console/cli}/tables.py +27 -24
  69. exonware/xwsystem/console/contracts.py +113 -0
  70. exonware/xwsystem/console/defs.py +154 -0
  71. exonware/xwsystem/console/errors.py +34 -0
  72. exonware/xwsystem/console/event_logger.py +385 -0
  73. exonware/xwsystem/console/writer.py +132 -0
  74. exonware/xwsystem/contracts.py +28 -0
  75. exonware/xwsystem/data_structures/__init__.py +23 -0
  76. exonware/xwsystem/data_structures/trie.py +34 -0
  77. exonware/xwsystem/data_structures/union_find.py +144 -0
  78. exonware/xwsystem/defs.py +17 -0
  79. exonware/xwsystem/errors.py +23 -0
  80. exonware/xwsystem/facade.py +62 -0
  81. exonware/xwsystem/http_client/__init__.py +22 -1
  82. exonware/xwsystem/http_client/advanced_client.py +8 -5
  83. exonware/xwsystem/http_client/base.py +3 -2
  84. exonware/xwsystem/http_client/client.py +7 -4
  85. exonware/xwsystem/http_client/contracts.py +42 -56
  86. exonware/xwsystem/http_client/defs.py +2 -1
  87. exonware/xwsystem/http_client/errors.py +2 -1
  88. exonware/xwsystem/http_client/facade.py +156 -0
  89. exonware/xwsystem/io/__init__.py +22 -3
  90. exonware/xwsystem/io/archive/__init__.py +8 -2
  91. exonware/xwsystem/io/archive/archive.py +1 -1
  92. exonware/xwsystem/io/archive/archive_files.py +4 -7
  93. exonware/xwsystem/io/archive/archivers.py +120 -10
  94. exonware/xwsystem/io/archive/base.py +4 -5
  95. exonware/xwsystem/io/archive/codec_integration.py +1 -2
  96. exonware/xwsystem/io/archive/compression.py +1 -2
  97. exonware/xwsystem/io/archive/facade.py +263 -0
  98. exonware/xwsystem/io/archive/formats/__init__.py +2 -3
  99. exonware/xwsystem/io/archive/formats/brotli_format.py +20 -7
  100. exonware/xwsystem/io/archive/formats/lz4_format.py +20 -7
  101. exonware/xwsystem/io/archive/formats/rar.py +11 -5
  102. exonware/xwsystem/io/archive/formats/sevenzip.py +12 -6
  103. exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -2
  104. exonware/xwsystem/io/archive/formats/tar.py +52 -7
  105. exonware/xwsystem/io/archive/formats/wim_format.py +11 -5
  106. exonware/xwsystem/io/archive/formats/zip.py +1 -2
  107. exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -2
  108. exonware/xwsystem/io/archive/formats/zstandard.py +20 -7
  109. exonware/xwsystem/io/base.py +119 -115
  110. exonware/xwsystem/io/codec/__init__.py +4 -2
  111. exonware/xwsystem/io/codec/base.py +19 -13
  112. exonware/xwsystem/io/codec/contracts.py +59 -2
  113. exonware/xwsystem/io/codec/registry.py +67 -21
  114. exonware/xwsystem/io/common/__init__.py +1 -1
  115. exonware/xwsystem/io/common/atomic.py +29 -16
  116. exonware/xwsystem/io/common/base.py +11 -10
  117. exonware/xwsystem/io/common/lock.py +6 -5
  118. exonware/xwsystem/io/common/path_manager.py +2 -1
  119. exonware/xwsystem/io/common/watcher.py +1 -2
  120. exonware/xwsystem/io/contracts.py +301 -433
  121. exonware/xwsystem/io/contracts_1.py +1180 -0
  122. exonware/xwsystem/io/data_operations.py +19 -20
  123. exonware/xwsystem/io/defs.py +4 -3
  124. exonware/xwsystem/io/errors.py +3 -2
  125. exonware/xwsystem/io/facade.py +87 -61
  126. exonware/xwsystem/io/file/__init__.py +1 -1
  127. exonware/xwsystem/io/file/base.py +8 -9
  128. exonware/xwsystem/io/file/conversion.py +2 -3
  129. exonware/xwsystem/io/file/file.py +61 -18
  130. exonware/xwsystem/io/file/paged_source.py +8 -8
  131. exonware/xwsystem/io/file/paging/__init__.py +1 -2
  132. exonware/xwsystem/io/file/paging/byte_paging.py +4 -5
  133. exonware/xwsystem/io/file/paging/line_paging.py +2 -3
  134. exonware/xwsystem/io/file/paging/record_paging.py +2 -3
  135. exonware/xwsystem/io/file/paging/registry.py +1 -2
  136. exonware/xwsystem/io/file/source.py +13 -17
  137. exonware/xwsystem/io/filesystem/__init__.py +1 -1
  138. exonware/xwsystem/io/filesystem/base.py +1 -2
  139. exonware/xwsystem/io/filesystem/local.py +3 -4
  140. exonware/xwsystem/io/folder/__init__.py +1 -1
  141. exonware/xwsystem/io/folder/base.py +1 -2
  142. exonware/xwsystem/io/folder/folder.py +16 -7
  143. exonware/xwsystem/io/indexing/__init__.py +14 -0
  144. exonware/xwsystem/io/indexing/facade.py +443 -0
  145. exonware/xwsystem/io/path_parser.py +98 -0
  146. exonware/xwsystem/io/serialization/__init__.py +21 -3
  147. exonware/xwsystem/io/serialization/auto_serializer.py +146 -20
  148. exonware/xwsystem/io/serialization/base.py +84 -34
  149. exonware/xwsystem/io/serialization/contracts.py +50 -73
  150. exonware/xwsystem/io/serialization/defs.py +2 -1
  151. exonware/xwsystem/io/serialization/errors.py +2 -1
  152. exonware/xwsystem/io/serialization/flyweight.py +154 -7
  153. exonware/xwsystem/io/serialization/format_detector.py +15 -14
  154. exonware/xwsystem/io/serialization/formats/__init__.py +8 -5
  155. exonware/xwsystem/io/serialization/formats/binary/bson.py +15 -6
  156. exonware/xwsystem/io/serialization/formats/binary/cbor.py +5 -5
  157. exonware/xwsystem/io/serialization/formats/binary/marshal.py +5 -5
  158. exonware/xwsystem/io/serialization/formats/binary/msgpack.py +5 -5
  159. exonware/xwsystem/io/serialization/formats/binary/pickle.py +5 -5
  160. exonware/xwsystem/io/serialization/formats/binary/plistlib.py +5 -5
  161. exonware/xwsystem/io/serialization/formats/database/dbm.py +7 -7
  162. exonware/xwsystem/io/serialization/formats/database/shelve.py +7 -7
  163. exonware/xwsystem/io/serialization/formats/database/sqlite3.py +7 -7
  164. exonware/xwsystem/io/serialization/formats/tabular/__init__.py +27 -0
  165. exonware/xwsystem/io/serialization/formats/tabular/base.py +89 -0
  166. exonware/xwsystem/io/serialization/formats/tabular/csv.py +319 -0
  167. exonware/xwsystem/io/serialization/formats/tabular/df.py +249 -0
  168. exonware/xwsystem/io/serialization/formats/tabular/excel.py +291 -0
  169. exonware/xwsystem/io/serialization/formats/tabular/googlesheets.py +374 -0
  170. exonware/xwsystem/io/serialization/formats/text/__init__.py +1 -1
  171. exonware/xwsystem/io/serialization/formats/text/append_only_log.py +5 -7
  172. exonware/xwsystem/io/serialization/formats/text/configparser.py +5 -5
  173. exonware/xwsystem/io/serialization/formats/text/csv.py +7 -5
  174. exonware/xwsystem/io/serialization/formats/text/formdata.py +5 -5
  175. exonware/xwsystem/io/serialization/formats/text/json.py +27 -18
  176. exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
  177. exonware/xwsystem/io/serialization/formats/text/jsonlines.py +18 -14
  178. exonware/xwsystem/io/serialization/formats/text/multipart.py +5 -5
  179. exonware/xwsystem/io/serialization/formats/text/toml.py +8 -6
  180. exonware/xwsystem/io/serialization/formats/text/xml.py +25 -20
  181. exonware/xwsystem/io/serialization/formats/text/yaml.py +8 -6
  182. exonware/xwsystem/io/serialization/parsers/__init__.py +3 -2
  183. exonware/xwsystem/io/serialization/parsers/base.py +6 -5
  184. exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +7 -6
  185. exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +10 -7
  186. exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +7 -6
  187. exonware/xwsystem/io/serialization/parsers/orjson_parser.py +11 -8
  188. exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +13 -9
  189. exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +10 -7
  190. exonware/xwsystem/io/serialization/parsers/registry.py +11 -10
  191. exonware/xwsystem/io/serialization/parsers/standard.py +7 -6
  192. exonware/xwsystem/io/serialization/parsers/ujson_parser.py +10 -7
  193. exonware/xwsystem/io/serialization/registry.py +4 -4
  194. exonware/xwsystem/io/serialization/serializer.py +168 -79
  195. exonware/xwsystem/io/serialization/universal_options.py +367 -0
  196. exonware/xwsystem/io/serialization/utils/__init__.py +1 -2
  197. exonware/xwsystem/io/serialization/utils/path_ops.py +5 -6
  198. exonware/xwsystem/io/source_reader.py +223 -0
  199. exonware/xwsystem/io/stream/__init__.py +1 -1
  200. exonware/xwsystem/io/stream/async_operations.py +61 -14
  201. exonware/xwsystem/io/stream/base.py +1 -2
  202. exonware/xwsystem/io/stream/codec_io.py +6 -7
  203. exonware/xwsystem/ipc/__init__.py +1 -0
  204. exonware/xwsystem/ipc/async_fabric.py +4 -4
  205. exonware/xwsystem/ipc/base.py +6 -5
  206. exonware/xwsystem/ipc/contracts.py +41 -66
  207. exonware/xwsystem/ipc/defs.py +2 -1
  208. exonware/xwsystem/ipc/errors.py +2 -1
  209. exonware/xwsystem/ipc/message_queue.py +5 -2
  210. exonware/xwsystem/ipc/pipes.py +70 -34
  211. exonware/xwsystem/ipc/process_manager.py +7 -5
  212. exonware/xwsystem/ipc/process_pool.py +6 -5
  213. exonware/xwsystem/ipc/shared_memory.py +64 -11
  214. exonware/xwsystem/monitoring/__init__.py +7 -0
  215. exonware/xwsystem/monitoring/base.py +11 -8
  216. exonware/xwsystem/monitoring/contracts.py +86 -144
  217. exonware/xwsystem/monitoring/defs.py +2 -1
  218. exonware/xwsystem/monitoring/error_recovery.py +16 -3
  219. exonware/xwsystem/monitoring/errors.py +2 -1
  220. exonware/xwsystem/monitoring/facade.py +183 -0
  221. exonware/xwsystem/monitoring/memory_monitor.py +1 -0
  222. exonware/xwsystem/monitoring/metrics.py +1 -0
  223. exonware/xwsystem/monitoring/performance_manager_generic.py +7 -7
  224. exonware/xwsystem/monitoring/performance_monitor.py +1 -0
  225. exonware/xwsystem/monitoring/performance_validator.py +1 -0
  226. exonware/xwsystem/monitoring/system_monitor.py +6 -5
  227. exonware/xwsystem/monitoring/tracing.py +18 -16
  228. exonware/xwsystem/monitoring/tracker.py +2 -1
  229. exonware/xwsystem/operations/__init__.py +5 -50
  230. exonware/xwsystem/operations/base.py +3 -44
  231. exonware/xwsystem/operations/contracts.py +25 -15
  232. exonware/xwsystem/operations/defs.py +1 -1
  233. exonware/xwsystem/operations/diff.py +5 -4
  234. exonware/xwsystem/operations/errors.py +1 -1
  235. exonware/xwsystem/operations/merge.py +6 -4
  236. exonware/xwsystem/operations/patch.py +5 -4
  237. exonware/xwsystem/patterns/__init__.py +1 -0
  238. exonware/xwsystem/patterns/base.py +2 -1
  239. exonware/xwsystem/patterns/context_manager.py +2 -1
  240. exonware/xwsystem/patterns/contracts.py +215 -256
  241. exonware/xwsystem/patterns/defs.py +2 -1
  242. exonware/xwsystem/patterns/dynamic_facade.py +1 -0
  243. exonware/xwsystem/patterns/errors.py +2 -4
  244. exonware/xwsystem/patterns/handler_factory.py +2 -3
  245. exonware/xwsystem/patterns/import_registry.py +1 -0
  246. exonware/xwsystem/patterns/object_pool.py +1 -0
  247. exonware/xwsystem/patterns/registry.py +4 -43
  248. exonware/xwsystem/plugins/__init__.py +2 -1
  249. exonware/xwsystem/plugins/base.py +6 -5
  250. exonware/xwsystem/plugins/contracts.py +94 -158
  251. exonware/xwsystem/plugins/defs.py +2 -1
  252. exonware/xwsystem/plugins/errors.py +2 -1
  253. exonware/xwsystem/py.typed +3 -0
  254. exonware/xwsystem/query/__init__.py +36 -0
  255. exonware/xwsystem/query/contracts.py +56 -0
  256. exonware/xwsystem/query/errors.py +22 -0
  257. exonware/xwsystem/query/registry.py +128 -0
  258. exonware/xwsystem/runtime/__init__.py +2 -1
  259. exonware/xwsystem/runtime/base.py +4 -3
  260. exonware/xwsystem/runtime/contracts.py +39 -60
  261. exonware/xwsystem/runtime/defs.py +2 -1
  262. exonware/xwsystem/runtime/env.py +11 -9
  263. exonware/xwsystem/runtime/errors.py +2 -1
  264. exonware/xwsystem/runtime/reflection.py +3 -2
  265. exonware/xwsystem/security/__init__.py +68 -11
  266. exonware/xwsystem/security/audit.py +167 -0
  267. exonware/xwsystem/security/base.py +121 -24
  268. exonware/xwsystem/security/contracts.py +91 -146
  269. exonware/xwsystem/security/crypto.py +17 -16
  270. exonware/xwsystem/security/defs.py +2 -1
  271. exonware/xwsystem/security/errors.py +2 -1
  272. exonware/xwsystem/security/facade.py +321 -0
  273. exonware/xwsystem/security/file_security.py +330 -0
  274. exonware/xwsystem/security/hazmat.py +11 -8
  275. exonware/xwsystem/security/monitor.py +372 -0
  276. exonware/xwsystem/security/path_validator.py +140 -18
  277. exonware/xwsystem/security/policy.py +357 -0
  278. exonware/xwsystem/security/resource_limits.py +1 -0
  279. exonware/xwsystem/security/validator.py +455 -0
  280. exonware/xwsystem/shared/__init__.py +14 -1
  281. exonware/xwsystem/shared/base.py +285 -2
  282. exonware/xwsystem/shared/contracts.py +415 -126
  283. exonware/xwsystem/shared/defs.py +2 -1
  284. exonware/xwsystem/shared/errors.py +2 -2
  285. exonware/xwsystem/shared/xwobject.py +316 -0
  286. exonware/xwsystem/structures/__init__.py +1 -0
  287. exonware/xwsystem/structures/base.py +3 -2
  288. exonware/xwsystem/structures/circular_detector.py +15 -14
  289. exonware/xwsystem/structures/contracts.py +53 -76
  290. exonware/xwsystem/structures/defs.py +2 -1
  291. exonware/xwsystem/structures/errors.py +2 -1
  292. exonware/xwsystem/structures/tree_walker.py +2 -1
  293. exonware/xwsystem/threading/__init__.py +21 -4
  294. exonware/xwsystem/threading/async_primitives.py +6 -5
  295. exonware/xwsystem/threading/base.py +3 -2
  296. exonware/xwsystem/threading/contracts.py +87 -143
  297. exonware/xwsystem/threading/defs.py +2 -1
  298. exonware/xwsystem/threading/errors.py +2 -1
  299. exonware/xwsystem/threading/facade.py +175 -0
  300. exonware/xwsystem/threading/locks.py +1 -0
  301. exonware/xwsystem/threading/safe_factory.py +1 -0
  302. exonware/xwsystem/utils/__init__.py +40 -0
  303. exonware/xwsystem/utils/base.py +22 -21
  304. exonware/xwsystem/utils/contracts.py +50 -73
  305. exonware/xwsystem/utils/dt/__init__.py +19 -3
  306. exonware/xwsystem/utils/dt/base.py +5 -4
  307. exonware/xwsystem/utils/dt/contracts.py +22 -29
  308. exonware/xwsystem/utils/dt/defs.py +2 -1
  309. exonware/xwsystem/utils/dt/errors.py +2 -5
  310. exonware/xwsystem/utils/dt/formatting.py +88 -2
  311. exonware/xwsystem/utils/dt/humanize.py +10 -9
  312. exonware/xwsystem/utils/dt/parsing.py +56 -5
  313. exonware/xwsystem/utils/dt/timezone_utils.py +2 -24
  314. exonware/xwsystem/utils/errors.py +2 -4
  315. exonware/xwsystem/utils/paths.py +1 -0
  316. exonware/xwsystem/utils/string.py +49 -0
  317. exonware/xwsystem/utils/test_runner.py +185 -0
  318. exonware/xwsystem/utils/utils_contracts.py +2 -1
  319. exonware/xwsystem/utils/web.py +110 -0
  320. exonware/xwsystem/validation/__init__.py +25 -1
  321. exonware/xwsystem/validation/base.py +6 -5
  322. exonware/xwsystem/validation/contracts.py +29 -41
  323. exonware/xwsystem/validation/data_validator.py +1 -0
  324. exonware/xwsystem/validation/declarative.py +11 -8
  325. exonware/xwsystem/validation/defs.py +2 -1
  326. exonware/xwsystem/validation/errors.py +2 -1
  327. exonware/xwsystem/validation/facade.py +198 -0
  328. exonware/xwsystem/validation/fluent_validator.py +22 -19
  329. exonware/xwsystem/validation/schema_discovery.py +210 -0
  330. exonware/xwsystem/validation/type_safety.py +2 -1
  331. exonware/xwsystem/version.py +2 -2
  332. {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/METADATA +71 -4
  333. exonware_xwsystem-0.1.0.3.dist-info/RECORD +337 -0
  334. exonware/xwsystem/cli/__init__.py +0 -43
  335. exonware/xwsystem/cli/console.py +0 -113
  336. exonware/xwsystem/cli/defs.py +0 -134
  337. exonware/xwsystem/conf.py +0 -44
  338. exonware/xwsystem/security/auth.py +0 -484
  339. exonware_xwsystem-0.1.0.1.dist-info/RECORD +0 -284
  340. {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
  341. {exonware_xwsystem-0.1.0.1.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
- - Advanced authentication (OAuth2, JWT, SAML)
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 .auth import (
18
- OAuth2Provider,
19
- JWTProvider,
20
- SAMLProvider,
21
- EnterpriseAuth,
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
- # Authentication
47
- "OAuth2Provider",
48
- "JWTProvider",
49
- "SAMLProvider",
50
- "EnterpriseAuth",
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.1.0.1
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, Union
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: Union[HashAlgorithm, EncryptionAlgorithm]):
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: Union[str, bytes]) -> bytes:
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) -> Union[str, 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: Union[str, bytes]) -> str:
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: Union[str, bytes], hash_value: str) -> bool:
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: Union[str, bytes]) -> bytes:
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: Union[str, bytes], signature: bytes) -> bool:
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: Union[str, bytes], salt: Optional[bytes] = None) -> str:
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: Union[str, bytes]) -> str:
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: Union[str, bytes], hash_value: str, salt: Optional[bytes] = None) -> bool:
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: Union[str, bytes]) -> tuple[str, bytes]:
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: Union[str, bytes], key: Optional[bytes] = None, iv: Optional[bytes] = None) -> bytes:
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) -> Union[str, bytes]:
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: Union[str, bytes], output_path: Union[str, bytes]) -> bool:
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: Union[str, bytes], output_path: Union[str, bytes]) -> bool:
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: Union[str, bytes]) -> bool:
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: Union[str, bytes]) -> str:
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: Union[str, bytes]) -> bool:
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: Union[str, bytes]) -> bool:
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: Union[str, bytes]) -> bool:
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: Union[str, bytes]) -> bool:
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: Union[str, bytes]) -> str:
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