howler-api 4.1.0.dev1346__tar.gz → 4.1.0.dev1368__tar.gz
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.
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/PKG-INFO +2 -2
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/hit.py +4 -2
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/tool.py +4 -2
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/ingest.py +2 -25
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/correlation_service.py +35 -11
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/pyproject.toml +2 -2
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/README.md +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/add_label.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/add_to_case.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/change_field.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/demote.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/example_plugin.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/prioritization.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/promote.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/remove_label.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/transition.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/base.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/socket.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/action.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/analytic.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/auth.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/clue.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/configs.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/dossier.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/help.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/notebook.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/overview.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/search.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/template.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/user.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/utils/params.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/view.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/case.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/fuzzy.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/search.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/app.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/README.md +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/classification.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/classification.yml +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/exceptions.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/loader.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/logging/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/logging/audit.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/logging/format.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/net.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/net_static.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/random_user.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/swagger.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/config.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/action_queue_worker.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/correlation.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/retention.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/README.md +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/bulk.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/collection.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/constants.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/exceptions.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/howler_store.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/operations.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/schemas.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/store.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/support/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/support/build.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/support/schemas.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/types.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/error.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/README.md +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/generate_mitre.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/generate_tlds.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/reindex_data.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/wipe_databases.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/gunicorn_config.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/healthz.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/azure.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/discover.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/hit.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/oauth.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/search.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/workflow.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/ws.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/README.md +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/base.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/charter.txt +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/constants.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/helper.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/howler_enum.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/mixins.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/action.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/analytic.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/aws.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/azure.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/case.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/cbs.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/clue.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/config.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/dossier.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/event.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/gcp.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/hit.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/howler_data.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/lead.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/localized_label.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/overview.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/pivot.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/record.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/template.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/user.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/view.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/random_data.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/randomizer.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/patched.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/plugins/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/plugins/config.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/README.md +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/events.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/set.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/security/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/security/socket.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/security/utils.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/action_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/analytic_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/auth_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/bundle_compat_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/case_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/comms_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/config_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/docs_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/dossier_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/event_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/fuzzy_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/hit_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/jwt_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/lucene_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/notebook_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/overview_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/search_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/template_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/user_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/viewer_service.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/telemetry.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/__init__.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/annotations.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/chunk.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/compat.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/constants.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/dict_utils.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/indexes.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/isotime.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/list_utils.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/lucene.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/net_utils.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/path.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/socket_utils.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/str_utils.py +0 -0
- {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/uid.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: howler-api
|
|
3
|
-
Version: 4.1.0.
|
|
3
|
+
Version: 4.1.0.dev1368
|
|
4
4
|
Summary: Howler - API server
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
|
|
@@ -50,7 +50,7 @@ Requires-Dist: python-datemath (==3.0.3)
|
|
|
50
50
|
Requires-Dist: python-dotenv (>=1.1.0,<2.0.0)
|
|
51
51
|
Requires-Dist: pytz (>=2025.2,<2026.0)
|
|
52
52
|
Requires-Dist: pyyaml (==6.0.3)
|
|
53
|
-
Requires-Dist: redis (==8.0
|
|
53
|
+
Requires-Dist: redis (==8.1.0)
|
|
54
54
|
Requires-Dist: requests (==2.34.2)
|
|
55
55
|
Requires-Dist: tzdata (>=2026.1,<2027.0)
|
|
56
56
|
Requires-Dist: validators (>=0.34,<0.36)
|
|
@@ -30,7 +30,7 @@ from howler.odm.models.hit import Hit
|
|
|
30
30
|
from howler.odm.models.howler_data import Comment, HitOperationType, HitStatusTransition
|
|
31
31
|
from howler.odm.models.user import User
|
|
32
32
|
from howler.security import api_login
|
|
33
|
-
from howler.services import action_service, analytic_service, comms_service, hit_service
|
|
33
|
+
from howler.services import action_service, analytic_service, comms_service, correlation_service, hit_service
|
|
34
34
|
from howler.utils.constants import DEBUG_FORCE_REFRESH
|
|
35
35
|
from howler.utils.str_utils import sanitize_lucene_query
|
|
36
36
|
|
|
@@ -130,7 +130,9 @@ def create_hits(user: User, **kwargs):
|
|
|
130
130
|
|
|
131
131
|
hit_service.create_hits(odms, user=user.uname, refresh="true" if DEBUG_FORCE_REFRESH else refresh)
|
|
132
132
|
analytic_service.save_from_hits(odms, user, refresh=refresh)
|
|
133
|
-
|
|
133
|
+
ids = [odm.howler.id for odm in odms]
|
|
134
|
+
action_service.enqueue_action_execution(ids, trigger="create", user=user)
|
|
135
|
+
correlation_service.enqueue_for_correlation(ids)
|
|
134
136
|
|
|
135
137
|
response_body["warnings"] = warnings
|
|
136
138
|
|
|
@@ -13,7 +13,7 @@ from howler.odm.base import _Field
|
|
|
13
13
|
from howler.odm.models.hit import Hit
|
|
14
14
|
from howler.odm.models.user import User
|
|
15
15
|
from howler.security import api_login
|
|
16
|
-
from howler.services import action_service, analytic_service, hit_service
|
|
16
|
+
from howler.services import action_service, analytic_service, correlation_service, hit_service
|
|
17
17
|
from howler.utils.constants import DEBUG_FORCE_REFRESH
|
|
18
18
|
from howler.utils.dict_utils import flatten
|
|
19
19
|
from howler.utils.isotime import now_as_iso
|
|
@@ -233,6 +233,8 @@ def create_one_or_many_hits(tool_name: str, user: User, **kwargs): # noqa: C901
|
|
|
233
233
|
hit_service.create_hits(odms, user=user.uname, refresh="true" if DEBUG_FORCE_REFRESH else refresh)
|
|
234
234
|
analytic_service.save_from_hits(odms, user, refresh=refresh)
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
ids = [entry["id"] for entry in out]
|
|
237
|
+
action_service.enqueue_action_execution(ids, trigger="create", user=user)
|
|
238
|
+
correlation_service.enqueue_for_correlation(ids)
|
|
237
239
|
|
|
238
240
|
return created(out, warnings=warnings)
|
|
@@ -11,7 +11,6 @@ from howler.common.exceptions import HowlerException, HowlerValueError
|
|
|
11
11
|
from howler.common.loader import datastore
|
|
12
12
|
from howler.common.logging import get_logger
|
|
13
13
|
from howler.common.swagger import generate_swagger_docs
|
|
14
|
-
from howler.config import CORRELATION_QUEUE_NAME, config
|
|
15
14
|
from howler.datastore.collection import ESCollection
|
|
16
15
|
from howler.datastore.exceptions import DataStoreException
|
|
17
16
|
from howler.datastore.howler_store import INDEXES
|
|
@@ -19,9 +18,8 @@ from howler.datastore.operations import OdmHelper, OdmUpdateOperation
|
|
|
19
18
|
from howler.odm.models.event import Event
|
|
20
19
|
from howler.odm.models.hit import Hit
|
|
21
20
|
from howler.odm.models.user import User
|
|
22
|
-
from howler.remote.datatypes.queues.named import NamedQueue
|
|
23
21
|
from howler.security import api_login
|
|
24
|
-
from howler.services import event_service, hit_service
|
|
22
|
+
from howler.services import correlation_service, event_service, hit_service
|
|
25
23
|
from howler.utils.dict_utils import flatten
|
|
26
24
|
|
|
27
25
|
MAX_COMMENT_LEN = 5000
|
|
@@ -36,24 +34,6 @@ logger = get_logger(__file__)
|
|
|
36
34
|
|
|
37
35
|
hit_helper = OdmHelper(Hit)
|
|
38
36
|
|
|
39
|
-
# Persistent queue for the correlation worker to consume newly ingested hit IDs.
|
|
40
|
-
_ingestion_queue: NamedQueue[str] | None = None
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def _get_ingestion_queue() -> NamedQueue[str]:
|
|
44
|
-
"""Return the shared ingestion queue, creating it on first use."""
|
|
45
|
-
global _ingestion_queue
|
|
46
|
-
|
|
47
|
-
if _ingestion_queue is None:
|
|
48
|
-
_ingestion_queue = NamedQueue(
|
|
49
|
-
CORRELATION_QUEUE_NAME,
|
|
50
|
-
host=config.core.redis.persistent.host,
|
|
51
|
-
port=config.core.redis.persistent.port,
|
|
52
|
-
private=False,
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
return _ingestion_queue
|
|
56
|
-
|
|
57
37
|
|
|
58
38
|
@generate_swagger_docs()
|
|
59
39
|
@ingest_api.route("/<index>", methods=["POST"])
|
|
@@ -120,10 +100,7 @@ def create(index: str, user: User, **kwargs):
|
|
|
120
100
|
|
|
121
101
|
# Enqueue newly created hit IDs for the correlation worker.
|
|
122
102
|
if ids:
|
|
123
|
-
|
|
124
|
-
_get_ingestion_queue().push(*ids)
|
|
125
|
-
except Exception:
|
|
126
|
-
logger.exception("Failed to enqueue hit IDs for correlation")
|
|
103
|
+
correlation_service.enqueue_for_correlation(ids)
|
|
127
104
|
|
|
128
105
|
return created(ids, warnings=warnings)
|
|
129
106
|
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/correlation_service.py
RENAMED
|
@@ -37,6 +37,40 @@ def _normalize_utc(ts: datetime) -> datetime:
|
|
|
37
37
|
return ts
|
|
38
38
|
|
|
39
39
|
|
|
40
|
+
# Persistent queue for the correlation worker to consume newly ingested hit IDs.
|
|
41
|
+
_ingestion_queue: NamedQueue[str] | None = None
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _get_ingestion_queue() -> NamedQueue[str]:
|
|
45
|
+
"""Return the shared ingestion queue, creating it on first use."""
|
|
46
|
+
global _ingestion_queue
|
|
47
|
+
|
|
48
|
+
if _ingestion_queue is None:
|
|
49
|
+
_ingestion_queue = NamedQueue(
|
|
50
|
+
CORRELATION_QUEUE_NAME,
|
|
51
|
+
host=config.core.redis.persistent.host,
|
|
52
|
+
port=config.core.redis.persistent.port,
|
|
53
|
+
private=False,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return _ingestion_queue
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def enqueue_for_correlation(ids: list[str]) -> None:
|
|
60
|
+
"""Enqueue record IDs for correlation processing.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
ids: List of record IDs to enqueue for correlation.
|
|
64
|
+
|
|
65
|
+
Raises:
|
|
66
|
+
HowlerRuntimeError: If enqueueing fails.
|
|
67
|
+
"""
|
|
68
|
+
try:
|
|
69
|
+
_get_ingestion_queue().push(*ids)
|
|
70
|
+
except Exception:
|
|
71
|
+
logger.exception("Error on queuing for correlation")
|
|
72
|
+
|
|
73
|
+
|
|
40
74
|
def get_active_rules() -> list[tuple[str, CaseRule]]: # noqa: C901
|
|
41
75
|
"""Return all active (enabled, non-expired) rules across every case.
|
|
42
76
|
|
|
@@ -179,23 +213,13 @@ def process_batch(record_ids: list[str]) -> int: # noqa: C901
|
|
|
179
213
|
return added
|
|
180
214
|
|
|
181
215
|
|
|
182
|
-
def _build_queue() -> NamedQueue[str]:
|
|
183
|
-
"""Create the NamedQueue backed by persistent Redis."""
|
|
184
|
-
return NamedQueue(
|
|
185
|
-
CORRELATION_QUEUE_NAME,
|
|
186
|
-
host=config.core.redis.persistent.host,
|
|
187
|
-
port=config.core.redis.persistent.port,
|
|
188
|
-
private=False,
|
|
189
|
-
)
|
|
190
|
-
|
|
191
|
-
|
|
192
216
|
def run_worker() -> None: # pragma: no cover – long-running loop, tested via process_batch
|
|
193
217
|
"""Block on the ingestion queue and process batches of record IDs.
|
|
194
218
|
|
|
195
219
|
Accumulates up to ``BATCH_SIZE`` IDs or flushes after ``BATCH_TIMEOUT``
|
|
196
220
|
seconds, whichever comes first.
|
|
197
221
|
"""
|
|
198
|
-
queue =
|
|
222
|
+
queue = _get_ingestion_queue()
|
|
199
223
|
logger.info("Correlation worker started (batch_size=%d, timeout=%ds)", BATCH_SIZE, BATCH_TIMEOUT)
|
|
200
224
|
|
|
201
225
|
batch: list[str] = []
|
|
@@ -152,7 +152,7 @@ suppress-none-returning = true
|
|
|
152
152
|
[tool.poetry]
|
|
153
153
|
package-mode = true
|
|
154
154
|
name = "howler-api"
|
|
155
|
-
version = "4.1.0.
|
|
155
|
+
version = "4.1.0.dev1368"
|
|
156
156
|
description = "Howler - API server"
|
|
157
157
|
authors = [
|
|
158
158
|
"Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
|
|
@@ -211,7 +211,7 @@ pyjwt = "2.13.0"
|
|
|
211
211
|
python-baseconv = "1.2.2"
|
|
212
212
|
python-datemath = "3.0.3"
|
|
213
213
|
pyyaml = "6.0.3"
|
|
214
|
-
redis = "8.0
|
|
214
|
+
redis = "8.1.0"
|
|
215
215
|
requests = "2.34.2"
|
|
216
216
|
wsproto = "1.3.2"
|
|
217
217
|
chevron = "0.14.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/action_queue_worker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/migrations/fix_process.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/generate_sigma_rules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/autonomous_system.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/code_signature.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/vulnerability.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/comms.py
RENAMED
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/multi.py
RENAMED
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/named.py
RENAMED
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/user_quota_tracker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/bundle_compat_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|