howler-api 4.1.0.dev1346__tar.gz → 4.1.0.dev1368__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.
Files changed (225) hide show
  1. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/PKG-INFO +2 -2
  2. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/hit.py +4 -2
  3. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/tool.py +4 -2
  4. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/ingest.py +2 -25
  5. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/correlation_service.py +35 -11
  6. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/pyproject.toml +2 -2
  7. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/README.md +0 -0
  8. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/__init__.py +0 -0
  9. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/__init__.py +0 -0
  10. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/add_label.py +0 -0
  11. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/add_to_bundle.py +0 -0
  12. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/add_to_case.py +0 -0
  13. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/change_field.py +0 -0
  14. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/demote.py +0 -0
  15. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/example_plugin.py +0 -0
  16. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/prioritization.py +0 -0
  17. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/promote.py +0 -0
  18. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/remove_from_bundle.py +0 -0
  19. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/remove_label.py +0 -0
  20. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/actions/transition.py +0 -0
  21. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/__init__.py +0 -0
  22. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/base.py +0 -0
  23. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/socket.py +0 -0
  24. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/__init__.py +0 -0
  25. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/action.py +0 -0
  26. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/analytic.py +0 -0
  27. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/auth.py +0 -0
  28. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/clue.py +0 -0
  29. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/configs.py +0 -0
  30. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/dossier.py +0 -0
  31. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/help.py +0 -0
  32. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/notebook.py +0 -0
  33. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/overview.py +0 -0
  34. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/search.py +0 -0
  35. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/template.py +0 -0
  36. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/user.py +0 -0
  37. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/utils/__init__.py +0 -0
  38. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/utils/etag.py +0 -0
  39. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/utils/params.py +0 -0
  40. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v1/view.py +0 -0
  41. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/__init__.py +0 -0
  42. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/case.py +0 -0
  43. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/fuzzy.py +0 -0
  44. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/api/v2/search.py +0 -0
  45. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/app.py +0 -0
  46. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/README.md +0 -0
  47. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/__init__.py +0 -0
  48. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/classification.py +0 -0
  49. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/classification.yml +0 -0
  50. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/exceptions.py +0 -0
  51. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/loader.py +0 -0
  52. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/logging/__init__.py +0 -0
  53. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/logging/audit.py +0 -0
  54. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/logging/format.py +0 -0
  55. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/net.py +0 -0
  56. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/net_static.py +0 -0
  57. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/random_user.py +0 -0
  58. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/common/swagger.py +0 -0
  59. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/config.py +0 -0
  60. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/__init__.py +0 -0
  61. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/action_queue_worker.py +0 -0
  62. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/correlation.py +0 -0
  63. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/retention.py +0 -0
  64. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/cronjobs/view_cleanup.py +0 -0
  65. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/README.md +0 -0
  66. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/__init__.py +0 -0
  67. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/bulk.py +0 -0
  68. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/collection.py +0 -0
  69. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/constants.py +0 -0
  70. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/exceptions.py +0 -0
  71. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/howler_store.py +0 -0
  72. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/migrations/fix_process.py +0 -0
  73. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/operations.py +0 -0
  74. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/schemas.py +0 -0
  75. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/store.py +0 -0
  76. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/support/__init__.py +0 -0
  77. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/support/build.py +0 -0
  78. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/support/schemas.py +0 -0
  79. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/datastore/types.py +0 -0
  80. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/error.py +0 -0
  81. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/README.md +0 -0
  82. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/__init__.py +0 -0
  83. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/generate_mitre.py +0 -0
  84. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/generate_sigma_rules.py +0 -0
  85. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/generate_tlds.py +0 -0
  86. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/reindex_data.py +0 -0
  87. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/external/wipe_databases.py +0 -0
  88. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/gunicorn_config.py +0 -0
  89. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/healthz.py +0 -0
  90. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/__init__.py +0 -0
  91. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/azure.py +0 -0
  92. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/discover.py +0 -0
  93. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/hit.py +0 -0
  94. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/oauth.py +0 -0
  95. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/search.py +0 -0
  96. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/workflow.py +0 -0
  97. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/helper/ws.py +0 -0
  98. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/README.md +0 -0
  99. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/__init__.py +0 -0
  100. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/base.py +0 -0
  101. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/charter.txt +0 -0
  102. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/constants.py +0 -0
  103. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/helper.py +0 -0
  104. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/howler_enum.py +0 -0
  105. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/mixins.py +0 -0
  106. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/__init__.py +0 -0
  107. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/action.py +0 -0
  108. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/analytic.py +0 -0
  109. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/assemblyline.py +0 -0
  110. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/aws.py +0 -0
  111. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/azure.py +0 -0
  112. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/case.py +0 -0
  113. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/cbs.py +0 -0
  114. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/clue.py +0 -0
  115. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/config.py +0 -0
  116. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/dossier.py +0 -0
  117. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/__init__.py +0 -0
  118. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/agent.py +0 -0
  119. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/autonomous_system.py +0 -0
  120. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/client.py +0 -0
  121. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/cloud.py +0 -0
  122. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/code_signature.py +0 -0
  123. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/container.py +0 -0
  124. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/dns.py +0 -0
  125. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/egress.py +0 -0
  126. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/elf.py +0 -0
  127. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/email.py +0 -0
  128. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/error.py +0 -0
  129. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/event.py +0 -0
  130. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/faas.py +0 -0
  131. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/file.py +0 -0
  132. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/geo.py +0 -0
  133. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/group.py +0 -0
  134. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/hash.py +0 -0
  135. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/host.py +0 -0
  136. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/http.py +0 -0
  137. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/ingress.py +0 -0
  138. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/interface.py +0 -0
  139. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/network.py +0 -0
  140. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/observer.py +0 -0
  141. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/organization.py +0 -0
  142. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/os.py +0 -0
  143. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/pe.py +0 -0
  144. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/process.py +0 -0
  145. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/registry.py +0 -0
  146. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/related.py +0 -0
  147. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/rule.py +0 -0
  148. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/server.py +0 -0
  149. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/threat.py +0 -0
  150. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/tls.py +0 -0
  151. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/url.py +0 -0
  152. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/user.py +0 -0
  153. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/user_agent.py +0 -0
  154. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/ecs/vulnerability.py +0 -0
  155. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/event.py +0 -0
  156. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/gcp.py +0 -0
  157. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/hit.py +0 -0
  158. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/howler_data.py +0 -0
  159. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/lead.py +0 -0
  160. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/localized_label.py +0 -0
  161. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/overview.py +0 -0
  162. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/pivot.py +0 -0
  163. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/record.py +0 -0
  164. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/template.py +0 -0
  165. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/user.py +0 -0
  166. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/models/view.py +0 -0
  167. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/random_data.py +0 -0
  168. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/odm/randomizer.py +0 -0
  169. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/patched.py +0 -0
  170. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/plugins/__init__.py +0 -0
  171. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/plugins/config.py +0 -0
  172. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/__init__.py +0 -0
  173. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/README.md +0 -0
  174. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/__init__.py +0 -0
  175. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/counters.py +0 -0
  176. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/events.py +0 -0
  177. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/hash.py +0 -0
  178. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/lock.py +0 -0
  179. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/__init__.py +0 -0
  180. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/comms.py +0 -0
  181. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/multi.py +0 -0
  182. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/named.py +0 -0
  183. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/queues/priority.py +0 -0
  184. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/set.py +0 -0
  185. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  186. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/security/__init__.py +0 -0
  187. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/security/socket.py +0 -0
  188. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/security/utils.py +0 -0
  189. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/__init__.py +0 -0
  190. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/action_service.py +0 -0
  191. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/analytic_service.py +0 -0
  192. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/auth_service.py +0 -0
  193. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/bundle_compat_service.py +0 -0
  194. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/case_service.py +0 -0
  195. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/comms_service.py +0 -0
  196. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/config_service.py +0 -0
  197. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/docs_service.py +0 -0
  198. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/dossier_service.py +0 -0
  199. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/event_service.py +0 -0
  200. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/fuzzy_service.py +0 -0
  201. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/hit_service.py +0 -0
  202. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/jwt_service.py +0 -0
  203. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/lucene_service.py +0 -0
  204. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/notebook_service.py +0 -0
  205. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/overview_service.py +0 -0
  206. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/search_service.py +0 -0
  207. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/template_service.py +0 -0
  208. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/user_service.py +0 -0
  209. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/services/viewer_service.py +0 -0
  210. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/telemetry.py +0 -0
  211. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/__init__.py +0 -0
  212. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/annotations.py +0 -0
  213. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/chunk.py +0 -0
  214. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/compat.py +0 -0
  215. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/constants.py +0 -0
  216. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/dict_utils.py +0 -0
  217. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/indexes.py +0 -0
  218. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/isotime.py +0 -0
  219. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/list_utils.py +0 -0
  220. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/lucene.py +0 -0
  221. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/net_utils.py +0 -0
  222. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/path.py +0 -0
  223. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/socket_utils.py +0 -0
  224. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/str_utils.py +0 -0
  225. {howler_api-4.1.0.dev1346 → howler_api-4.1.0.dev1368}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 4.1.0.dev1346
