howler-api 3.3.0.dev763__tar.gz → 3.3.0.dev764__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 (201) hide show
  1. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/PKG-INFO +2 -2
  2. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/__init__.py +3 -1
  3. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/clue.py +2 -2
  4. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/cronjobs/rules.py +2 -2
  5. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/discover.py +2 -2
  6. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/helper.py +2 -2
  7. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/random_data.py +8 -7
  8. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/security/__init__.py +2 -2
  9. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/action_service.py +2 -2
  10. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/lucene_service.py +2 -1
  11. howler_api-3.3.0.dev764/howler/utils/constants.py +4 -0
  12. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/pyproject.toml +3 -3
  13. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/README.md +0 -0
  14. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/__init__.py +0 -0
  15. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/__init__.py +0 -0
  16. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/add_label.py +0 -0
  17. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/add_to_bundle.py +0 -0
  18. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/change_field.py +0 -0
  19. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/demote.py +0 -0
  20. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/example_plugin.py +0 -0
  21. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/prioritization.py +0 -0
  22. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/promote.py +0 -0
  23. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/remove_from_bundle.py +0 -0
  24. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/remove_label.py +0 -0
  25. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/actions/transition.py +0 -0
  26. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/base.py +0 -0
  27. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/socket.py +0 -0
  28. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/__init__.py +0 -0
  29. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/action.py +0 -0
  30. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/analytic.py +0 -0
  31. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/auth.py +0 -0
  32. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/configs.py +0 -0
  33. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/dossier.py +0 -0
  34. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/help.py +0 -0
  35. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/hit.py +0 -0
  36. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/notebook.py +0 -0
  37. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/overview.py +0 -0
  38. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/search.py +0 -0
  39. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/template.py +0 -0
  40. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/tool.py +0 -0
  41. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/user.py +0 -0
  42. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/utils/__init__.py +0 -0
  43. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/utils/etag.py +0 -0
  44. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/api/v1/view.py +0 -0
  45. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/app.py +0 -0
  46. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/README.md +0 -0
  47. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/__init__.py +0 -0
  48. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/classification.py +0 -0
  49. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/classification.yml +0 -0
  50. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/exceptions.py +0 -0
  51. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/loader.py +0 -0
  52. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/logging/__init__.py +0 -0
  53. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/logging/audit.py +0 -0
  54. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/logging/format.py +0 -0
  55. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/net.py +0 -0
  56. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/net_static.py +0 -0
  57. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/random_user.py +0 -0
  58. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/common/swagger.py +0 -0
  59. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/config.py +0 -0
  60. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/cronjobs/__init__.py +0 -0
  61. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/cronjobs/retention.py +0 -0
  62. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/cronjobs/view_cleanup.py +0 -0
  63. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/README.md +0 -0
  64. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/__init__.py +0 -0
  65. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/bulk.py +0 -0
  66. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/collection.py +0 -0
  67. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/constants.py +0 -0
  68. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/exceptions.py +0 -0
  69. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/howler_store.py +0 -0
  70. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/migrations/fix_process.py +0 -0
  71. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/operations.py +0 -0
  72. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/schemas.py +0 -0
  73. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/store.py +0 -0
  74. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/support/__init__.py +0 -0
  75. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/support/build.py +0 -0
  76. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/support/schemas.py +0 -0
  77. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/datastore/types.py +0 -0
  78. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/error.py +0 -0
  79. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/README.md +0 -0
  80. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/__init__.py +0 -0
  81. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/generate_mitre.py +0 -0
  82. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/generate_sigma_rules.py +0 -0
  83. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/generate_tlds.py +0 -0
  84. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/reindex_data.py +0 -0
  85. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/external/wipe_databases.py +0 -0
  86. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/gunicorn_config.py +0 -0
  87. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/healthz.py +0 -0
  88. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/__init__.py +0 -0
  89. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/azure.py +0 -0
  90. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/hit.py +0 -0
  91. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/oauth.py +0 -0
  92. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/search.py +0 -0
  93. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/workflow.py +0 -0
  94. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/helper/ws.py +0 -0
  95. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/README.md +0 -0
  96. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/__init__.py +0 -0
  97. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/base.py +0 -0
  98. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/charter.txt +0 -0
  99. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/howler_enum.py +0 -0
  100. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/__init__.py +0 -0
  101. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/action.py +0 -0
  102. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/analytic.py +0 -0
  103. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/assemblyline.py +0 -0
  104. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/aws.py +0 -0
  105. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/azure.py +0 -0
  106. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/cbs.py +0 -0
  107. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/clue.py +0 -0
  108. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/config.py +0 -0
  109. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/dossier.py +0 -0
  110. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/__init__.py +0 -0
  111. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/agent.py +0 -0
  112. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/autonomous_system.py +0 -0
  113. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/client.py +0 -0
  114. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/cloud.py +0 -0
  115. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/code_signature.py +0 -0
  116. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/container.py +0 -0
  117. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/dns.py +0 -0
  118. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/egress.py +0 -0
  119. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/elf.py +0 -0
  120. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/email.py +0 -0
  121. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/error.py +0 -0
  122. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/event.py +0 -0
  123. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/faas.py +0 -0
  124. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/file.py +0 -0
  125. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/geo.py +0 -0
  126. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/group.py +0 -0
  127. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/hash.py +0 -0
  128. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/host.py +0 -0
  129. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/http.py +0 -0
  130. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/ingress.py +0 -0
  131. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/interface.py +0 -0
  132. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/network.py +0 -0
  133. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/observer.py +0 -0
  134. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/organization.py +0 -0
  135. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/os.py +0 -0
  136. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/pe.py +0 -0
  137. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/process.py +0 -0
  138. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/registry.py +0 -0
  139. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/related.py +0 -0
  140. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/rule.py +0 -0
  141. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/server.py +0 -0
  142. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/threat.py +0 -0
  143. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/tls.py +0 -0
  144. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/url.py +0 -0
  145. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/user.py +0 -0
  146. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/user_agent.py +0 -0
  147. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/ecs/vulnerability.py +0 -0
  148. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/gcp.py +0 -0
  149. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/hit.py +0 -0
  150. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/howler_data.py +0 -0
  151. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/lead.py +0 -0
  152. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/localized_label.py +0 -0
  153. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/overview.py +0 -0
  154. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/pivot.py +0 -0
  155. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/template.py +0 -0
  156. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/user.py +0 -0
  157. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/models/view.py +0 -0
  158. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/odm/randomizer.py +0 -0
  159. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/patched.py +0 -0
  160. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/plugins/__init__.py +0 -0
  161. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/plugins/config.py +0 -0
  162. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/__init__.py +0 -0
  163. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/README.md +0 -0
  164. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/__init__.py +0 -0
  165. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/counters.py +0 -0
  166. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/events.py +0 -0
  167. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/hash.py +0 -0
  168. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/lock.py +0 -0
  169. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/__init__.py +0 -0
  170. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/comms.py +0 -0
  171. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/multi.py +0 -0
  172. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/named.py +0 -0
  173. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/queues/priority.py +0 -0
  174. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/set.py +0 -0
  175. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  176. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/security/socket.py +0 -0
  177. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/security/utils.py +0 -0
  178. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/__init__.py +0 -0
  179. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/analytic_service.py +0 -0
  180. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/auth_service.py +0 -0
  181. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/config_service.py +0 -0
  182. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/dossier_service.py +0 -0
  183. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/event_service.py +0 -0
  184. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/hit_service.py +0 -0
  185. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/jwt_service.py +0 -0
  186. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/notebook_service.py +0 -0
  187. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/overview_service.py +0 -0
  188. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/template_service.py +0 -0
  189. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/services/user_service.py +0 -0
  190. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/telemetry.py +0 -0
  191. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/__init__.py +0 -0
  192. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/annotations.py +0 -0
  193. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/chunk.py +0 -0
  194. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/dict_utils.py +0 -0
  195. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/isotime.py +0 -0
  196. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/list_utils.py +0 -0
  197. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/lucene.py +0 -0
  198. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/path.py +0 -0
  199. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/socket_utils.py +0 -0
  200. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/str_utils.py +0 -0
  201. {howler_api-3.3.0.dev763 → howler_api-3.3.0.dev764}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 3.3.0.dev763
