howler-api 2.11.0.dev236__tar.gz → 2.11.0.dev243__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 (196) hide show
  1. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/PKG-INFO +1 -1
  2. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/view.py +3 -11
  3. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/analytic_service.py +23 -0
  4. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/hit_service.py +17 -2
  5. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/pyproject.toml +1 -1
  6. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/README.md +0 -0
  7. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/__init__.py +0 -0
  8. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/__init__.py +0 -0
  9. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/add_label.py +0 -0
  10. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/add_to_bundle.py +0 -0
  11. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/change_field.py +0 -0
  12. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/demote.py +0 -0
  13. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/example_plugin.py +0 -0
  14. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/prioritization.py +0 -0
  15. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/promote.py +0 -0
  16. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/remove_from_bundle.py +0 -0
  17. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/remove_label.py +0 -0
  18. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/actions/transition.py +0 -0
  19. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/__init__.py +0 -0
  20. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/base.py +0 -0
  21. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/socket.py +0 -0
  22. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/__init__.py +0 -0
  23. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/action.py +0 -0
  24. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/analytic.py +0 -0
  25. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/auth.py +0 -0
  26. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/borealis.py +0 -0
  27. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/configs.py +0 -0
  28. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/dossier.py +0 -0
  29. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/help.py +0 -0
  30. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/hit.py +0 -0
  31. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/notebook.py +0 -0
  32. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/overview.py +0 -0
  33. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/search.py +0 -0
  34. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/template.py +0 -0
  35. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/tool.py +0 -0
  36. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/user.py +0 -0
  37. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/utils/__init__.py +0 -0
  38. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/api/v1/utils/etag.py +0 -0
  39. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/app.py +0 -0
  40. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/README.md +0 -0
  41. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/__init__.py +0 -0
  42. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/classification.py +0 -0
  43. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/classification.yml +0 -0
  44. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/exceptions.py +0 -0
  45. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/hexdump.py +0 -0
  46. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/iprange.py +0 -0
  47. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/loader.py +0 -0
  48. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/logging/__init__.py +0 -0
  49. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/logging/audit.py +0 -0
  50. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/logging/format.py +0 -0
  51. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/net.py +0 -0
  52. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/net_static.py +0 -0
  53. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/random_user.py +0 -0
  54. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/common/swagger.py +0 -0
  55. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/config.py +0 -0
  56. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/cronjobs/__init__.py +0 -0
  57. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/cronjobs/retention.py +0 -0
  58. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/cronjobs/rules.py +0 -0
  59. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/README.md +0 -0
  60. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/__init__.py +0 -0
  61. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/bulk.py +0 -0
  62. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/collection.py +0 -0
  63. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/constants.py +0 -0
  64. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/exceptions.py +0 -0
  65. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/howler_store.py +0 -0
  66. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/migrations/fix_process.py +0 -0
  67. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/operations.py +0 -0
  68. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/schemas.py +0 -0
  69. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/store.py +0 -0
  70. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/support/__init__.py +0 -0
  71. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/support/build.py +0 -0
  72. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/support/schemas.py +0 -0
  73. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/datastore/types.py +0 -0
  74. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/error.py +0 -0
  75. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/external/__init__.py +0 -0
  76. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/external/generate_mitre.py +0 -0
  77. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/external/generate_sigma_rules.py +0 -0
  78. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/external/generate_tlds.py +0 -0
  79. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/external/reindex_data.py +0 -0
  80. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/external/wipe_databases.py +0 -0
  81. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/gunicorn_config.py +0 -0
  82. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/healthz.py +0 -0
  83. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/helper/__init__.py +0 -0
  84. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/helper/azure.py +0 -0
  85. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/helper/discover.py +0 -0
  86. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/helper/hit.py +0 -0
  87. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/helper/oauth.py +0 -0
  88. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/helper/search.py +0 -0
  89. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/helper/workflow.py +0 -0
  90. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/helper/ws.py +0 -0
  91. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/README.md +0 -0
  92. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/__init__.py +0 -0
  93. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/base.py +0 -0
  94. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/charter.txt +0 -0
  95. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/helper.py +0 -0
  96. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/howler_enum.py +0 -0
  97. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/__init__.py +0 -0
  98. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/action.py +0 -0
  99. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/analytic.py +0 -0
  100. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/assemblyline.py +0 -0
  101. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/aws.py +0 -0
  102. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/azure.py +0 -0
  103. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/cbs.py +0 -0
  104. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/config.py +0 -0
  105. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/dossier.py +0 -0
  106. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/__init__.py +0 -0
  107. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/agent.py +0 -0
  108. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/autonomous_system.py +0 -0
  109. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/client.py +0 -0
  110. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/cloud.py +0 -0
  111. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/code_signature.py +0 -0
  112. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/container.py +0 -0
  113. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/dns.py +0 -0
  114. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/egress.py +0 -0
  115. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/elf.py +0 -0
  116. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/email.py +0 -0
  117. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/error.py +0 -0
  118. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/event.py +0 -0
  119. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/faas.py +0 -0
  120. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/file.py +0 -0
  121. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/geo.py +0 -0
  122. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/group.py +0 -0
  123. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/hash.py +0 -0
  124. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/host.py +0 -0
  125. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/http.py +0 -0
  126. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/ingress.py +0 -0
  127. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/interface.py +0 -0
  128. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/network.py +0 -0
  129. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/observer.py +0 -0
  130. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/organization.py +0 -0
  131. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/os.py +0 -0
  132. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/pe.py +0 -0
  133. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/process.py +0 -0
  134. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/registry.py +0 -0
  135. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/related.py +0 -0
  136. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/rule.py +0 -0
  137. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/server.py +0 -0
  138. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/threat.py +0 -0
  139. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/tls.py +0 -0
  140. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/url.py +0 -0
  141. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/user.py +0 -0
  142. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/user_agent.py +0 -0
  143. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/ecs/vulnerability.py +0 -0
  144. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/gcp.py +0 -0
  145. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/hit.py +0 -0
  146. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/howler_data.py +0 -0
  147. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/lead.py +0 -0
  148. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/localized_label.py +0 -0
  149. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/overview.py +0 -0
  150. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/pivot.py +0 -0
  151. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/template.py +0 -0
  152. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/user.py +0 -0
  153. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/models/view.py +0 -0
  154. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/random_data.py +0 -0
  155. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/odm/randomizer.py +0 -0
  156. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/patched.py +0 -0
  157. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/plugins/__init__.py +0 -0
  158. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/plugins/config.py +0 -0
  159. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/__init__.py +0 -0
  160. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/README.md +0 -0
  161. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/__init__.py +0 -0
  162. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/counters.py +0 -0
  163. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/events.py +0 -0
  164. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/hash.py +0 -0
  165. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/lock.py +0 -0
  166. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/queues/__init__.py +0 -0
  167. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/queues/comms.py +0 -0
  168. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/queues/multi.py +0 -0
  169. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/queues/named.py +0 -0
  170. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/queues/priority.py +0 -0
  171. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/set.py +0 -0
  172. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  173. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/security/__init__.py +0 -0
  174. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/security/socket.py +0 -0
  175. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/security/utils.py +0 -0
  176. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/__init__.py +0 -0
  177. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/action_service.py +0 -0
  178. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/auth_service.py +0 -0
  179. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/config_service.py +0 -0
  180. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/dossier_service.py +0 -0
  181. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/event_service.py +0 -0
  182. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/jwt_service.py +0 -0
  183. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/lucene_service.py +0 -0
  184. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/notebook_service.py +0 -0
  185. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/services/user_service.py +0 -0
  186. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/__init__.py +0 -0
  187. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/annotations.py +0 -0
  188. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/chunk.py +0 -0
  189. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/dict_utils.py +0 -0
  190. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/isotime.py +0 -0
  191. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/list_utils.py +0 -0
  192. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/lucene.py +0 -0
  193. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/path.py +0 -0
  194. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/socket_utils.py +0 -0
  195. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/str_utils.py +0 -0
  196. {howler_api-2.11.0.dev236 → howler_api-2.11.0.dev243}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: howler-api
