howler-api 4.0.0.dev1279__tar.gz → 4.0.0.dev1283__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 (224) hide show
  1. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/PKG-INFO +1 -1
  2. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/demote.py +2 -2
  3. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/promote.py +2 -6
  4. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/ingest.py +2 -2
  5. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/config.py +1 -0
  6. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/hit.py +10 -9
  7. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/workflow.py +7 -1
  8. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/helper.py +1 -1
  9. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/howler_data.py +2 -6
  10. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/random_data.py +0 -1
  11. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/correlation_service.py +3 -2
  12. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/hit_service.py +1 -1
  13. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/pyproject.toml +1 -1
  14. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/README.md +0 -0
  15. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/__init__.py +0 -0
  16. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/__init__.py +0 -0
  17. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/add_label.py +0 -0
  18. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/add_to_bundle.py +0 -0
  19. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/add_to_case.py +0 -0
  20. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/change_field.py +0 -0
  21. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/example_plugin.py +0 -0
  22. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/prioritization.py +0 -0
  23. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/remove_from_bundle.py +0 -0
  24. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/remove_label.py +0 -0
  25. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/transition.py +0 -0
  26. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/__init__.py +0 -0
  27. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/base.py +0 -0
  28. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/socket.py +0 -0
  29. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/__init__.py +0 -0
  30. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/action.py +0 -0
  31. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/analytic.py +0 -0
  32. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/auth.py +0 -0
  33. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/clue.py +0 -0
  34. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/configs.py +0 -0
  35. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/dossier.py +0 -0
  36. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/help.py +0 -0
  37. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/hit.py +0 -0
  38. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/notebook.py +0 -0
  39. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/overview.py +0 -0
  40. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/search.py +0 -0
  41. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/template.py +0 -0
  42. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/tool.py +0 -0
  43. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/user.py +0 -0
  44. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/utils/__init__.py +0 -0
  45. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/utils/etag.py +0 -0
  46. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/utils/params.py +0 -0
  47. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/view.py +0 -0
  48. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/__init__.py +0 -0
  49. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/case.py +0 -0
  50. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/fuzzy.py +0 -0
  51. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/search.py +0 -0
  52. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/app.py +0 -0
  53. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/README.md +0 -0
  54. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/__init__.py +0 -0
  55. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/classification.py +0 -0
  56. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/classification.yml +0 -0
  57. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/exceptions.py +0 -0
  58. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/loader.py +0 -0
  59. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/logging/__init__.py +0 -0
  60. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/logging/audit.py +0 -0
  61. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/logging/format.py +0 -0
  62. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/net.py +0 -0
  63. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/net_static.py +0 -0
  64. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/random_user.py +0 -0
  65. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/swagger.py +0 -0
  66. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/__init__.py +0 -0
  67. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/action_queue_worker.py +0 -0
  68. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/correlation.py +0 -0
  69. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/retention.py +0 -0
  70. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/view_cleanup.py +0 -0
  71. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/README.md +0 -0
  72. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/__init__.py +0 -0
  73. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/bulk.py +0 -0
  74. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/collection.py +0 -0
  75. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/constants.py +0 -0
  76. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/exceptions.py +0 -0
  77. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/howler_store.py +0 -0
  78. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/migrations/fix_process.py +0 -0
  79. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/operations.py +0 -0
  80. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/schemas.py +0 -0
  81. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/store.py +0 -0
  82. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/support/__init__.py +0 -0
  83. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/support/build.py +0 -0
  84. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/support/schemas.py +0 -0
  85. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/types.py +0 -0
  86. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/error.py +0 -0
  87. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/README.md +0 -0
  88. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/__init__.py +0 -0
  89. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/generate_mitre.py +0 -0
  90. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/generate_sigma_rules.py +0 -0
  91. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/generate_tlds.py +0 -0
  92. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/reindex_data.py +0 -0
  93. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/wipe_databases.py +0 -0
  94. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/gunicorn_config.py +0 -0
  95. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/healthz.py +0 -0
  96. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/__init__.py +0 -0
  97. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/azure.py +0 -0
  98. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/discover.py +0 -0
  99. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/oauth.py +0 -0
  100. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/search.py +0 -0
  101. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/ws.py +0 -0
  102. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/README.md +0 -0
  103. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/__init__.py +0 -0
  104. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/base.py +0 -0
  105. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/charter.txt +0 -0
  106. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/constants.py +0 -0
  107. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/howler_enum.py +0 -0
  108. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/mixins.py +0 -0
  109. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/__init__.py +0 -0
  110. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/action.py +0 -0
  111. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/analytic.py +0 -0
  112. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/assemblyline.py +0 -0
  113. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/aws.py +0 -0
  114. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/azure.py +0 -0
  115. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/case.py +0 -0
  116. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/cbs.py +0 -0
  117. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/clue.py +0 -0
  118. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/config.py +0 -0
  119. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/dossier.py +0 -0
  120. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/__init__.py +0 -0
  121. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/agent.py +0 -0
  122. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/autonomous_system.py +0 -0
  123. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/client.py +0 -0
  124. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/cloud.py +0 -0
  125. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/code_signature.py +0 -0
  126. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/container.py +0 -0
  127. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/dns.py +0 -0
  128. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/egress.py +0 -0
  129. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/elf.py +0 -0
  130. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/email.py +0 -0
  131. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/error.py +0 -0
  132. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/event.py +0 -0
  133. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/faas.py +0 -0
  134. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/file.py +0 -0
  135. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/geo.py +0 -0
  136. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/group.py +0 -0
  137. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/hash.py +0 -0
  138. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/host.py +0 -0
  139. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/http.py +0 -0
  140. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/ingress.py +0 -0
  141. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/interface.py +0 -0
  142. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/network.py +0 -0
  143. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/observer.py +0 -0
  144. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/organization.py +0 -0
  145. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/os.py +0 -0
  146. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/pe.py +0 -0
  147. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/process.py +0 -0
  148. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/registry.py +0 -0
  149. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/related.py +0 -0
  150. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/rule.py +0 -0
  151. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/server.py +0 -0
  152. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/threat.py +0 -0
  153. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/tls.py +0 -0
  154. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/url.py +0 -0
  155. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/user.py +0 -0
  156. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/user_agent.py +0 -0
  157. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/vulnerability.py +0 -0
  158. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/event.py +0 -0
  159. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/gcp.py +0 -0
  160. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/hit.py +0 -0
  161. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/lead.py +0 -0
  162. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/localized_label.py +0 -0
  163. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/overview.py +0 -0
  164. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/pivot.py +0 -0
  165. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/record.py +0 -0
  166. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/template.py +0 -0
  167. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/user.py +0 -0
  168. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/view.py +0 -0
  169. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/randomizer.py +0 -0
  170. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/patched.py +0 -0
  171. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/plugins/__init__.py +0 -0
  172. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/plugins/config.py +0 -0
  173. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/__init__.py +0 -0
  174. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/README.md +0 -0
  175. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/__init__.py +0 -0
  176. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/counters.py +0 -0
  177. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/events.py +0 -0
  178. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/hash.py +0 -0
  179. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/lock.py +0 -0
  180. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/__init__.py +0 -0
  181. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/comms.py +0 -0
  182. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/multi.py +0 -0
  183. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/named.py +0 -0
  184. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/priority.py +0 -0
  185. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/set.py +0 -0
  186. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  187. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/security/__init__.py +0 -0
  188. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/security/socket.py +0 -0
  189. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/security/utils.py +0 -0
  190. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/__init__.py +0 -0
  191. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/action_service.py +0 -0
  192. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/analytic_service.py +0 -0
  193. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/auth_service.py +0 -0
  194. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/bundle_compat_service.py +0 -0
  195. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/case_service.py +0 -0
  196. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/comms_service.py +0 -0
  197. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/config_service.py +0 -0
  198. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/docs_service.py +0 -0
  199. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/dossier_service.py +0 -0
  200. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/event_service.py +0 -0
  201. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/fuzzy_service.py +0 -0
  202. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/jwt_service.py +0 -0
  203. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/lucene_service.py +0 -0
  204. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/notebook_service.py +0 -0
  205. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/overview_service.py +0 -0
  206. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/search_service.py +0 -0
  207. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/template_service.py +0 -0
  208. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/user_service.py +0 -0
  209. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/viewer_service.py +0 -0
  210. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/telemetry.py +0 -0
  211. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/__init__.py +0 -0
  212. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/annotations.py +0 -0
  213. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/chunk.py +0 -0
  214. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/compat.py +0 -0
  215. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/constants.py +0 -0
  216. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/dict_utils.py +0 -0
  217. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/isotime.py +0 -0
  218. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/list_utils.py +0 -0
  219. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/lucene.py +0 -0
  220. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/net_utils.py +0 -0
  221. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/path.py +0 -0
  222. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/socket_utils.py +0 -0
  223. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/str_utils.py +0 -0
  224. {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 4.0.0.dev1279
3
+ Version: 4.0.0.dev1283
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -76,7 +76,7 @@ def execute(
76
76
  *hit_helper.demote_hit(escalation=escalation),
77
77
  odm_helper.update("howler.assessment", None),
78
78
  odm_helper.update("howler.rationale", None),
79
- odm_helper.update("howler.assignment", None),
79
+ odm_helper.update("howler.triaged", None),
80
80
  ],
81
81
  )
