howler-api 4.0.0.dev1084__tar.gz → 4.0.0.dev1088__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/PKG-INFO +1 -1
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/socket.py +12 -2
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/security/socket.py +27 -2
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/pyproject.toml +1 -1
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/README.md +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/add_label.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/add_to_case.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/change_field.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/demote.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/example_plugin.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/prioritization.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/promote.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/remove_label.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/actions/transition.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/base.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/action.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/analytic.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/auth.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/clue.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/configs.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/dossier.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/help.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/hit.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/notebook.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/overview.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/search.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/template.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/tool.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/user.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/utils/params.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v1/view.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v2/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v2/case.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v2/ingest.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/api/v2/search.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/app.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/README.md +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/classification.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/classification.yml +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/exceptions.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/loader.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/logging/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/logging/audit.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/logging/format.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/net.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/net_static.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/random_user.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/common/swagger.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/config.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/cronjobs/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/cronjobs/action_queue_worker.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/cronjobs/correlation.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/cronjobs/retention.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/README.md +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/bulk.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/collection.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/constants.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/exceptions.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/howler_store.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/operations.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/schemas.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/store.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/support/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/support/build.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/support/schemas.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/types.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/error.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/external/README.md +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/external/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/external/generate_mitre.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/external/generate_tlds.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/external/reindex_data.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/external/wipe_databases.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/gunicorn_config.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/healthz.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/helper/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/helper/azure.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/helper/discover.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/helper/hit.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/helper/oauth.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/helper/search.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/helper/workflow.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/helper/ws.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/README.md +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/base.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/charter.txt +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/constants.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/helper.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/howler_enum.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/mixins.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/action.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/analytic.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/aws.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/azure.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/case.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/cbs.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/clue.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/config.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/dossier.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/event.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/gcp.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/hit.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/howler_data.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/lead.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/localized_label.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/overview.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/pivot.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/record.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/template.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/user.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/view.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/random_data.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/randomizer.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/patched.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/plugins/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/plugins/config.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/README.md +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/events.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/set.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/security/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/security/utils.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/action_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/analytic_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/auth_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/bundle_compat_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/case_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/comms_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/config_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/correlation_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/docs_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/dossier_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/event_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/hit_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/jwt_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/lucene_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/notebook_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/overview_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/search_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/template_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/user_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/viewer_service.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/telemetry.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/annotations.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/chunk.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/compat.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/constants.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/dict_utils.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/isotime.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/list_utils.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/lucene.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/path.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/socket_utils.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/str_utils.py +0 -0
- {howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/utils/uid.py +0 -0
|
@@ -82,6 +82,7 @@ def connect(ws: Server, *args: Any, ws_id: str, **kwargs): # noqa: C901
|
|
|
82
82
|
Result Example:
|
|
83
83
|
A continuous websocket connection
|
|
84
84
|
"""
|
|
85
|
+
logger.info("%s: WS connect handler started", ws_id)
|
|
85
86
|
outstanding_actions: list[tuple[str, str, bool]] = []
|
|
86
87
|
|
|
87
88
|
def send_hit(data: dict[str, Any]):
|
|
@@ -105,6 +106,10 @@ def connect(ws: Server, *args: Any, ws_id: str, **kwargs): # noqa: C901
|
|
|
105
106
|
ws.send(ws_response("viewers_update", data))
|
|
106
107
|
|
|
107
108
|
try:
|
|
109
|
+
logger.debug(
|
|
110
|
+
"%s: Registering comms listeners: hits, broadcast, action, cases, viewers_update",
|
|
111
|
+
ws_id,
|
|
112
|
+
)
|
|
108
113
|
comms_service.on("hits", send_hit)
|
|
109
114
|
comms_service.on("broadcast", send_broadcast)
|
|
110
115
|
comms_service.on("action", send_action)
|
|
@@ -114,6 +119,7 @@ def connect(ws: Server, *args: Any, ws_id: str, **kwargs): # noqa: C901
|
|
|
114
119
|
data = ws.receive(10)
|
|
115
120
|
if data:
|
|
116
121
|
obj = json.loads(data)
|
|
122
|
+
logger.debug("%s: Received message: keys=%s", ws_id, list(obj.keys()))
|
|
117
123
|
|
|
118
124
|
if "id" not in obj or "action" not in obj or "broadcast" not in obj:
|
|
119
125
|
ws.close(
|
|
@@ -125,19 +131,22 @@ def connect(ws: Server, *args: Any, ws_id: str, **kwargs): # noqa: C901
|
|
|
125
131
|
message="Sent data is invalid.",
|
|
126
132
|
),
|
|
127
133
|
)
|
|
134
|
+
logger.warning("%s: Closed due to invalid payload: %s", ws_id, obj)
|
|
128
135
|
return
|
|
129
136
|
|
|
130
137
|
outstanding_actions = check_action(
|
|
131
138
|
obj["id"], obj["action"], obj["broadcast"], outstanding_actions=outstanding_actions, **kwargs
|
|
132
139
|
)
|
|
140
|
+
logger.debug("%s: Outstanding actions count=%s", ws_id, len(outstanding_actions))
|
|
133
141
|
else:
|
|
134
|
-
logger.debug(
|
|
142
|
+
logger.debug("%s listening", ws_id)
|
|
135
143
|
except Exception as e:
|
|
136
144
|
if isinstance(e, ConnectionClosed):
|
|
137
145
|
raise
|
|
138
146
|
else:
|
|
139
|
-
logger.exception("Exception
|
|
147
|
+
logger.exception("%s: Exception in connect loop", ws_id)
|
|
140
148
|
finally:
|
|
149
|
+
logger.debug("%s: Deregistering comms listeners", ws_id)
|
|
141
150
|
comms_service.off("hits", send_hit)
|
|
142
151
|
comms_service.off("broadcast", send_broadcast)
|
|
143
152
|
comms_service.off("action", send_action)
|
|
@@ -146,3 +155,4 @@ def connect(ws: Server, *args: Any, ws_id: str, **kwargs): # noqa: C901
|
|
|
146
155
|
|
|
147
156
|
for id, action, broadcast in outstanding_actions:
|
|
148
157
|
outstanding_actions = check_action(id, action, broadcast, outstanding_actions=outstanding_actions, **kwargs)
|
|
158
|
+
logger.info("%s: WS connect handler finished", ws_id)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import functools
|
|
2
2
|
import json
|
|
3
3
|
import uuid
|
|
4
|
-
from typing import Optional, cast
|
|
4
|
+
from typing import Any, Optional, cast
|
|
5
5
|
|
|
6
6
|
from flask import request
|
|
7
7
|
from jwt import InvalidTokenError
|
|
@@ -41,9 +41,32 @@ def websocket_auth(required_type: Optional[list[str]] = None, required_priv: Opt
|
|
|
41
41
|
ws_id = str(uuid.uuid4())
|
|
42
42
|
ws = None
|
|
43
43
|
try:
|
|
44
|
+
logger.info("%s: Incoming websocket request", ws_id)
|
|
45
|
+
handshake_ctx: dict[str, Any] = {
|
|
46
|
+
"remote_addr": request.environ.get("REMOTE_ADDR"),
|
|
47
|
+
"remote_port": request.environ.get("REMOTE_PORT"),
|
|
48
|
+
"x_forwarded_for": request.environ.get("HTTP_X_FORWARDED_FOR"),
|
|
49
|
+
"x_forwarded_proto": request.environ.get("HTTP_X_FORWARDED_PROTO"),
|
|
50
|
+
"host": request.environ.get("HTTP_HOST"),
|
|
51
|
+
"connection": request.environ.get("HTTP_CONNECTION"),
|
|
52
|
+
"upgrade": request.environ.get("HTTP_UPGRADE"),
|
|
53
|
+
"sec_websocket_key": request.environ.get("HTTP_SEC_WEBSOCKET_KEY"),
|
|
54
|
+
"sec_websocket_version": request.environ.get("HTTP_SEC_WEBSOCKET_VERSION"),
|
|
55
|
+
"sec_websocket_protocol": request.environ.get("HTTP_SEC_WEBSOCKET_PROTOCOL"),
|
|
56
|
+
"path_info": request.environ.get("PATH_INFO"),
|
|
57
|
+
"request_id": request.environ.get("HTTP_X_REQUEST_ID"),
|
|
58
|
+
}
|
|
59
|
+
logger.debug("%s: Websocket request context: %s", ws_id, handshake_ctx)
|
|
44
60
|
ws = Server(request.environ, ping_interval=5)
|
|
61
|
+
logger.info("%s: Websocket upgrade established", ws_id)
|
|
45
62
|
|
|
46
63
|
auth_header = cast(str, ws.receive())
|
|
64
|
+
logger.debug(
|
|
65
|
+
"%s: Received auth header; bearer_prefix=%s; length=%s",
|
|
66
|
+
ws_id,
|
|
67
|
+
bool(auth_header and auth_header.strip().lower().startswith("bearer ")),
|
|
68
|
+
len(auth_header) if auth_header is not None else 0,
|
|
69
|
+
)
|
|
47
70
|
|
|
48
71
|
user, privs = auth_service.bearer_auth(auth_header)
|
|
49
72
|
|
|
@@ -74,6 +97,7 @@ def websocket_auth(required_type: Optional[list[str]] = None, required_priv: Opt
|
|
|
74
97
|
},
|
|
75
98
|
)
|
|
76
99
|
)
|
|
100
|
+
logger.debug("%s: Privileges: %s", ws_id, privs)
|
|
77
101
|
|
|
78
102
|
f(ws, *args, ws_id=ws_id, username=user["uname"], privs=privs, **kwargs)
|
|
79
103
|
except ConnectionClosed:
|
|
@@ -101,10 +125,11 @@ def websocket_auth(required_type: Optional[list[str]] = None, required_priv: Opt
|
|
|
101
125
|
try:
|
|
102
126
|
ws.close()
|
|
103
127
|
except Exception as e:
|
|
104
|
-
logger.debug("Exception on WS close: %s", str(e))
|
|
128
|
+
logger.debug("%s: Exception on WS close: %s", ws_id, str(e))
|
|
105
129
|
finally:
|
|
106
130
|
ws.connected = False
|
|
107
131
|
|
|
132
|
+
logger.info("%s: Websocket request finished", ws_id)
|
|
108
133
|
return ok()
|
|
109
134
|
|
|
110
135
|
return auth
|
|
@@ -152,7 +152,7 @@ suppress-none-returning = true
|
|
|
152
152
|
[tool.poetry]
|
|
153
153
|
package-mode = true
|
|
154
154
|
name = "howler-api"
|
|
155
|
-
version = "4.0.0.
|
|
155
|
+
version = "4.0.0.dev1088"
|
|
156
156
|
description = "Howler - API server"
|
|
157
157
|
authors = [
|
|
158
158
|
"Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/cronjobs/action_queue_worker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/datastore/migrations/fix_process.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/external/generate_sigma_rules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/autonomous_system.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/code_signature.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/odm/models/ecs/vulnerability.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/comms.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/multi.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/named.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/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
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/bundle_compat_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1084 → howler_api-4.0.0.dev1088}/howler/services/correlation_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|