3
- Version: 2.11.0.dev236
3
+ Version: 2.11.0.dev243
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -1,15 +1,7 @@
1
1
  from flask import request
2
2
  from mergedeep.mergedeep import merge
3
3
 
4
- from howler.api import (
5
- bad_request,
6
- created,
7
- forbidden,
8
- make_subapi_blueprint,
9
- no_content,
10
- not_found,
11
- ok,
12
- )
4
+ from howler.api import bad_request, created, forbidden, make_subapi_blueprint, no_content, not_found, ok
13
5
  from howler.common.exceptions import HowlerException
14
6
  from howler.common.loader import datastore
15
7
  from howler.common.logging import get_logger
@@ -185,8 +177,8 @@ def update_view(id: str, user: User, **kwargs):
185
177
  if not isinstance(new_data, dict):
186
178
  return bad_request(err="Invalid data format")
187
179
 
188
- if set(new_data.keys()) - {"title", "query", "span", "sort", "settings"}:
189
- return bad_request(err="Only title, query, span and sort can be updated.")
180
+ if set(new_data.keys()) & {"view_id", "owner"}:
181
+ return bad_request(err="You cannot change the owner or id of a view.")
190
182
 
191
183
  existing_view: View = storage.view.get_if_exists(id)
192
184
  if not existing_view:
