howler-api 2.10.0.dev54__tar.gz → 2.10.0.dev62__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.10.0.dev54 → howler_api-2.10.0.dev62}/PKG-INFO +1 -1
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/hit_service.py +5 -14
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/dict_utils.py +31 -1
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/pyproject.toml +1 -1
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/README.md +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/add_label.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/change_field.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/demote.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/example_plugin.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/prioritization.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/promote.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/remove_label.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/actions/transition.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/base.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/socket.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/action.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/analytic.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/auth.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/borealis.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/configs.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/dossier.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/help.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/hit.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/notebook.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/overview.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/search.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/template.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/tool.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/user.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/api/v1/view.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/app.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/README.md +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/classification.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/classification.yml +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/exceptions.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/hexdump.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/iprange.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/loader.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/logging/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/logging/audit.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/logging/format.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/net.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/net_static.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/random_user.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/common/swagger.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/config.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/cronjobs/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/cronjobs/retention.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/cronjobs/rules.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/README.md +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/bulk.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/collection.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/constants.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/exceptions.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/howler_store.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/operations.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/schemas.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/store.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/support/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/support/build.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/support/schemas.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/datastore/types.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/error.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/external/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/external/generate_mitre.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/external/generate_tlds.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/external/reindex_data.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/external/wipe_databases.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/gunicorn_config.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/healthz.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/helper/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/helper/azure.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/helper/discover.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/helper/hit.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/helper/oauth.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/helper/search.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/helper/workflow.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/helper/ws.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/README.md +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/base.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/charter.txt +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/helper.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/howler_enum.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/action.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/analytic.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/aws.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/azure.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/cbs.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/config.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/dossier.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/gcp.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/hit.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/howler_data.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/lead.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/localized_label.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/overview.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/pivot.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/template.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/user.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/view.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/random_data.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/randomizer.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/patched.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/README.md +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/events.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/set.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/security/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/security/socket.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/security/utils.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/action_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/analytic_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/auth_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/config_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/dossier_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/event_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/jwt_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/lucene_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/notebook_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/services/user_service.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/__init__.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/annotations.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/chunk.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/isotime.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/list_utils.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/lucene.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/path.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/socket_utils.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/str_utils.py +0 -0
- {howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/utils/uid.py +0 -0
|
@@ -8,12 +8,7 @@ from prometheus_client import Counter
|
|
|
8
8
|
|
|
9
9
|
import howler.services.event_service as event_service
|
|
10
10
|
from howler.actions.promote import Escalation
|
|
11
|
-
from howler.common.exceptions import
|
|
12
|
-
HowlerTypeError,
|
|
13
|
-
HowlerValueError,
|
|
14
|
-
NotFoundException,
|
|
15
|
-
ResourceExists,
|
|
16
|
-
)
|
|
11
|
+
from howler.common.exceptions import HowlerTypeError, HowlerValueError, NotFoundException, ResourceExists
|
|
17
12
|
from howler.common.loader import APP_NAME, datastore
|
|
18
13
|
from howler.common.logging import get_logger
|
|
19
14
|
from howler.datastore.collection import ESCollection
|
|
@@ -33,15 +28,10 @@ from howler.helper.workflow import Transition, Workflow
|
|
|
33
28
|
from howler.odm.base import BANNED_FIELDS
|
|
34
29
|
from howler.odm.models.ecs.event import Event
|
|
35
30
|
from howler.odm.models.hit import Hit
|
|
36
|
-
from howler.odm.models.howler_data import
|
|
37
|
-
HitOperationType,
|
|
38
|
-
HitStatus,
|
|
39
|
-
HitStatusTransition,
|
|
40
|
-
Log,
|
|
41
|
-
)
|
|
31
|
+
from howler.odm.models.howler_data import HitOperationType, HitStatus, HitStatusTransition, Log
|
|
42
32
|
from howler.odm.models.user import User
|
|
43
33
|
from howler.services import action_service
|
|
44
|
-
from howler.utils.dict_utils import flatten
|
|
34
|
+
from howler.utils.dict_utils import extra_keys, flatten
|
|
45
35
|
from howler.utils.uid import get_random_id
|
|
46
36
|
|
|
47
37
|
log = get_logger(__file__)
|
|
@@ -313,7 +303,8 @@ def convert_hit(data: dict[str, Any], unique: bool, ignore_extra_values: bool =
|
|
|
313
303
|
|
|
314
304
|
# Check for deprecated field and unused fields
|
|
315
305
|
odm_flatten = odm.flat_fields(show_compound=True)
|
|
316
|
-
unused_keys =
|
|
306
|
+
unused_keys = extra_keys(data, set(odm_flatten.keys()) - BANNED_FIELDS)
|
|
307
|
+
|
|
317
308
|
if unused_keys and not ignore_extra_values:
|
|
318
309
|
raise HowlerValueError(f"Hit was created with invalid parameters: {', '.join(unused_keys)}")
|
|
319
310
|
deprecated_keys = set(key for key in odm_flatten.keys() & data.keys() if odm_flatten[key].deprecated)
|
|
@@ -94,7 +94,7 @@ def flatten(data: _Mapping, parent_key: Optional[str] = None, odm: Optional[type
|
|
|
94
94
|
|
|
95
95
|
|
|
96
96
|
def unflatten(data: _Mapping) -> _Mapping:
|
|
97
|
-
"
|
|
97
|
+
"Unflatten a nested dict"
|
|
98
98
|
out: dict[str, Any] = dict()
|
|
99
99
|
for k, v in data.items():
|
|
100
100
|
parts = k.split(".")
|
|
@@ -107,6 +107,36 @@ def unflatten(data: _Mapping) -> _Mapping:
|
|
|
107
107
|
return out
|
|
108
108
|
|
|
109
109
|
|
|
110
|
+
def extra_keys(data: _Mapping, keys: set[str], parent_key: Optional[str] = None) -> set[str]:
|
|
111
|
+
"Geta list of extra keys when compared to a list of permitted keys"
|
|
112
|
+
result: set[str] = set()
|
|
113
|
+
for key in data.keys():
|
|
114
|
+
if isinstance(data[key], dict):
|
|
115
|
+
result = result | extra_keys(
|
|
116
|
+
data[key],
|
|
117
|
+
{sub_key[(len(sub_key) + 1) :] for sub_key in keys if sub_key.startswith(f"{key}.")},
|
|
118
|
+
parent_key=key if not parent_key else f"{parent_key}.{key}",
|
|
119
|
+
)
|
|
120
|
+
elif isinstance(data[key], list):
|
|
121
|
+
if key in keys:
|
|
122
|
+
continue
|
|
123
|
+
|
|
124
|
+
for entry in data[key]:
|
|
125
|
+
if not isinstance(entry, dict):
|
|
126
|
+
result.add(key if not parent_key else f"{parent_key}.{key}")
|
|
127
|
+
break
|
|
128
|
+
else:
|
|
129
|
+
result = result | extra_keys(
|
|
130
|
+
entry,
|
|
131
|
+
{sub_key[(len(key) + 1) :] for sub_key in keys if sub_key.startswith(f"{key}.")},
|
|
132
|
+
parent_key=key if not parent_key else f"{parent_key}.{key}",
|
|
133
|
+
)
|
|
134
|
+
elif key not in keys:
|
|
135
|
+
result.add(key if not parent_key else f"{parent_key}.{key}")
|
|
136
|
+
|
|
137
|
+
return result
|
|
138
|
+
|
|
139
|
+
|
|
110
140
|
def prune( # noqa: C901
|
|
111
141
|
data: _Mapping, keys: list[str], fields: dict[str, "_Field"], mapping_class: type, parent_key: Optional[str] = None
|
|
112
142
|
) -> dict[str, Any]:
|
|
@@ -147,7 +147,7 @@ suppress-none-returning = true
|
|
|
147
147
|
[tool.poetry]
|
|
148
148
|
package-mode = true
|
|
149
149
|
name = "howler-api"
|
|
150
|
-
version = "2.10.0.
|
|
150
|
+
version = "2.10.0.dev62"
|
|
151
151
|
description = "Howler - API server"
|
|
152
152
|
authors = [
|
|
153
153
|
"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
|
{howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.10.0.dev54 → howler_api-2.10.0.dev62}/howler/odm/models/ecs/autonomous_system.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-2.10.0.dev54 → howler_api-2.10.0.dev62}/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
|