3
+ Version: 4.1.0.dev1368
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -50,7 +50,7 @@ Requires-Dist: python-datemath (==3.0.3)
50
50
  Requires-Dist: python-dotenv (>=1.1.0,<2.0.0)
51
51
  Requires-Dist: pytz (>=2025.2,<2026.0)
52
52
  Requires-Dist: pyyaml (==6.0.3)
53
- Requires-Dist: redis (==8.0.1)
53
+ Requires-Dist: redis (==8.1.0)
54
54
  Requires-Dist: requests (==2.34.2)
55
55
  Requires-Dist: tzdata (>=2026.1,<2027.0)
56
56
  Requires-Dist: validators (>=0.34,<0.36)
@@ -30,7 +30,7 @@ from howler.odm.models.hit import Hit
30
30
  from howler.odm.models.howler_data import Comment, HitOperationType, HitStatusTransition
31
31
  from howler.odm.models.user import User
32
32
  from howler.security import api_login
33
- from howler.services import action_service, analytic_service, comms_service, hit_service
33
+ from howler.services import action_service, analytic_service, comms_service, correlation_service, hit_service
34
34
  from howler.utils.constants import DEBUG_FORCE_REFRESH
35
35
  from howler.utils.str_utils import sanitize_lucene_query
36
36
 
