howler-api 3.4.0.dev955__tar.gz → 3.4.0.dev970__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 (204) hide show
  1. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/PKG-INFO +1 -1
  2. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/collection.py +42 -0
  3. howler_api-3.4.0.dev970/howler/odm/models/ecs/file.py +83 -0
  4. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/pyproject.toml +1 -1
  5. howler_api-3.4.0.dev955/howler/odm/models/ecs/file.py +0 -83
  6. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/README.md +0 -0
  7. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/__init__.py +0 -0
  8. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/__init__.py +0 -0
  9. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/add_label.py +0 -0
  10. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/add_to_bundle.py +0 -0
  11. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/change_field.py +0 -0
  12. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/demote.py +0 -0
  13. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/example_plugin.py +0 -0
  14. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/prioritization.py +0 -0
  15. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/promote.py +0 -0
  16. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/remove_from_bundle.py +0 -0
  17. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/remove_label.py +0 -0
  18. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/actions/transition.py +0 -0
  19. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/__init__.py +0 -0
  20. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/base.py +0 -0
  21. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/socket.py +0 -0
  22. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/__init__.py +0 -0
  23. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/action.py +0 -0
  24. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/analytic.py +0 -0
  25. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/auth.py +0 -0
  26. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/clue.py +0 -0
  27. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/configs.py +0 -0
  28. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/dossier.py +0 -0
  29. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/help.py +0 -0
  30. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/hit.py +0 -0
  31. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/notebook.py +0 -0
  32. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/overview.py +0 -0
  33. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/search.py +0 -0
  34. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/template.py +0 -0
  35. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/tool.py +0 -0
  36. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/user.py +0 -0
  37. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/utils/__init__.py +0 -0
  38. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/utils/etag.py +0 -0
  39. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/api/v1/view.py +0 -0
  40. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/app.py +0 -0
  41. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/README.md +0 -0
  42. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/__init__.py +0 -0
  43. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/classification.py +0 -0
  44. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/classification.yml +0 -0
  45. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/exceptions.py +0 -0
  46. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/loader.py +0 -0
  47. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/logging/__init__.py +0 -0
  48. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/logging/audit.py +0 -0
  49. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/logging/format.py +0 -0
  50. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/net.py +0 -0
  51. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/net_static.py +0 -0
  52. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/random_user.py +0 -0
  53. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/common/swagger.py +0 -0
  54. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/config.py +0 -0
  55. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/cronjobs/__init__.py +0 -0
  56. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/cronjobs/action_queue_worker.py +0 -0
  57. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/cronjobs/retention.py +0 -0
  58. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/cronjobs/rules.py +0 -0
  59. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/cronjobs/view_cleanup.py +0 -0
  60. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/README.md +0 -0
  61. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/__init__.py +0 -0
  62. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/bulk.py +0 -0
  63. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/constants.py +0 -0
  64. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/exceptions.py +0 -0
  65. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/howler_store.py +0 -0
  66. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/migrations/fix_process.py +0 -0
  67. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/operations.py +0 -0
  68. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/schemas.py +0 -0
  69. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/store.py +0 -0
  70. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/support/__init__.py +0 -0
  71. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/support/build.py +0 -0
  72. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/support/schemas.py +0 -0
  73. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/datastore/types.py +0 -0
  74. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/error.py +0 -0
  75. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/external/README.md +0 -0
  76. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/external/__init__.py +0 -0
  77. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/external/generate_mitre.py +0 -0
  78. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/external/generate_sigma_rules.py +0 -0
  79. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/external/generate_tlds.py +0 -0
  80. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/external/reindex_data.py +0 -0
  81. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/external/wipe_databases.py +0 -0
  82. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/gunicorn_config.py +0 -0
  83. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/healthz.py +0 -0
  84. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/helper/__init__.py +0 -0
  85. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/helper/azure.py +0 -0
  86. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/helper/discover.py +0 -0
  87. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/helper/hit.py +0 -0
  88. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/helper/oauth.py +0 -0
  89. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/helper/search.py +0 -0
  90. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/helper/workflow.py +0 -0
  91. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/helper/ws.py +0 -0
  92. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/README.md +0 -0
  93. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/__init__.py +0 -0
  94. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/base.py +0 -0
  95. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/charter.txt +0 -0
  96. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/helper.py +0 -0
  97. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/howler_enum.py +0 -0
  98. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/__init__.py +0 -0
  99. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/action.py +0 -0
  100. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/analytic.py +0 -0
  101. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/assemblyline.py +0 -0
  102. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/aws.py +0 -0
  103. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/azure.py +0 -0
  104. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/cbs.py +0 -0
  105. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/clue.py +0 -0
  106. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/config.py +0 -0
  107. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/dossier.py +0 -0
  108. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/__init__.py +0 -0
  109. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/agent.py +0 -0
  110. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/autonomous_system.py +0 -0
  111. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/client.py +0 -0
  112. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/cloud.py +0 -0
  113. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/code_signature.py +0 -0
  114. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/container.py +0 -0
  115. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/dns.py +0 -0
  116. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/egress.py +0 -0
  117. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/elf.py +0 -0
  118. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/email.py +0 -0
  119. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/error.py +0 -0
  120. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/event.py +0 -0
  121. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/faas.py +0 -0
  122. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/geo.py +0 -0
  123. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/group.py +0 -0
  124. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/hash.py +0 -0
  125. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/host.py +0 -0
  126. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/http.py +0 -0
  127. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/ingress.py +0 -0
  128. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/interface.py +0 -0
  129. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/network.py +0 -0
  130. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/observer.py +0 -0
  131. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/organization.py +0 -0
  132. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/os.py +0 -0
  133. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/pe.py +0 -0
  134. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/process.py +0 -0
  135. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/registry.py +0 -0
  136. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/related.py +0 -0
  137. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/rule.py +0 -0
  138. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/server.py +0 -0
  139. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/threat.py +0 -0
  140. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/tls.py +0 -0
  141. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/url.py +0 -0
  142. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/user.py +0 -0
  143. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/user_agent.py +0 -0
  144. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/ecs/vulnerability.py +0 -0
  145. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/gcp.py +0 -0
  146. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/hit.py +0 -0
  147. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/howler_data.py +0 -0
  148. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/lead.py +0 -0
  149. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/localized_label.py +0 -0
  150. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/overview.py +0 -0
  151. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/pivot.py +0 -0
  152. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/template.py +0 -0
  153. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/user.py +0 -0
  154. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/models/view.py +0 -0
  155. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/random_data.py +0 -0
  156. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/odm/randomizer.py +0 -0
  157. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/patched.py +0 -0
  158. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/plugins/__init__.py +0 -0
  159. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/plugins/config.py +0 -0
  160. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/__init__.py +0 -0
  161. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/README.md +0 -0
  162. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/__init__.py +0 -0
  163. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/counters.py +0 -0
  164. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/events.py +0 -0
  165. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/hash.py +0 -0
  166. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/lock.py +0 -0
  167. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/queues/__init__.py +0 -0
  168. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/queues/comms.py +0 -0
  169. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/queues/multi.py +0 -0
  170. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/queues/named.py +0 -0
  171. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/queues/priority.py +0 -0
  172. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/set.py +0 -0
  173. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  174. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/security/__init__.py +0 -0
  175. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/security/socket.py +0 -0
  176. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/security/utils.py +0 -0
  177. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/__init__.py +0 -0
  178. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/action_service.py +0 -0
  179. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/analytic_service.py +0 -0
  180. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/auth_service.py +0 -0
  181. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/config_service.py +0 -0
  182. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/dossier_service.py +0 -0
  183. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/event_service.py +0 -0
  184. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/hit_service.py +0 -0
  185. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/jwt_service.py +0 -0
  186. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/lucene_service.py +0 -0
  187. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/notebook_service.py +0 -0
  188. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/overview_service.py +0 -0
  189. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/template_service.py +0 -0
  190. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/services/user_service.py +0 -0
  191. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/telemetry.py +0 -0
  192. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/__init__.py +0 -0
  193. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/annotations.py +0 -0
  194. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/chunk.py +0 -0
  195. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/compat.py +0 -0
  196. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/constants.py +0 -0
  197. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/dict_utils.py +0 -0
  198. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/isotime.py +0 -0
  199. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/list_utils.py +0 -0
  200. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/lucene.py +0 -0
  201. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/path.py +0 -0
  202. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/socket_utils.py +0 -0
  203. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/str_utils.py +0 -0
  204. {howler_api-3.4.0.dev955 → howler_api-3.4.0.dev970}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 3.4.0.dev955
