howler-api 4.0.0.dev1044__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.dev1044 → howler_api-4.0.0.dev1062}/PKG-INFO +1 -1
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v2/search.py +4 -2
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/search.py +1 -1
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/case.py +7 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/random_data.py +1 -1
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/case_service.py +39 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/search_service.py +1 -1
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/pyproject.toml +1 -1
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/README.md +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/add_label.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/add_to_case.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/change_field.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/demote.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/example_plugin.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/prioritization.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/promote.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/remove_label.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/transition.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/base.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/socket.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/action.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/analytic.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/auth.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/clue.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/configs.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/dossier.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/help.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/hit.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/notebook.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/overview.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/search.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/template.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/tool.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/user.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/utils/params.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/view.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v2/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v2/case.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v2/ingest.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/app.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/README.md +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/classification.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/classification.yml +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/exceptions.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/loader.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/logging/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/logging/audit.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/logging/format.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/net.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/net_static.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/random_user.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/swagger.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/config.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/action_queue_worker.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/correlation.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/retention.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/README.md +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/bulk.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/collection.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/constants.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/exceptions.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/howler_store.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/operations.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/schemas.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/store.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/support/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/support/build.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/support/schemas.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/types.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/error.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/README.md +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/generate_mitre.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/generate_tlds.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/reindex_data.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/wipe_databases.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/gunicorn_config.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/healthz.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/azure.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/discover.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/hit.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/oauth.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/workflow.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/ws.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/README.md +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/base.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/charter.txt +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/constants.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/helper.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/howler_enum.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/mixins.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/action.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/analytic.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/aws.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/azure.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/cbs.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/clue.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/config.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/dossier.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/gcp.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/hit.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/howler_data.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/lead.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/localized_label.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/observable.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/overview.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/pivot.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/record.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/template.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/user.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/view.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/randomizer.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/patched.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/plugins/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/plugins/config.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/README.md +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/events.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/set.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/security/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/security/socket.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/security/utils.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/action_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/analytic_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/auth_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/bundle_compat_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/config_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/correlation_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/docs_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/dossier_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/event_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/hit_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/jwt_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/lucene_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/notebook_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/observable_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/overview_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/template_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/user_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/viewer_service.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/telemetry.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/annotations.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/chunk.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/compat.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/constants.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/dict_utils.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/isotime.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/list_utils.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/lucene.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/path.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/socket_utils.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/str_utils.py +0 -0
- {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/uid.py +0 -0
|
@@ -117,6 +117,9 @@ def search(indexes: str, **kwargs):
|
|
|
117
117
|
}
|
|
118
118
|
)
|
|
119
119
|
|
|
120
|
+
# NOTE: This means index searches must be either ALL access controlled or none of them havbe access control.
|
|
121
|
+
# Otherwise, the access control requirements on one index will cause the other index to return no items.
|
|
122
|
+
# This is pretty reasonable constraint, as all the relevant, searchable items support classifications.
|
|
120
123
|
if has_access_control(index_list):
|
|
121
124
|
params["access_control"] = user["access_control"]
|
|
122
125
|
|
|
@@ -127,8 +130,7 @@ def search(indexes: str, **kwargs):
|
|
|
127
130
|
return bad_request(err="There was no search query.")
|
|
128
131
|
|
|
129
132
|
metadata = params.pop("metadata", [])
|
|
130
|
-
|
|
131
|
-
result = search_service.search(indexes, query, access_control=access_control, **params)
|
|
133
|
+
result = search_service.search(indexes, query, access_control=params.pop("access_control", None), **params)
|
|
132
134
|
|
|
133
135
|
if metadata and any(idx in index_list for idx in ["hit"]):
|
|
134
136
|
hit_service.augment_metadata(result["items"], metadata, user)
|
|
@@ -5,7 +5,7 @@ from howler.datastore.collection import ESCollection
|
|
|
5
5
|
from howler.odm.models.user import User
|
|
6
6
|
|
|
7
7
|
# List of indices where queries are protected with classification access control
|
|
8
|
-
ACCESS_CONTROLLED_INDICES: set[str] = {"hit"}
|
|
8
|
+
ACCESS_CONTROLLED_INDICES: set[str] = {"hit", "observable", "case"}
|
|
9
9
|
|
|
10
10
|
ADMIN_INDEX_MAP: dict[str, Callable[[], ESCollection]] = {}
|
|
11
11
|
|
|
@@ -2,6 +2,7 @@ from typing import Any, Optional
|
|
|
2
2
|
|
|
3
3
|
from howler import odm
|
|
4
4
|
from howler.common.exceptions import HowlerValueError
|
|
5
|
+
from howler.config import CLASSIFICATION
|
|
5
6
|
from howler.odm.constants import Status
|
|
6
7
|
from howler.odm.mixins import DatastoreMixin
|
|
7
8
|
from howler.utils.compat import StrEnum
|
|
@@ -120,6 +121,12 @@ class CaseEnrichment(odm.Model):
|
|
|
120
121
|
@odm.model(index=True, store=True, description="Case model with path-based items, enrichments, rules, and tasks.")
|
|
121
122
|
class Case(DatastoreMixin["Case"], odm.Model):
|
|
122
123
|
case_id: str = odm.UUID(description="A unique identifier for this case.")
|
|
124
|
+
classification: str = odm.Classification(
|
|
125
|
+
is_user_classification=False,
|
|
126
|
+
copyto="__text__",
|
|
127
|
+
default=CLASSIFICATION.UNRESTRICTED,
|
|
128
|
+
description="Maximum classification for the case",
|
|
129
|
+
)
|
|
123
130
|
title: str = odm.Keyword(description="Case title.")
|
|
124
131
|
summary: str = odm.Text(description="Short case summary.")
|
|
125
132
|
overview: str = odm.Optional(odm.Text(description="Markdown overview of the case."))
|
|
@@ -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):
|
|
@@ -56,7 +56,7 @@ def _normalize_indexes(indexes: str | list[str]) -> str:
|
|
|
56
56
|
if index in {"*", "_all"} or "-" in index or "*" in index:
|
|
57
57
|
normalized_indexes.append(index)
|
|
58
58
|
else:
|
|
59
|
-
normalized_indexes.append(f"{APP_NAME}-{index}
|
|
59
|
+
normalized_indexes.append(f"{APP_NAME}-{index}")
|
|
60
60
|
|
|
61
61
|
return ",".join(normalized_indexes)
|
|
62
62
|
|
|
@@ -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
|
{howler_api-4.0.0.dev1044 → 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.dev1044 → 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.dev1044 → 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
|
{howler_api-4.0.0.dev1044 → 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.dev1044 → 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.dev1044 → 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.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/comms.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/multi.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/named.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1044 → 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.dev1044 → howler_api-4.0.0.dev1062}/howler/services/bundle_compat_service.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1044 → 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
|