@@ -130,7 +130,9 @@ def create_hits(user: User, **kwargs):
130
130
 
131
131
  hit_service.create_hits(odms, user=user.uname, refresh="true" if DEBUG_FORCE_REFRESH else refresh)
132
132
  analytic_service.save_from_hits(odms, user, refresh=refresh)
133
- action_service.enqueue_action_execution([odm.howler.id for odm in odms], trigger="create", user=user)
133
+ ids = [odm.howler.id for odm in odms]
134
+ action_service.enqueue_action_execution(ids, trigger="create", user=user)
135
+ correlation_service.enqueue_for_correlation(ids)
134
136
 
135
137
  response_body["warnings"] = warnings
136
138
 
@@ -13,7 +13,7 @@ from howler.odm.base import _Field
13
13
  from howler.odm.models.hit import Hit
14
14
  from howler.odm.models.user import User
15
15
  from howler.security import api_login
16
- from howler.services import action_service, analytic_service, hit_service
16
+ from howler.services import action_service, analytic_service, correlation_service, hit_service
17
17
  from howler.utils.constants import DEBUG_FORCE_REFRESH
18
18
  from howler.utils.dict_utils import flatten
19
19
  from howler.utils.isotime import now_as_iso
@@ -233,6 +233,8 @@ def create_one_or_many_hits(tool_name: str, user: User, **kwargs): # noqa: C901
233
233
  hit_service.create_hits(odms, user=user.uname, refresh="true" if DEBUG_FORCE_REFRESH else refresh)
234
234
  analytic_service.save_from_hits(odms, user, refresh=refresh)
235
235
 
236
- action_service.enqueue_action_execution([entry["id"] for entry in out], trigger="create", user=user)
236
+ ids = [entry["id"] for entry in out]
237
+ action_service.enqueue_action_execution(ids, trigger="create", user=user)
238
+ correlation_service.enqueue_for_correlation(ids)
237
239
 
238
240
  return created(out, warnings=warnings)
@@ -11,7 +11,6 @@ from howler.common.exceptions import HowlerException, HowlerValueError
11
11
  from howler.common.loader import datastore
12
12
  from howler.common.logging import get_logger
13
13
  from howler.common.swagger import generate_swagger_docs
14
- from howler.config import CORRELATION_QUEUE_NAME, config
15
14
  from howler.datastore.collection import ESCollection
16
15
  from howler.datastore.exceptions import DataStoreException
17
16
  from howler.datastore.howler_store import INDEXES
@@ -19,9 +18,8 @@ from howler.datastore.operations import OdmHelper, OdmUpdateOperation
19
18
  from howler.odm.models.event import Event
20
19
  from howler.odm.models.hit import Hit
21
20
  from howler.odm.models.user import User
22
- from howler.remote.datatypes.queues.named import NamedQueue
23
21
  from howler.security import api_login
24
- from howler.services import event_service, hit_service
22
+ from howler.services import correlation_service, event_service, hit_service
25
23
  from howler.utils.dict_utils import flatten
26
24
 
27
25
  MAX_COMMENT_LEN = 5000
@@ -36,24 +34,6 @@ logger = get_logger(__file__)
36
34
 
37
35
  hit_helper = OdmHelper(Hit)