3
+ Version: 3.4.0.dev970
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -1364,6 +1364,43 @@ class ESCollection(Generic[ModelType]):
1364
1364
 
1365
1365
  return res["updated"]
1366
1366
 
1367
+ def _expand_fl(self, fl: str) -> str:
1368
+ """Expand wildcard patterns in a field list string using the model's flat_fields.
1369
+
1370
+ For each comma-separated entry in `fl`, if the entry contains a `*`, it is treated
1371
+ as a glob-style wildcard pattern and matched against all fields returned by
1372
+ ``flat_fields()``. Entries without wildcards are kept as-is.
1373
+
1374
+ Args:
1375
+ fl: Comma-separated list of field names, optionally containing ``*`` wildcards
1376
+ (e.g. ``"howler.*,event.start"``).
1377
+
1378
+ Returns:
1379
+ A comma-separated string of expanded field names. If no model class is
1380
+ associated with this collection the original ``fl`` string is returned
1381
+ unchanged.
1382
+ """
1383
+ if not self.model_class or "*" not in fl:
1384
+ return fl
1385
+
1386
+ all_fields = list(self.model_class.flat_fields().keys())
1387
+ expanded: list[str] = []
1388
+ for pattern in fl.split(","):
1389
+ pattern = pattern.strip()
1390
+ if not pattern:
1391
+ # Skip empty entries (e.g. from trailing commas).
1392
+ continue
1393
+ if "*" not in pattern or pattern == "*":
1394
+ # Exact names and the bare '*' (meaning "all fields") are kept as-is.
1395
+ expanded.append(pattern)
1396
+ else:
1397
+ # Convert the glob-style wildcard to a full regex pattern.
1398
+ # Replace '*' with '.*' and escape all other regex special characters.
1399
+ regex = re.compile("^" + re.escape(pattern).replace(r"\*", ".*") + "$")
1400
+ matched = [f for f in all_fields if regex.match(f)]
1401
+ expanded.extend(matched if matched else [pattern])
1402
+ return ",".join(expanded)
1403
+
1367
1404
  def _format_output(self, result, fields=None, as_obj=True):
