howler-api 3.3.0.dev763__tar.gz → 3.3.0.dev764__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-3.3.0.dev763 → howler_api-3.3.0.dev764}/PKG-INFO +2 -2
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/__init__.py +3 -1
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/clue.py +2 -2
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/cronjobs/rules.py +2 -2
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/discover.py +2 -2
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/helper.py +2 -2
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/random_data.py +8 -7
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/security/__init__.py +2 -2
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/action_service.py +2 -2
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/lucene_service.py +2 -1
- howler_api-3.3.0.dev764/howler/utils/constants.py +4 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/pyproject.toml +3 -3
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/README.md +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/add_label.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/change_field.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/demote.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/example_plugin.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/prioritization.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/promote.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/remove_label.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/transition.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/base.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/socket.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/action.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/analytic.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/auth.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/configs.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/dossier.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/help.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/hit.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/notebook.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/overview.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/search.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/template.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/tool.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/user.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/view.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/app.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/README.md +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/classification.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/classification.yml +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/exceptions.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/loader.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/logging/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/logging/audit.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/logging/format.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/net.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/net_static.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/random_user.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/swagger.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/config.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/cronjobs/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/cronjobs/retention.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/README.md +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/bulk.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/collection.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/constants.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/exceptions.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/howler_store.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/operations.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/schemas.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/store.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/support/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/support/build.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/support/schemas.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/types.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/error.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/README.md +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/generate_mitre.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/generate_tlds.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/reindex_data.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/wipe_databases.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/gunicorn_config.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/healthz.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/azure.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/hit.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/oauth.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/search.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/workflow.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/ws.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/README.md +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/base.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/charter.txt +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/howler_enum.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/action.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/analytic.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/aws.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/azure.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/cbs.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/clue.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/config.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/dossier.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/gcp.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/hit.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/howler_data.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/lead.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/localized_label.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/overview.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/pivot.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/template.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/user.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/view.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/randomizer.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/patched.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/plugins/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/plugins/config.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/README.md +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/events.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/set.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/security/socket.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/security/utils.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/analytic_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/auth_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/config_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/dossier_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/event_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/hit_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/jwt_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/notebook_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/overview_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/template_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/user_service.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/telemetry.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/__init__.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/annotations.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/chunk.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/dict_utils.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/isotime.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/list_utils.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/lucene.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/path.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/socket_utils.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/str_utils.py +0 -0
- {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/uid.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: howler-api
|
|
3
|
-
Version: 3.3.0.
|
|
3
|
+
Version: 3.3.0.dev764
|
|
4
4
|
Summary: Howler - API server
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
|
|
@@ -8,7 +8,7 @@ Author: Canadian Centre for Cyber Security
|
|
|
8
8
|
Author-email: howler@cyber.gc.ca
|
|
9
9
|
Maintainer: Matthew Rafuse
|
|
10
10
|
Maintainer-email: matthew.rafuse@cyber.gc.ca
|
|
11
|
-
Requires-Python: >=3.
|
|
11
|
+
Requires-Python: >=3.10,<4.0
|
|
12
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
14
14
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -10,6 +10,7 @@ from howler import odm
|
|
|
10
10
|
from howler.common.loader import APP_NAME
|
|
11
11
|
from howler.common.logging import get_logger, log_with_traceback
|
|
12
12
|
from howler.config import QUOTA_TRACKER, get_version
|
|
13
|
+
from howler.utils.constants import TESTING
|
|
13
14
|
from howler.utils.str_utils import safe_str
|
|
14
15
|
|
|
15
16
|
API_PREFIX = "/api"
|
|
@@ -72,7 +73,8 @@ def _make_api_response(
|
|
|
72
73
|
resp.set_cookie(k, v, secure=True, httponly=True, samesite="Lax")
|
|
73
74
|
|
|
74
75
|
RAW_API_COUNTER.labels(request.method, str(request.url_rule), status_code).inc()
|
|
75
|
-
|
|
76
|
+
if not TESTING:
|
|
77
|
+
logger.info("%s %s - %s", request.method, request.path, status_code)
|
|
76
78
|
|
|
77
79
|
return resp
|
|
78
80
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import sys
|
|
2
1
|
import time
|
|
3
2
|
from typing import Callable, Optional
|
|
4
3
|
|
|
@@ -12,6 +11,7 @@ from howler.common.swagger import generate_swagger_docs
|
|
|
12
11
|
from howler.config import cache, config
|
|
13
12
|
from howler.plugins import get_plugins
|
|
14
13
|
from howler.security import api_login
|
|
14
|
+
from howler.utils.constants import TESTING
|
|
15
15
|
|
|
16
16
|
SUB_API = "clue"
|
|
17
17
|
clue_api = make_subapi_blueprint(SUB_API, api_version=1)
|
|
@@ -22,7 +22,7 @@ logger = get_logger(__file__)
|
|
|
22
22
|
|
|
23
23
|
def skip_cache(*args):
|
|
24
24
|
"Function to skip cache in testing mode"
|
|
25
|
-
return
|
|
25
|
+
return TESTING
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
@cache.memoize(15 * 60, unless=skip_cache)
|
|
@@ -3,7 +3,6 @@ import json
|
|
|
3
3
|
import os
|
|
4
4
|
import random
|
|
5
5
|
import re
|
|
6
|
-
import sys
|
|
7
6
|
from datetime import datetime
|
|
8
7
|
from typing import Any, Optional
|
|
9
8
|
|
|
@@ -23,6 +22,7 @@ from howler.datastore.operations import OdmHelper, OdmUpdateOperation
|
|
|
23
22
|
from howler.odm.models.analytic import Analytic
|
|
24
23
|
from howler.odm.models.hit import Hit
|
|
25
24
|
from howler.odm.models.howler_data import HitOperationType
|
|
25
|
+
from howler.utils.constants import TESTING
|
|
26
26
|
|
|
27
27
|
logger = get_logger(__file__)
|
|
28
28
|
hit_helper = OdmHelper(Hit)
|
|
@@ -217,7 +217,7 @@ def register_rules(new_rule: Optional[Analytic] = None, test_override: bool = Fa
|
|
|
217
217
|
logger.error("Scheduler instance does not exist!")
|
|
218
218
|
return
|
|
219
219
|
|
|
220
|
-
if
|
|
220
|
+
if TESTING and not test_override:
|
|
221
221
|
logger.info("Skipping registration, running in a test environment")
|
|
222
222
|
return
|
|
223
223
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import sys
|
|
2
1
|
import typing
|
|
3
2
|
from typing import Optional
|
|
4
3
|
|
|
@@ -6,6 +5,7 @@ import requests
|
|
|
6
5
|
|
|
7
6
|
from howler.common.logging import get_logger
|
|
8
7
|
from howler.config import config
|
|
8
|
+
from howler.utils.constants import TESTING
|
|
9
9
|
|
|
10
10
|
logger = get_logger(__file__)
|
|
11
11
|
DISCO_CACHE = {}
|
|
@@ -20,7 +20,7 @@ def get_apps_list(discovery_url: Optional[str]) -> list[dict[str, str]]:
|
|
|
20
20
|
if discovery_url not in DISCO_CACHE:
|
|
21
21
|
apps = []
|
|
22
22
|
|
|
23
|
-
if
|
|
23
|
+
if TESTING:
|
|
24
24
|
logger.info("Skipping discovery, running in a test environment")
|
|
25
25
|
|
|
26
26
|
try:
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import random
|
|
3
|
-
import sys
|
|
4
3
|
from datetime import datetime, timedelta
|
|
5
4
|
from hashlib import md5
|
|
6
5
|
from math import ceil
|
|
@@ -29,6 +28,7 @@ from howler.odm.randomizer import (
|
|
|
29
28
|
)
|
|
30
29
|
from howler.plugins import get_plugins
|
|
31
30
|
from howler.security.utils import get_password_hash
|
|
31
|
+
from howler.utils.constants import TESTING
|
|
32
32
|
from howler.utils.uid import get_random_id
|
|
33
33
|
|
|
34
34
|
APPS = get_apps_list(discovery_url=config.ui.discover_url)
|
|
@@ -360,7 +360,7 @@ def create_users_with_username(ds: HowlerDatastore, usernames: list[str]):
|
|
|
360
360
|
)
|
|
361
361
|
ds.user.save(username, user_data)
|
|
362
362
|
|
|
363
|
-
if
|
|
363
|
+
if not TESTING:
|
|
364
364
|
logger.info("%s:%s", username, username)
|
|
365
365
|
|
|
366
366
|
ds.user.commit()
|
|
@@ -6,6 +6,7 @@ from dotenv import load_dotenv
|
|
|
6
6
|
|
|
7
7
|
from howler.odm.models.clue import Clue
|
|
8
8
|
from howler.plugins import get_plugins
|
|
9
|
+
from howler.utils.constants import TESTING
|
|
9
10
|
|
|
10
11
|
load_dotenv()
|
|
11
12
|
|
|
@@ -136,7 +137,7 @@ def create_users(ds):
|
|
|
136
137
|
)
|
|
137
138
|
ds.view.save(admin_view.view_id, admin_view)
|
|
138
139
|
|
|
139
|
-
if
|
|
140
|
+
if not TESTING:
|
|
140
141
|
logger.info("\t%s:%s", user_data.uname, admin_pass)
|
|
141
142
|
|
|
142
143
|
user_hash = get_password_hash(user_pass)
|
|
@@ -183,7 +184,7 @@ def create_users(ds):
|
|
|
183
184
|
)
|
|
184
185
|
ds.view.save(user_view.view_id, user_view)
|
|
185
186
|
|
|
186
|
-
if
|
|
187
|
+
if not TESTING:
|
|
187
188
|
logger.info("\t%s:%s", user_data.uname, user_pass)
|
|
188
189
|
|
|
189
190
|
huey_hash = get_password_hash(huey_pass)
|
|
@@ -230,7 +231,7 @@ def create_users(ds):
|
|
|
230
231
|
)
|
|
231
232
|
ds.view.save(huey_view.view_id, huey_view)
|
|
232
233
|
|
|
233
|
-
if
|
|
234
|
+
if not TESTING:
|
|
234
235
|
logger.info("\t%s:%s", huey_data.uname, huey_pass)
|
|
235
236
|
|
|
236
237
|
shawnh_view = View(
|
|
@@ -260,7 +261,7 @@ def create_users(ds):
|
|
|
260
261
|
ds.user.save("shawn-h", shawn_data)
|
|
261
262
|
ds.view.save(shawnh_view.view_id, shawnh_view)
|
|
262
263
|
|
|
263
|
-
if
|
|
264
|
+
if not TESTING:
|
|
264
265
|
logger.info("\t%s:%s", shawn_data.uname, shawnh_pass)
|
|
265
266
|
|
|
266
267
|
goose_view = View(
|
|
@@ -290,7 +291,7 @@ def create_users(ds):
|
|
|
290
291
|
ds.user.save("goose", goose_data)
|
|
291
292
|
ds.view.save(goose_view.view_id, goose_view)
|
|
292
293
|
|
|
293
|
-
if
|
|
294
|
+
if not TESTING:
|
|
294
295
|
logger.info("\t%s:%s", goose_data.uname, goose_pass)
|
|
295
296
|
|
|
296
297
|
ds.user.commit()
|
|
@@ -566,10 +567,10 @@ def create_hits(ds: HowlerDatastore, hit_count: int = 200):
|
|
|
566
567
|
|
|
567
568
|
ds.hit.commit()
|
|
568
569
|
|
|
569
|
-
if hit_idx % 25 == 0 and
|
|
570
|
+
if hit_idx % 25 == 0 and not TESTING:
|
|
570
571
|
logger.info("\tCreated %s/%s", hit_idx, hit_count)
|
|
571
572
|
|
|
572
|
-
if
|
|
573
|
+
if not TESTING:
|
|
573
574
|
logger.info("\tCreated %s/%s", hit_idx + 1, hit_count)
|
|
574
575
|
|
|
575
576
|
logger.info(
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import functools
|
|
2
|
-
import sys
|
|
3
2
|
from typing import Optional
|
|
4
3
|
|
|
5
4
|
import requests
|
|
@@ -23,6 +22,7 @@ from howler.common.logging import get_logger
|
|
|
23
22
|
from howler.common.logging.audit import audit
|
|
24
23
|
from howler.config import AUDIT, QUOTA_TRACKER, config
|
|
25
24
|
from howler.odm.models.user import User
|
|
25
|
+
from howler.utils.constants import TESTING
|
|
26
26
|
|
|
27
27
|
logger = get_logger(__file__)
|
|
28
28
|
|
|
@@ -184,7 +184,7 @@ class api_login(object): # noqa: D101, N801
|
|
|
184
184
|
)
|
|
185
185
|
|
|
186
186
|
ip = request.headers.get("X-Forwarded-For", request.remote_addr)
|
|
187
|
-
if
|
|
187
|
+
if not TESTING:
|
|
188
188
|
logger.info("Logged in as %s from %s for path %s", user["uname"], ip, request.path)
|
|
189
189
|
|
|
190
190
|
# If auditing is enabled, write this successful access to the audit logs
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import json
|
|
2
|
-
import sys
|
|
3
2
|
from typing import Any, Optional
|
|
4
3
|
|
|
5
4
|
from flask import Response
|
|
@@ -12,6 +11,7 @@ from howler.common.logging import get_logger
|
|
|
12
11
|
from howler.common.logging.audit import audit
|
|
13
12
|
from howler.odm.models.action import VALID_TRIGGERS, Action
|
|
14
13
|
from howler.odm.models.user import User
|
|
14
|
+
from howler.utils.constants import TESTING
|
|
15
15
|
from howler.utils.str_utils import sanitize_lucene_query
|
|
16
16
|
|
|
17
17
|
logger = get_logger(__file__)
|
|
@@ -67,7 +67,7 @@ def bulk_execute_on_query(query: str, trigger: str = "create", user: Optional[Us
|
|
|
67
67
|
intersected_query = f"({query}) AND ({action.query})"
|
|
68
68
|
|
|
69
69
|
if datastore().hit.search(intersected_query, rows=0)["total"] < 1:
|
|
70
|
-
if
|
|
70
|
+
if TESTING:
|
|
71
71
|
logger.debug("Action %s does not apply to query %s", action.action_id, query)
|
|
72
72
|
|
|
73
73
|
continue
|
|
@@ -17,6 +17,7 @@ from howler.common.exceptions import InvalidDataException
|
|
|
17
17
|
from howler.common.loader import datastore
|
|
18
18
|
from howler.config import redis
|
|
19
19
|
from howler.remote.datatypes.hash import Hash
|
|
20
|
+
from howler.utils.constants import TESTING
|
|
20
21
|
from howler.utils.dict_utils import flatten_deep
|
|
21
22
|
from howler.utils.lucene import coerce, normalize_phrase, try_parse_date, try_parse_ip, try_parse_number
|
|
22
23
|
|
|
@@ -235,7 +236,7 @@ def match(lucene: str, obj: dict[str, Any]):
|
|
|
235
236
|
hash_key = sha256(lucene.encode()).hexdigest()
|
|
236
237
|
|
|
237
238
|
# We cache the results back from ES, since we will frequently run the same validation queries over and over again.
|
|
238
|
-
if (normalized_query := NORMALIZED_QUERY_CACHE.get(hash_key)) is None or
|
|
239
|
+
if (normalized_query := NORMALIZED_QUERY_CACHE.get(hash_key)) is None or TESTING:
|
|
239
240
|
# This regex checks for lucene phrases (i.e. the "Example Analytic" part of howler.analytic:"Example Analytic")
|
|
240
241
|
# And then escapes them.
|
|
241
242
|
# https://regex101.com/r/8u5F6a/1
|
|
@@ -152,7 +152,7 @@ suppress-none-returning = true
|
|
|
152
152
|
[tool.poetry]
|
|
153
153
|
package-mode = true
|
|
154
154
|
name = "howler-api"
|
|
155
|
-
version = "3.3.0.
|
|
155
|
+
version = "3.3.0.dev764"
|
|
156
156
|
description = "Howler - API server"
|
|
157
157
|
authors = [
|
|
158
158
|
"Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
|
|
@@ -195,7 +195,7 @@ homepage = "https://cybercentrecanada.github.io/howler/"
|
|
|
195
195
|
repository = "https://github.com/CybercentreCanada/howler-api"
|
|
196
196
|
|
|
197
197
|
[tool.poetry.dependencies]
|
|
198
|
-
python = "^3.
|
|
198
|
+
python = "^3.10"
|
|
199
199
|
apscheduler = "3.11.2"
|
|
200
200
|
authlib = "^1.6.0"
|
|
201
201
|
chardet = "5.2.0"
|
|
@@ -240,7 +240,7 @@ pyright = {extras = ["nodejs"], version = "^1.1.408"}
|
|
|
240
240
|
mypy = "^1.6.1"
|
|
241
241
|
|
|
242
242
|
[tool.poetry.group.test.dependencies]
|
|
243
|
-
pytest = "
|
|
243
|
+
pytest = "9.0.3"
|
|
244
244
|
retrying = "^1.3.4"
|
|
245
245
|
pyftpdlib = "^1.5.9"
|
|
246
246
|
pyopenssl = ">=24.1,<27.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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-3.3.0.dev763 → howler_api-3.3.0.dev764}/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-3.3.0.dev763 → howler_api-3.3.0.dev764}/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
|
|
File without changes
|
{howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/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
|