@@ -1,3 +1,5 @@
1
+ from typing import Any, Union
2
+
1
3
  from howler.common.loader import datastore
2
4
  from howler.common.logging import get_logger
3
5
  from howler.datastore.operations import OdmUpdateOperation
@@ -36,6 +38,27 @@ def update_analytic(
36
38
  return result
37
39
 
38
40
 
41
+ def get_matching_analytics(hits: Union[list[Hit], list[dict[str, Any]]]) -> list[Analytic]:
42
+ """Get a list of matching analytics for the given list of hits.
43
+
44
+ Args:
45
+ hits (Union[list[Hit], list[dict[str, Any]]]): A list of Hit objects or dictionaries representing hits.
46
+ Returns:
47
+ list[Analytic]: A list of Analytic objects that match the analytics referenced in the hits.
48
+ """
49
+ storage = datastore()
50
+
51
+ analytic_names: set[str] = set()
52
+ for hit in hits:
53
+ analytic_names.add(f'"{sanitize_lucene_query(hit["howler"]["analytic"])}"')
54
+
55
+ existing_analytics: list[Analytic] = storage.analytic.search(f'name:({" OR ".join(analytic_names)})', as_obj=True)[
56
+ "items"
57
+ ]
58
+
59
+ return existing_analytics
60
+
61
+
39
62
  def save_from_hit(hit: Hit, user: User):
40
63
  """Save updates to an analytic based on a new hit that has been created
41
64
 
@@ -30,7 +30,7 @@ from howler.odm.models.ecs.event import Event
30
30
  from howler.odm.models.hit import Hit
31
31
  from howler.odm.models.howler_data import HitOperationType, HitStatus, HitStatusTransition, Log
32
32
  from howler.odm.models.user import User
33
- from howler.services import action_service, dossier_service
33
+ from howler.services import action_service, analytic_service, dossier_service
34
34
  from howler.utils.dict_utils import extra_keys, flatten
35
35
  from howler.utils.uid import get_random_id
36
36
 
@@ -821,7 +821,7 @@ def __match_metadata(candidates: list[dict[str, Any]], hit: dict[str, Any]) -> O
821
821
  return sorted(matching_candidates, key=functools.cmp_to_key(__compare_metadata))[0]
822
822
 
823
823
 
824
- def augment_metadata(data: list[dict[str, Any]] | dict[str, Any], metadata: list[str], user: dict[str, Any]):
824
+ def augment_metadata(data: list[dict[str, Any]] | dict[str, Any], metadata: list[str], user: dict[str, Any]): # noqa: C901
825
825
  """Augment hit search results with additional metadata.
826
826
 
827
827
  This function enriches hit data by adding related information such as templates,
@@ -862,6 +862,21 @@ def augment_metadata(data: list[dict[str, Any]] | dict[str, Any], metadata: list
862
862
  for hit in hits:
863
863
  hit["__overview"] = __match_metadata(overview_candidates, hit)
864
864
 
865
+ if "analytic" in metadata:
866
+ matched_analytics = analytic_service.get_matching_analytics(hits)
867
+
868
+ for hit in hits:
869
+ matched_analytic = next(
870
+ (
871
+ analytic
872
+ for analytic in matched_analytics
873
+ if analytic.name.lower() == hit["howler"]["analytic"].lower()
874
+ ),
875
+ None,
876
+ )
877
+
878
+ hit["__analytic"] = matched_analytic.as_primitives() if matched_analytic else None
879
+
865
880
  if "dossiers" in metadata:
866
881
  dossiers: list[dict[str, Any]] = datastore().dossier.search(
867
882
  "dossier_id:*",
@@ -148,7 +148,7 @@ suppress-none-returning = true
148
148
  [tool.poetry]
149
149
  package-mode = true
150
150
  name = "howler-api"
151
- version = "2.11.0.dev236"
151
+ version = "2.11.0.dev243"
152
152
  description = "Howler - API server"
153
153
  authors = [
154
154
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",