howler-api 4.1.0.dev1573__tar.gz → 4.1.0.dev1582__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 (228) hide show
  1. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/PKG-INFO +1 -1
  2. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/action.py +29 -0
  3. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/__init__.py +6 -1
  4. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/hash.py +5 -5
  5. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/lock.py +4 -4
  6. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/priority.py +3 -3
  7. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/set.py +4 -4
  8. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/user_quota_tracker.py +3 -3
  9. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/action_service.py +36 -1
  10. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/pyproject.toml +1 -1
  11. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/README.md +0 -0
  12. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/__init__.py +0 -0
  13. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/__init__.py +0 -0
  14. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/add_label.py +0 -0
  15. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/add_to_bundle.py +0 -0
  16. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/add_to_case.py +0 -0
  17. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/change_field.py +0 -0
  18. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/demote.py +0 -0
  19. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/example_plugin.py +0 -0
  20. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/prioritization.py +0 -0
  21. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/promote.py +0 -0
  22. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/remove_from_bundle.py +0 -0
  23. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/remove_label.py +0 -0
  24. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/transition.py +0 -0
  25. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/__init__.py +0 -0
  26. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/base.py +0 -0
  27. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/socket.py +0 -0
  28. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/__init__.py +0 -0
  29. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/analytic.py +0 -0
  30. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/auth.py +0 -0
  31. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/clue.py +0 -0
  32. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/configs.py +0 -0
  33. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/dossier.py +0 -0
  34. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/help.py +0 -0
  35. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/hit.py +0 -0
  36. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/notebook.py +0 -0
  37. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/overview.py +0 -0
  38. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/search.py +0 -0
  39. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/template.py +0 -0
  40. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/tool.py +0 -0
  41. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/user.py +0 -0
  42. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/utils/__init__.py +0 -0
  43. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/utils/etag.py +0 -0
  44. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/utils/params.py +0 -0
  45. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/view.py +0 -0
  46. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/__init__.py +0 -0
  47. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/case.py +0 -0
  48. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/fuzzy.py +0 -0
  49. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/ingest.py +0 -0
  50. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/search.py +0 -0
  51. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/app.py +0 -0
  52. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/README.md +0 -0
  53. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/__init__.py +0 -0
  54. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/classification.py +0 -0
  55. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/classification.yml +0 -0
  56. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/exceptions.py +0 -0
  57. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/loader.py +0 -0
  58. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/logging/__init__.py +0 -0
  59. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/logging/audit.py +0 -0
  60. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/logging/format.py +0 -0
  61. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/net.py +0 -0
  62. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/net_static.py +0 -0
  63. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/random_user.py +0 -0
  64. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/swagger.py +0 -0
  65. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/config.py +0 -0
  66. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/__init__.py +0 -0
  67. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/action_queue_worker.py +0 -0
  68. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/correlation.py +0 -0
  69. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/retention.py +0 -0
  70. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/view_cleanup.py +0 -0
  71. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/README.md +0 -0
  72. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/__init__.py +0 -0
  73. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/bulk.py +0 -0
  74. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/collection.py +0 -0
  75. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/constants.py +0 -0
  76. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/exceptions.py +0 -0
  77. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/howler_store.py +0 -0
  78. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/migrations/fix_process.py +0 -0
  79. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/operations.py +0 -0
  80. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/schemas.py +0 -0
  81. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/store.py +0 -0
  82. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/support/__init__.py +0 -0
  83. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/support/build.py +0 -0
  84. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/support/schemas.py +0 -0
  85. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/types.py +0 -0
  86. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/utils.py +0 -0
  87. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/error.py +0 -0
  88. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/README.md +0 -0
  89. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/__init__.py +0 -0
  90. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/check_duplicates.py +0 -0
  91. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/generate_mitre.py +0 -0
  92. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/generate_sigma_rules.py +0 -0
  93. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/generate_tlds.py +0 -0
  94. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/reindex_data.py +0 -0
  95. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/wipe_databases.py +0 -0
  96. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/gunicorn_config.py +0 -0
  97. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/healthz.py +0 -0
  98. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/__init__.py +0 -0
  99. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/azure.py +0 -0
  100. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/discover.py +0 -0
  101. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/hit.py +0 -0
  102. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/oauth.py +0 -0
  103. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/search.py +0 -0
  104. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/workflow.py +0 -0
  105. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/ws.py +0 -0
  106. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/README.md +0 -0
  107. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/__init__.py +0 -0
  108. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/base.py +0 -0
  109. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/charter.txt +0 -0
  110. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/constants.py +0 -0
  111. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/helper.py +0 -0
  112. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/howler_enum.py +0 -0
  113. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/mixins.py +0 -0
  114. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/__init__.py +0 -0
  115. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/action.py +0 -0
  116. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/analytic.py +0 -0
  117. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/assemblyline.py +0 -0
  118. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/aws.py +0 -0
  119. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/azure.py +0 -0
  120. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/case.py +0 -0
  121. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/cbs.py +0 -0
  122. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/clue.py +0 -0
  123. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/config.py +0 -0
  124. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/dossier.py +0 -0
  125. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/__init__.py +0 -0
  126. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/agent.py +0 -0
  127. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/autonomous_system.py +0 -0
  128. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/client.py +0 -0
  129. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/cloud.py +0 -0
  130. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/code_signature.py +0 -0
  131. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/container.py +0 -0
  132. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/dns.py +0 -0
  133. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/egress.py +0 -0
  134. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/elf.py +0 -0
  135. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/email.py +0 -0
  136. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/error.py +0 -0
  137. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/event.py +0 -0
  138. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/faas.py +0 -0
  139. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/file.py +0 -0
  140. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/geo.py +0 -0
  141. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/group.py +0 -0
  142. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/hash.py +0 -0
  143. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/host.py +0 -0
  144. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/http.py +0 -0
  145. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/ingress.py +0 -0
  146. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/interface.py +0 -0
  147. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/network.py +0 -0
  148. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/observer.py +0 -0
  149. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/organization.py +0 -0
  150. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/os.py +0 -0
  151. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/pe.py +0 -0
  152. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/process.py +0 -0
  153. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/registry.py +0 -0
  154. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/related.py +0 -0
  155. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/rule.py +0 -0
  156. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/server.py +0 -0
  157. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/threat.py +0 -0
  158. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/tls.py +0 -0
  159. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/url.py +0 -0
  160. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/user.py +0 -0
  161. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/user_agent.py +0 -0
  162. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/vulnerability.py +0 -0
  163. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/event.py +0 -0
  164. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/gcp.py +0 -0
  165. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/hit.py +0 -0
  166. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/howler_data.py +0 -0
  167. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/lead.py +0 -0
  168. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/localized_label.py +0 -0
  169. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/overview.py +0 -0
  170. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/pivot.py +0 -0
  171. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/record.py +0 -0
  172. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/template.py +0 -0
  173. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/user.py +0 -0
  174. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/view.py +0 -0
  175. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/random_data.py +0 -0
  176. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/randomizer.py +0 -0
  177. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/patched.py +0 -0
  178. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/plugins/__init__.py +0 -0
  179. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/plugins/config.py +0 -0
  180. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/__init__.py +0 -0
  181. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/README.md +0 -0
  182. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/counters.py +0 -0
  183. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/events.py +0 -0
  184. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/__init__.py +0 -0
  185. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/comms.py +0 -0
  186. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/multi.py +0 -0
  187. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/named.py +0 -0
  188. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/security/__init__.py +0 -0
  189. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/security/login.py +0 -0
  190. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/security/socket.py +0 -0
  191. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/security/utils.py +0 -0
  192. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/__init__.py +0 -0
  193. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/analytic_service.py +0 -0
  194. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/auth_service.py +0 -0
  195. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/bundle_compat_service.py +0 -0
  196. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/case_service.py +0 -0
  197. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/comms_service.py +0 -0
  198. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/config_service.py +0 -0
  199. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/correlation_service.py +0 -0
  200. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/docs_service.py +0 -0
  201. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/dossier_service.py +0 -0
  202. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/event_service.py +0 -0
  203. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/fuzzy_service.py +0 -0
  204. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/hit_service.py +0 -0
  205. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/jwt_service.py +0 -0
  206. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/lucene_service.py +0 -0
  207. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/notebook_service.py +0 -0
  208. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/overview_service.py +0 -0
  209. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/search_service.py +0 -0
  210. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/template_service.py +0 -0
  211. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/user_service.py +0 -0
  212. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/viewer_service.py +0 -0
  213. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/telemetry.py +0 -0
  214. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/__init__.py +0 -0
  215. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/annotations.py +0 -0
  216. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/chunk.py +0 -0
  217. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/compat.py +0 -0
  218. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/constants.py +0 -0
  219. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/dict_utils.py +0 -0
  220. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/indexes.py +0 -0
  221. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/isotime.py +0 -0
  222. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/list_utils.py +0 -0
  223. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/lucene.py +0 -0
  224. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/net_utils.py +0 -0
  225. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/path.py +0 -0
  226. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/socket_utils.py +0 -0
  227. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/str_utils.py +0 -0
  228. {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 4.1.0.dev1573
3
+ Version: 4.1.0.dev1582
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -4,6 +4,7 @@ from flask import Response, request
4
4
 
5
5
  import howler.actions as actions
6
6
  from howler.api import bad_request, created, forbidden, internal_error, make_subapi_blueprint, no_content, not_found, ok
7
+ from howler.api.v1.utils.etag import add_etag
7
8
  from howler.api.v1.utils.params import parse_parameters, parse_refresh
8
9
  from howler.common.exceptions import HowlerException
9
10
  from howler.common.loader import datastore
@@ -46,6 +47,34 @@ def get_actions(**_) -> Response:
46
47
  return ok(datastore().action.search("*:*", as_obj=False)["items"])
47
48
 
48
49
 
50
+ @generate_swagger_docs()
51
+ @action_api.route("/<id>", methods=["GET"])
52
+ @api_login(
53
+ audit=True,
54
+ check_xsrf_token=False,
55
+ required_type=["admin", "automation_basic", "automation_advanced", "actionrunner_basic", "actionrunner_advanced"],
56
+ )
57
+ @add_etag(getter=action_service.get_action)
58
+ def get_action(id: str, record: Action | None, server_version: str, **kwargs) -> Response | tuple[Response, str]:
59
+ """Get an existing action.
60
+
61
+ Variables:
62
+ id => The id of the action to retrieve
63
+
64
+ Optional Arguments:
65
+ None
66
+
67
+ Result Example:
68
+ {
69
+ ...action # The requested action
70
+ }
71
+ """
72
+ if not record:
73
+ return not_found(err="The specified action does not exist")
74
+
75
+ return ok(record), server_version
76
+
77
+
49
78
  @generate_swagger_docs()
50
79
  @action_api.route("/", methods=["POST"])
51
80
  @api_login(audit=False, check_xsrf_token=False, required_type=["admin", "automation_basic", "automation_advanced"])
@@ -7,7 +7,7 @@ import socket
7
7
  import time
8
8
  from datetime import datetime, timezone
9
9
  from pathlib import Path
10
- from typing import Any
10
+ from typing import Any, Protocol
11
11
 
12
12
  import redis
13
13
  from packaging.version import parse
@@ -29,6 +29,11 @@ if parse(redis.__version__) <= parse("2.10.0"):
29
29
 
30
30
  APP_NAME = os.environ.get("APP_NAME", "howler")
31
31
 
32
+
33
+ class RedisScriptClient(Protocol):
34
+ def register_script(self, script: str) -> Any: ...
35
+
36
+
32
37
  log = logging.getLogger(f"{APP_NAME}.queue")
33
38
  pool: dict[tuple[str, str, bool], redis.BlockingConnectionPool] = {}
34
39
 
@@ -2,12 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  import json
4
4
  import time
5
- from typing import TYPE_CHECKING, Any, Generic, Optional, TypeVar
5
+ from typing import TYPE_CHECKING, Any, Generic, Optional, TypeVar, cast
6
6
 
7
7
  from redis import RedisCluster
8
8
 
9
9
  from howler.common.exceptions import HowlerValueError
10
- from howler.remote.datatypes import get_client, retry_call
10
+ from howler.remote.datatypes import RedisScriptClient, get_client, retry_call
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from redis import Redis
@@ -78,9 +78,9 @@ class Hash(Generic[T]):
78
78
  ):