1368
1405
  # Getting search document data
1369
1406
  extra_fields = result.get("fields", {})
@@ -1735,6 +1772,7 @@ class ESCollection(Generic[ModelType]):
1735
1772
  ]
1736
1773
 
1737
1774
  if fl:
1775
+ fl = self._expand_fl(fl)
1738
1776
  field_list = fl.split(",")
1739
1777
  args.append(("field_list", field_list))
1740
1778
  else:
@@ -1847,6 +1885,7 @@ class ESCollection(Generic[ModelType]):
1847
1885
  filters.append(access_control)
1848
1886
 
1849
1887
  if fl:
1888
+ fl = self._expand_fl(fl)
1850
1889
  fl = fl.split(",")
1851
1890
 
1852
1891
  query_expression = {
@@ -1896,6 +1935,8 @@ class ESCollection(Generic[ModelType]):
1896
1935
 
1897
1936
  if not fl:
1898
1937
  fl = "howler.id"
1938
+ else:
1939
+ fl = self._expand_fl(fl)
1899
1940
 
1900
1941
  if rows is None:
1901
1942
  rows = 5
@@ -2226,6 +2267,7 @@ class ESCollection(Generic[ModelType]):
2226
2267
  filters.append("%s:*" % group_field)
2227
2268
 
2228
2269
  if fl:
2270
+ fl = self._expand_fl(fl)
2229
2271
  field_list = fl.split(",")
2230
2272
  args.append(("field_list", field_list))
2231
2273
  else:
@@ -0,0 +1,83 @@
1
+ from howler import odm
2
+ from howler.odm.models.ecs.code_signature import CodeSignature
3
+ from howler.odm.models.ecs.elf import ELF
4
+ from howler.odm.models.ecs.hash import Hashes
5
+ from howler.odm.models.ecs.pe import PE
6
+
7
+ # from howler.odm.models.ecs.x509 import X509
8
+
9
+ FILE_TYPE = ["file", "dir", "symlink"]
10
+
11
+
12
+ @odm.model(
13
+ index=True,
14
+ store=True,
15
+ description="A file is defined as a set of information that has been created on, or has existed on a filesystem.",
16
+ )
17
+ class File(odm.Model):
18
+ accessed: str | None = odm.Optional(odm.Date(description="Last time the file was accessed."))
19
+ attributes: list[str] | None = odm.Optional(odm.List(odm.Keyword(), description="Array of file attributes."))
20
+ created: str | None = odm.Optional(odm.Date(description="File creation time."))
21
+ ctime: str | None = odm.Optional(odm.Date(description="Last time the file attributes or metadata changed."))
22
+ device: str | None = odm.Optional(odm.Keyword(description="Device that is the source of the file."))
23
+ directory: str | None = odm.Optional(
24
+ odm.Keyword(
25
+ description="Directory where the file is located. It should include the drive letter, when appropriate."
26
+ )
27
+ )
28
+ drive_letter: str | None = odm.Optional(
29
+ odm.Keyword(description="Drive letter where the file is located. This field is only relevant on Windows.")
30
+ )
31
+ extension: str | None = odm.Optional(odm.Keyword(description="File extension, excluding the leading dot."))
32
+ fork_name: str | None = odm.Optional(
33
+ odm.Keyword(description="A fork is additional data associated with a filesystem object.")
34
+ )
35
+ gid: str | None = odm.Optional(odm.Keyword(description="Primary group ID (GID) of the file."))
36
+ group: str | None = odm.Optional(odm.Keyword(description="Primary group name of the file."))
37
+ inode: str | None = odm.Optional(odm.Keyword(description="Inode representing the file in the filesystem."))
38
+ mime_type: str | None = odm.Optional(
39
+ odm.Keyword(
40
+ description="MIME type should identify the format of the file or stream of "
41
+ "bytes using IANA official types, where possible."
42
+ )
43
+ )
44
+ mode: str | None = odm.Optional(odm.Keyword(description="Mode of the file in octal representation."))
45
+ mtime: str | None = odm.Optional(odm.Date(description="Last time the file content was modified."))
46
+ name: str | None = odm.Optional(
47
+ odm.Keyword(description="Name of the file including the extension, without the directory.")
48
+ )
49
+ owner: str | None = odm.Optional(odm.Keyword(description="File owner’s username."))
50
+ path: str | None = odm.Optional(
51
+ odm.Keyword(
52
+ description="Full path to the file, including the file name. "
53
+ "It should include the drive letter, when appropriate."
54
+ )
55
+ )
56
+ size: int | None = odm.Long(description="File size in bytes.", optional=True)
57
+ target_path: str | None = odm.Optional(odm.Keyword(description="Target path for symlinks."))
58
+ type: str | None = odm.Optional(odm.Enum(values=FILE_TYPE, description="File type (file, dir, or symlink)."))
59
+ uid: str | None = odm.Optional(
60
+ odm.Keyword(description="The user ID (UID) or security identifier (SID) of the file owner.")
61
+ )
62
+
63
+ code_signature: CodeSignature | None = odm.Optional(
64
+ odm.Compound(
65
+ CodeSignature,
66
+ description="These fields contain information about binary code signatures.",
67
+ )
68
+ )
69
+ elf: ELF | None = odm.Optional(
70
+ odm.Compound(
71
+ ELF,
72
+ description="These fields contain Linux Executable Linkable Format (ELF) metadata.",
73
+ )
74
+ )
75
+ hash: Hashes | None = odm.Optional(
76
+ odm.Compound(
77
+ Hashes,
78
+ description="Hashes, usually file hashes.",
79
+ )
80
+ )
81
+ pe: PE | None = odm.Optional(
82
+ odm.Compound(PE, description="These fields contain Windows Portable Executable (PE) metadata.")
83
+ )
@@ -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.4.0.dev955"
155
+ version = "3.4.0.dev970"
156
156
  description = "Howler - API server"
157
157
  authors = [
158
158
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
@@ -1,83 +0,0 @@
1
- from typing import Optional
2
-
3
- from howler import odm
4
- from howler.odm.models.ecs.code_signature import CodeSignature
5
- from howler.odm.models.ecs.elf import ELF
6
- from howler.odm.models.ecs.hash import Hashes
7
- from howler.odm.models.ecs.pe import PE
8
-
9
- # from howler.odm.models.ecs.x509 import X509
10
-
11
- FILE_TYPE = ["file", "dir", "symlink"]
12
-
13
-
14
- @odm.model(
15
- index=True,
16
- store=True,
17
- description="A file is defined as a set of information that has been created on, or has existed on a filesystem.",
18
- )
19
- class File(odm.Model):
20
- accessed: Optional[str] = odm.Optional(odm.Date(description="Last time the file was accessed."))
21
- attributes: Optional[list[str]] = odm.Optional(odm.List(odm.Keyword(), description="Array of file attributes."))
22
- created: Optional[str] = odm.Optional(odm.Date(description="File creation time."))
23
- ctime: Optional[str] = odm.Optional(odm.Date(description="Last time the file attributes or metadata changed."))
24
- device: Optional[str] = odm.Optional(odm.Keyword(description="Device that is the source of the file."))
25
- directory: Optional[str] = odm.Optional(
26
- odm.Keyword(
27
- description="Directory where the file is located. It should include the drive letter, when appropriate."
28
- )
29
- )
30
- drive_letter: Optional[str] = odm.Optional(
31
- odm.Keyword(description="Drive letter where the file is located. This field is only relevant on Windows.")
32
- )
33
- extension: Optional[str] = odm.Optional(odm.Keyword(description="File extension, excluding the leading dot."))
34
- fork_name: Optional[str] = odm.Optional(
35
- odm.Keyword(description="A fork is additional data associated with a filesystem object.")
36
- )
37
- gid: Optional[str] = odm.Optional(odm.Keyword(description="Primary group ID (GID) of the file."))
38
- group: Optional[str] = odm.Optional(odm.Keyword(description="Primary group name of the file."))
39
- inode: Optional[str] = odm.Optional(odm.Keyword(description="Inode representing the file in the filesystem."))
40
- mime_type: Optional[str] = odm.Optional(
41
- odm.Keyword(
42
- description="MIME type should identify the format of the file or stream of "
43
- "bytes using IANA official types, where possible."
44
- )
45
- )
46
- mode: Optional[str] = odm.Optional(odm.Keyword(description="Mode of the file in octal representation."))
47
- mtime: Optional[str] = odm.Optional(odm.Date(description="Last time the file content was modified."))
48
- name: Optional[str] = odm.Optional(
49
- odm.Keyword(description="Name of the file including the extension, without the directory.")
50
- )
51
- owner: Optional[str] = odm.Optional(odm.Keyword(description="File owner’s username."))
52
- path: Optional[str] = odm.Optional(
53
- odm.Keyword(
54
- description="Full path to the file, including the file name. "
55
- "It should include the drive letter, when appropriate."
56
- )
57
- )
58
- size: Optional[int] = odm.Integer(description="File size in bytes.", optional=True)
59
- target_path: Optional[str] = odm.Optional(odm.Keyword(description="Target path for symlinks."))
60
- type: Optional[str] = odm.Optional(odm.Enum(values=FILE_TYPE, description="File type (file, dir, or symlink)."))
61
- uid: Optional[str] = odm.Optional(
62
- odm.Keyword(description="The user ID (UID) or security identifier (SID) of the file owner.")
63
- )
64
-
65
- code_signature: Optional[CodeSignature] = odm.Optional(
66
- odm.Compound(
67
- CodeSignature,
68
- description="These fields contain information about binary code signatures.",
69
- )
70
- )
71
- elf: Optional[ELF] = odm.Optional(
72
- odm.Compound(
73
- ELF,
74
- description="These fields contain Linux Executable Linkable Format (ELF) metadata.",
75
- )
76
- )
77
- hash: Optional[Hashes] = odm.Optional(
78
- odm.Compound(
79
- Hashes,
80
- description="These fields contain Windows Portable Executable (PE) metadata.",
81
- )
82
- )
83
- pe: Optional[PE] = odm.Optional(odm.Compound(PE, description="Hashes, usually file hashes."))