3
+ Version: 3.3.0.dev764
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -8,7 +8,7 @@ Author: Canadian Centre for Cyber Security
8
8
  Author-email: howler@cyber.gc.ca
9
9
  Maintainer: Matthew Rafuse
10
10
  Maintainer-email: matthew.rafuse@cyber.gc.ca
11
- Requires-Python: >=3.9.17,<4.0.0
11
+ Requires-Python: >=3.10,<4.0
12
12
  Classifier: Development Status :: 5 - Production/Stable
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: License :: OSI Approved :: MIT License
@@ -10,6 +10,7 @@ from howler import odm
10
10
  from howler.common.loader import APP_NAME
11
11
  from howler.common.logging import get_logger, log_with_traceback
12
12
  from howler.config import QUOTA_TRACKER, get_version
13
+ from howler.utils.constants import TESTING
13
14
  from howler.utils.str_utils import safe_str
14
15
 
15
16
  API_PREFIX = "/api"
@@ -72,7 +73,8 @@ def _make_api_response(
72
73
  resp.set_cookie(k, v, secure=True, httponly=True, samesite="Lax")
73
74
 
74
75
  RAW_API_COUNTER.labels(request.method, str(request.url_rule), status_code).inc()
75
- logger.info("%s %s - %s", request.method, request.path, status_code)
76
+ if not TESTING:
77
+ logger.info("%s %s - %s", request.method, request.path, status_code)
76
78
 
77
79
  return resp
78
80
 
@@ -1,4 +1,3 @@
1
- import sys
2
1
  import time
3
2
  from typing import Callable, Optional
4
3
 
@@ -12,6 +11,7 @@ from howler.common.swagger import generate_swagger_docs
12
11
  from howler.config import cache, config
13
12
  from howler.plugins import get_plugins
14
13
  from howler.security import api_login
14
+ from howler.utils.constants import TESTING
15
15
 
16
16
  SUB_API = "clue"
17
17
  clue_api = make_subapi_blueprint(SUB_API, api_version=1)
@@ -22,7 +22,7 @@ logger = get_logger(__file__)
22
22
 
23
23
  def skip_cache(*args):
24
24
  "Function to skip cache in testing mode"
25
- return "pytest" in sys.modules
25
+ return TESTING
26
26
 
27
27
 
28
28
  @cache.memoize(15 * 60, unless=skip_cache)
@@ -3,7 +3,6 @@ import json
3
3
  import os
4
4
  import random
5
5
  import re
6
- import sys
7
6
  from datetime import datetime
8
7
  from typing import Any, Optional
9
8
 
@@ -23,6 +22,7 @@ from howler.datastore.operations import OdmHelper, OdmUpdateOperation
23
22
  from howler.odm.models.analytic import Analytic
24
23
  from howler.odm.models.hit import Hit
25
24
  from howler.odm.models.howler_data import HitOperationType
25
+ from howler.utils.constants import TESTING
26
26
 
27
27
  logger = get_logger(__file__)
28
28
  hit_helper = OdmHelper(Hit)
@@ -217,7 +217,7 @@ def register_rules(new_rule: Optional[Analytic] = None, test_override: bool = Fa
217
217
  logger.error("Scheduler instance does not exist!")
218
218
  return
219
219
 
220
- if "pytest" in sys.modules and not test_override:
220
+ if TESTING and not test_override:
221
221
  logger.info("Skipping registration, running in a test environment")
222
222
  return
223
223
 
@@ -1,4 +1,3 @@
1
- import sys
2
1
  import typing
3
2
  from typing import Optional
4
3
 
@@ -6,6 +5,7 @@ import requests
6
5
 
7
6
  from howler.common.logging import get_logger
8
7
  from howler.config import config
8
+ from howler.utils.constants import TESTING
9
9
 
10
10
  logger = get_logger(__file__)
11
11
  DISCO_CACHE = {}
@@ -20,7 +20,7 @@ def get_apps_list(discovery_url: Optional[str]) -> list[dict[str, str]]:
20
20
  if discovery_url not in DISCO_CACHE:
21
21
  apps = []
22
22
 
23
- if "pytest" in sys.modules:
23
+ if TESTING:
24
24
  logger.info("Skipping discovery, running in a test environment")
25
25
 
26
26
  try:
@@ -1,6 +1,5 @@
1
1
  import json
2
2
  import random
3
- import sys
4
3
  from datetime import datetime, timedelta
5
4
  from hashlib import md5
6
5
  from math import ceil
@@ -29,6 +28,7 @@ from howler.odm.randomizer import (
29
28
  )
30
29
  from howler.plugins import get_plugins
31
30
  from howler.security.utils import get_password_hash
31
+ from howler.utils.constants import TESTING
32
32
  from howler.utils.uid import get_random_id
33
33
 
34
34
  APPS = get_apps_list(discovery_url=config.ui.discover_url)
@@ -360,7 +360,7 @@ def create_users_with_username(ds: HowlerDatastore, usernames: list[str]):
360
360
  )
361
361
  ds.user.save(username, user_data)
362
362
 
363
- if "pytest" not in sys.modules:
363
+ if not TESTING:
364
364
  logger.info("%s:%s", username, username)
365
365
 
366
366
  ds.user.commit()
@@ -6,6 +6,7 @@ from dotenv import load_dotenv
6
6
 
7
7
  from howler.odm.models.clue import Clue
8
8
  from howler.plugins import get_plugins
9
+ from howler.utils.constants import TESTING
9
10
 
10
11
  load_dotenv()
11
12
 
@@ -136,7 +137,7 @@ def create_users(ds):
136
137
  )
