howler-api 4.0.0.dev1056__tar.gz → 4.0.0.dev1062__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.dev1056 → howler_api-4.0.0.dev1062}/PKG-INFO +1 -1
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/random_data.py +1 -1
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/case_service.py +39 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/pyproject.toml +1 -1
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/README.md +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/add_label.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/add_to_case.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/change_field.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/demote.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/example_plugin.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/prioritization.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/promote.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/remove_label.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/actions/transition.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/base.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/socket.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/action.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/analytic.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/auth.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/clue.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/configs.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/dossier.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/help.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/hit.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/notebook.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/overview.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/search.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/template.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/tool.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/user.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/utils/params.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v1/view.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v2/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v2/case.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v2/ingest.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/api/v2/search.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/app.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/README.md +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/classification.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/classification.yml +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/exceptions.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/loader.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/logging/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/logging/audit.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/logging/format.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/net.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/net_static.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/random_user.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/common/swagger.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/config.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/cronjobs/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/cronjobs/action_queue_worker.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/cronjobs/correlation.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/cronjobs/retention.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/README.md +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/bulk.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/collection.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/constants.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/exceptions.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/howler_store.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/operations.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/schemas.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/store.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/support/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/support/build.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/support/schemas.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/datastore/types.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/error.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/external/README.md +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/external/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/external/generate_mitre.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/external/generate_tlds.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/external/reindex_data.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/external/wipe_databases.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/gunicorn_config.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/healthz.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/helper/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/helper/azure.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/helper/discover.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/helper/hit.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/helper/oauth.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/helper/search.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/helper/workflow.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/helper/ws.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/README.md +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/base.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/charter.txt +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/constants.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/helper.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/howler_enum.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/mixins.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/action.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/analytic.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/aws.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/azure.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/case.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/cbs.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/clue.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/config.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/dossier.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/gcp.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/hit.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/howler_data.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/lead.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/localized_label.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/observable.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/overview.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/pivot.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/record.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/template.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/user.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/view.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/randomizer.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/patched.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/plugins/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/plugins/config.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/README.md +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/events.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/set.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/security/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/security/socket.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/security/utils.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/action_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/analytic_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/auth_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/bundle_compat_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/config_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/correlation_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/docs_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/dossier_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/event_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/hit_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/jwt_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/lucene_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/notebook_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/observable_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/overview_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/search_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/template_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/user_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/viewer_service.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/telemetry.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/annotations.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/chunk.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/compat.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/constants.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/dict_utils.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/isotime.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/list_utils.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/lucene.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/path.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/socket_utils.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/str_utils.py +0 -0
- {howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/utils/uid.py +0 -0
|
@@ -809,7 +809,7 @@ def create_cases(ds: HowlerDatastore, num_cases: int = 5):
|
|
|
809
809
|
for idx, related_case_id in enumerate(selected_related_case_ids, start=1):
|
|
810
810
|
items.append(
|
|
811
811
|
{
|
|
812
|
-
"path": f"
|
|
812
|
+
"path": f"Related Case {idx}",
|
|
813
813
|
"type": "case",
|
|
814
814
|
"value": related_case_id,
|
|
815
815
|
}
|
|
@@ -429,6 +429,11 @@ def append_case(case_id: str, item: CaseItem) -> Case:
|
|
|
429
429
|
the referenced case is not already present in the parent case. It then persists the updated
|
|
430
430
|
parent case.
|
|
431
431
|
|
|
432
|
+
Case items are always placed at the root of the case structure (no subfolders).
|
|
433
|
+
If the supplied ``item.path`` contains folder segments (e.g. ``"folder/child-case"``),
|
|
434
|
+
those segments are stripped and only the last path component is retained. A log
|
|
435
|
+
entry is recorded whenever normalization changes the original path.
|
|
436
|
+
|
|
432
437
|
Args:
|
|
433
438
|
case_id: Unique identifier of the parent case to append the reference to.
|
|
434
439
|
item: A CaseItem whose ``value`` is the ID of an existing case to reference.
|
|
@@ -453,6 +458,40 @@ def append_case(case_id: str, item: CaseItem) -> Case:
|
|
|
453
458
|
if referenced_case is None:
|
|
454
459
|
raise NotFoundException(f"Referenced case {item.value} not found, cannot be added to case")
|
|
455
460
|
|
|
461
|
+
# Enforce root placement: case items must not live inside subfolders.
|
|
462
|
+
# Strip any leading folder segments, keeping only the last path component.
|
|
463
|
+
original_path = item.path
|
|
464
|
+
if original_path and "/" in original_path:
|
|
465
|
+
stripped_path = original_path.strip("/")
|
|
466
|
+
root_path = stripped_path.split("/")[-1] if stripped_path else None
|
|
467
|
+
else:
|
|
468
|
+
root_path = original_path
|
|
469
|
+
|
|
470
|
+
if not root_path:
|
|
471
|
+
item.path = item.value
|
|
472
|
+
elif root_path != original_path:
|
|
473
|
+
logger.info(
|
|
474
|
+
"Case item path '%s' contains folder segments; normalizing to root path '%s'",
|
|
475
|
+
original_path,
|
|
476
|
+
root_path,
|
|
477
|
+
)
|
|
478
|
+
item.path = root_path
|
|
479
|
+
_case.log.append(
|
|
480
|
+
CaseLog(
|
|
481
|
+
{
|
|
482
|
+
"timestamp": "NOW",
|
|
483
|
+
"key": "items",
|
|
484
|
+
"previous_value": original_path,
|
|
485
|
+
"new_value": root_path,
|
|
486
|
+
"user": "system",
|
|
487
|
+
"explanation": (
|
|
488
|
+
f"Case item path normalized from '{original_path}' to '{root_path}': "
|
|
489
|
+
"case references must be placed at the root of the case structure."
|
|
490
|
+
),
|
|
491
|
+
}
|
|
492
|
+
)
|
|
493
|
+
)
|
|
494
|
+
|
|
456
495
|
_case.items.append(item)
|
|
457
496
|
|
|
458
497
|
if not datastore().case.save(_case.case_id, _case):
|
|
@@ -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.dev1062"
|
|
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.dev1056 → howler_api-4.0.0.dev1062}/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.0.0.dev1056 → howler_api-4.0.0.dev1062}/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.dev1056 → howler_api-4.0.0.dev1062}/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.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/autonomous_system.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/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.0.0.dev1056 → howler_api-4.0.0.dev1062}/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
|
{howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/comms.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/multi.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/named.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/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.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/bundle_compat_service.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1056 → howler_api-4.0.0.dev1062}/howler/services/correlation_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
|