79
79
  self.c: Any = get_client(host, port, False)
80
80
  self.name = name
81
- self._pop = self.c.register_script(h_pop_script)
82
- self._limited_add = self.c.register_script(_limited_add)
83
- self._conditional_remove = self.c.register_script(_conditional_remove_script)
81
+ self._pop = cast(RedisScriptClient, self.c).register_script(h_pop_script)
82
+ self._limited_add = cast(RedisScriptClient, self.c).register_script(_limited_add)
83
+ self._conditional_remove = cast(RedisScriptClient, self.c).register_script(_conditional_remove_script)
84
84
 
85
85
  def __iter__(self):
86
86
  return HashIterator(self)
@@ -1,6 +1,6 @@
1
- from typing import Any
1
+ from typing import Any, cast
2
2
 
3
- from howler.remote.datatypes import get_client, retry_call
3
+ from howler.remote.datatypes import RedisScriptClient, get_client, retry_call
4
4
  from howler.utils.uid import get_random_id
5
5
 
6
6
  lock_acquire_script = """
@@ -33,8 +33,8 @@ class Lock(object):
33
33
  self.lock_release = "-".join(("lock", str(timeout), name, "released"))
34
34
  self.lock_holder = "-".join(("lock", str(timeout), name, "holder"))
35
35
  self.timeout = timeout
36
- self._acquire = self.c.register_script(lock_acquire_script)
37
- self._release = self.c.register_script(lock_release_script)
36
+ self._acquire = cast(RedisScriptClient, self.c).register_script(lock_acquire_script)
37
+ self._release = cast(RedisScriptClient, self.c).register_script(lock_release_script)
38
38
 
39
39
  def __enter__(self):
40
40
  while not retry_call(self._acquire, args=[self.lock_holder, self.uuid, self.timeout]):
@@ -2,10 +2,10 @@ from __future__ import annotations
2
2
 
3
3
  import json
4
4
  import time
5
- from typing import Any, Generic, Optional, TypeVar, Union
5
+ from typing import Any, Generic, Optional, TypeVar, Union, cast
6
6
 
7
7
  from howler.common.exceptions import HowlerTypeError
8
- from howler.remote.datatypes import decode, get_client, retry_call
8
+ from howler.remote.datatypes import RedisScriptClient, decode, get_client, retry_call
9
9
 
10
10
  SORTING_KEY_LEN = 21
11
11
 
@@ -37,7 +37,7 @@ T = TypeVar("T")
37
37
  class PriorityQueue(Generic[T]):
38
38
  def __init__(self, name, host=None, port=None, private=False):
39
39
  self.c: Any = get_client(host, port, private)
40
- self._deque_range = self.c.register_script(pq_dequeue_range_script)
40
+ self._deque_range = cast(RedisScriptClient, self.c).register_script(pq_dequeue_range_script)
41
41
  self.name = name
42
42
 
43
43
  def __enter__(self):
@@ -1,8 +1,8 @@
1
1
  import json
2
2
  import time
3
- from typing import Any
3
+ from typing import Any, cast
4
4
 
5
- from howler.remote.datatypes import get_client, retry_call
5
+ from howler.remote.datatypes import RedisScriptClient, get_client, retry_call
6
6
 
7
7
  _drop_card_script = """
