raxe 0.4.6__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.
- raxe/__init__.py +101 -0
- raxe/application/__init__.py +48 -0
- raxe/application/ab_testing.py +170 -0
- raxe/application/analytics/__init__.py +30 -0
- raxe/application/analytics/achievement_service.py +444 -0
- raxe/application/analytics/repositories.py +172 -0
- raxe/application/analytics/retention_service.py +267 -0
- raxe/application/analytics/statistics_service.py +419 -0
- raxe/application/analytics/streak_service.py +283 -0
- raxe/application/apply_policy.py +291 -0
- raxe/application/eager_l2.py +503 -0
- raxe/application/preloader.py +353 -0
- raxe/application/scan_merger.py +321 -0
- raxe/application/scan_pipeline.py +1059 -0
- raxe/application/scan_pipeline_async.py +403 -0
- raxe/application/session_tracker.py +458 -0
- raxe/application/telemetry_manager.py +357 -0
- raxe/application/telemetry_orchestrator.py +1210 -0
- raxe/async_sdk/__init__.py +34 -0
- raxe/async_sdk/cache.py +286 -0
- raxe/async_sdk/client.py +556 -0
- raxe/async_sdk/wrappers/__init__.py +23 -0
- raxe/async_sdk/wrappers/openai.py +238 -0
- raxe/cli/__init__.py +21 -0
- raxe/cli/auth.py +1047 -0
- raxe/cli/branding.py +235 -0
- raxe/cli/config.py +334 -0
- raxe/cli/custom_rules.py +458 -0
- raxe/cli/doctor.py +686 -0
- raxe/cli/error_handler.py +665 -0
- raxe/cli/event.py +648 -0
- raxe/cli/exit_codes.py +57 -0
- raxe/cli/expiry_warning.py +302 -0
- raxe/cli/export.py +183 -0
- raxe/cli/history.py +247 -0
- raxe/cli/l2_formatter.py +872 -0
- raxe/cli/main.py +1137 -0
- raxe/cli/models.py +590 -0
- raxe/cli/output.py +403 -0
- raxe/cli/privacy.py +84 -0
- raxe/cli/profiler.py +262 -0
- raxe/cli/progress.py +379 -0
- raxe/cli/progress_context.py +101 -0
- raxe/cli/repl.py +394 -0
- raxe/cli/rules.py +542 -0
- raxe/cli/setup_wizard.py +721 -0
- raxe/cli/stats.py +292 -0
- raxe/cli/suppress.py +501 -0
- raxe/cli/telemetry.py +1384 -0
- raxe/cli/test.py +130 -0
- raxe/cli/tune.py +315 -0
- raxe/cli/validate.py +218 -0
- raxe/domain/__init__.py +30 -0
- raxe/domain/analytics/__init__.py +97 -0
- raxe/domain/analytics/achievements.py +306 -0
- raxe/domain/analytics/models.py +120 -0
- raxe/domain/analytics/retention.py +168 -0
- raxe/domain/analytics/statistics.py +207 -0
- raxe/domain/analytics/streaks.py +173 -0
- raxe/domain/engine/__init__.py +15 -0
- raxe/domain/engine/executor.py +396 -0
- raxe/domain/engine/matcher.py +212 -0
- raxe/domain/inline_suppression.py +176 -0
- raxe/domain/ml/__init__.py +133 -0
- raxe/domain/ml/embedding_cache.py +309 -0
- raxe/domain/ml/gemma_detector.py +921 -0
- raxe/domain/ml/gemma_models.py +346 -0
- raxe/domain/ml/l2_config.py +428 -0
- raxe/domain/ml/l2_output_schema.py +443 -0
- raxe/domain/ml/manifest_loader.py +309 -0
- raxe/domain/ml/manifest_schema.py +345 -0
- raxe/domain/ml/model_metadata.py +263 -0
- raxe/domain/ml/model_registry.py +786 -0
- raxe/domain/ml/protocol.py +282 -0
- raxe/domain/ml/scoring_models.py +419 -0
- raxe/domain/ml/stub_detector.py +397 -0
- raxe/domain/ml/threat_scorer.py +757 -0
- raxe/domain/ml/tokenizer_registry.py +372 -0
- raxe/domain/ml/voting/__init__.py +89 -0
- raxe/domain/ml/voting/config.py +595 -0
- raxe/domain/ml/voting/engine.py +465 -0
- raxe/domain/ml/voting/head_voters.py +378 -0
- raxe/domain/ml/voting/models.py +222 -0
- raxe/domain/models.py +82 -0
- raxe/domain/packs/__init__.py +17 -0
- raxe/domain/packs/models.py +304 -0
- raxe/domain/policies/__init__.py +20 -0
- raxe/domain/policies/evaluator.py +212 -0
- raxe/domain/policies/models.py +223 -0
- raxe/domain/rules/__init__.py +32 -0
- raxe/domain/rules/custom.py +286 -0
- raxe/domain/rules/models.py +273 -0
- raxe/domain/rules/schema.py +166 -0
- raxe/domain/rules/validator.py +556 -0
- raxe/domain/suppression.py +801 -0
- raxe/domain/suppression_factory.py +174 -0
- raxe/domain/telemetry/__init__.py +116 -0
- raxe/domain/telemetry/backpressure.py +424 -0
- raxe/domain/telemetry/event_creator.py +362 -0
- raxe/domain/telemetry/events.py +1282 -0
- raxe/domain/telemetry/priority.py +263 -0
- raxe/domain/telemetry/scan_telemetry_builder.py +670 -0
- raxe/infrastructure/__init__.py +25 -0
- raxe/infrastructure/analytics/__init__.py +18 -0
- raxe/infrastructure/analytics/aggregator.py +484 -0
- raxe/infrastructure/analytics/aggregator_optimized.py +184 -0
- raxe/infrastructure/analytics/engine.py +748 -0
- raxe/infrastructure/analytics/repository.py +409 -0
- raxe/infrastructure/analytics/streaks.py +467 -0
- raxe/infrastructure/analytics/views.py +178 -0
- raxe/infrastructure/cloud/__init__.py +9 -0
- raxe/infrastructure/config/__init__.py +56 -0
- raxe/infrastructure/config/endpoints.py +641 -0
- raxe/infrastructure/config/scan_config.py +352 -0
- raxe/infrastructure/config/yaml_config.py +459 -0
- raxe/infrastructure/database/__init__.py +10 -0
- raxe/infrastructure/database/connection.py +200 -0
- raxe/infrastructure/database/models.py +325 -0
- raxe/infrastructure/database/scan_history.py +764 -0
- raxe/infrastructure/ml/__init__.py +0 -0
- raxe/infrastructure/ml/download_progress.py +438 -0
- raxe/infrastructure/ml/model_downloader.py +457 -0
- raxe/infrastructure/models/__init__.py +16 -0
- raxe/infrastructure/models/discovery.py +461 -0
- raxe/infrastructure/packs/__init__.py +13 -0
- raxe/infrastructure/packs/loader.py +407 -0
- raxe/infrastructure/packs/registry.py +381 -0
- raxe/infrastructure/policies/__init__.py +16 -0
- raxe/infrastructure/policies/api_client.py +256 -0
- raxe/infrastructure/policies/validator.py +227 -0
- raxe/infrastructure/policies/yaml_loader.py +250 -0
- raxe/infrastructure/rules/__init__.py +18 -0
- raxe/infrastructure/rules/custom_loader.py +224 -0
- raxe/infrastructure/rules/versioning.py +222 -0
- raxe/infrastructure/rules/yaml_loader.py +286 -0
- raxe/infrastructure/security/__init__.py +31 -0
- raxe/infrastructure/security/auth.py +145 -0
- raxe/infrastructure/security/policy_validator.py +124 -0
- raxe/infrastructure/security/signatures.py +171 -0
- raxe/infrastructure/suppression/__init__.py +36 -0
- raxe/infrastructure/suppression/composite_repository.py +154 -0
- raxe/infrastructure/suppression/sqlite_repository.py +231 -0
- raxe/infrastructure/suppression/yaml_composite_repository.py +156 -0
- raxe/infrastructure/suppression/yaml_repository.py +510 -0
- raxe/infrastructure/telemetry/__init__.py +79 -0
- raxe/infrastructure/telemetry/acquisition.py +179 -0
- raxe/infrastructure/telemetry/config.py +254 -0
- raxe/infrastructure/telemetry/credential_store.py +947 -0
- raxe/infrastructure/telemetry/dual_queue.py +1123 -0
- raxe/infrastructure/telemetry/flush_helper.py +343 -0
- raxe/infrastructure/telemetry/flush_scheduler.py +776 -0
- raxe/infrastructure/telemetry/health_client.py +394 -0
- raxe/infrastructure/telemetry/hook.py +347 -0
- raxe/infrastructure/telemetry/queue.py +520 -0
- raxe/infrastructure/telemetry/sender.py +476 -0
- raxe/infrastructure/tracking/__init__.py +13 -0
- raxe/infrastructure/tracking/usage.py +389 -0
- raxe/integrations/__init__.py +55 -0
- raxe/integrations/availability.py +143 -0
- raxe/integrations/registry.py +122 -0
- raxe/integrations/utils.py +135 -0
- raxe/mcp/__init__.py +62 -0
- raxe/mcp/cli.py +97 -0
- raxe/mcp/server.py +409 -0
- raxe/monitoring/__init__.py +51 -0
- raxe/monitoring/metrics.py +372 -0
- raxe/monitoring/profiler.py +388 -0
- raxe/monitoring/server.py +136 -0
- raxe/packs/core/v1.0.0/pack.yaml +1394 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-001@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-006@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-014@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-017@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-022@1.0.0.yaml +67 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-023@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-024@1.0.0.yaml +80 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-025@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-026@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-027@1.0.0.yaml +77 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-028@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-029@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-030@1.0.0.yaml +55 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-033@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-035@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-046@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-047@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-048@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-049@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-050@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-068@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-078@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2001@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2004@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-201@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-202@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-203@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3007@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3016@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3027@1.0.0.yaml +64 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3028@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3029@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3030@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3031@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3032@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3033@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-007@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-015@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-017@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-022@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-023@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-025@1.0.0.yaml +93 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-026@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-027@1.0.0.yaml +82 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-028@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-033@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-036@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-037@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-052@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-054@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-056@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-065@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-075@1.0.0.yaml +45 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-079@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1080@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1090@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1104@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1105@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1112@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-201@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-202@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-203@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-204@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-205@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-206@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-207@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-208@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-209@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-210@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-211@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-212@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-213@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-214@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-215@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-216@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-217@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-218@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-219@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-220@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-221@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-222@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-223@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-224@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-225@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-226@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-227@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-228@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-229@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-230@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-231@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-232@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-233@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-234@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-235@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-236@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-237@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-238@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-013@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-019@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-029@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-038@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-044@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-067@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-069@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-100@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-101@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-102@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-103@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-104@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-105@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-106@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-107@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-108@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-109@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-110@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-111@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-201@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-203@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3004@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3006@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3011@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-5016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6001@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-70@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-71@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-72@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-73@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-74@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-75@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-76@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-77@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-78@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-99@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-001@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-002@1.0.0.yaml +71 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-003@1.0.0.yaml +65 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-004@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-101@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-102@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-104@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-105@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-106@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-107@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-108@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-109@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-111@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-112@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-113@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-114@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-115@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-116@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-117@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-118@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-119@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-120@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-121@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-122@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-123@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-124@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-125@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-126@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-127@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-128@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-129@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-130@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-131@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-132@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-133@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-134@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-135@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-136@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-137@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-138@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-139@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-140@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-141@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-142@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-143@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-144@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-145@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-146@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-147@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-148@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-149@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-150@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-151@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-152@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-153@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-154@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-155@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-156@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-157@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-158@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-159@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-160@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-161@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-001@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-009@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-028@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-033@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-034@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-039@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-066@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-076@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-098@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-104@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-105@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-111@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-121@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-122@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-123@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-124@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-125@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-126@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-127@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-128@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-129@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-130@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-131@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-132@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-133@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-134@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-135@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-136@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-137@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-138@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-139@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-140@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-141@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-142@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-143@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-144@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-145@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-146@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-147@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-148@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-149@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-150@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-151@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-152@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-153@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-154@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-155@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-156@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-157@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-158@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-159@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-160@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-161@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-162@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-201@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-203@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-204@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-205@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-206@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-207@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-009@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-012@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-017@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-025@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-027@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-034@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-037@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-040@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-041@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-050@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-051@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-052@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-053@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-054@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-055@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-056@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-058@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2015@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2025@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2035@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2037@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2042@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3001@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3003@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3004@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3005@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3006@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3007@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3008@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3009@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3010@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3011@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3012@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3013@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3014@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3015@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3016@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3017@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3018@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3019@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3020@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3021@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3022@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3023@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3024@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3025@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3026@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3027@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3028@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3029@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3030@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3031@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3032@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3033@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3034@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3035@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3037@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3038@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3039@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3040@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3041@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3042@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3043@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3044@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3045@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3046@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3047@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3048@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3049@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3050@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3051@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3052@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3053@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3054@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3055@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3057@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3058@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3059@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3060@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3061@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3062@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3063@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3064@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3065@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3066@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3067@1.0.0.yaml +88 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3068@1.0.0.yaml +94 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3069@1.0.0.yaml +90 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3070@1.0.0.yaml +99 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3071@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3072@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3073@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3074@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3075@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3076@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3077@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3078@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3079@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3080@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3081@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3082@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3083@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3084@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3085@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-016@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-042@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-045@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-050@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-201@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3001@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3006@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3009@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3012@1.0.0.yaml +41 -0
- raxe/plugins/__init__.py +98 -0
- raxe/plugins/custom_rules.py +380 -0
- raxe/plugins/loader.py +389 -0
- raxe/plugins/manager.py +538 -0
- raxe/plugins/protocol.py +428 -0
- raxe/py.typed +0 -0
- raxe/sdk/__init__.py +77 -0
- raxe/sdk/agent_scanner.py +1918 -0
- raxe/sdk/client.py +1603 -0
- raxe/sdk/decorator.py +175 -0
- raxe/sdk/exceptions.py +859 -0
- raxe/sdk/integrations/__init__.py +277 -0
- raxe/sdk/integrations/agent_scanner.py +71 -0
- raxe/sdk/integrations/autogen.py +872 -0
- raxe/sdk/integrations/crewai.py +1368 -0
- raxe/sdk/integrations/dspy.py +845 -0
- raxe/sdk/integrations/extractors.py +363 -0
- raxe/sdk/integrations/huggingface.py +395 -0
- raxe/sdk/integrations/langchain.py +948 -0
- raxe/sdk/integrations/litellm.py +484 -0
- raxe/sdk/integrations/llamaindex.py +1049 -0
- raxe/sdk/integrations/portkey.py +831 -0
- raxe/sdk/suppression_context.py +215 -0
- raxe/sdk/wrappers/__init__.py +163 -0
- raxe/sdk/wrappers/anthropic.py +310 -0
- raxe/sdk/wrappers/openai.py +221 -0
- raxe/sdk/wrappers/vertexai.py +484 -0
- raxe/utils/__init__.py +12 -0
- raxe/utils/error_sanitizer.py +135 -0
- raxe/utils/logging.py +241 -0
- raxe/utils/performance.py +414 -0
- raxe/utils/profiler.py +339 -0
- raxe/utils/validators.py +170 -0
- raxe-0.4.6.dist-info/METADATA +471 -0
- raxe-0.4.6.dist-info/RECORD +668 -0
- raxe-0.4.6.dist-info/WHEEL +5 -0
- raxe-0.4.6.dist-info/entry_points.txt +2 -0
- raxe-0.4.6.dist-info/licenses/LICENSE +56 -0
- raxe-0.4.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
"""Rule validation logic for community submissions.
|
|
2
|
+
|
|
3
|
+
This module provides comprehensive validation for rule YAML files including:
|
|
4
|
+
- Schema validation
|
|
5
|
+
- Pattern compilation and safety checks
|
|
6
|
+
- Catastrophic backtracking detection
|
|
7
|
+
- Field completeness checks
|
|
8
|
+
- Test example validation
|
|
9
|
+
"""
|
|
10
|
+
import re
|
|
11
|
+
from dataclasses import dataclass, field
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any, ClassVar
|
|
14
|
+
from urllib.parse import urlparse
|
|
15
|
+
|
|
16
|
+
import yaml
|
|
17
|
+
from pydantic import ValidationError
|
|
18
|
+
|
|
19
|
+
from raxe.domain.rules.schema import RuleSchema
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class ValidationIssue:
|
|
24
|
+
"""A single validation issue.
|
|
25
|
+
|
|
26
|
+
Attributes:
|
|
27
|
+
severity: Issue severity (error, warning, info)
|
|
28
|
+
field: Field or pattern where issue was found
|
|
29
|
+
message: Human-readable description of the issue
|
|
30
|
+
suggestion: Optional suggestion for fixing the issue
|
|
31
|
+
"""
|
|
32
|
+
severity: str # 'error', 'warning', 'info'
|
|
33
|
+
field: str
|
|
34
|
+
message: str
|
|
35
|
+
suggestion: str = ""
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class ValidationResult:
|
|
40
|
+
"""Result of rule validation.
|
|
41
|
+
|
|
42
|
+
Attributes:
|
|
43
|
+
valid: Whether the rule passed all validations
|
|
44
|
+
issues: List of validation issues found
|
|
45
|
+
rule_id: Extracted rule ID if available
|
|
46
|
+
warnings_count: Number of warnings
|
|
47
|
+
errors_count: Number of errors
|
|
48
|
+
"""
|
|
49
|
+
valid: bool
|
|
50
|
+
issues: list[ValidationIssue] = field(default_factory=list)
|
|
51
|
+
rule_id: str | None = None
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def warnings_count(self) -> int:
|
|
55
|
+
"""Count of warning-level issues."""
|
|
56
|
+
return sum(1 for issue in self.issues if issue.severity == 'warning')
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def errors_count(self) -> int:
|
|
60
|
+
"""Count of error-level issues."""
|
|
61
|
+
return sum(1 for issue in self.issues if issue.severity == 'error')
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def has_errors(self) -> bool:
|
|
65
|
+
"""Whether there are any errors."""
|
|
66
|
+
return self.errors_count > 0
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class RuleValidator:
|
|
70
|
+
"""Validates rule files for submission.
|
|
71
|
+
|
|
72
|
+
Performs comprehensive validation including:
|
|
73
|
+
- YAML syntax validation
|
|
74
|
+
- Schema compliance checking
|
|
75
|
+
- Pattern compilation and safety
|
|
76
|
+
- Catastrophic backtracking detection
|
|
77
|
+
- Field completeness validation
|
|
78
|
+
- Test example validation
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
# Known dangerous regex patterns that can cause catastrophic backtracking
|
|
82
|
+
BACKTRACKING_PATTERNS: ClassVar[list] = [
|
|
83
|
+
(r'\(\.\*\)\+', "Nested quantifiers (.*)+"),
|
|
84
|
+
(r'\(\.\+\)\+', "Nested quantifiers (.+)+"),
|
|
85
|
+
(r'\(\.\*\)\*', "Nested quantifiers (.*)* "),
|
|
86
|
+
(r'\(\.\+\)\*', "Nested quantifiers (.+)*"),
|
|
87
|
+
(r'\([^)]*\+\)\+', "Nested quantifiers like (a+)+"),
|
|
88
|
+
(r'\([^)]*\*\)\*', "Nested quantifiers like (a*)*"),
|
|
89
|
+
(r'\([^)]*\)\+\+', "Possessive quantifier without atomic group"),
|
|
90
|
+
(r'\([^)]*\{[^}]*,[^}]*\}\)\+', "Nested quantified groups"),
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
# Minimum requirements for explainability
|
|
94
|
+
MIN_RISK_EXPLANATION_LENGTH = 20
|
|
95
|
+
MIN_REMEDIATION_LENGTH = 20
|
|
96
|
+
MIN_EXAMPLES_SHOULD_MATCH = 5
|
|
97
|
+
MIN_EXAMPLES_SHOULD_NOT_MATCH = 5
|
|
98
|
+
|
|
99
|
+
def __init__(self) -> None:
|
|
100
|
+
"""Initialize the rule validator."""
|
|
101
|
+
pass
|
|
102
|
+
|
|
103
|
+
def validate_file(self, file_path: str | Path) -> ValidationResult:
|
|
104
|
+
"""Validate a rule file.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
file_path: Path to the rule YAML file
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
ValidationResult with all validation issues
|
|
111
|
+
"""
|
|
112
|
+
file_path = Path(file_path)
|
|
113
|
+
result = ValidationResult(valid=True)
|
|
114
|
+
|
|
115
|
+
# Check file exists
|
|
116
|
+
if not file_path.exists():
|
|
117
|
+
result.valid = False
|
|
118
|
+
result.issues.append(ValidationIssue(
|
|
119
|
+
severity='error',
|
|
120
|
+
field='file',
|
|
121
|
+
message=f"File not found: {file_path}",
|
|
122
|
+
suggestion="Check the file path and ensure the file exists"
|
|
123
|
+
))
|
|
124
|
+
return result
|
|
125
|
+
|
|
126
|
+
# Check file extension
|
|
127
|
+
if file_path.suffix not in ['.yaml', '.yml']:
|
|
128
|
+
result.issues.append(ValidationIssue(
|
|
129
|
+
severity='warning',
|
|
130
|
+
field='file',
|
|
131
|
+
message=f"File has extension '{file_path.suffix}', expected .yaml or .yml",
|
|
132
|
+
suggestion="Rename file to use .yaml or .yml extension"
|
|
133
|
+
))
|
|
134
|
+
|
|
135
|
+
# Load YAML
|
|
136
|
+
try:
|
|
137
|
+
with open(file_path, encoding='utf-8') as f:
|
|
138
|
+
rule_data = yaml.safe_load(f)
|
|
139
|
+
except yaml.YAMLError as e:
|
|
140
|
+
result.valid = False
|
|
141
|
+
result.issues.append(ValidationIssue(
|
|
142
|
+
severity='error',
|
|
143
|
+
field='yaml',
|
|
144
|
+
message=f"Invalid YAML syntax: {e}",
|
|
145
|
+
suggestion="Fix YAML syntax errors. Check indentation and special characters."
|
|
146
|
+
))
|
|
147
|
+
return result
|
|
148
|
+
except Exception as e:
|
|
149
|
+
result.valid = False
|
|
150
|
+
result.issues.append(ValidationIssue(
|
|
151
|
+
severity='error',
|
|
152
|
+
field='file',
|
|
153
|
+
message=f"Failed to read file: {e}",
|
|
154
|
+
suggestion="Ensure file is readable and contains valid UTF-8 text"
|
|
155
|
+
))
|
|
156
|
+
return result
|
|
157
|
+
|
|
158
|
+
# Validate against schema
|
|
159
|
+
try:
|
|
160
|
+
rule_schema = RuleSchema(**rule_data)
|
|
161
|
+
result.rule_id = rule_schema.rule_id
|
|
162
|
+
except ValidationError as e:
|
|
163
|
+
result.valid = False
|
|
164
|
+
for error in e.errors():
|
|
165
|
+
field_path = '.'.join(str(loc) for loc in error['loc'])
|
|
166
|
+
result.issues.append(ValidationIssue(
|
|
167
|
+
severity='error',
|
|
168
|
+
field=field_path,
|
|
169
|
+
message=error['msg'],
|
|
170
|
+
suggestion=self._get_schema_error_suggestion(error)
|
|
171
|
+
))
|
|
172
|
+
# If schema validation fails, we can't continue with other checks
|
|
173
|
+
return result
|
|
174
|
+
except Exception as e:
|
|
175
|
+
result.valid = False
|
|
176
|
+
result.issues.append(ValidationIssue(
|
|
177
|
+
severity='error',
|
|
178
|
+
field='schema',
|
|
179
|
+
message=f"Schema validation failed: {e}",
|
|
180
|
+
suggestion="Check that all required fields are present and have correct types"
|
|
181
|
+
))
|
|
182
|
+
return result
|
|
183
|
+
|
|
184
|
+
# Additional validation checks
|
|
185
|
+
self._validate_patterns(rule_schema, result)
|
|
186
|
+
self._validate_examples(rule_schema, result)
|
|
187
|
+
self._validate_explainability(rule_schema, result)
|
|
188
|
+
self._validate_metadata(rule_schema, result)
|
|
189
|
+
self._check_best_practices(rule_schema, result)
|
|
190
|
+
|
|
191
|
+
# Update valid flag based on errors
|
|
192
|
+
result.valid = not result.has_errors
|
|
193
|
+
|
|
194
|
+
return result
|
|
195
|
+
|
|
196
|
+
def _validate_patterns(self, rule_schema: RuleSchema, result: ValidationResult) -> None:
|
|
197
|
+
"""Validate regex patterns.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
rule_schema: Validated rule schema
|
|
201
|
+
result: ValidationResult to append issues to
|
|
202
|
+
"""
|
|
203
|
+
for i, pattern_schema in enumerate(rule_schema.patterns):
|
|
204
|
+
pattern_str = pattern_schema.pattern
|
|
205
|
+
|
|
206
|
+
# Check pattern compiles
|
|
207
|
+
try:
|
|
208
|
+
# Convert flags
|
|
209
|
+
flags = 0
|
|
210
|
+
for flag_name in pattern_schema.flags:
|
|
211
|
+
flag_upper = flag_name.upper()
|
|
212
|
+
if hasattr(re, flag_upper):
|
|
213
|
+
flags |= getattr(re, flag_upper)
|
|
214
|
+
else:
|
|
215
|
+
result.issues.append(ValidationIssue(
|
|
216
|
+
severity='error',
|
|
217
|
+
field=f'patterns[{i}].flags',
|
|
218
|
+
message=f"Unknown regex flag: {flag_name}",
|
|
219
|
+
suggestion="Use valid regex flags like IGNORECASE, MULTILINE, DOTALL"
|
|
220
|
+
))
|
|
221
|
+
continue
|
|
222
|
+
|
|
223
|
+
_ = re.compile(pattern_str, flags) # Validate pattern compiles
|
|
224
|
+
|
|
225
|
+
except re.error as e:
|
|
226
|
+
result.issues.append(ValidationIssue(
|
|
227
|
+
severity='error',
|
|
228
|
+
field=f'patterns[{i}].pattern',
|
|
229
|
+
message=f"Pattern does not compile: {e}",
|
|
230
|
+
suggestion="Fix the regex syntax. Test with online regex validators."
|
|
231
|
+
))
|
|
232
|
+
continue
|
|
233
|
+
|
|
234
|
+
# Check for catastrophic backtracking
|
|
235
|
+
backtracking_issues = self._check_catastrophic_backtracking(pattern_str)
|
|
236
|
+
for issue_msg in backtracking_issues:
|
|
237
|
+
result.issues.append(ValidationIssue(
|
|
238
|
+
severity='error',
|
|
239
|
+
field=f'patterns[{i}].pattern',
|
|
240
|
+
message=f"Potential catastrophic backtracking: {issue_msg}",
|
|
241
|
+
suggestion="Simplify the pattern or use atomic groups to prevent backtracking"
|
|
242
|
+
))
|
|
243
|
+
|
|
244
|
+
# Check pattern timeout
|
|
245
|
+
if pattern_schema.timeout < 1.0:
|
|
246
|
+
result.issues.append(ValidationIssue(
|
|
247
|
+
severity='warning',
|
|
248
|
+
field=f'patterns[{i}].timeout',
|
|
249
|
+
message=f"Timeout {pattern_schema.timeout}s is very short",
|
|
250
|
+
suggestion="Consider using timeout >= 1.0s to avoid false negatives"
|
|
251
|
+
))
|
|
252
|
+
elif pattern_schema.timeout > 10.0:
|
|
253
|
+
result.issues.append(ValidationIssue(
|
|
254
|
+
severity='warning',
|
|
255
|
+
field=f'patterns[{i}].timeout',
|
|
256
|
+
message=f"Timeout {pattern_schema.timeout}s is very long",
|
|
257
|
+
suggestion="Consider optimizing the pattern or reducing timeout to <= 10.0s"
|
|
258
|
+
))
|
|
259
|
+
|
|
260
|
+
# Check pattern length
|
|
261
|
+
if len(pattern_str) > 500:
|
|
262
|
+
result.issues.append(ValidationIssue(
|
|
263
|
+
severity='warning',
|
|
264
|
+
field=f'patterns[{i}].pattern',
|
|
265
|
+
message=f"Pattern is very long ({len(pattern_str)} chars)",
|
|
266
|
+
suggestion="Consider breaking into multiple simpler patterns"
|
|
267
|
+
))
|
|
268
|
+
|
|
269
|
+
def _check_catastrophic_backtracking(self, pattern: str) -> list[str]:
|
|
270
|
+
"""Check for patterns that may cause catastrophic backtracking.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
pattern: Regex pattern to check
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
List of issue messages (empty if no issues)
|
|
277
|
+
"""
|
|
278
|
+
issues = []
|
|
279
|
+
|
|
280
|
+
for danger_pattern, description in self.BACKTRACKING_PATTERNS:
|
|
281
|
+
if re.search(danger_pattern, pattern):
|
|
282
|
+
issues.append(description)
|
|
283
|
+
|
|
284
|
+
# Additional heuristic checks
|
|
285
|
+
# Count nested quantifiers
|
|
286
|
+
nested_count = len(re.findall(r'\([^)]*[*+][^)]*\)[*+]', pattern))
|
|
287
|
+
if nested_count > 2:
|
|
288
|
+
issues.append(f"Multiple nested quantifiers detected ({nested_count})")
|
|
289
|
+
|
|
290
|
+
# Check for alternation with overlapping patterns
|
|
291
|
+
if '|' in pattern:
|
|
292
|
+
alternates = pattern.split('|')
|
|
293
|
+
if len(alternates) > 10:
|
|
294
|
+
issues.append(f"Many alternatives ({len(alternates)}) may slow matching")
|
|
295
|
+
|
|
296
|
+
return issues
|
|
297
|
+
|
|
298
|
+
def _validate_examples(self, rule_schema: RuleSchema, result: ValidationResult) -> None:
|
|
299
|
+
"""Validate test examples.
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
rule_schema: Validated rule schema
|
|
303
|
+
result: ValidationResult to append issues to
|
|
304
|
+
"""
|
|
305
|
+
examples = rule_schema.examples
|
|
306
|
+
|
|
307
|
+
# Check minimum examples
|
|
308
|
+
if len(examples.should_match) < self.MIN_EXAMPLES_SHOULD_MATCH:
|
|
309
|
+
result.issues.append(ValidationIssue(
|
|
310
|
+
severity='error',
|
|
311
|
+
field='examples.should_match',
|
|
312
|
+
message=f"Need at least {self.MIN_EXAMPLES_SHOULD_MATCH} positive examples, "
|
|
313
|
+
f"got {len(examples.should_match)}",
|
|
314
|
+
suggestion=f"Add {self.MIN_EXAMPLES_SHOULD_MATCH - len(examples.should_match)} more examples that should match"
|
|
315
|
+
))
|
|
316
|
+
|
|
317
|
+
if len(examples.should_not_match) < self.MIN_EXAMPLES_SHOULD_NOT_MATCH:
|
|
318
|
+
result.issues.append(ValidationIssue(
|
|
319
|
+
severity='error',
|
|
320
|
+
field='examples.should_not_match',
|
|
321
|
+
message=f"Need at least {self.MIN_EXAMPLES_SHOULD_NOT_MATCH} negative examples, "
|
|
322
|
+
f"got {len(examples.should_not_match)}",
|
|
323
|
+
suggestion=f"Add {self.MIN_EXAMPLES_SHOULD_NOT_MATCH - len(examples.should_not_match)} more examples that should NOT match"
|
|
324
|
+
))
|
|
325
|
+
|
|
326
|
+
# Check examples are non-empty
|
|
327
|
+
for i, example in enumerate(examples.should_match):
|
|
328
|
+
if not example.strip():
|
|
329
|
+
result.issues.append(ValidationIssue(
|
|
330
|
+
severity='error',
|
|
331
|
+
field=f'examples.should_match[{i}]',
|
|
332
|
+
message="Example is empty or whitespace-only",
|
|
333
|
+
suggestion="Provide a meaningful test example"
|
|
334
|
+
))
|
|
335
|
+
|
|
336
|
+
for i, example in enumerate(examples.should_not_match):
|
|
337
|
+
if not example.strip():
|
|
338
|
+
result.issues.append(ValidationIssue(
|
|
339
|
+
severity='error',
|
|
340
|
+
field=f'examples.should_not_match[{i}]',
|
|
341
|
+
message="Example is empty or whitespace-only",
|
|
342
|
+
suggestion="Provide a meaningful test example"
|
|
343
|
+
))
|
|
344
|
+
|
|
345
|
+
# Test patterns against examples
|
|
346
|
+
try:
|
|
347
|
+
patterns = []
|
|
348
|
+
for pattern_schema in rule_schema.patterns:
|
|
349
|
+
flags = 0
|
|
350
|
+
for flag_name in pattern_schema.flags:
|
|
351
|
+
flag_upper = flag_name.upper()
|
|
352
|
+
if hasattr(re, flag_upper):
|
|
353
|
+
flags |= getattr(re, flag_upper)
|
|
354
|
+
patterns.append(re.compile(pattern_schema.pattern, flags))
|
|
355
|
+
|
|
356
|
+
# Check should_match examples
|
|
357
|
+
for i, example in enumerate(examples.should_match):
|
|
358
|
+
matched = any(p.search(example) for p in patterns)
|
|
359
|
+
if not matched:
|
|
360
|
+
result.issues.append(ValidationIssue(
|
|
361
|
+
severity='error',
|
|
362
|
+
field=f'examples.should_match[{i}]',
|
|
363
|
+
message=f"Example does not match any pattern: '{example[:50]}...'",
|
|
364
|
+
suggestion="Fix the pattern or the example to ensure it matches"
|
|
365
|
+
))
|
|
366
|
+
|
|
367
|
+
# Check should_not_match examples
|
|
368
|
+
for i, example in enumerate(examples.should_not_match):
|
|
369
|
+
matched = any(p.search(example) for p in patterns)
|
|
370
|
+
if matched:
|
|
371
|
+
result.issues.append(ValidationIssue(
|
|
372
|
+
severity='error',
|
|
373
|
+
field=f'examples.should_not_match[{i}]',
|
|
374
|
+
message=f"Example incorrectly matches pattern: '{example[:50]}...'",
|
|
375
|
+
suggestion="Fix the pattern to not match this example, or remove the example"
|
|
376
|
+
))
|
|
377
|
+
|
|
378
|
+
except Exception as e:
|
|
379
|
+
result.issues.append(ValidationIssue(
|
|
380
|
+
severity='warning',
|
|
381
|
+
field='examples',
|
|
382
|
+
message=f"Could not test examples against patterns: {e}",
|
|
383
|
+
suggestion="Ensure patterns compile correctly"
|
|
384
|
+
))
|
|
385
|
+
|
|
386
|
+
def _validate_explainability(self, rule_schema: RuleSchema, result: ValidationResult) -> None:
|
|
387
|
+
"""Validate explainability fields.
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
rule_schema: Validated rule schema
|
|
391
|
+
result: ValidationResult to append issues to
|
|
392
|
+
"""
|
|
393
|
+
# Check risk_explanation
|
|
394
|
+
if not rule_schema.risk_explanation or len(rule_schema.risk_explanation.strip()) < self.MIN_RISK_EXPLANATION_LENGTH:
|
|
395
|
+
result.issues.append(ValidationIssue(
|
|
396
|
+
severity='error',
|
|
397
|
+
field='risk_explanation',
|
|
398
|
+
message=f"risk_explanation must be at least {self.MIN_RISK_EXPLANATION_LENGTH} characters",
|
|
399
|
+
suggestion="Provide a clear explanation of why this pattern is dangerous and what risks it poses"
|
|
400
|
+
))
|
|
401
|
+
|
|
402
|
+
# Check remediation_advice
|
|
403
|
+
if not rule_schema.remediation_advice or len(rule_schema.remediation_advice.strip()) < self.MIN_REMEDIATION_LENGTH:
|
|
404
|
+
result.issues.append(ValidationIssue(
|
|
405
|
+
severity='error',
|
|
406
|
+
field='remediation_advice',
|
|
407
|
+
message=f"remediation_advice must be at least {self.MIN_REMEDIATION_LENGTH} characters",
|
|
408
|
+
suggestion="Provide clear advice on how to fix or mitigate this threat"
|
|
409
|
+
))
|
|
410
|
+
|
|
411
|
+
# Check docs_url format
|
|
412
|
+
if rule_schema.docs_url:
|
|
413
|
+
if not self._is_valid_url(rule_schema.docs_url):
|
|
414
|
+
result.issues.append(ValidationIssue(
|
|
415
|
+
severity='warning',
|
|
416
|
+
field='docs_url',
|
|
417
|
+
message=f"docs_url appears invalid: {rule_schema.docs_url}",
|
|
418
|
+
suggestion="Provide a valid HTTP/HTTPS URL or leave empty"
|
|
419
|
+
))
|
|
420
|
+
else:
|
|
421
|
+
result.issues.append(ValidationIssue(
|
|
422
|
+
severity='info',
|
|
423
|
+
field='docs_url',
|
|
424
|
+
message="No documentation URL provided",
|
|
425
|
+
suggestion="Consider adding a docs_url for users to learn more"
|
|
426
|
+
))
|
|
427
|
+
|
|
428
|
+
def _validate_metadata(self, rule_schema: RuleSchema, result: ValidationResult) -> None:
|
|
429
|
+
"""Validate metadata fields.
|
|
430
|
+
|
|
431
|
+
Args:
|
|
432
|
+
rule_schema: Validated rule schema
|
|
433
|
+
result: ValidationResult to append issues to
|
|
434
|
+
"""
|
|
435
|
+
metadata = rule_schema.metadata
|
|
436
|
+
|
|
437
|
+
# Check for author
|
|
438
|
+
if 'author' not in metadata or not metadata['author']:
|
|
439
|
+
result.issues.append(ValidationIssue(
|
|
440
|
+
severity='warning',
|
|
441
|
+
field='metadata.author',
|
|
442
|
+
message="No author specified",
|
|
443
|
+
suggestion="Add 'author' field to metadata for attribution"
|
|
444
|
+
))
|
|
445
|
+
|
|
446
|
+
# Check for created date
|
|
447
|
+
if 'created' not in metadata:
|
|
448
|
+
result.issues.append(ValidationIssue(
|
|
449
|
+
severity='info',
|
|
450
|
+
field='metadata.created',
|
|
451
|
+
message="No creation date specified",
|
|
452
|
+
suggestion="Add 'created' field to metadata (YYYY-MM-DD format)"
|
|
453
|
+
))
|
|
454
|
+
|
|
455
|
+
# Validate confidence score
|
|
456
|
+
if rule_schema.confidence < 0.5:
|
|
457
|
+
result.issues.append(ValidationIssue(
|
|
458
|
+
severity='warning',
|
|
459
|
+
field='confidence',
|
|
460
|
+
message=f"Low confidence score: {rule_schema.confidence}",
|
|
461
|
+
suggestion="Consider improving the pattern or providing more evidence for higher confidence"
|
|
462
|
+
))
|
|
463
|
+
|
|
464
|
+
# Check MITRE ATT&CK mappings
|
|
465
|
+
if not rule_schema.mitre_attack:
|
|
466
|
+
result.issues.append(ValidationIssue(
|
|
467
|
+
severity='info',
|
|
468
|
+
field='mitre_attack',
|
|
469
|
+
message="No MITRE ATT&CK techniques mapped",
|
|
470
|
+
suggestion="Consider mapping to relevant MITRE ATT&CK techniques for better threat context"
|
|
471
|
+
))
|
|
472
|
+
|
|
473
|
+
def _check_best_practices(self, rule_schema: RuleSchema, result: ValidationResult) -> None:
|
|
474
|
+
"""Check for best practices and style guidelines.
|
|
475
|
+
|
|
476
|
+
Args:
|
|
477
|
+
rule_schema: Validated rule schema
|
|
478
|
+
result: ValidationResult to append issues to
|
|
479
|
+
"""
|
|
480
|
+
# Check naming convention
|
|
481
|
+
rule_id = rule_schema.rule_id
|
|
482
|
+
if not re.match(r'^[a-z]{2,6}-\d+$', rule_id, re.IGNORECASE):
|
|
483
|
+
result.issues.append(ValidationIssue(
|
|
484
|
+
severity='warning',
|
|
485
|
+
field='rule_id',
|
|
486
|
+
message=f"Rule ID '{rule_id}' doesn't follow convention (family-number)",
|
|
487
|
+
suggestion="Use format like 'pi-001', 'jb-042', etc."
|
|
488
|
+
))
|
|
489
|
+
|
|
490
|
+
# Check description quality
|
|
491
|
+
if len(rule_schema.description) < 30:
|
|
492
|
+
result.issues.append(ValidationIssue(
|
|
493
|
+
severity='warning',
|
|
494
|
+
field='description',
|
|
495
|
+
message="Description is very short",
|
|
496
|
+
suggestion="Provide a more detailed description of what the rule detects"
|
|
497
|
+
))
|
|
498
|
+
|
|
499
|
+
# Check name quality
|
|
500
|
+
if len(rule_schema.name) < 10:
|
|
501
|
+
result.issues.append(ValidationIssue(
|
|
502
|
+
severity='info',
|
|
503
|
+
field='name',
|
|
504
|
+
message="Rule name is very short",
|
|
505
|
+
suggestion="Consider a more descriptive name"
|
|
506
|
+
))
|
|
507
|
+
|
|
508
|
+
# Check for duplicate patterns
|
|
509
|
+
patterns_set = set()
|
|
510
|
+
for i, pattern_schema in enumerate(rule_schema.patterns):
|
|
511
|
+
pattern_key = (pattern_schema.pattern, tuple(pattern_schema.flags))
|
|
512
|
+
if pattern_key in patterns_set:
|
|
513
|
+
result.issues.append(ValidationIssue(
|
|
514
|
+
severity='warning',
|
|
515
|
+
field=f'patterns[{i}]',
|
|
516
|
+
message="Duplicate pattern detected",
|
|
517
|
+
suggestion="Remove duplicate patterns to improve performance"
|
|
518
|
+
))
|
|
519
|
+
patterns_set.add(pattern_key)
|
|
520
|
+
|
|
521
|
+
def _is_valid_url(self, url: str) -> bool:
|
|
522
|
+
"""Check if string is a valid URL.
|
|
523
|
+
|
|
524
|
+
Args:
|
|
525
|
+
url: URL string to validate
|
|
526
|
+
|
|
527
|
+
Returns:
|
|
528
|
+
True if valid HTTP/HTTPS URL
|
|
529
|
+
"""
|
|
530
|
+
try:
|
|
531
|
+
result = urlparse(url)
|
|
532
|
+
return all([result.scheme in ['http', 'https'], result.netloc])
|
|
533
|
+
except Exception:
|
|
534
|
+
return False
|
|
535
|
+
|
|
536
|
+
def _get_schema_error_suggestion(self, error: dict[str, Any]) -> str:
|
|
537
|
+
"""Get helpful suggestion for schema validation error.
|
|
538
|
+
|
|
539
|
+
Args:
|
|
540
|
+
error: Pydantic error dict
|
|
541
|
+
|
|
542
|
+
Returns:
|
|
543
|
+
Suggestion string
|
|
544
|
+
"""
|
|
545
|
+
error_type = error.get('type', '')
|
|
546
|
+
|
|
547
|
+
if 'missing' in error_type:
|
|
548
|
+
return "Add this required field to the YAML file"
|
|
549
|
+
elif 'type_error' in error_type:
|
|
550
|
+
return "Check the field type matches the schema requirements"
|
|
551
|
+
elif 'value_error' in error_type:
|
|
552
|
+
return "Check the field value is in the allowed range/format"
|
|
553
|
+
elif 'extra' in error_type:
|
|
554
|
+
return "Remove this field or check for typos in field name"
|
|
555
|
+
else:
|
|
556
|
+
return "Check the schema documentation for field requirements"
|