38
36
 
39
- # Persistent queue for the correlation worker to consume newly ingested hit IDs.
40
- _ingestion_queue: NamedQueue[str] | None = None
41
-
42
-
43
- def _get_ingestion_queue() -> NamedQueue[str]:
44
- """Return the shared ingestion queue, creating it on first use."""
45
- global _ingestion_queue
46
-
47
- if _ingestion_queue is None:
48
- _ingestion_queue = NamedQueue(
49
- CORRELATION_QUEUE_NAME,
50
- host=config.core.redis.persistent.host,
51
- port=config.core.redis.persistent.port,
52
- private=False,
53
- )
54
-
55
- return _ingestion_queue
56
-
57
37
 
58
38
  @generate_swagger_docs()
59
39
  @ingest_api.route("/<index>", methods=["POST"])
@@ -120,10 +100,7 @@ def create(index: str, user: User, **kwargs):
120
100
 
121
101
  # Enqueue newly created hit IDs for the correlation worker.
122
102
  if ids:
123
- try:
124
- _get_ingestion_queue().push(*ids)
125
- except Exception:
126
- logger.exception("Failed to enqueue hit IDs for correlation")
103
+ correlation_service.enqueue_for_correlation(ids)
127
104
 
128
105
  return created(ids, warnings=warnings)
129
106
 
@@ -37,6 +37,40 @@ def _normalize_utc(ts: datetime) -> datetime:
37
37
  return ts
38
38
 
39
39
 
40
+ # Persistent queue for the correlation worker to consume newly ingested hit IDs.
41
+ _ingestion_queue: NamedQueue[str] | None = None
42
+
43
+
44
+ def _get_ingestion_queue() -> NamedQueue[str]:
45
+ """Return the shared ingestion queue, creating it on first use."""
46
+ global _ingestion_queue
47
+
48
+ if _ingestion_queue is None:
49
+ _ingestion_queue = NamedQueue(
50
+ CORRELATION_QUEUE_NAME,
51
+ host=config.core.redis.persistent.host,
52
+ port=config.core.redis.persistent.port,
53
+ private=False,
54
+ )
55
+
56
+ return _ingestion_queue
57
+
58
+
59
+ def enqueue_for_correlation(ids: list[str]) -> None:
60
+ """Enqueue record IDs for correlation processing.
61
+
62
+ Args:
63
+ ids: List of record IDs to enqueue for correlation.
64
+
65
+ Raises:
66
+ HowlerRuntimeError: If enqueueing fails.
67
+ """
68
+ try:
69
+ _get_ingestion_queue().push(*ids)
70
+ except Exception:
71
+ logger.exception("Error on queuing for correlation")
72
+
73
+
40
74
  def get_active_rules() -> list[tuple[str, CaseRule]]: # noqa: C901
41
75
  """Return all active (enabled, non-expired) rules across every case.
42
76
 
@@ -179,23 +213,13 @@ def process_batch(record_ids: list[str]) -> int: # noqa: C901
179
213
  return added
180
214
 
181
215
 
182
- def _build_queue() -> NamedQueue[str]:
183
- """Create the NamedQueue backed by persistent Redis."""
184
- return NamedQueue(
185
- CORRELATION_QUEUE_NAME,
186
- host=config.core.redis.persistent.host,
187
- port=config.core.redis.persistent.port,
188
- private=False,
189
- )
190
-
191
-
192
216
  def run_worker() -> None: # pragma: no cover – long-running loop, tested via process_batch
193
217
  """Block on the ingestion queue and process batches of record IDs.
194
218
 
195
219
  Accumulates up to ``BATCH_SIZE`` IDs or flushes after ``BATCH_TIMEOUT``
196
220
  seconds, whichever comes first.
197
221
  """
198
- queue = _build_queue()
222
+ queue = _get_ingestion_queue()
199
223
  logger.info("Correlation worker started (batch_size=%d, timeout=%ds)", BATCH_SIZE, BATCH_TIMEOUT)
200
224
 
201
225
  batch: list[str] = []
@@ -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.1.0.dev1346"
155
+ version = "4.1.0.dev1368"
156
156
  description = "Howler - API server"
157
157
  authors = [
158
158
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
@@ -211,7 +211,7 @@ pyjwt = "2.13.0"
211
211
  python-baseconv = "1.2.2"
212
212
  python-datemath = "3.0.3"
213
213
  pyyaml = "6.0.3"
214
- redis = "8.0.1"
214
+ redis = "8.1.0"
215
215
  requests = "2.34.2"
216
216
  wsproto = "1.3.2"
217
217
  chevron = "0.14.0"