8
8
  local set_name = ARGV[1]
@@ -29,8 +29,8 @@ class Set(object):
29
29
  def __init__(self, name, host=None, port=None):
30
30
  self.c: Any = get_client(host, port, False)
31
31
  self.name = name
32
- self._drop_card = self.c.register_script(_drop_card_script)
33
- self._limited_add = self.c.register_script(_limited_add)
32
+ self._drop_card = cast(RedisScriptClient, self.c).register_script(_drop_card_script)
33
+ self._limited_add = cast(RedisScriptClient, self.c).register_script(_limited_add)
34
34
 
35
35
  def __enter__(self):
36
36
  return self
@@ -1,8 +1,8 @@
1
- from typing import Any
1
+ from typing import Any, cast
2
2
 
3
3
  from redis.exceptions import ResponseError
4
4
 
5
- from howler.remote.datatypes import get_client, retry_call
5
+ from howler.remote.datatypes import RedisScriptClient, get_client, retry_call
6
6
 
7
7
  begin_script = """
8
8
  local t = redis.call('time')
@@ -25,7 +25,7 @@ end
25
25
  class UserQuotaTracker(object):
26
26
  def __init__(self, prefix, timeout=120, redis=None, host=None, port=None, private=False):
27
27
  self.c: Any = redis or get_client(host, port, private)
28
- self.bs = self.c.register_script(begin_script)
28
+ self.bs = cast(RedisScriptClient, self.c).register_script(begin_script)
29
29
  self.prefix = prefix
30
30
  self.timeout = timeout
31
31
 
@@ -1,7 +1,7 @@
1
1
  import json
2
2
  from collections import defaultdict
3
3
  from importlib.util import find_spec
4
- from typing import Any, Optional, TypedDict
4
+ from typing import Any, Literal, Optional, TypedDict, overload
5
5
 
6
6
  from cryptography.exceptions import InvalidTag
7
7
  from flask import Response, has_request_context, request
@@ -35,6 +35,41 @@ class TriggeredAction(TypedDict):
35
35
  _action_queues: dict[str, NamedQueue[TriggeredAction]] = {}
36
36
 
37
37
 
38
+ @overload
39
+ def get_action(
40
+ id: str, as_odm: Literal[True], version: Literal[True], user: User | None = None
41
+ ) -> tuple[Action, str]: ...
42
+
43
+
44
+ @overload
45
+ def get_action(id: str, as_odm: Literal[True], version: Literal[False]) -> Action: ...
46
+
47
+
48
+ @overload
49
+ def get_action(id: str, as_odm: Literal[True]) -> Action: ...
50
+
51
+
52
+ @overload
53
+ def get_action(id: str) -> Action: ...
54
+
55
+
56
+ @overload
57
+ def get_action(id: str, as_odm: Literal[False], version: Literal[True]) -> tuple[dict[str, Any], str]: ...
58
+
59
+
60
+ @overload
61
+ def get_action(id: str, as_odm: Literal[False], version: Literal[False]) -> dict[str, Any]: ...
62
+
63
+
64
+ @overload
65
+ def get_action(id: str, as_odm: Literal[False]) -> dict[str, Any]: ...
66
+
67
+
68
+ def get_action(id: str, as_odm=False, version=False, user: User | None = None):
69
+ """Retrieve an action from the datastore as an ODM object or dictionary."""
70
+ return datastore().action.get_if_exists(key=id, as_obj=as_odm, version=version)
71
+
72
+
38
73
  def _is_builtin_operation(operation_id: str) -> bool:
39
74
  """Return whether an operation is implemented by Howler's built-in actions package."""
40
75
  return find_spec(f"howler.actions.{operation_id}") is not None
@@ -152,7 +152,7 @@ suppress-none-returning = true
152
152
  [tool.poetry]
153
153
  package-mode = true
154
154
  name = "howler-api"
155
- version = "4.1.0.dev1573"
155
+ version = "4.1.0.dev1582"
156
156
  description = "Howler - API server"
157
157
  authors = [
158
158
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",