howler-api 2.12.0.dev307__tar.gz → 2.12.0.dev313__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-2.12.0.dev307 → howler_api-2.12.0.dev313}/PKG-INFO +1 -1
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/config.py +145 -1
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/random_data.py +2 -2
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/pyproject.toml +1 -1
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/README.md +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/add_label.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/change_field.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/demote.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/example_plugin.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/prioritization.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/promote.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/remove_label.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/actions/transition.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/base.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/socket.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/action.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/analytic.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/auth.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/borealis.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/configs.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/dossier.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/help.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/hit.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/notebook.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/overview.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/search.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/template.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/tool.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/user.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/api/v1/view.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/app.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/README.md +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/classification.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/classification.yml +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/exceptions.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/hexdump.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/iprange.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/loader.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/logging/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/logging/audit.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/logging/format.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/net.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/net_static.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/random_user.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/common/swagger.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/config.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/cronjobs/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/cronjobs/retention.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/cronjobs/rules.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/README.md +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/bulk.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/collection.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/constants.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/exceptions.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/howler_store.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/operations.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/schemas.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/store.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/support/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/support/build.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/support/schemas.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/datastore/types.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/error.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/external/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/external/generate_mitre.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/external/generate_tlds.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/external/reindex_data.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/external/wipe_databases.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/gunicorn_config.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/healthz.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/helper/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/helper/azure.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/helper/discover.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/helper/hit.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/helper/oauth.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/helper/search.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/helper/workflow.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/helper/ws.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/README.md +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/base.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/charter.txt +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/helper.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/howler_enum.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/action.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/analytic.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/aws.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/azure.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/cbs.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/dossier.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/gcp.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/hit.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/howler_data.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/lead.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/localized_label.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/overview.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/pivot.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/template.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/user.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/view.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/randomizer.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/patched.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/plugins/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/plugins/config.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/README.md +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/events.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/set.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/security/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/security/socket.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/security/utils.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/action_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/analytic_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/auth_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/config_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/dossier_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/event_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/hit_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/jwt_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/lucene_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/notebook_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/overview_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/template_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/services/user_service.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/__init__.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/annotations.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/chunk.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/dict_utils.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/isotime.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/list_utils.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/lucene.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/path.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/socket_utils.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/str_utils.py +0 -0
- {howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/utils/uid.py +0 -0
|
@@ -20,11 +20,24 @@ logger.addHandler(console)
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class RedisServer(BaseModel):
|
|
23
|
+
"""Configuration for a single Redis server instance.
|
|
24
|
+
|
|
25
|
+
Defines the connection parameters for a Redis server, including
|
|
26
|
+
the hostname and port number.
|
|
27
|
+
"""
|
|
28
|
+
|
|
23
29
|
host: str = Field(description="Hostname of Redis instance")
|
|
24
30
|
port: int = Field(description="Port of Redis instance")
|
|
25
31
|
|
|
26
32
|
|
|
27
33
|
class Redis(BaseModel):
|
|
34
|
+
"""Redis configuration for Howler.
|
|
35
|
+
|
|
36
|
+
Defines connections to both persistent and non-persistent Redis instances.
|
|
37
|
+
The non-persistent instance is used for volatile data like caches, while
|
|
38
|
+
the persistent instance is used for data that needs to survive restarts.
|
|
39
|
+
"""
|
|
40
|
+
|
|
28
41
|
nonpersistent: RedisServer = Field(
|
|
29
42
|
default=RedisServer(host="127.0.0.1", port=6379), description="A volatile Redis instance"
|
|
30
43
|
)
|
|
@@ -35,6 +48,14 @@ class Redis(BaseModel):
|
|
|
35
48
|
|
|
36
49
|
|
|
37
50
|
class Host(BaseModel):
|
|
51
|
+
"""Configuration for a remote host connection.
|
|
52
|
+
|
|
53
|
+
Defines connection parameters for external services, including authentication
|
|
54
|
+
credentials (username/password or API key) and connection details.
|
|
55
|
+
Environment variables can override username and password using the pattern
|
|
56
|
+
{NAME}_HOST_USERNAME and {NAME}_HOST_PASSWORD.
|
|
57
|
+
"""
|
|
58
|
+
|
|
38
59
|
name: str = Field(description="Name of the host")
|
|
39
60
|
username: Optional[str] = Field(description="Username to login with", default=None)
|
|
40
61
|
password: Optional[str] = Field(description="Password to login with", default=None)
|
|
@@ -64,6 +85,12 @@ class Host(BaseModel):
|
|
|
64
85
|
|
|
65
86
|
|
|
66
87
|
class Datastore(BaseModel):
|
|
88
|
+
"""Datastore configuration for Howler.
|
|
89
|
+
|
|
90
|
+
Defines the backend datastore used by Howler for storing hits and metadata.
|
|
91
|
+
Currently supports Elasticsearch as the datastore type.
|
|
92
|
+
"""
|
|
93
|
+
|
|
67
94
|
hosts: list[Host] = Field(
|
|
68
95
|
default=[Host(name="elastic", username="elastic", password="devpass", scheme="http", host="localhost:9200")], # noqa: S106
|
|
69
96
|
description="List of hosts used for the datastore",
|
|
@@ -74,6 +101,13 @@ class Datastore(BaseModel):
|
|
|
74
101
|
|
|
75
102
|
|
|
76
103
|
class Logging(BaseModel):
|
|
104
|
+
"""Logging configuration for Howler.
|
|
105
|
+
|
|
106
|
+
Defines how and where Howler logs should be output, including console,
|
|
107
|
+
file, and syslog destinations. Also controls log level, format, and
|
|
108
|
+
metric export intervals.
|
|
109
|
+
"""
|
|
110
|
+
|
|
77
111
|
log_level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL", "DISABLED"] = Field(
|
|
78
112
|
default="INFO",
|
|
79
113
|
description="What level of logging should we have?",
|
|
@@ -94,6 +128,12 @@ class Logging(BaseModel):
|
|
|
94
128
|
|
|
95
129
|
|
|
96
130
|
class PasswordRequirement(BaseModel):
|
|
131
|
+
"""Password complexity requirements for internal authentication.
|
|
132
|
+
|
|
133
|
+
Defines the rules for password creation and validation, including
|
|
134
|
+
character type requirements and minimum length.
|
|
135
|
+
"""
|
|
136
|
+
|
|
97
137
|
lower: bool = Field(default=False, description="Password must contain lowercase letters")
|
|
98
138
|
number: bool = Field(default=False, description="Password must contain numbers")
|
|
99
139
|
special: bool = Field(default=False, description="Password must contain special characters")
|
|
@@ -102,6 +142,13 @@ class PasswordRequirement(BaseModel):
|
|
|
102
142
|
|
|
103
143
|
|
|
104
144
|
class Internal(BaseModel):
|
|
145
|
+
"""Internal authentication configuration.
|
|
146
|
+
|
|
147
|
+
Defines settings for Howler's built-in username/password authentication,
|
|
148
|
+
including password requirements and brute-force protection via login
|
|
149
|
+
failure tracking.
|
|
150
|
+
"""
|
|
151
|
+
|
|
105
152
|
enabled: bool = Field(default=True, description="Internal authentication allowed?")
|
|
106
153
|
failure_ttl: int = Field(
|
|
107
154
|
default=60, description="How long to wait after `max_failures` before re-attempting login?"
|
|
@@ -111,6 +158,13 @@ class Internal(BaseModel):
|
|
|
111
158
|
|
|
112
159
|
|
|
113
160
|
class OAuthAutoProperty(BaseModel):
|
|
161
|
+
"""Automatic property assignment based on OAuth attributes.
|
|
162
|
+
|
|
163
|
+
Defines rules for automatically assigning user properties (roles,
|
|
164
|
+
classifications, or access levels) based on pattern matching against
|
|
165
|
+
OAuth provider data.
|
|
166
|
+
"""
|
|
167
|
+
|
|
114
168
|
field: str = Field(description="Field to apply `pattern` to")
|
|
115
169
|
pattern: str = Field(description="Regex pattern for auto-prop assignment")
|
|
116
170
|
type: Literal["access", "classification", "role"] = Field(
|
|
@@ -120,6 +174,13 @@ class OAuthAutoProperty(BaseModel):
|
|
|
120
174
|
|
|
121
175
|
|
|
122
176
|
class OAuthProvider(BaseModel):
|
|
177
|
+
"""OAuth provider configuration.
|
|
178
|
+
|
|
179
|
+
Defines the connection and authentication settings for an OAuth 2.0 provider.
|
|
180
|
+
Includes user auto-creation, group mapping, JWT validation, and various
|
|
181
|
+
OAuth endpoints required for the authentication flow.
|
|
182
|
+
"""
|
|
183
|
+
|
|
123
184
|
auto_create: bool = Field(default=True, description="Auto-create users if they are missing")
|
|
124
185
|
auto_sync: bool = Field(default=False, description="Should we automatically sync with OAuth provider?")
|
|
125
186
|
auto_properties: list[OAuthAutoProperty] = Field(
|
|
@@ -191,6 +252,13 @@ class OAuthProvider(BaseModel):
|
|
|
191
252
|
|
|
192
253
|
|
|
193
254
|
class OAuth(BaseModel):
|
|
255
|
+
"""OAuth authentication configuration.
|
|
256
|
+
|
|
257
|
+
Top-level OAuth settings including enabling/disabling OAuth authentication,
|
|
258
|
+
Gravatar integration, and a dictionary of configured OAuth providers.
|
|
259
|
+
Also controls API key lifetime restrictions for OAuth-authenticated users.
|
|
260
|
+
"""
|
|
261
|
+
|
|
194
262
|
enabled: bool = Field(default=False, description="Enable use of OAuth?")
|
|
195
263
|
gravatar_enabled: bool = Field(default=True, description="Enable gravatar?")
|
|
196
264
|
providers: dict[str, OAuthProvider] = Field(
|
|
@@ -204,6 +272,13 @@ class OAuth(BaseModel):
|
|
|
204
272
|
|
|
205
273
|
|
|
206
274
|
class Auth(BaseModel):
|
|
275
|
+
"""Authentication configuration for Howler.
|
|
276
|
+
|
|
277
|
+
Configures all authentication methods supported by Howler, including
|
|
278
|
+
internal username/password authentication and OAuth providers. Also
|
|
279
|
+
controls API key settings and restrictions.
|
|
280
|
+
"""
|
|
281
|
+
|
|
207
282
|
allow_apikeys: bool = Field(default=True, description="Allow API keys?")
|
|
208
283
|
allow_extended_apikeys: bool = Field(default=True, description="Allow extended API keys?")
|
|
209
284
|
max_apikey_duration_amount: Optional[int] = Field(
|
|
@@ -218,17 +293,34 @@ class Auth(BaseModel):
|
|
|
218
293
|
|
|
219
294
|
|
|
220
295
|
class APMServer(BaseModel):
|
|
221
|
-
"APM server configuration
|
|
296
|
+
"""Application Performance Monitoring (APM) server configuration.
|
|
297
|
+
|
|
298
|
+
Defines the connection details for an external APM server used to
|
|
299
|
+
collect and analyze application performance metrics.
|
|
300
|
+
"""
|
|
222
301
|
|
|
223
302
|
server_url: Optional[str] = Field(default=None, description="URL to API server")
|
|
224
303
|
token: Optional[str] = Field(default=None, description="Authentication token for server")
|
|
225
304
|
|
|
226
305
|
|
|
227
306
|
class Metrics(BaseModel):
|
|
307
|
+
"""Metrics collection configuration.
|
|
308
|
+
|
|
309
|
+
Configures how Howler collects and exports application metrics,
|
|
310
|
+
including integration with external APM servers.
|
|
311
|
+
"""
|
|
312
|
+
|
|
228
313
|
apm_server: APMServer = APMServer()
|
|
229
314
|
|
|
230
315
|
|
|
231
316
|
class Retention(BaseModel):
|
|
317
|
+
"""Hit retention policy configuration.
|
|
318
|
+
|
|
319
|
+
Defines the automatic data retention policy for hits, including
|
|
320
|
+
the maximum age of hits before they are purged and the schedule
|
|
321
|
+
for running the retention cleanup job.
|
|
322
|
+
"""
|
|
323
|
+
|
|
232
324
|
enabled: bool = Field(
|
|
233
325
|
default=True,
|
|
234
326
|
description=(
|
|
@@ -251,6 +343,12 @@ class Retention(BaseModel):
|
|
|
251
343
|
|
|
252
344
|
|
|
253
345
|
class ViewCleanup(BaseModel):
|
|
346
|
+
"""View cleanup job configuration.
|
|
347
|
+
|
|
348
|
+
Defines the schedule and behavior for cleaning up stale dashboard views
|
|
349
|
+
that reference non-existent backend data.
|
|
350
|
+
"""
|
|
351
|
+
|
|
254
352
|
enabled: bool = Field(
|
|
255
353
|
default=True,
|
|
256
354
|
description=(
|
|
@@ -265,6 +363,13 @@ class ViewCleanup(BaseModel):
|
|
|
265
363
|
|
|
266
364
|
|
|
267
365
|
class System(BaseModel):
|
|
366
|
+
"""System-level configuration for Howler.
|
|
367
|
+
|
|
368
|
+
Defines global system settings including deployment type (production,
|
|
369
|
+
staging, or development) and configuration for automated maintenance
|
|
370
|
+
jobs like data retention and view cleanup.
|
|
371
|
+
"""
|
|
372
|
+
|
|
268
373
|
type: Literal["production", "staging", "development"] = Field(default="development", description="Type of system")
|
|
269
374
|
retention: Retention = Retention()
|
|
270
375
|
"Retention Configuration"
|
|
@@ -273,6 +378,13 @@ class System(BaseModel):
|
|
|
273
378
|
|
|
274
379
|
|
|
275
380
|
class UI(BaseModel):
|
|
381
|
+
"""User interface and web server configuration.
|
|
382
|
+
|
|
383
|
+
Defines settings for the Howler web UI including Flask configuration,
|
|
384
|
+
session validation, API auditing, static file locations, and WebSocket
|
|
385
|
+
integration for real-time updates.
|
|
386
|
+
"""
|
|
387
|
+
|
|
276
388
|
audit: bool = Field(description="Should API calls be audited and saved to a separate log file?", default=True)
|
|
277
389
|
debug: bool = Field(default=False, description="Enable debugging?")
|
|
278
390
|
static_folder: Optional[str] = Field(
|
|
@@ -298,6 +410,13 @@ class UI(BaseModel):
|
|
|
298
410
|
|
|
299
411
|
|
|
300
412
|
class Borealis(BaseModel):
|
|
413
|
+
"""Borealis enrichment service integration configuration.
|
|
414
|
+
|
|
415
|
+
Defines settings for integrating with Borealis, an external enrichment
|
|
416
|
+
service that can provide additional context and status information for
|
|
417
|
+
hits displayed in the Howler UI.
|
|
418
|
+
"""
|
|
419
|
+
|
|
301
420
|
enabled: bool = Field(default=False, description="Should borealis integration be enabled?")
|
|
302
421
|
|
|
303
422
|
url: str = Field(
|
|
@@ -312,6 +431,13 @@ class Borealis(BaseModel):
|
|
|
312
431
|
|
|
313
432
|
|
|
314
433
|
class Notebook(BaseModel):
|
|
434
|
+
"""Jupyter notebook integration configuration.
|
|
435
|
+
|
|
436
|
+
Defines settings for integrating with nbgallery, a collaborative
|
|
437
|
+
Jupyter notebook platform, allowing users to access and share
|
|
438
|
+
notebooks related to their Howler analysis work.
|
|
439
|
+
"""
|
|
440
|
+
|
|
315
441
|
enabled: bool = Field(default=False, description="Should nbgallery notebook integration be enabled?")
|
|
316
442
|
|
|
317
443
|
scope: Optional[str] = Field(default=None, description="The scope expected by nbgallery for JWTs")
|
|
@@ -322,6 +448,13 @@ class Notebook(BaseModel):
|
|
|
322
448
|
|
|
323
449
|
|
|
324
450
|
class Core(BaseModel):
|
|
451
|
+
"""Core application configuration for Howler.
|
|
452
|
+
|
|
453
|
+
Aggregates all core service configurations including Redis, metrics,
|
|
454
|
+
and external integrations like Borealis and nbgallery notebooks.
|
|
455
|
+
Also manages the loading of external plugins.
|
|
456
|
+
"""
|
|
457
|
+
|
|
325
458
|
plugins: set[str] = Field(description="A list of external plugins to load", default=set())
|
|
326
459
|
|
|
327
460
|
metrics: Metrics = Metrics()
|
|
@@ -379,6 +512,17 @@ logger.info("Fetching configuration files from %s", ":".join(str(c) for c in con
|
|
|
379
512
|
|
|
380
513
|
|
|
381
514
|
class Config(BaseSettings):
|
|
515
|
+
"""Main Howler configuration model.
|
|
516
|
+
|
|
517
|
+
The root configuration object that aggregates all configuration sections
|
|
518
|
+
including authentication, datastore, logging, system settings, UI, and core
|
|
519
|
+
services. Configuration can be loaded from YAML files or environment variables
|
|
520
|
+
with the HWL_ prefix.
|
|
521
|
+
|
|
522
|
+
Environment variables use double underscores (__) for nested properties.
|
|
523
|
+
For example: HWL_DATASTORE__TYPE=elasticsearch
|
|
524
|
+
"""
|
|
525
|
+
|
|
382
526
|
auth: Auth = Auth()
|
|
383
527
|
core: Core = Core()
|
|
384
528
|
datastore: Datastore = Datastore()
|
|
@@ -821,14 +821,14 @@ def wipe_dossiers(ds: HowlerDatastore):
|
|
|
821
821
|
def setup_hits(ds):
|
|
822
822
|
"Set up hits index"
|
|
823
823
|
os.environ["ELASTIC_HIT_SHARDS"] = "1"
|
|
824
|
-
os.environ["ELASTIC_HIT_REPLICAS"] = "
|
|
824
|
+
os.environ["ELASTIC_HIT_REPLICAS"] = "1"
|
|
825
825
|
ds.hit.fix_shards()
|
|
826
826
|
ds.hit.fix_replicas()
|
|
827
827
|
|
|
828
828
|
|
|
829
829
|
def setup_users(ds):
|
|
830
830
|
"Set up users index"
|
|
831
|
-
os.environ["ELASTIC_USER_REPLICAS"] = "
|
|
831
|
+
os.environ["ELASTIC_USER_REPLICAS"] = "1"
|
|
832
832
|
os.environ["ELASTIC_USER_AVATAR_REPLICAS"] = "1"
|
|
833
833
|
ds.user.fix_replicas()
|
|
834
834
|
ds.user_avatar.fix_replicas()
|
|
@@ -148,7 +148,7 @@ suppress-none-returning = true
|
|
|
148
148
|
[tool.poetry]
|
|
149
149
|
package-mode = true
|
|
150
150
|
name = "howler-api"
|
|
151
|
-
version = "2.12.0.
|
|
151
|
+
version = "2.12.0.dev313"
|
|
152
152
|
description = "Howler - API server"
|
|
153
153
|
authors = [
|
|
154
154
|
"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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/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
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/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
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/odm/models/ecs/autonomous_system.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/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-2.12.0.dev307 → howler_api-2.12.0.dev313}/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
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/comms.py
RENAMED
|
File without changes
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/multi.py
RENAMED
|
File without changes
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/named.py
RENAMED
|
File without changes
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-2.12.0.dev307 → howler_api-2.12.0.dev313}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|