137
138
  ds.view.save(admin_view.view_id, admin_view)
138
139
 
139
- if "pytest" not in sys.modules:
140
+ if not TESTING:
140
141
  logger.info("\t%s:%s", user_data.uname, admin_pass)
141
142
 
142
143
  user_hash = get_password_hash(user_pass)
@@ -183,7 +184,7 @@ def create_users(ds):
183
184
  )
184
185
  ds.view.save(user_view.view_id, user_view)
185
186
 
186
- if "pytest" not in sys.modules:
187
+ if not TESTING:
187
188
  logger.info("\t%s:%s", user_data.uname, user_pass)
188
189
 
189
190
  huey_hash = get_password_hash(huey_pass)
@@ -230,7 +231,7 @@ def create_users(ds):
230
231
  )
231
232
  ds.view.save(huey_view.view_id, huey_view)
232
233
 
233
- if "pytest" not in sys.modules:
234
+ if not TESTING:
234
235
  logger.info("\t%s:%s", huey_data.uname, huey_pass)
235
236
 
236
237
  shawnh_view = View(
@@ -260,7 +261,7 @@ def create_users(ds):
260
261
  ds.user.save("shawn-h", shawn_data)
261
262
  ds.view.save(shawnh_view.view_id, shawnh_view)
262
263
 
263
- if "pytest" not in sys.modules:
264
+ if not TESTING:
264
265
  logger.info("\t%s:%s", shawn_data.uname, shawnh_pass)
265
266
 
266
267
  goose_view = View(
@@ -290,7 +291,7 @@ def create_users(ds):
290
291
  ds.user.save("goose", goose_data)
291
292
  ds.view.save(goose_view.view_id, goose_view)
292
293
 
293
- if "pytest" not in sys.modules:
294
+ if not TESTING:
294
295
  logger.info("\t%s:%s", goose_data.uname, goose_pass)
295
296
 
296
297
  ds.user.commit()
@@ -566,10 +567,10 @@ def create_hits(ds: HowlerDatastore, hit_count: int = 200):
566
567
 
567
568
  ds.hit.commit()
568
569
 
569
- if hit_idx % 25 == 0 and "pytest" not in sys.modules:
570
+ if hit_idx % 25 == 0 and not TESTING:
570
571
  logger.info("\tCreated %s/%s", hit_idx, hit_count)
571
572
 
572
- if "pytest" not in sys.modules:
573
+ if not TESTING:
573
574
  logger.info("\tCreated %s/%s", hit_idx + 1, hit_count)
574
575
 
575
576
  logger.info(
@@ -1,5 +1,4 @@
1
1
  import functools
2
- import sys
3
2
  from typing import Optional
4
3
 
5
4
  import requests
@@ -23,6 +22,7 @@ from howler.common.logging import get_logger
23
22
  from howler.common.logging.audit import audit
24
23
  from howler.config import AUDIT, QUOTA_TRACKER, config
25
24
  from howler.odm.models.user import User
25
+ from howler.utils.constants import TESTING
26
26
 
27
27
  logger = get_logger(__file__)
28
28
 
@@ -184,7 +184,7 @@ class api_login(object): # noqa: D101, N801
184
184
  )
185
185
 
186
186
  ip = request.headers.get("X-Forwarded-For", request.remote_addr)
187
- if "pytest" not in sys.modules:
187
+ if not TESTING:
188
188
  logger.info("Logged in as %s from %s for path %s", user["uname"], ip, request.path)
189
189
 
190
190
  # If auditing is enabled, write this successful access to the audit logs
@@ -1,5 +1,4 @@
1
1
  import json
2
- import sys
3
2
  from typing import Any, Optional
4
3
 
5
4
  from flask import Response
@@ -12,6 +11,7 @@ from howler.common.logging import get_logger
12
11
  from howler.common.logging.audit import audit
13
12
  from howler.odm.models.action import VALID_TRIGGERS, Action
14
13
  from howler.odm.models.user import User
14
+ from howler.utils.constants import TESTING
15
15
  from howler.utils.str_utils import sanitize_lucene_query
16
16
 
17
17
  logger = get_logger(__file__)
@@ -67,7 +67,7 @@ def bulk_execute_on_query(query: str, trigger: str = "create", user: Optional[Us
67
67
  intersected_query = f"({query}) AND ({action.query})"
68
68
 
69
69
  if datastore().hit.search(intersected_query, rows=0)["total"] < 1:
70
- if "pytest" in sys.modules:
70
+ if TESTING:
71
71
  logger.debug("Action %s does not apply to query %s", action.action_id, query)
72
72
 
73
73
  continue
@@ -17,6 +17,7 @@ from howler.common.exceptions import InvalidDataException
17
17
  from howler.common.loader import datastore
18
18
  from howler.config import redis
19
19
  from howler.remote.datatypes.hash import Hash
20
+ from howler.utils.constants import TESTING
20
21
  from howler.utils.dict_utils import flatten_deep
21
22
  from howler.utils.lucene import coerce, normalize_phrase, try_parse_date, try_parse_ip, try_parse_number
22
23
 
@@ -235,7 +236,7 @@ def match(lucene: str, obj: dict[str, Any]):
235
236
  hash_key = sha256(lucene.encode()).hexdigest()
236
237
 
237
238
  # We cache the results back from ES, since we will frequently run the same validation queries over and over again.
238
- if (normalized_query := NORMALIZED_QUERY_CACHE.get(hash_key)) is None or "pytest" in sys.modules:
239
+ if (normalized_query := NORMALIZED_QUERY_CACHE.get(hash_key)) is None or TESTING:
239
240
  # This regex checks for lucene phrases (i.e. the "Example Analytic" part of howler.analytic:"Example Analytic")
240
241
  # And then escapes them.
241
242
  # https://regex101.com/r/8u5F6a/1
@@ -0,0 +1,4 @@
1
+ import os
2
+ import sys
3
+
4
+ TESTING = os.getenv("TESTING", "false").lower() in ["true", "1", "yes"] or "pytest" in sys.modules
@@ -152,7 +152,7 @@ suppress-none-returning = true
152
152
  [tool.poetry]
153
153
  package-mode = true
154
154
  name = "howler-api"
155
- version = "3.3.0.dev763"
155
+ version = "3.3.0.dev764"
156
156
  description = "Howler - API server"
157
157
  authors = [
158
158
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
@@ -195,7 +195,7 @@ homepage = "https://cybercentrecanada.github.io/howler/"
195
195
  repository = "https://github.com/CybercentreCanada/howler-api"
196
196
 
197
197
  [tool.poetry.dependencies]
198
- python = "^3.9.17"
198
+ python = "^3.10"
199
199
  apscheduler = "3.11.2"
200
200
  authlib = "^1.6.0"
201
201
  chardet = "5.2.0"
@@ -240,7 +240,7 @@ pyright = {extras = ["nodejs"], version = "^1.1.408"}
240
240
  mypy = "^1.6.1"
241
241
 
242
242
  [tool.poetry.group.test.dependencies]
243
- pytest = "^8.1.1"
243
+ pytest = "9.0.3"
244
244
  retrying = "^1.3.4"
245
245
  pyftpdlib = "^1.5.9"
246
246
  pyopenssl = ">=24.1,<27.0"