howler-api 4.0.0.dev1044__tar.gz → 4.0.0.dev1062__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 (221) hide show
  1. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/PKG-INFO +1 -1
  2. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v2/search.py +4 -2
  3. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/search.py +1 -1
  4. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/case.py +7 -0
  5. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/random_data.py +1 -1
  6. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/case_service.py +39 -0
  7. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/search_service.py +1 -1
  8. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/pyproject.toml +1 -1
  9. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/README.md +0 -0
  10. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/__init__.py +0 -0
  11. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/__init__.py +0 -0
  12. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/add_label.py +0 -0
  13. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/add_to_bundle.py +0 -0
  14. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/add_to_case.py +0 -0
  15. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/change_field.py +0 -0
  16. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/demote.py +0 -0
  17. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/example_plugin.py +0 -0
  18. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/prioritization.py +0 -0
  19. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/promote.py +0 -0
  20. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/remove_from_bundle.py +0 -0
  21. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/remove_label.py +0 -0
  22. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/actions/transition.py +0 -0
  23. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/__init__.py +0 -0
  24. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/base.py +0 -0
  25. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/socket.py +0 -0
  26. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/__init__.py +0 -0
  27. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/action.py +0 -0
  28. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/analytic.py +0 -0
  29. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/auth.py +0 -0
  30. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/clue.py +0 -0
  31. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/configs.py +0 -0
  32. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/dossier.py +0 -0
  33. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/help.py +0 -0
  34. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/hit.py +0 -0
  35. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/notebook.py +0 -0
  36. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/overview.py +0 -0
  37. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/search.py +0 -0
  38. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/template.py +0 -0
  39. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/tool.py +0 -0
  40. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/user.py +0 -0
  41. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/utils/__init__.py +0 -0
  42. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/utils/etag.py +0 -0
  43. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/utils/params.py +0 -0
  44. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v1/view.py +0 -0
  45. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v2/__init__.py +0 -0
  46. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v2/case.py +0 -0
  47. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/api/v2/ingest.py +0 -0
  48. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/app.py +0 -0
  49. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/README.md +0 -0
  50. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/__init__.py +0 -0
  51. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/classification.py +0 -0
  52. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/classification.yml +0 -0
  53. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/exceptions.py +0 -0
  54. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/loader.py +0 -0
  55. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/logging/__init__.py +0 -0
  56. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/logging/audit.py +0 -0
  57. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/logging/format.py +0 -0
  58. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/net.py +0 -0
  59. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/net_static.py +0 -0
  60. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/random_user.py +0 -0
  61. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/common/swagger.py +0 -0
  62. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/config.py +0 -0
  63. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/__init__.py +0 -0
  64. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/action_queue_worker.py +0 -0
  65. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/correlation.py +0 -0
  66. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/retention.py +0 -0
  67. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/cronjobs/view_cleanup.py +0 -0
  68. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/README.md +0 -0
  69. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/__init__.py +0 -0
  70. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/bulk.py +0 -0
  71. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/collection.py +0 -0
  72. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/constants.py +0 -0
  73. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/exceptions.py +0 -0
  74. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/howler_store.py +0 -0
  75. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/migrations/fix_process.py +0 -0
  76. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/operations.py +0 -0
  77. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/schemas.py +0 -0
  78. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/store.py +0 -0
  79. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/support/__init__.py +0 -0
  80. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/support/build.py +0 -0
  81. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/support/schemas.py +0 -0
  82. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/datastore/types.py +0 -0
  83. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/error.py +0 -0
  84. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/README.md +0 -0
  85. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/__init__.py +0 -0
  86. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/generate_mitre.py +0 -0
  87. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/generate_sigma_rules.py +0 -0
  88. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/generate_tlds.py +0 -0
  89. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/reindex_data.py +0 -0
  90. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/external/wipe_databases.py +0 -0
  91. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/gunicorn_config.py +0 -0
  92. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/healthz.py +0 -0
  93. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/__init__.py +0 -0
  94. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/azure.py +0 -0
  95. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/discover.py +0 -0
  96. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/hit.py +0 -0
  97. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/oauth.py +0 -0
  98. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/workflow.py +0 -0
  99. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/helper/ws.py +0 -0
  100. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/README.md +0 -0
  101. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/__init__.py +0 -0
  102. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/base.py +0 -0
  103. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/charter.txt +0 -0
  104. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/constants.py +0 -0
  105. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/helper.py +0 -0
  106. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/howler_enum.py +0 -0
  107. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/mixins.py +0 -0
  108. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/__init__.py +0 -0
  109. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/action.py +0 -0
  110. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/analytic.py +0 -0
  111. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/assemblyline.py +0 -0
  112. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/aws.py +0 -0
  113. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/azure.py +0 -0
  114. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/cbs.py +0 -0
  115. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/clue.py +0 -0
  116. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/config.py +0 -0
  117. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/dossier.py +0 -0
  118. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/__init__.py +0 -0
  119. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/agent.py +0 -0
  120. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/autonomous_system.py +0 -0
  121. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/client.py +0 -0
  122. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/cloud.py +0 -0
  123. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/code_signature.py +0 -0
  124. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/container.py +0 -0
  125. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/dns.py +0 -0
  126. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/egress.py +0 -0
  127. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/elf.py +0 -0
  128. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/email.py +0 -0
  129. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/error.py +0 -0
  130. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/event.py +0 -0
  131. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/faas.py +0 -0
  132. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/file.py +0 -0
  133. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/geo.py +0 -0
  134. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/group.py +0 -0
  135. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/hash.py +0 -0
  136. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/host.py +0 -0
  137. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/http.py +0 -0
  138. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/ingress.py +0 -0
  139. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/interface.py +0 -0
  140. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/network.py +0 -0
  141. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/observer.py +0 -0
  142. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/organization.py +0 -0
  143. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/os.py +0 -0
  144. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/pe.py +0 -0
  145. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/process.py +0 -0
  146. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/registry.py +0 -0
  147. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/related.py +0 -0
  148. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/rule.py +0 -0
  149. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/server.py +0 -0
  150. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/threat.py +0 -0
  151. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/tls.py +0 -0
  152. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/url.py +0 -0
  153. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/user.py +0 -0
  154. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/user_agent.py +0 -0
  155. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/ecs/vulnerability.py +0 -0
  156. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/gcp.py +0 -0
  157. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/hit.py +0 -0
  158. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/howler_data.py +0 -0
  159. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/lead.py +0 -0
  160. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/localized_label.py +0 -0
  161. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/observable.py +0 -0
  162. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/overview.py +0 -0
  163. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/pivot.py +0 -0
  164. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/record.py +0 -0
  165. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/template.py +0 -0
  166. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/user.py +0 -0
  167. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/models/view.py +0 -0
  168. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/odm/randomizer.py +0 -0
  169. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/patched.py +0 -0
  170. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/plugins/__init__.py +0 -0
  171. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/plugins/config.py +0 -0
  172. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/__init__.py +0 -0
  173. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/README.md +0 -0
  174. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/__init__.py +0 -0
  175. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/counters.py +0 -0
  176. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/events.py +0 -0
  177. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/hash.py +0 -0
  178. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/lock.py +0 -0
  179. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/__init__.py +0 -0
  180. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/comms.py +0 -0
  181. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/multi.py +0 -0
  182. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/named.py +0 -0
  183. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/queues/priority.py +0 -0
  184. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/set.py +0 -0
  185. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  186. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/security/__init__.py +0 -0
  187. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/security/socket.py +0 -0
  188. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/security/utils.py +0 -0
  189. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/__init__.py +0 -0
  190. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/action_service.py +0 -0
  191. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/analytic_service.py +0 -0
  192. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/auth_service.py +0 -0
  193. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/bundle_compat_service.py +0 -0
  194. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/config_service.py +0 -0
  195. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/correlation_service.py +0 -0
  196. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/docs_service.py +0 -0
  197. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/dossier_service.py +0 -0
  198. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/event_service.py +0 -0
  199. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/hit_service.py +0 -0
  200. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/jwt_service.py +0 -0
  201. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/lucene_service.py +0 -0
  202. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/notebook_service.py +0 -0
  203. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/observable_service.py +0 -0
  204. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/overview_service.py +0 -0
  205. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/template_service.py +0 -0
  206. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/user_service.py +0 -0
  207. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/services/viewer_service.py +0 -0
  208. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/telemetry.py +0 -0
  209. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/__init__.py +0 -0
  210. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/annotations.py +0 -0
  211. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/chunk.py +0 -0
  212. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/compat.py +0 -0
  213. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/constants.py +0 -0
  214. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/dict_utils.py +0 -0
  215. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/isotime.py +0 -0
  216. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/list_utils.py +0 -0
  217. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/lucene.py +0 -0
  218. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/path.py +0 -0
  219. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/socket_utils.py +0 -0
  220. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/howler/utils/str_utils.py +0 -0
  221. {howler_api-4.0.0.dev1044 → howler_api-4.0.0.dev1062}/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.dev1044
