howler-api 4.0.0.dev1185__tar.gz → 4.0.0.dev1190__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 (223) hide show
  1. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/PKG-INFO +1 -1
  2. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/add_to_bundle.py +1 -1
  3. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/add_to_case.py +2 -2
  4. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/remove_from_bundle.py +1 -1
  5. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/socket.py +5 -5
  6. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/analytic.py +2 -2
  7. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v2/case.py +2 -2
  8. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v2/ingest.py +1 -1
  9. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v2/search.py +1 -1
  10. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/cronjobs/correlation.py +1 -1
  11. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/mixins.py +1 -1
  12. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/bundle_compat_service.py +6 -6
  13. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/case_service.py +8 -8
  14. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/comms_service.py +1 -1
  15. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/correlation_service.py +1 -1
  16. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/docs_service.py +1 -1
  17. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/search_service.py +1 -1
  18. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/pyproject.toml +1 -1
  19. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/README.md +0 -0
  20. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/__init__.py +0 -0
  21. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/__init__.py +0 -0
  22. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/add_label.py +0 -0
  23. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/change_field.py +0 -0
  24. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/demote.py +0 -0
  25. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/example_plugin.py +0 -0
  26. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/prioritization.py +0 -0
  27. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/promote.py +0 -0
  28. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/remove_label.py +0 -0
  29. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/actions/transition.py +0 -0
  30. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/__init__.py +0 -0
  31. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/base.py +0 -0
  32. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/__init__.py +0 -0
  33. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/action.py +0 -0
  34. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/auth.py +0 -0
  35. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/clue.py +0 -0
  36. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/configs.py +0 -0
  37. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/dossier.py +0 -0
  38. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/help.py +0 -0
  39. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/hit.py +0 -0
  40. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/notebook.py +0 -0
  41. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/overview.py +0 -0
  42. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/search.py +0 -0
  43. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/template.py +0 -0
  44. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/tool.py +0 -0
  45. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/user.py +0 -0
  46. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/utils/__init__.py +0 -0
  47. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/utils/etag.py +0 -0
  48. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/utils/params.py +0 -0
  49. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v1/view.py +0 -0
  50. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v2/__init__.py +0 -0
  51. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/api/v2/fuzzy.py +0 -0
  52. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/app.py +0 -0
  53. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/README.md +0 -0
  54. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/__init__.py +0 -0
  55. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/classification.py +0 -0
  56. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/classification.yml +0 -0
  57. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/exceptions.py +0 -0
  58. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/loader.py +0 -0
  59. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/logging/__init__.py +0 -0
  60. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/logging/audit.py +0 -0
  61. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/logging/format.py +0 -0
  62. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/net.py +0 -0
  63. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/net_static.py +0 -0
  64. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/random_user.py +0 -0
  65. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/common/swagger.py +0 -0
  66. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/config.py +0 -0
  67. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/cronjobs/__init__.py +0 -0
  68. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/cronjobs/action_queue_worker.py +0 -0
  69. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/cronjobs/retention.py +0 -0
  70. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/cronjobs/view_cleanup.py +0 -0
  71. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/README.md +0 -0
  72. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/__init__.py +0 -0
  73. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/bulk.py +0 -0
  74. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/collection.py +0 -0
  75. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/constants.py +0 -0
  76. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/exceptions.py +0 -0
  77. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/howler_store.py +0 -0
  78. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/migrations/fix_process.py +0 -0
  79. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/operations.py +0 -0
  80. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/schemas.py +0 -0
  81. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/store.py +0 -0
  82. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/support/__init__.py +0 -0
  83. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/support/build.py +0 -0
  84. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/support/schemas.py +0 -0
  85. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/datastore/types.py +0 -0
  86. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/error.py +0 -0
  87. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/external/README.md +0 -0
  88. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/external/__init__.py +0 -0
  89. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/external/generate_mitre.py +0 -0
  90. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/external/generate_sigma_rules.py +0 -0
  91. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/external/generate_tlds.py +0 -0
  92. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/external/reindex_data.py +0 -0
  93. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/external/wipe_databases.py +0 -0
  94. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/gunicorn_config.py +0 -0
  95. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/healthz.py +0 -0
  96. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/helper/__init__.py +0 -0
  97. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/helper/azure.py +0 -0
  98. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/helper/discover.py +0 -0
  99. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/helper/hit.py +0 -0
  100. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/helper/oauth.py +0 -0
  101. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/helper/search.py +0 -0
  102. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/helper/workflow.py +0 -0
  103. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/helper/ws.py +0 -0
  104. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/README.md +0 -0
  105. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/__init__.py +0 -0
  106. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/base.py +0 -0
  107. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/charter.txt +0 -0
  108. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/constants.py +0 -0
  109. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/helper.py +0 -0
  110. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/howler_enum.py +0 -0
  111. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/__init__.py +0 -0
  112. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/action.py +0 -0
  113. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/analytic.py +0 -0
  114. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/assemblyline.py +0 -0
  115. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/aws.py +0 -0
  116. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/azure.py +0 -0
  117. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/case.py +0 -0
  118. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/cbs.py +0 -0
  119. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/clue.py +0 -0
  120. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/config.py +0 -0
  121. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/dossier.py +0 -0
  122. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/__init__.py +0 -0
  123. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/agent.py +0 -0
  124. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/autonomous_system.py +0 -0
  125. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/client.py +0 -0
  126. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/cloud.py +0 -0
  127. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/code_signature.py +0 -0
  128. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/container.py +0 -0
  129. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/dns.py +0 -0
  130. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/egress.py +0 -0
  131. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/elf.py +0 -0
  132. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/email.py +0 -0
  133. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/error.py +0 -0
  134. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/event.py +0 -0
  135. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/faas.py +0 -0
  136. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/file.py +0 -0
  137. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/geo.py +0 -0
  138. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/group.py +0 -0
  139. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/hash.py +0 -0
  140. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/host.py +0 -0
  141. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/http.py +0 -0
  142. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/ingress.py +0 -0
  143. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/interface.py +0 -0
  144. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/network.py +0 -0
  145. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/observer.py +0 -0
  146. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/organization.py +0 -0
  147. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/os.py +0 -0
  148. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/pe.py +0 -0
  149. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/process.py +0 -0
  150. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/registry.py +0 -0
  151. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/related.py +0 -0
  152. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/rule.py +0 -0
  153. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/server.py +0 -0
  154. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/threat.py +0 -0
  155. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/tls.py +0 -0
  156. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/url.py +0 -0
  157. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/user.py +0 -0
  158. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/user_agent.py +0 -0
  159. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/ecs/vulnerability.py +0 -0
  160. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/event.py +0 -0
  161. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/gcp.py +0 -0
  162. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/hit.py +0 -0
  163. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/howler_data.py +0 -0
  164. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/lead.py +0 -0
  165. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/localized_label.py +0 -0
  166. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/overview.py +0 -0
  167. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/pivot.py +0 -0
  168. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/record.py +0 -0
  169. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/template.py +0 -0
  170. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/user.py +0 -0
  171. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/models/view.py +0 -0
  172. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/random_data.py +0 -0
  173. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/odm/randomizer.py +0 -0
  174. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/patched.py +0 -0
  175. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/plugins/__init__.py +0 -0
  176. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/plugins/config.py +0 -0
  177. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/__init__.py +0 -0
  178. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/README.md +0 -0
  179. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/__init__.py +0 -0
  180. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/counters.py +0 -0
  181. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/events.py +0 -0
  182. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/hash.py +0 -0
  183. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/lock.py +0 -0
  184. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/queues/__init__.py +0 -0
  185. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/queues/comms.py +0 -0
  186. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/queues/multi.py +0 -0
  187. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/queues/named.py +0 -0
  188. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/queues/priority.py +0 -0
  189. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/set.py +0 -0
  190. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  191. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/security/__init__.py +0 -0
  192. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/security/socket.py +0 -0
  193. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/security/utils.py +0 -0
  194. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/__init__.py +0 -0
  195. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/action_service.py +0 -0
  196. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/analytic_service.py +0 -0
  197. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/auth_service.py +0 -0
  198. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/config_service.py +0 -0
  199. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/dossier_service.py +0 -0
  200. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/event_service.py +0 -0
  201. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/fuzzy_service.py +0 -0
  202. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/hit_service.py +0 -0
  203. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/jwt_service.py +0 -0
  204. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/lucene_service.py +0 -0
  205. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/notebook_service.py +0 -0
  206. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/overview_service.py +0 -0
  207. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/template_service.py +0 -0
  208. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/user_service.py +0 -0
  209. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/services/viewer_service.py +0 -0
  210. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/telemetry.py +0 -0
  211. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/__init__.py +0 -0
  212. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/annotations.py +0 -0
  213. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/chunk.py +0 -0
  214. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/compat.py +0 -0
  215. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/constants.py +0 -0
  216. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/dict_utils.py +0 -0
  217. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/isotime.py +0 -0
  218. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/list_utils.py +0 -0
  219. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/lucene.py +0 -0
  220. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/path.py +0 -0
  221. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/socket_utils.py +0 -0
  222. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/howler/utils/str_utils.py +0 -0
  223. {howler_api-4.0.0.dev1185 → howler_api-4.0.0.dev1190}/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.dev1185
