howler-api 4.0.0.dev1283__tar.gz → 4.0.0.dev1297__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.0.0.dev1283 → howler_api-4.0.0.dev1297}/PKG-INFO +1 -1
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/loader.py +1 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/collection.py +2 -2
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/howler_data.py +15 -15
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/fuzzy_service.py +4 -4
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/hit_service.py +12 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/search_service.py +4 -47
- howler_api-4.0.0.dev1297/howler/utils/indexes.py +56 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/pyproject.toml +1 -1
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/README.md +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/add_label.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/add_to_case.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/change_field.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/demote.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/example_plugin.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/prioritization.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/promote.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/remove_label.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/actions/transition.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/base.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/socket.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/action.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/analytic.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/auth.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/clue.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/configs.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/dossier.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/help.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/hit.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/notebook.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/overview.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/search.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/template.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/tool.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/user.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/utils/params.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v1/view.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v2/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v2/case.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v2/fuzzy.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v2/ingest.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/api/v2/search.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/app.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/README.md +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/classification.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/classification.yml +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/exceptions.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/logging/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/logging/audit.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/logging/format.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/net.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/net_static.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/random_user.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/common/swagger.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/config.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/cronjobs/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/cronjobs/action_queue_worker.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/cronjobs/correlation.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/cronjobs/retention.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/README.md +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/bulk.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/constants.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/exceptions.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/howler_store.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/operations.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/schemas.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/store.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/support/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/support/build.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/support/schemas.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/datastore/types.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/error.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/external/README.md +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/external/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/external/generate_mitre.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/external/generate_tlds.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/external/reindex_data.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/external/wipe_databases.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/gunicorn_config.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/healthz.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/helper/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/helper/azure.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/helper/discover.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/helper/hit.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/helper/oauth.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/helper/search.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/helper/workflow.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/helper/ws.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/README.md +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/base.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/charter.txt +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/constants.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/helper.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/howler_enum.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/mixins.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/action.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/analytic.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/aws.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/azure.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/case.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/cbs.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/clue.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/config.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/dossier.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/event.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/gcp.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/hit.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/lead.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/localized_label.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/overview.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/pivot.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/record.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/template.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/user.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/models/view.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/random_data.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/odm/randomizer.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/patched.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/plugins/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/plugins/config.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/README.md +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/events.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/set.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/security/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/security/socket.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/security/utils.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/action_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/analytic_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/auth_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/bundle_compat_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/case_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/comms_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/config_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/correlation_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/docs_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/dossier_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/event_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/jwt_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/lucene_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/notebook_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/overview_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/template_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/user_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/services/viewer_service.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/telemetry.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/annotations.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/chunk.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/compat.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/constants.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/dict_utils.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/isotime.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/list_utils.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/lucene.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/net_utils.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/path.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/socket_utils.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/str_utils.py +0 -0
- {howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/howler/utils/uid.py +0 -0
|
@@ -14,6 +14,7 @@ if TYPE_CHECKING:
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
APP_NAME = os.environ.get("APP_NAME", "howler")
|
|
17
|
+
DATASTORE_INDEX_PREFIX = os.environ.get("HWL_DATASTORE_INDEX_PREFIX", APP_NAME)
|
|
17
18
|
APP_PREFIX = os.environ.get("APP_PREFIX", "hwl")
|
|
18
19
|
USER_TYPES = {"admin", "user", "automation_basic", "automation_advanced", "actionrunner_basic", "actionrunner_advanced"}
|
|
19
20
|
|
|
@@ -20,7 +20,7 @@ from opentelemetry import trace
|
|
|
20
20
|
|
|
21
21
|
from howler import odm
|
|
22
22
|
from howler.common.exceptions import HowlerRuntimeError, HowlerValueError, NonRecoverableError
|
|
23
|
-
from howler.common.loader import
|
|
23
|
+
from howler.common.loader import DATASTORE_INDEX_PREFIX
|
|
24
24
|
from howler.common.logging.format import HWL_DATE_FORMAT, HWL_LOG_FORMAT
|
|
25
25
|
from howler.datastore.constants import BACK_MAPPING, TYPE_MAPPING
|
|
26
26
|
from howler.datastore.exceptions import (
|
|
@@ -229,7 +229,7 @@ class ESCollection(Generic[ModelType]):
|
|
|
229
229
|
self._index_list: list[str] = []
|
|
230
230
|
|
|
231
231
|
self.datastore = datastore
|
|
232
|
-
self.name = f"{
|
|
232
|
+
self.name = f"{DATASTORE_INDEX_PREFIX}-{name}"
|
|
233
233
|
self.ilm_config = ilm_config
|
|
234
234
|
self.index_name = f"{self.name}_hot"
|
|
235
235
|
self.model_class = model_class
|
|
@@ -131,17 +131,17 @@ class Log(odm.Model):
|
|
|
131
131
|
|
|
132
132
|
@odm.model(index=True, store=True, description="Hit outline header.")
|
|
133
133
|
class Header(odm.Model):
|
|
134
|
-
threat:
|
|
135
|
-
target:
|
|
134
|
+
threat: str | None = odm.Optional(odm.Keyword(description="The IP of the threat."))
|
|
135
|
+
target: str | None = odm.Optional(odm.Keyword(description="The target of the hit."))
|
|
136
136
|
indicators: list[str] = odm.List(odm.Keyword(description="Indicators of the hit."), default=[])
|
|
137
|
-
summary:
|
|
137
|
+
summary: str | None = odm.Optional(odm.Keyword(description="Summary of the hit."))
|
|
138
138
|
|
|
139
139
|
|
|
140
140
|
@odm.model(index=True, store=True, description="Fields describing the location where this alert has been retained.")
|
|
141
141
|
class Incident(odm.Model):
|
|
142
142
|
platform: str = odm.Keyword(description="The name of the platform for this incident.")
|
|
143
|
-
incident_id:
|
|
144
|
-
url:
|
|
143
|
+
incident_id: str | None = odm.Keyword(description="The ID of the incident.", optional=True)
|
|
144
|
+
url: str | None = odm.Keyword(description="The url where the incident can be found.", optional=True)
|
|
145
145
|
|
|
146
146
|
|
|
147
147
|
@odm.model(index=True, store=True, description="Labels for the hit")
|
|
@@ -177,7 +177,7 @@ DEFAULT_ASSIGNMENT = "unassigned"
|
|
|
177
177
|
class HowlerData(odm.Model):
|
|
178
178
|
id: str = odm.UUID(description="A UUID for this hit.")
|
|
179
179
|
analytic: str = odm.CaseInsensitiveKeyword(description="Title of the analytic.")
|
|
180
|
-
assignment:
|
|
180
|
+
assignment: str = odm.Keyword(
|
|
181
181
|
description="Unique identifier of the assigned user.",
|
|
182
182
|
default=DEFAULT_ASSIGNMENT,
|
|
183
183
|
)
|
|
@@ -191,7 +191,7 @@ class HowlerData(odm.Model):
|
|
|
191
191
|
default=[],
|
|
192
192
|
description="A list of links associated with this hit.",
|
|
193
193
|
)
|
|
194
|
-
detection:
|
|
194
|
+
detection: str | None = odm.Optional(
|
|
195
195
|
odm.CaseInsensitiveKeyword(description="The detection that produced this hit.")
|
|
196
196
|
)
|
|
197
197
|
hash: str = odm.HowlerHash(
|
|
@@ -219,13 +219,13 @@ class HowlerData(odm.Model):
|
|
|
219
219
|
score: Optional[float] = odm.Optional(
|
|
220
220
|
odm.Float(description="A score assigned by an enrichment to help prioritize triage.", default=0)
|
|
221
221
|
)
|
|
222
|
-
status = odm.Enum(values=Status, default=Status.OPEN, description="Status of the hit.")
|
|
223
|
-
scrutiny = odm.Enum(
|
|
222
|
+
status: str = odm.Enum(values=Status, default=Status.OPEN, description="Status of the hit.")
|
|
223
|
+
scrutiny: str = odm.Enum(
|
|
224
224
|
values=Scrutiny,
|
|
225
225
|
default=Scrutiny.UNSEEN,
|
|
226
226
|
description="Level of scrutiny done to this hit.",
|
|
227
227
|
)
|
|
228
|
-
escalation = odm.Enum(
|
|
228
|
+
escalation: str = odm.Enum(
|
|
229
229
|
values=Escalation,
|
|
230
230
|
default=Escalation.HIT,
|
|
231
231
|
description="Level of escalation of this hit.",
|
|
@@ -235,8 +235,8 @@ class HowlerData(odm.Model):
|
|
|
235
235
|
description="User selected time for hit expiry",
|
|
236
236
|
)
|
|
237
237
|
)
|
|
238
|
-
assessment:
|
|
239
|
-
rationale:
|
|
238
|
+
assessment: str | None = odm.Optional(odm.Enum(values=Assessment, description="Assessment of the hit."))
|
|
239
|
+
rationale: str | None = odm.Optional(
|
|
240
240
|
odm.Keyword(
|
|
241
241
|
description=(
|
|
242
242
|
"The rationale behind the hit assessment. Allows it to be understood and verified by other analysts."
|
|
@@ -254,9 +254,9 @@ class HowlerData(odm.Model):
|
|
|
254
254
|
default=[],
|
|
255
255
|
description="A list of changes to the hit with timestamps and attribution.",
|
|
256
256
|
)
|
|
257
|
-
monitored:
|
|
258
|
-
reported:
|
|
259
|
-
mitigated:
|
|
257
|
+
monitored: str | None = odm.Optional(odm.Keyword(description="Link to the incident monitoring dashboard."))
|
|
258
|
+
reported: str | None = odm.Optional(odm.Keyword(description="Link to the incident report."))
|
|
259
|
+
mitigated: str | None = odm.Optional(odm.Keyword(description="Link to the mitigation record (tool dependent)."))
|
|
260
260
|
outline: Optional[Header] = odm.Optional(odm.Compound(Header), description="The user specified header of the hit")
|
|
261
261
|
incidents: list[Incident] = odm.List(
|
|
262
262
|
odm.Compound(Incident), default=[], description="Fields describing an incident associated with this alert."
|
|
@@ -8,7 +8,7 @@ import elasticsearch
|
|
|
8
8
|
from elasticsearch import Elasticsearch
|
|
9
9
|
|
|
10
10
|
from howler import odm
|
|
11
|
-
from howler.common.loader import
|
|
11
|
+
from howler.common.loader import datastore
|
|
12
12
|
from howler.common.logging import get_logger
|
|
13
13
|
from howler.datastore.exceptions import SearchException, SearchRetryException
|
|
14
14
|
from howler.datastore.types import SearchResult
|
|
@@ -25,7 +25,7 @@ from howler.odm.base import (
|
|
|
25
25
|
Text,
|
|
26
26
|
_Field,
|
|
27
27
|
)
|
|
28
|
-
from howler.
|
|
28
|
+
from howler.utils.indexes import get_logical_index_name, normalize_indexes
|
|
29
29
|
from howler.utils.str_utils import sanitize_lucene_query
|
|
30
30
|
|
|
31
31
|
DEFAULT_OFFSET = 0
|
|
@@ -369,7 +369,7 @@ def fuzzy_search(
|
|
|
369
369
|
raise SearchException(f"Invalid index for fuzzy search: {idx}")
|
|
370
370
|
|
|
371
371
|
client: Elasticsearch = datastore().ds.client
|
|
372
|
-
parsed_indexes =
|
|
372
|
+
parsed_indexes = normalize_indexes(indexes)
|
|
373
373
|
|
|
374
374
|
query_body = build_fuzzy_query(query, indexes, filters, access_control)
|
|
375
375
|
|
|
@@ -420,7 +420,7 @@ def _format_items_with_score(hits: list[dict[str, Any]]) -> list[dict[str, Any]]
|
|
|
420
420
|
if source:
|
|
421
421
|
raw_index = hit.get("_index", None)
|
|
422
422
|
if raw_index:
|
|
423
|
-
source["__index"] = raw_index
|
|
423
|
+
source["__index"] = get_logical_index_name(raw_index)
|
|
424
424
|
source["_score"] = hit.get("_score", 0)
|
|
425
425
|
items.append(source)
|
|
426
426
|
return items
|
|
@@ -317,6 +317,18 @@ def convert_hit( # noqa: C901
|
|
|
317
317
|
"See howler's documentation for more information."
|
|
318
318
|
)
|
|
319
319
|
|
|
320
|
+
if odm.howler.assessment:
|
|
321
|
+
target_escalation = AssessmentEscalationMap[odm.howler.assessment]
|
|
322
|
+
if odm.howler.escalation != target_escalation:
|
|
323
|
+
warnings.append(
|
|
324
|
+
f"Hits with assessment {odm.howler.assessment} must also have escalation set to {target_escalation}."
|
|
325
|
+
)
|
|
326
|
+
odm.howler.escalation = str(target_escalation)
|
|
327
|
+
|
|
328
|
+
if odm.howler.escalation in [Escalation.MISS, Escalation.EVIDENCE] and odm.howler.status != Status.RESOLVED:
|
|
329
|
+
warnings.append("Hits with escalation miss or evidence must also have their status set to resolved.")
|
|
330
|
+
odm.howler.status = Status.RESOLVED.value
|
|
331
|
+
|
|
320
332
|
if odm.event:
|
|
321
333
|
odm.event.id = odm.howler.id
|
|
322
334
|
if not odm.event.created:
|
|
@@ -5,7 +5,7 @@ from typing import Any
|
|
|
5
5
|
import elasticsearch
|
|
6
6
|
from elasticsearch import Elasticsearch
|
|
7
7
|
|
|
8
|
-
from howler.common.loader import
|
|
8
|
+
from howler.common.loader import datastore
|
|
9
9
|
from howler.common.logging import get_logger
|
|
10
10
|
from howler.datastore.collection import parse_sort
|
|
11
11
|
from howler.datastore.exceptions import SearchException, SearchRetryException
|
|
@@ -13,6 +13,7 @@ from howler.datastore.types import SearchResult
|
|
|
13
13
|
from howler.helper.search import get_collection, has_access_control
|
|
14
14
|
from howler.odm.models.user import User
|
|
15
15
|
from howler.services import case_service
|
|
16
|
+
from howler.utils.indexes import get_logical_index_name, normalize_indexes
|
|
16
17
|
|
|
17
18
|
DEFAULT_OFFSET = 0
|
|
18
19
|
DEFAULT_ROW_SIZE = 25
|
|
@@ -23,50 +24,6 @@ SCROLL_TIMEOUT = "5m"
|
|
|
23
24
|
logger = get_logger(__file__)
|
|
24
25
|
|
|
25
26
|
|
|
26
|
-
def _normalize_indexes(indexes: str | list[str]) -> str:
|
|
27
|
-
"""Normalizes Elasticsearch index names into a comma-separated string.
|
|
28
|
-
|
|
29
|
-
Parses the input indexes and applies naming conventions. Special patterns like
|
|
30
|
-
wildcards, exclusions, and explicitly formatted indexes are preserved as-is.
|
|
31
|
-
Regular indexes are formatted with the APP_NAME prefix and '_hot' suffix.
|
|
32
|
-
|
|
33
|
-
Args:
|
|
34
|
-
indexes: A comma-separated string or list of index names to normalize.
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
A comma-separated string of normalized index names ready for Elasticsearch queries.
|
|
38
|
-
|
|
39
|
-
Raises:
|
|
40
|
-
SearchException: If no valid indexes are provided after parsing and stripping whitespace.
|
|
41
|
-
|
|
42
|
-
Examples:
|
|
43
|
-
>>> _normalize_indexes("logs,metrics")
|
|
44
|
-
"howler-logs_hot,howler-metrics_hot"
|
|
45
|
-
|
|
46
|
-
>>> _normalize_indexes(["*", "custom-index"])
|
|
47
|
-
"*,custom-index"
|
|
48
|
-
|
|
49
|
-
>>> _normalize_indexes("alerts, events")
|
|
50
|
-
"howler-alerts_hot,howler-events_hot"
|
|
51
|
-
"""
|
|
52
|
-
if isinstance(indexes, str):
|
|
53
|
-
parsed_indexes = [item.strip() for item in indexes.split(",") if item.strip()]
|
|
54
|
-
else:
|
|
55
|
-
parsed_indexes = [item.strip() for item in indexes if item.strip()]
|
|
56
|
-
|
|
57
|
-
if not parsed_indexes:
|
|
58
|
-
raise SearchException("No indexes were provided.")
|
|
59
|
-
|
|
60
|
-
normalized_indexes: list[str] = []
|
|
61
|
-
for index in parsed_indexes:
|
|
62
|
-
if index in {"*", "_all"} or "-" in index or "*" in index:
|
|
63
|
-
normalized_indexes.append(index)
|
|
64
|
-
else:
|
|
65
|
-
normalized_indexes.append(f"{APP_NAME}-{index}")
|
|
66
|
-
|
|
67
|
-
return ",".join(normalized_indexes)
|
|
68
|
-
|
|
69
|
-
|
|
70
27
|
def _format_items(hits: list[dict[str, Any]], user_classification: str | None) -> list[dict[str, Any]]:
|
|
71
28
|
"""Formats Elasticsearch search hits into a standardized item format.
|
|
72
29
|
|
|
@@ -86,7 +43,7 @@ def _format_items(hits: list[dict[str, Any]], user_classification: str | None) -
|
|
|
86
43
|
raw_index = hit.get("_index", None)
|
|
87
44
|
|
|
88
45
|
if raw_index:
|
|
89
|
-
source["__index"] = raw_index
|
|
46
|
+
source["__index"] = get_logical_index_name(raw_index)
|
|
90
47
|
|
|
91
48
|
if source.get("__index") == "case" and user_classification:
|
|
92
49
|
case_service.filter_case_items_by_classification(source, user_classification)
|
|
@@ -137,7 +94,7 @@ def search( # noqa: C901
|
|
|
137
94
|
del metadata
|
|
138
95
|
|
|
139
96
|
client: Elasticsearch = datastore().ds.client
|
|
140
|
-
parsed_indexes =
|
|
97
|
+
parsed_indexes = normalize_indexes(indexes)
|
|
141
98
|
|
|
142
99
|
if filters is None:
|
|
143
100
|
parsed_filters: list[str] = []
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from howler.common.loader import APP_NAME, DATASTORE_INDEX_PREFIX
|
|
2
|
+
from howler.datastore.exceptions import SearchException
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def normalize_indexes(indexes: str | list[str]) -> str:
|
|
6
|
+
"""Normalizes Elasticsearch index names into a comma-separated string.
|
|
7
|
+
|
|
8
|
+
Parses the input indexes and applies naming conventions. Special patterns like
|
|
9
|
+
wildcards, exclusions, and explicitly formatted indexes are preserved as-is.
|
|
10
|
+
Regular indexes are formatted with the datastore index prefix and '_hot' suffix.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
indexes: A comma-separated string or list of index names to normalize.
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
A comma-separated string of normalized index names ready for Elasticsearch queries.
|
|
17
|
+
|
|
18
|
+
Raises:
|
|
19
|
+
SearchException: If no valid indexes are provided after parsing and stripping whitespace.
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
>>> normalize_indexes("logs,metrics")
|
|
23
|
+
"howler-logs_hot,howler-metrics_hot"
|
|
24
|
+
|
|
25
|
+
>>> normalize_indexes(["*", "custom-index"])
|
|
26
|
+
"*,custom-index"
|
|
27
|
+
|
|
28
|
+
>>> normalize_indexes("alerts, events")
|
|
29
|
+
"howler-alerts_hot,howler-events_hot"
|
|
30
|
+
"""
|
|
31
|
+
if isinstance(indexes, str):
|
|
32
|
+
parsed_indexes = [item.strip() for item in indexes.split(",") if item.strip()]
|
|
33
|
+
else:
|
|
34
|
+
parsed_indexes = [item.strip() for item in indexes if item.strip()]
|
|
35
|
+
|
|
36
|
+
if not parsed_indexes:
|
|
37
|
+
raise SearchException("No indexes were provided.")
|
|
38
|
+
|
|
39
|
+
normalized_indexes: list[str] = []
|
|
40
|
+
for index in parsed_indexes:
|
|
41
|
+
if index in {"*", "_all"} or "-" in index or "*" in index:
|
|
42
|
+
normalized_indexes.append(index)
|
|
43
|
+
else:
|
|
44
|
+
normalized_indexes.append(f"{DATASTORE_INDEX_PREFIX}-{index}")
|
|
45
|
+
|
|
46
|
+
return ",".join(normalized_indexes)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_logical_index_name(raw_index: str) -> str:
|
|
50
|
+
"""Strip the physical datastore prefix and hot-index suffix from an index name."""
|
|
51
|
+
for index_prefix in sorted({DATASTORE_INDEX_PREFIX, APP_NAME}, key=len, reverse=True):
|
|
52
|
+
if raw_index.startswith(f"{index_prefix}-"):
|
|
53
|
+
raw_index = raw_index.removeprefix(f"{index_prefix}-")
|
|
54
|
+
break
|
|
55
|
+
|
|
56
|
+
return raw_index.removesuffix("_hot")
|
|
@@ -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.0.0.
|
|
155
|
+
version = "4.0.0.dev1297"
|
|
156
156
|
description = "Howler - API server"
|
|
157
157
|
authors = [
|
|
158
158
|
"Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
|
|
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
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/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
|
{howler_api-4.0.0.dev1283 → howler_api-4.0.0.dev1297}/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.0.0.dev1283 → howler_api-4.0.0.dev1297}/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
|