3
+ Version: 4.0.0.dev1062
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -117,6 +117,9 @@ def search(indexes: str, **kwargs):
117
117
  }
118
118
  )
119
119
 
120
+ # NOTE: This means index searches must be either ALL access controlled or none of them havbe access control.
121
+ # Otherwise, the access control requirements on one index will cause the other index to return no items.
122
+ # This is pretty reasonable constraint, as all the relevant, searchable items support classifications.
120
123
  if has_access_control(index_list):
121
124
  params["access_control"] = user["access_control"]
122
125
 
@@ -127,8 +130,7 @@ def search(indexes: str, **kwargs):
127
130
  return bad_request(err="There was no search query.")
128
131
 
129
132
  metadata = params.pop("metadata", [])
130
- access_control = params.pop("access_control", None)
131
- result = search_service.search(indexes, query, access_control=access_control, **params)
133
+ result = search_service.search(indexes, query, access_control=params.pop("access_control", None), **params)
132
134
 
133
135
  if metadata and any(idx in index_list for idx in ["hit"]):
134
136
  hit_service.augment_metadata(result["items"], metadata, user)
@@ -5,7 +5,7 @@ from howler.datastore.collection import ESCollection
5
5
  from howler.odm.models.user import User
6
6
 
7
7
  # List of indices where queries are protected with classification access control