82
82
  else:
@@ -94,7 +94,7 @@ def execute(
94
94
  ds.hit.update_by_query(
95
95
  query,
96
96
  [
97
- *hit_helper.assess_hit(assessment, rationale, user=(user if user else "automation")),
97
+ *hit_helper.assess_hit(assessment, rationale),
98
98
  odm_helper.update(
99
99
  "howler.assignment",
100
100
  user.get("uname", "automation") if user else "automation",
@@ -10,7 +10,6 @@ from howler.odm.models.howler_data import (
10
10
  AssessmentEscalationMap,
11
11
  Escalation,
12
12
  )
13
- from howler.odm.models.user import User
14
13
  from howler.utils.str_utils import sanitize_lucene_query
15
14
 
16
15
  OPERATION_ID = "promote"
@@ -27,7 +26,6 @@ def execute(
27
26
  escalation: Escalation = Escalation.ALERT,
28
27
  assessment: Optional[str] = None,
29
28
  rationale: Optional[str] = None,
30
- user: Optional[User] = None,
31
29
  **kwargs,
32
30
  ):
33
31
  """Promote a hit.
@@ -75,7 +73,7 @@ def execute(
75
73
  *hit_helper.promote_hit(escalation=escalation),
76
74
  odm_helper.update("howler.assessment", None),
77
75
  odm_helper.update("howler.rationale", None),
78
- odm_helper.update("howler.assignment", None),
76
+ odm_helper.update("howler.triaged", None),
79
77
  ],
80
78
  )
81
79
  else:
@@ -90,9 +88,7 @@ def execute(
90
88
  )
91
89
  return report
92
90
 
93
- ds.hit.update_by_query(
94
- query, hit_helper.assess_hit(assessment, rationale, user=(user if user else "automation"))
95
- )
91
+ ds.hit.update_by_query(query, hit_helper.assess_hit(assessment, rationale))
96
92
 
97
93
  report.append(
98
94
  {
@@ -11,7 +11,7 @@ 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 config
14
+ from howler.config import CORRELATION_QUEUE_NAME, config
15
15
  from howler.datastore.collection import ESCollection
16
16
  from howler.datastore.exceptions import DataStoreException
17
17
  from howler.datastore.howler_store import INDEXES
@@ -46,7 +46,7 @@ def _get_ingestion_queue() -> NamedQueue[str]:
46
46
 
47
47
  if _ingestion_queue is None:
48
48
  _ingestion_queue = NamedQueue(
49
- "howler.ingestion_queue",
49
+ CORRELATION_QUEUE_NAME,
50
50
  host=config.core.redis.persistent.host,
51
51
  port=config.core.redis.persistent.port,
52
52
  private=False,
@@ -24,6 +24,7 @@ HWL_USE_WEBSOCKET_API = os.environ.get("HWL_USE_WEBSOCKET_API", "false").lower()
24
24
  HWL_USE_JOB_SYSTEM = os.environ.get("HWL_USE_JOB_SYSTEM", "false").lower() == "true"
25
25
  HWL_ENABLE_COVERAGE = os.environ.get("HWL_ENABLE_COVERAGE", "false").lower() == "true"
26
26
  HWL_PLUGIN_DIRECTORY = os.environ.get("HWL_PLUGIN_DIRECTORY", "/etc/howler/plugins")
27
+ CORRELATION_QUEUE_NAME = os.environ.get("HWL_CORRELATION_QUEUE_NAME", "howler.ingestion_queue")
27
28
 
28
29
 
29
30
  def get_version() -> str:
@@ -24,14 +24,11 @@ def assess_hit(
24
24
  assessment: Optional[str] = None,
25
25
  rationale: Optional[str] = None,
26
26
  hit: Optional[Union[dict[str, Any], Hit]] = None,
27
- *,
28
- user: User | str,
29
27
  **kwargs,
30
28
  ) -> list[OdmUpdateOperation]:
31
29
  """Update the assessment and esclation of a hit
32
30
 
33
31
  Args:
34
- user (User | str): The user making the assessment
35
32
  assessment (Optional[str], optional): The assessment to set the hit to. Defaults to None.
36
33
  hit (Optional[Union[dict[str, Any], Hit]], optional): The hit to update. Defaults to None.
37
34
 
@@ -55,6 +52,14 @@ def assess_hit(
55
52
  if assessment is None and rationale:
56
53
  rationale = None
57
54
 
55
+ if assessment is None:
56
+ # reset the timestamp and set state to in progress if removing assessment (re-assessing)
57
+ triaged_timestamp = None
58
+ status = Status.IN_PROGRESS
59
+ else:
60
+ triaged_timestamp = "NOW"
61
+ status = Status.RESOLVED
62
+
58
63
  logger.debug(
59
64
  "Updating assessment of %s to %s",
60
65
  hit["howler"]["id"] if hit else "unknown",
@@ -66,16 +71,12 @@ def assess_hit(
66
71
  escalation,
67
72
  )
68
73
 
69
- if assessment is None:
70
- assessor_id = None
71
- else:
72
- assessor_id = user.get("uname", user.get("username", None)) if isinstance(user, User) else user
73
-
74
74
  return [
75
75
  odm_helper.update("howler.assessment", assessment),
76
76
  odm_helper.update("howler.escalation", escalation),
77
77
  odm_helper.update("howler.rationale", rationale, silent=True),
78
- odm_helper.update("howler.assessor", assessor_id, silent=True),
78
+ odm_helper.update("howler.triaged", triaged_timestamp),
79
+ odm_helper.update("howler.status", status),
79
80
  ]
80
81
 
81
82
 
@@ -86,7 +86,13 @@ class Workflow:
86
86
 
87
87
  updates_dict[update.key] = update
88
88
 
89
- if self.status_prop not in updates_dict and _transition.get("dest", False):
89
+ if _transition.get("dest", False):
90
+ if self.status_prop in updates_dict and updates_dict[self.status_prop].value != _transition["dest"]:
91
+ raise WorkflowException(
92
+ f"Transition {transition} attempted to update the status {self.status_prop} with \
93
+ a different value than the transition destination."
94
+ )
95
+
90
96
  updates_dict[self.status_prop] = OdmUpdateOperation(
91
97
  ESCollection.UPDATE_SET,
92
98
  self.status_prop,
@@ -178,10 +178,10 @@ def generate_useful_hit( # noqa: C901
178
178
 
179
179
  hit.howler.assessment = None
180
180
  hit.howler.rationale = None
181
+ hit.howler.triaged = None
181
182
  hit.howler.status = "open"
182
183
  hit.howler.assignment = "unassigned"
183
184
  hit.howler.escalation = choice([Escalation.HIT, Escalation.ALERT])
184
- hit.howler.assessor = None
185
185
 
186
186
  if randint(1, 10) > 9:
187
187
  hit.howler.expiry = datetime.now() + timedelta(days=randint(1, 60))
@@ -1,4 +1,5 @@
1
1
  # mypy: ignore-errors
2
+ from datetime import datetime
2
3
  from typing import Optional
3
4
 
4
5
  from howler import odm
@@ -180,12 +181,6 @@ class HowlerData(odm.Model):
180
181
  description="Unique identifier of the assigned user.",
181
182
  default=DEFAULT_ASSIGNMENT,
182
183
  )
183
- assessor: Optional[str] = odm.Optional(
184
- odm.Keyword(
185
- description="The most recent person to assess a hit",
186
- default=None,
187
- )
188
- )
189
184
  data: list[str] = odm.List(
190
185
  odm.Keyword(description="Raw telemetry records associated with this hit."),
191
186
  default=[],
@@ -248,6 +243,7 @@ class HowlerData(odm.Model):
248
243
  )
249
244
  )
250
245
  )
246
+ triaged: Optional[datetime] = odm.Optional(odm.Date(description="Timestamp at which the hit was triaged."))
251
247
  comment: list[Comment] = odm.List(
252
248
  odm.Compound(Comment),
253
249
  default=[],
@@ -595,7 +595,6 @@ def create_hits(ds: HowlerDatastore, hit_count: int = 200):
595
595
  hit.howler.id,
596
596
  [
597
597
  *assess_hit(
598
- user=user,
599
598
  assessment=choice(Assessment.list()),
600
599
  rationale=get_random_string(),
601
600
  hit=hit,
@@ -16,6 +16,7 @@ from opentelemetry import trace
16
16
  from howler.common.exceptions import InvalidDataException, NotFoundException
17
17
  from howler.common.loader import datastore
18
18
  from howler.common.logging import get_logger
19
+ from howler.config import CORRELATION_QUEUE_NAME
19
20
  from howler.odm.models.case import CaseRule, RuleIndexTypes
20
21
  from howler.odm.models.config import config
21
22
  from howler.remote.datatypes.queues.named import NamedQueue
@@ -181,7 +182,7 @@ def process_batch(record_ids: list[str]) -> int: # noqa: C901
181
182
  def _build_queue() -> NamedQueue[str]:
182
183
  """Create the NamedQueue backed by persistent Redis."""
183
184
  return NamedQueue(
184
- "howler.ingestion_queue",
185
+ CORRELATION_QUEUE_NAME,
185
186
  host=config.core.redis.persistent.host,
186
187
  port=config.core.redis.persistent.port,
187
188
  private=False,
@@ -210,7 +211,7 @@ def run_worker() -> None: # pragma: no cover – long-running loop, tested via
210
211
  logger.debug("Processing correlation batch of %d hit(s)", len(batch))
211
212
  try:
212
213
  added = process_batch(batch)
213
- logger.info("Correlation batch complete: %d/%d hit(s) added", added, len(batch))
214
+ logger.info("Correlation batch complete: %d case item(s) added for %d record(s)", added, len(batch))
214
215
  except Exception:
215
216
  logger.exception("Error processing correlation batch")
216
217
  finally:
@@ -111,7 +111,7 @@ def get_hit_workflow() -> Workflow:
111
111
  "source": [Status.OPEN, Status.IN_PROGRESS],
112
112
  "transition": HitStatusTransition.ASSESS,
113
113
  "dest": Status.RESOLVED,
114
- "actions": [assess_hit],
114
+ "actions": [assess_hit, assign_hit],
115
115
  }
116
116
  ),
117
117
  Transition(
@@ -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.dev1279"
155
+ version = "4.0.0.dev1283"
156
156
  description = "Howler - API server"
157
157
  authors = [
158
158
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",