howler-api 4.0.0.dev993__tar.gz → 4.0.0.dev1004__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.dev993 → howler_api-4.0.0.dev1004}/PKG-INFO +1 -1
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/search.py +1 -1
- howler_api-4.0.0.dev1004/howler/common/net.py +128 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/pyproject.toml +1 -1
- howler_api-4.0.0.dev993/howler/common/net.py +0 -79
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/README.md +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/add_label.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/change_field.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/demote.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/example_plugin.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/prioritization.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/promote.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/remove_label.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/actions/transition.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/base.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/socket.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/action.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/analytic.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/auth.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/clue.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/configs.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/dossier.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/help.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/hit.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/notebook.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/overview.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/template.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/tool.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/user.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/api/v1/view.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/app.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/README.md +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/classification.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/classification.yml +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/exceptions.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/loader.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/logging/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/logging/audit.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/logging/format.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/net_static.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/random_user.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/common/swagger.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/config.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/cronjobs/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/cronjobs/action_queue_worker.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/cronjobs/retention.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/cronjobs/rules.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/README.md +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/bulk.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/collection.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/constants.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/exceptions.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/howler_store.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/operations.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/schemas.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/store.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/support/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/support/build.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/support/schemas.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/datastore/types.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/error.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/external/README.md +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/external/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/external/generate_mitre.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/external/generate_tlds.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/external/reindex_data.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/external/wipe_databases.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/gunicorn_config.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/healthz.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/helper/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/helper/azure.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/helper/discover.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/helper/hit.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/helper/oauth.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/helper/search.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/helper/workflow.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/helper/ws.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/README.md +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/base.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/charter.txt +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/helper.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/howler_enum.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/action.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/analytic.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/aws.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/azure.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/cbs.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/clue.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/config.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/dossier.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/gcp.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/hit.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/howler_data.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/lead.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/localized_label.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/overview.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/pivot.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/template.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/user.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/view.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/random_data.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/randomizer.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/patched.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/plugins/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/plugins/config.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/README.md +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/events.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/set.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/security/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/security/socket.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/security/utils.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/action_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/analytic_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/auth_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/config_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/dossier_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/event_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/hit_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/jwt_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/lucene_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/notebook_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/overview_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/template_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/services/user_service.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/telemetry.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/annotations.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/chunk.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/compat.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/constants.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/dict_utils.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/isotime.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/list_utils.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/lucene.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/path.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/socket_utils.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/str_utils.py +0 -0
- {howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/utils/uid.py +0 -0
|
@@ -715,7 +715,7 @@ def histogram(index, field, **kwargs):
|
|
|
715
715
|
params: dict[str, Any] = {}
|
|
716
716
|
if field_info is None:
|
|
717
717
|
return bad_request(err=f"Field '{field}' is not a valid field in index: {index}")
|
|
718
|
-
elif field_info["type"]
|
|
718
|
+
elif field_info["type"] in ("integer", "long"):
|
|
719
719
|
params = {"start": 0, "end": 2000, "gap": 100}
|
|
720
720
|
elif field_info["type"] == "date":
|
|
721
721
|
storage = datastore()
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import socket
|
|
2
|
+
import uuid
|
|
3
|
+
from ipaddress import IPv4Network, ip_address
|
|
4
|
+
from typing import Union
|
|
5
|
+
|
|
6
|
+
from howler.common.net_static import TLDS_ALPHA_BY_DOMAIN
|
|
7
|
+
|
|
8
|
+
# IANA Special-Use Domain Names Registry
|
|
9
|
+
# https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml
|
|
10
|
+
IANA_SPECIAL_USE_TLDS = {
|
|
11
|
+
"LOCALHOST", # RFC 6761 - loopback address
|
|
12
|
+
"TEST", # RFC 6761 - testing
|
|
13
|
+
"EXAMPLE", # RFC 6761 - documentation examples
|
|
14
|
+
"INVALID", # RFC 6761 - invalid domain names
|
|
15
|
+
"LOCAL", # RFC 6762 - mDNS/Bonjour local network names
|
|
16
|
+
"ONION", # RFC 7686 - Tor hidden services
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
# Common private network suffixes used in enterprise environments
|
|
20
|
+
# These are NOT IANA-registered but are widely used organizational conventions
|
|
21
|
+
PRIVATE_NETWORK_SUFFIXES = {
|
|
22
|
+
"INTERNAL",
|
|
23
|
+
"LAN",
|
|
24
|
+
"HOME",
|
|
25
|
+
"CORP",
|
|
26
|
+
"LOCALDOMAIN",
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def is_valid_port(value: Union[int, str, float]) -> bool:
|
|
31
|
+
"Check if a port is valid"
|
|
32
|
+
try:
|
|
33
|
+
if 1 <= int(value) <= 65535:
|
|
34
|
+
return True
|
|
35
|
+
except ValueError:
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
return False
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def is_valid_domain(
|
|
42
|
+
domain: str,
|
|
43
|
+
allow_special_use_tlds: bool = True,
|
|
44
|
+
allow_private_suffixes: bool = True,
|
|
45
|
+
) -> bool:
|
|
46
|
+
"""Check if a domain is valid.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
domain: The domain to validate.
|
|
50
|
+
allow_special_use_tlds: If True, accepts IANA special-use TLDs
|
|
51
|
+
(.localhost, .local, .onion, .test, .example, .invalid).
|
|
52
|
+
Set to False to reject these domains.
|
|
53
|
+
Defaults to True for backward compatibility.
|
|
54
|
+
allow_private_suffixes: If True, accepts common private network suffixes
|
|
55
|
+
(.internal, .lan, .home, .corp, .localdomain).
|
|
56
|
+
Set to False to reject these domains.
|
|
57
|
+
Defaults to True for backward compatibility.
|
|
58
|
+
|
|
59
|
+
Note:
|
|
60
|
+
To validate public internet domains only (e.g., for SSRF protection),
|
|
61
|
+
set both allow_special_use_tlds=False and allow_private_suffixes=False.
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
True if the domain has a valid TLD, False otherwise.
|
|
65
|
+
"""
|
|
66
|
+
if "@" in domain:
|
|
67
|
+
return False
|
|
68
|
+
|
|
69
|
+
if "." in domain:
|
|
70
|
+
tld = domain.split(".")[-1].upper()
|
|
71
|
+
if tld in TLDS_ALPHA_BY_DOMAIN:
|
|
72
|
+
return True
|
|
73
|
+
if allow_special_use_tlds and tld in IANA_SPECIAL_USE_TLDS:
|
|
74
|
+
return True
|
|
75
|
+
if allow_private_suffixes and tld in PRIVATE_NETWORK_SUFFIXES:
|
|
76
|
+
return True
|
|
77
|
+
|
|
78
|
+
return False
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def is_valid_ip(ip: str) -> bool:
|
|
82
|
+
"Check if an ip is valid"
|
|
83
|
+
parts = ip.split(".")
|
|
84
|
+
if len(parts) == 4:
|
|
85
|
+
for p in parts:
|
|
86
|
+
try:
|
|
87
|
+
if not (0 <= int(p) <= 255):
|
|
88
|
+
return False
|
|
89
|
+
except ValueError:
|
|
90
|
+
return False
|
|
91
|
+
|
|
92
|
+
if int(parts[0]) == 0:
|
|
93
|
+
return False
|
|
94
|
+
|
|
95
|
+
if int(parts[3]) == 0:
|
|
96
|
+
return False
|
|
97
|
+
|
|
98
|
+
return True
|
|
99
|
+
|
|
100
|
+
return False
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def is_ip_in_network(ip: str, network: IPv4Network) -> bool:
|
|
104
|
+
"Check if an ip is in a given network"
|
|
105
|
+
if not is_valid_ip(ip):
|
|
106
|
+
return False
|
|
107
|
+
|
|
108
|
+
return ip_address(ip) in network
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def is_valid_email(email: str) -> bool:
|
|
112
|
+
"Check if an email is valid"
|
|
113
|
+
parts = email.split("@")
|
|
114
|
+
if len(parts) == 2:
|
|
115
|
+
if is_valid_domain(parts[1]):
|
|
116
|
+
return True
|
|
117
|
+
|
|
118
|
+
return False
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def get_hostname() -> str:
|
|
122
|
+
"Get the hostname of the computer howler is running on"
|
|
123
|
+
return socket.gethostname()
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def get_mac_address() -> str:
|
|
127
|
+
"Get the mac address of the computer howler is running on"
|
|
128
|
+
return "".join(["{0:02x}".format((uuid.getnode() >> i) & 0xFF) for i in range(0, 8 * 6, 8)][::-1]).upper()
|
|
@@ -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.dev1004"
|
|
156
156
|
description = "Howler - API server"
|
|
157
157
|
authors = [
|
|
158
158
|
"Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import socket
|
|
2
|
-
import uuid
|
|
3
|
-
from ipaddress import IPv4Network, ip_address
|
|
4
|
-
from typing import Union
|
|
5
|
-
|
|
6
|
-
from howler.common.net_static import TLDS_ALPHA_BY_DOMAIN
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def is_valid_port(value: Union[int, str, float]) -> bool:
|
|
10
|
-
"Check if a port is valid"
|
|
11
|
-
try:
|
|
12
|
-
if 1 <= int(value) <= 65535:
|
|
13
|
-
return True
|
|
14
|
-
except ValueError:
|
|
15
|
-
pass
|
|
16
|
-
|
|
17
|
-
return False
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def is_valid_domain(domain: str) -> bool:
|
|
21
|
-
"Check if a domain is valid"
|
|
22
|
-
if "@" in domain:
|
|
23
|
-
return False
|
|
24
|
-
|
|
25
|
-
if "." in domain:
|
|
26
|
-
tld = domain.split(".")[-1]
|
|
27
|
-
return tld.upper() in TLDS_ALPHA_BY_DOMAIN
|
|
28
|
-
|
|
29
|
-
return False
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def is_valid_ip(ip: str) -> bool:
|
|
33
|
-
"Check if an ip is valid"
|
|
34
|
-
parts = ip.split(".")
|
|
35
|
-
if len(parts) == 4:
|
|
36
|
-
for p in parts:
|
|
37
|
-
try:
|
|
38
|
-
if not (0 <= int(p) <= 255):
|
|
39
|
-
return False
|
|
40
|
-
except ValueError:
|
|
41
|
-
return False
|
|
42
|
-
|
|
43
|
-
if int(parts[0]) == 0:
|
|
44
|
-
return False
|
|
45
|
-
|
|
46
|
-
if int(parts[3]) == 0:
|
|
47
|
-
return False
|
|
48
|
-
|
|
49
|
-
return True
|
|
50
|
-
|
|
51
|
-
return False
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
def is_ip_in_network(ip: str, network: IPv4Network) -> bool:
|
|
55
|
-
"Check if an ip is in a given network"
|
|
56
|
-
if not is_valid_ip(ip):
|
|
57
|
-
return False
|
|
58
|
-
|
|
59
|
-
return ip_address(ip) in network
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def is_valid_email(email: str) -> bool:
|
|
63
|
-
"Check if an email is valid"
|
|
64
|
-
parts = email.split("@")
|
|
65
|
-
if len(parts) == 2:
|
|
66
|
-
if is_valid_domain(parts[1]):
|
|
67
|
-
return True
|
|
68
|
-
|
|
69
|
-
return False
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def get_hostname() -> str:
|
|
73
|
-
"Get the hostname of the computer howler is running on"
|
|
74
|
-
return socket.gethostname()
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def get_mac_address() -> str:
|
|
78
|
-
"Get the mac address of the computer howler is running on"
|
|
79
|
-
return "".join(["{0:02x}".format((uuid.getnode() >> i) & 0xFF) for i in range(0, 8 * 6, 8)][::-1]).upper()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.dev993 → howler_api-4.0.0.dev1004}/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.dev993 → howler_api-4.0.0.dev1004}/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
|
{howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/odm/models/ecs/autonomous_system.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/comms.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/multi.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/named.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev993 → howler_api-4.0.0.dev1004}/howler/remote/datatypes/user_quota_tracker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|