3
+ Version: 4.0.0.dev1190
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -85,7 +85,7 @@ def execute(query: str, bundle_id: Optional[str] = None, user: Optional[User] =
85
85
  item_parent=folder.id if folder else None,
86
86
  )
87
87
  added.append(hit.howler.id)
88
- except Exception:
88
+ except Exception: # pragma: no cover
89
89
  skipped.append(hit.howler.id)
90
90
 
91
91
  if skipped:
@@ -87,9 +87,9 @@ def execute( # noqa: C901
87
87
  added.append(hit.howler.id)
88
88
  except InvalidDataException as e:
89
89
  skipped.append(f"{hit.howler.id}: {e}")
90
- except NotFoundException as e:
90
+ except NotFoundException as e: # pragma: no cover
91
91
  skipped.append(f"{hit.howler.id}: {e}")
92
- except Exception as e:
92
+ except Exception as e: # pragma: no cover
93
93
  skipped.append(f"{hit.howler.id}: {e}")
94
94
 
95
95
  if added:
@@ -131,7 +131,7 @@ def execute(query: str, bundle_id: Optional[str] = None, user: Optional[User] =
131
131
  "message": str(e),
132
132
  }
133
133
  )
134
- except Exception as e:
134
+ except Exception as e: # pragma: no cover
135
135
  report.append(
136
136
  {
137
137
  "query": query,
@@ -55,7 +55,7 @@ def emit(event: str):
55
55
  @tracer.start_as_current_span(f"{__name__}.get_viewers")
56
56
  @socket_api.route("/viewers/<entity_id>", methods=["GET"])
57
57
  @api_login(audit=False, required_priv=["R"])
58
- def get_viewers(entity_id: str, **kwargs):
58
+ def get_viewers(entity_id: str, **kwargs): # pragma: no cover
59
59
  """Get the list of users currently viewing the specified entity
60
60
 
61
61
  Variables:
@@ -97,11 +97,11 @@ def connect(ws: Server, *args: Any, ws_id: str, **kwargs): # noqa: C901
97
97
  logger.debug("Sending action: %s", data)
98
98
  ws.send(ws_response("action", data))
99
99
 
100
- def send_case(data: dict[str, Any]):
100
+ def send_case(data: dict[str, Any]): # pragma: no cover
101
101
  logger.debug("Sending case update: %s", data.get("case", {}).get("case_id", "unknown"))
102
102
  ws.send(ws_response("cases", data))
103
103
 
104
- def send_viewers_update(data: dict[str, Any]):
104
+ def send_viewers_update(data: dict[str, Any]): # pragma: no cover
105
105
  logger.debug("Sending viewers update: %s", data.get("id", "unknown"))
106
106
  ws.send(ws_response("viewers_update", data))
107
107
 
@@ -139,12 +139,12 @@ def connect(ws: Server, *args: Any, ws_id: str, **kwargs): # noqa: C901
139
139
  )
140
140
  logger.debug("%s: Outstanding actions count=%s", ws_id, len(outstanding_actions))
141
141
  else:
142
- logger.debug("%s listening", ws_id)
142
+ logger.debug("%s listening", ws_id) # pragma: no cover
143
143
  except Exception as e:
144
144
  if isinstance(e, ConnectionClosed):
145
145
  raise
146
146
  else:
147
- logger.exception("%s: Exception in connect loop", ws_id)
147
+ logger.exception("%s: Exception in connect loop", ws_id) # pragma: no cover
148
148
  finally:
149
149
  logger.debug("%s: Deregistering comms listeners", ws_id)
150
150
  comms_service.off("hits", send_hit)
@@ -508,7 +508,7 @@ def set_as_favourite(id: str, user: User | None, **kwargs):
508
508
  if not existing_analytic:
509
509
  return not_found(err="This analytic does not exist")
510
510
 
511
- if not user:
511
+ if not user: # pragma: no cover
512
512
  return forbidden(err="User was not found.")
513
513
 
514
514
  try:
@@ -543,7 +543,7 @@ def remove_as_favourite(id: str, user: User | None, **kwargs):
543
543
  if not storage.analytic.exists(id):
544
544
  return not_found(err="This analytic does not exist")
545
545
 
546
- if not user:
546
+ if not user: # pragma: no cover
547
547
  return forbidden(err="User was not found.")
548
548
 
549
549
  try:
@@ -56,7 +56,7 @@ def create_case(user: User, **kwargs):
56
56
  return bad_request(err=str(e))
57
57
  except ResourceExists as e:
58
58
  return bad_request(err=str(e))
59
- except HowlerException as e:
59
+ except HowlerException as e: # pragma: no cover
60
60
  return bad_request(err=str(e))
61
61
 
62
62
 
@@ -254,7 +254,7 @@ def append_item(id: str, user: User, **kwargs): # noqa: C901
254
254
  except DataStoreException as e:
255
255
  logger.exception("Save Error")
256
256
  return internal_error(err=str(e))
257
- except NotFoundException as e:
257
+ except NotFoundException as e: # pragma: no cover
258
258
  return not_found(err=str(e))
259
259
  except InvalidDataException as e:
260
260
  return bad_request(err=str(e))
@@ -365,5 +365,5 @@ def update_by_query(indexes: str, **kwargs):
365
365
  return ok({"success": all(ds[index].update_by_query(query, operations) for index in indexes.split(","))})
366
366
  except (HowlerValueError, KeyError, DataStoreException) as e:
367
367
  return bad_request(err=str(e))
368
- except Exception as e:
368
+ except Exception as e: # pragma: no cover
369
369
  return internal_error(err=str(e))
@@ -196,7 +196,7 @@ def explain_query(index, **kwargs):
196
196
  del explanation["index"]
197
197
 
198
198
  return ok(result)
199
- except Exception as e:
199
+ except Exception as e: # pragma: no cover
200
200
  logger.exception("Exception on query explanation")
201
201
  return bad_request(err=f"Exception: {e}")
202
202
 
@@ -21,7 +21,7 @@ def setup_job(sched: BaseScheduler):
21
21
  """Start the correlation worker thread if correlation is enabled."""
22
22
  global _thread
23
23
 
24
- if not config.system.correlation.enabled:
24
+ if not config.system.correlation.enabled: # pragma: no cover
25
25
  logger.info("Correlation worker disabled by configuration")
26
26
  return
27
27
 
@@ -52,7 +52,7 @@ class _ObjectsDescriptor(Generic[ModelType]):
52
52
  f"Use '{type(obj).__name__}.store' instead."
53
53
  )
54
54
 
55
- if objtype is None:
55
+ if objtype is None: # pragma: no cover
56
56
  raise HowlerRuntimeError("Cannot resolve owner class for 'store' descriptor.")
57
57
 
58
58
  index_name = objtype.__name__.lower()
@@ -126,14 +126,14 @@ def create_bundle(
126
126
  item_name=f"{child_hit.howler.analytic} ({child_hit.howler.id})",
127
127
  item_parent=folder.id if folder else None,
128
128
  )
129
- except (InvalidDataException, NotFoundException, DataStoreException) as exc:
129
+ except (InvalidDataException, NotFoundException, DataStoreException) as exc: # pragma: no cover
130
130
  logger.warning("Could not add child hit %s to case: %s", child_id, exc)
131
131
 
132
132
  datastore().hit.commit()
133
133
  datastore().case.commit()
134
134
 
135
135
  updated_case: Case | None = datastore().case.get(case.case_id)
136
- if updated_case is None:
136
+ if updated_case is None: # pragma: no cover
137
137
  raise NotFoundException(f"Case {case.case_id} disappeared after creation")
138
138
 
139
139
  return synthesize_bundle_response(updated_case, odm, warnings=warnings)
@@ -176,7 +176,7 @@ def add_to_bundle(
176
176
 
177
177
  # Check for duplicates and nested bundles before modifying
178
178
  current_case: Case | None = datastore().case.get(case_id)
179
- if current_case is None:
179
+ if current_case is None: # pragma: no cover
180
180
  raise NotFoundException(f"Case {case_id} not found")
181
181
 
182
182
  existing_values = {item.value for item in current_case.items}
@@ -191,7 +191,7 @@ def add_to_bundle(
191
191
 
192
192
  for hit_id in hit_ids:
193
193
  child_hit = hit_service.get_hit(hit_id, as_odm=True)
194
- if child_hit is None:
194
+ if child_hit is None: # pragma: no cover
195
195
  logger.warning("Hit %s does not exist, skipping", hit_id)
196
196
  continue
197
197
 
@@ -202,7 +202,7 @@ def add_to_bundle(
202
202
  )
203
203
 
204
204
  updated_case: Case | None = datastore().case.get(case_id)
205
- if updated_case is None:
205
+ if updated_case is None: # pragma: no cover
206
206
  raise NotFoundException(f"Case {case_id} not found")
207
207
 
208
208
  return synthesize_bundle_response(updated_case, root_hit)
@@ -248,7 +248,7 @@ def remove_from_bundle(
248
248
  case_service.remove_case_items(_case, item_ids_to_remove, force=use_force)
249
249
 
250
250
  updated_case: Case | None = datastore().case.get(_case.case_id)
251
- if updated_case is None:
251
+ if updated_case is None: # pragma: no cover
252
252
  raise NotFoundException(f"Case {_case.case_id} not found")
253
253
 
254
254
  return synthesize_bundle_response(updated_case, root_hit)
@@ -443,7 +443,7 @@ def append_case_item( # noqa: C901
443
443
  case CaseItemTypes.REFERENCE | CaseItemTypes.MARKDOWN | CaseItemTypes.FOLDER:
444
444
  case.items.append(item)
445
445
 
446
- if not case.save():
446
+ if not case.save(): # pragma: no cover
447
447
  raise DataStoreException(f"Failed to save {case.case_id} with new {item.type} {item.name}")
448
448
 
449
449
  comms_service.emit("cases", {"case": case.as_primitives()})
@@ -540,7 +540,7 @@ def move_case_item(case: str | Case | None, item_id: str, new_parent: str | None
540
540
 
541
541
  item.parent = new_parent
542
542
 
543
- if not ds.case.save(case.case_id, case):
543
+ if not ds.case.save(case.case_id, case): # pragma: no cover
544
544
  raise DataStoreException("Failed to save case after item move")
545
545
 
546
546
  comms_service.emit("cases", {"case": case.as_primitives()})
@@ -627,7 +627,7 @@ def remove_case_items(case: str | Case | None, item_ids: list[str], force: bool
627
627
 
628
628
  case.items = [item for item in case.items if item.id not in ids_to_remove]
629
629
 
630
- if not ds.case.save(case.case_id, case):
630
+ if not ds.case.save(case.case_id, case): # pragma: no cover
631
631
  raise DataStoreException("Failed to save case after item removal")
632
632
 
633
633
  for backing_obj in backing_objs:
@@ -677,7 +677,7 @@ def append_hit(case: Case, item: CaseItem) -> Case:
677
677
 
678
678
  case.items.append(item)
679
679
 
680
- if not ds.case.save(case.case_id, case):
680
+ if not ds.case.save(case.case_id, case): # pragma: no cover
681
681
  raise DataStoreException(f"Failed to save {case.case_id} with new item {item.value}")
682
682
 
683
683
  _add_backreference(hit, case.case_id)
@@ -718,7 +718,7 @@ def append_event(case: Case, item: CaseItem) -> Case:
718
718
 
719
719
  case.items.append(item)
720
720
 
721
- if not case.save():
721
+ if not case.save(): # pragma: no cover
722
722
  raise DataStoreException(f"Failed to save {case.case_id} with new item {item.value}")
723
723
 
724
724
  _add_backreference(event, case.case_id)
@@ -760,7 +760,7 @@ def append_case(case: Case, item: CaseItem) -> Case:
760
760
 
761
761
  case.items.append(item)
762
762
 
763
- if not case.save():
763
+ if not case.save(): # pragma: no cover
764
764
  raise DataStoreException(f"Failed to save {case.case_id} with new item {item.name}")
765
765
 
766
766
  comms_service.emit("cases", {"case": case.as_primitives()})
@@ -873,7 +873,7 @@ def remove_backreference(backing_obj: Hit | Event | None, case_id: str):
873
873
  if backing_obj is None:
874
874
  raise InvalidDataException("Cannot remove back reference on a nonexisting object")
875
875
 
876
- if not case_id:
876
+ if not case_id: # pragma: no cover
877
877
  raise InvalidDataException("Missing back reference case_id")
878
878
 
879
879
  if case_id in backing_obj.howler.related:
@@ -919,7 +919,7 @@ def rename_case_item(case_id: str, item_id: str, new_name: str) -> Case:
919
919
  if item.type == CaseItemTypes.FOLDER:
920
920
  item.value = item.name
921
921
 
922
- if not case.save():
922
+ if not case.save(): # pragma: no cover
923
923
  raise DataStoreException("Failed to save case after item rename")
924
924
 
925
925
  comms_service.emit("cases", {"case": case.as_primitives()})
@@ -97,7 +97,7 @@ def emit(event: str, data: Any):
97
97
  # Always publish to Redis so other pods receive the event.
98
98
  try:
99
99
  _get_sender().send(event, {"__event__": event, "__payload__": data})
100
- except Exception:
100
+ except Exception: # pragma: no cover
101
101
  logger.exception("Failed to publish event %s to Redis", event)
102
102
 
103
103
 
@@ -172,7 +172,7 @@ def process_batch(record_ids: list[str]) -> int: # noqa: C901
172
172
  logger.debug("Record %s already exists in case %s, skipping", record_id, case_id)
173
173
  except NotFoundException:
174
174
  logger.warning("Case %s or record %s not found during correlation", case_id, record_id)
175
- except Exception:
175
+ except Exception: # pragma: no cover
176
176
  logger.exception("Failed to add record %s to case %s", record_id, case_id)
177
177
 
178
178
  return added
@@ -56,7 +56,7 @@ def build_route_docs(version: str, user_types: list[str]):
56
56
  if blueprint not in api_blueprints:
57
57
  try:
58
58
  doc = current_app.blueprints[rule.endpoint[: rule.endpoint.rindex(".")]]._doc # type: ignore[attr-defined]
59
- except Exception:
59
+ except Exception: # pragma: no cover
60
60
  doc = ""
61
61
 
62
62
  api_blueprints[blueprint] = doc
@@ -220,7 +220,7 @@ def search( # noqa: C901
220
220
  if next_deep_paging_id is not None and len(response["items"]) < rows:
221
221
  try:
222
222
  client.clear_scroll(scroll_id=next_deep_paging_id)
223
- except elasticsearch.exceptions.NotFoundError:
223
+ except elasticsearch.exceptions.NotFoundError: # pragma: no cover
224
224
  pass
225
225
  next_deep_paging_id = None
226
226
 
@@ -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.dev1185"
155
+ version = "4.0.0.dev1190"
156
156
  description = "Howler - API server"
157
157
  authors = [
158
158
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",