8
- ACCESS_CONTROLLED_INDICES: set[str] = {"hit"}
8
+ ACCESS_CONTROLLED_INDICES: set[str] = {"hit", "observable", "case"}
9
9
 
10
10
  ADMIN_INDEX_MAP: dict[str, Callable[[], ESCollection]] = {}
11
11
 
@@ -2,6 +2,7 @@ from typing import Any, Optional
2
2
 
3
3
  from howler import odm
4
4
  from howler.common.exceptions import HowlerValueError
5
+ from howler.config import CLASSIFICATION
5
6
  from howler.odm.constants import Status
6
7
  from howler.odm.mixins import DatastoreMixin
7
8
  from howler.utils.compat import StrEnum
@@ -120,6 +121,12 @@ class CaseEnrichment(odm.Model):
120
121
  @odm.model(index=True, store=True, description="Case model with path-based items, enrichments, rules, and tasks.")
121
122
  class Case(DatastoreMixin["Case"], odm.Model):
122
123
  case_id: str = odm.UUID(description="A unique identifier for this case.")
124
+ classification: str = odm.Classification(
125
+ is_user_classification=False,
126
+ copyto="__text__",
127
+ default=CLASSIFICATION.UNRESTRICTED,
128
+ description="Maximum classification for the case",
129
+ )
123
130
  title: str = odm.Keyword(description="Case title.")
124
131
  summary: str = odm.Text(description="Short case summary.")
125
132
  overview: str = odm.Optional(odm.Text(description="Markdown overview of the case."))
@@ -809,7 +809,7 @@ def create_cases(ds: HowlerDatastore, num_cases: int = 5):
809
809
  for idx, related_case_id in enumerate(selected_related_case_ids, start=1):
810
810
  items.append(
811
811
  {
812
- "path": f"cases/Related Case {idx}",
812
+ "path": f"Related Case {idx}",
813
813
  "type": "case",
814
814
  "value": related_case_id,
815
815
  }
@@ -429,6 +429,11 @@ def append_case(case_id: str, item: CaseItem) -> Case:
429
429
  the referenced case is not already present in the parent case. It then persists the updated
430
430
  parent case.
431
431
 
432
+ Case items are always placed at the root of the case structure (no subfolders).
433
+ If the supplied ``item.path`` contains folder segments (e.g. ``"folder/child-case"``),
434
+ those segments are stripped and only the last path component is retained. A log
435
+ entry is recorded whenever normalization changes the original path.
436
+
432
437
  Args:
433
438
  case_id: Unique identifier of the parent case to append the reference to.
434
439
  item: A CaseItem whose ``value`` is the ID of an existing case to reference.
@@ -453,6 +458,40 @@ def append_case(case_id: str, item: CaseItem) -> Case:
453
458
  if referenced_case is None:
454
459
  raise NotFoundException(f"Referenced case {item.value} not found, cannot be added to case")
455
460
 
461
+ # Enforce root placement: case items must not live inside subfolders.
462
+ # Strip any leading folder segments, keeping only the last path component.
463
+ original_path = item.path
464
+ if original_path and "/" in original_path:
465
+ stripped_path = original_path.strip("/")
466
+ root_path = stripped_path.split("/")[-1] if stripped_path else None
467
+ else:
468
+ root_path = original_path
469
+
470
+ if not root_path:
471
+ item.path = item.value
472
+ elif root_path != original_path:
473
+ logger.info(
474
+ "Case item path '%s' contains folder segments; normalizing to root path '%s'",
475
+ original_path,
476
+ root_path,
477
+ )
478
+ item.path = root_path
479
+ _case.log.append(
480
+ CaseLog(
481
+ {
482
+ "timestamp": "NOW",
483
+ "key": "items",
484
+ "previous_value": original_path,
485
+ "new_value": root_path,
486
+ "user": "system",
487
+ "explanation": (
488
+ f"Case item path normalized from '{original_path}' to '{root_path}': "
489
+ "case references must be placed at the root of the case structure."
490
+ ),
491
+ }
492
+ )
493
+ )
494
+
456
495
  _case.items.append(item)
457
496
 
458
497
  if not datastore().case.save(_case.case_id, _case):
@@ -56,7 +56,7 @@ def _normalize_indexes(indexes: str | list[str]) -> str:
56
56
  if index in {"*", "_all"} or "-" in index or "*" in index:
57
57
  normalized_indexes.append(index)
58
58
  else:
59
- normalized_indexes.append(f"{APP_NAME}-{index}_hot")
59
+ normalized_indexes.append(f"{APP_NAME}-{index}")
60
60
 
61
61
  return ",".join(normalized_indexes)
62
62
 
@@ -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.dev1044"
155
+ version = "4.0.0.dev1062"
156
156
  description = "Howler - API server"
157
157
  authors = [
158
158
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",