howler-api 3.0.0.dev350__tar.gz → 3.0.0.dev361__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.

Potentially problematic release.


This version of howler-api might be problematic. Click here for more details.

Files changed (199) hide show
  1. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/PKG-INFO +1 -1
  2. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/__init__.py +3 -2
  3. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/action.py +2 -2
  4. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/configs.py +4 -1
  5. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/hit.py +1 -1
  6. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/user.py +4 -2
  7. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/README.md +0 -19
  8. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/helper/oauth.py +1 -1
  9. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/config_service.py +1 -1
  10. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/user_service.py +2 -1
  11. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/pyproject.toml +1 -1
  12. howler_api-3.0.0.dev350/howler/common/hexdump.py +0 -48
  13. howler_api-3.0.0.dev350/howler/common/iprange.py +0 -171
  14. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/README.md +0 -0
  15. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/__init__.py +0 -0
  16. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/add_label.py +0 -0
  17. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/add_to_bundle.py +0 -0
  18. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/change_field.py +0 -0
  19. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/demote.py +0 -0
  20. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/example_plugin.py +0 -0
  21. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/prioritization.py +0 -0
  22. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/promote.py +0 -0
  23. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/remove_from_bundle.py +0 -0
  24. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/remove_label.py +0 -0
  25. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/actions/transition.py +0 -0
  26. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/__init__.py +0 -0
  27. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/base.py +0 -0
  28. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/socket.py +0 -0
  29. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/__init__.py +0 -0
  30. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/analytic.py +0 -0
  31. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/auth.py +0 -0
  32. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/clue.py +0 -0
  33. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/dossier.py +0 -0
  34. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/help.py +0 -0
  35. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/notebook.py +0 -0
  36. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/overview.py +0 -0
  37. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/search.py +0 -0
  38. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/template.py +0 -0
  39. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/tool.py +0 -0
  40. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/utils/__init__.py +0 -0
  41. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/utils/etag.py +0 -0
  42. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/api/v1/view.py +0 -0
  43. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/app.py +0 -0
  44. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/__init__.py +0 -0
  45. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/classification.py +0 -0
  46. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/classification.yml +0 -0
  47. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/exceptions.py +0 -0
  48. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/loader.py +0 -0
  49. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/logging/__init__.py +0 -0
  50. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/logging/audit.py +0 -0
  51. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/logging/format.py +0 -0
  52. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/net.py +0 -0
  53. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/net_static.py +0 -0
  54. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/random_user.py +0 -0
  55. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/common/swagger.py +0 -0
  56. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/config.py +0 -0
  57. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/cronjobs/__init__.py +0 -0
  58. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/cronjobs/retention.py +0 -0
  59. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/cronjobs/rules.py +0 -0
  60. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/cronjobs/view_cleanup.py +0 -0
  61. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/README.md +0 -0
  62. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/__init__.py +0 -0
  63. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/bulk.py +0 -0
  64. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/collection.py +0 -0
  65. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/constants.py +0 -0
  66. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/exceptions.py +0 -0
  67. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/howler_store.py +0 -0
  68. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/migrations/fix_process.py +0 -0
  69. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/operations.py +0 -0
  70. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/schemas.py +0 -0
  71. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/store.py +0 -0
  72. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/support/__init__.py +0 -0
  73. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/support/build.py +0 -0
  74. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/support/schemas.py +0 -0
  75. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/datastore/types.py +0 -0
  76. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/error.py +0 -0
  77. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/external/__init__.py +0 -0
  78. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/external/generate_mitre.py +0 -0
  79. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/external/generate_sigma_rules.py +0 -0
  80. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/external/generate_tlds.py +0 -0
  81. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/external/reindex_data.py +0 -0
  82. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/external/wipe_databases.py +0 -0
  83. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/gunicorn_config.py +0 -0
  84. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/healthz.py +0 -0
  85. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/helper/__init__.py +0 -0
  86. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/helper/azure.py +0 -0
  87. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/helper/discover.py +0 -0
  88. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/helper/hit.py +0 -0
  89. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/helper/search.py +0 -0
  90. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/helper/workflow.py +0 -0
  91. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/helper/ws.py +0 -0
  92. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/README.md +0 -0
  93. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/__init__.py +0 -0
  94. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/base.py +0 -0
  95. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/charter.txt +0 -0
  96. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/helper.py +0 -0
  97. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/howler_enum.py +0 -0
  98. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/__init__.py +0 -0
  99. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/action.py +0 -0
  100. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/analytic.py +0 -0
  101. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/assemblyline.py +0 -0
  102. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/aws.py +0 -0
  103. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/azure.py +0 -0
  104. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/cbs.py +0 -0
  105. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/config.py +0 -0
  106. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/dossier.py +0 -0
  107. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/__init__.py +0 -0
  108. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/agent.py +0 -0
  109. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/autonomous_system.py +0 -0
  110. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/client.py +0 -0
  111. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/cloud.py +0 -0
  112. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/code_signature.py +0 -0
  113. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/container.py +0 -0
  114. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/dns.py +0 -0
  115. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/egress.py +0 -0
  116. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/elf.py +0 -0
  117. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/email.py +0 -0
  118. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/error.py +0 -0
  119. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/event.py +0 -0
  120. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/faas.py +0 -0
  121. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/file.py +0 -0
  122. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/geo.py +0 -0
  123. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/group.py +0 -0
  124. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/hash.py +0 -0
  125. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/host.py +0 -0
  126. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/http.py +0 -0
  127. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/ingress.py +0 -0
  128. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/interface.py +0 -0
  129. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/network.py +0 -0
  130. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/observer.py +0 -0
  131. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/organization.py +0 -0
  132. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/os.py +0 -0
  133. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/pe.py +0 -0
  134. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/process.py +0 -0
  135. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/registry.py +0 -0
  136. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/related.py +0 -0
  137. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/rule.py +0 -0
  138. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/server.py +0 -0
  139. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/threat.py +0 -0
  140. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/tls.py +0 -0
  141. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/url.py +0 -0
  142. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/user.py +0 -0
  143. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/user_agent.py +0 -0
  144. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/ecs/vulnerability.py +0 -0
  145. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/gcp.py +0 -0
  146. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/hit.py +0 -0
  147. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/howler_data.py +0 -0
  148. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/lead.py +0 -0
  149. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/localized_label.py +0 -0
  150. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/overview.py +0 -0
  151. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/pivot.py +0 -0
  152. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/template.py +0 -0
  153. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/user.py +0 -0
  154. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/models/view.py +0 -0
  155. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/random_data.py +0 -0
  156. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/odm/randomizer.py +0 -0
  157. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/patched.py +0 -0
  158. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/plugins/__init__.py +0 -0
  159. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/plugins/config.py +0 -0
  160. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/__init__.py +0 -0
  161. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/README.md +0 -0
  162. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/__init__.py +0 -0
  163. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/counters.py +0 -0
  164. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/events.py +0 -0
  165. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/hash.py +0 -0
  166. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/lock.py +0 -0
  167. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/queues/__init__.py +0 -0
  168. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/queues/comms.py +0 -0
  169. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/queues/multi.py +0 -0
  170. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/queues/named.py +0 -0
  171. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/queues/priority.py +0 -0
  172. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/set.py +0 -0
  173. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  174. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/security/__init__.py +0 -0
  175. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/security/socket.py +0 -0
  176. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/security/utils.py +0 -0
  177. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/__init__.py +0 -0
  178. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/action_service.py +0 -0
  179. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/analytic_service.py +0 -0
  180. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/auth_service.py +0 -0
  181. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/dossier_service.py +0 -0
  182. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/event_service.py +0 -0
  183. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/hit_service.py +0 -0
  184. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/jwt_service.py +0 -0
  185. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/lucene_service.py +0 -0
  186. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/notebook_service.py +0 -0
  187. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/overview_service.py +0 -0
  188. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/services/template_service.py +0 -0
  189. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/__init__.py +0 -0
  190. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/annotations.py +0 -0
  191. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/chunk.py +0 -0
  192. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/dict_utils.py +0 -0
  193. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/isotime.py +0 -0
  194. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/list_utils.py +0 -0
  195. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/lucene.py +0 -0
  196. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/path.py +0 -0
  197. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/socket_utils.py +0 -0
  198. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/str_utils.py +0 -0
  199. {howler_api-3.0.0.dev350 → howler_api-3.0.0.dev361}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 3.0.0.dev350
3
+ Version: 3.0.0.dev361
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -74,7 +74,7 @@ def __sanitize_report(report: list[dict[str, Any]]) -> list[dict[str, Any]]:
74
74
  def execute(
75
75
  operation_id: str,
76
76
  query: str,
77
- user: User,
77
+ user: User | None,
78
78
  request_id: Optional[str] = None,
79
79
  **kwargs,
80
80
  ) -> list[dict[str, Any]]:
@@ -117,7 +117,8 @@ def execute(
117
117
  }
118
118
  ]
119
119
 
120
- missing_roles = set(operation.specification()["roles"]) - set(user["type"])
120
+ user_roles: set[str] = set(user["type"] if user else [])
121
+ missing_roles = set(operation.specification()["roles"]) - user_roles
121
122
  if missing_roles:
122
123
  return [
123
124
  {
@@ -237,7 +237,7 @@ def execute_action(id: str, **kwargs) -> Response:
237
237
  return not_found(err="The specified action does not exist")
238
238
 
239
239
  reports: dict[str, list[dict]] = {}
240
- current_user = kwargs.get("user", None)
240
+ current_user: User | None = kwargs.get("user", None)
241
241
 
242
242
  for operation in action.operations:
243
243
  op_data = json.loads(operation["data_json"])
@@ -333,7 +333,7 @@ def execute_operations(**kwargs) -> Response:
333
333
  return bad_request(err="Incorrect data structure!")
334
334
 
335
335
  reports: dict[str, list[dict]] = {}
336
- current_user = kwargs.get("user", None)
336
+ current_user: User | None = kwargs.get("user", None)
337
337
  operations = execute_req["operations"]
338
338
 
339
339
  operation_ids = [o["operation_id"] for o in operations]
@@ -1,8 +1,11 @@
1
+ from typing import cast
2
+
1
3
  from flask import request
2
4
 
3
5
  import howler.services.config_service as config_service
4
6
  from howler.api import make_subapi_blueprint, ok
5
7
  from howler.common.swagger import generate_swagger_docs
8
+ from howler.odm.models.user import User
6
9
  from howler.security.utils import get_disco_url
7
10
 
8
11
  SUB_API = "configs"
@@ -49,7 +52,7 @@ def configs(**kwargs):
49
52
  """
50
53
  return ok(
51
54
  config_service.get_configuration(
52
- user=kwargs.get("user", None),
55
+ user=cast(User | None, kwargs.get("user", None)),
53
56
  discovery_url=get_disco_url(request.environ.get("HTTP_REFERER")),
54
57
  )
55
58
  )
@@ -1072,7 +1072,7 @@ def update_bundle(id, **kwargs):
1072
1072
  ...hit # The updated bundle
1073
1073
  }
1074
1074
  """
1075
- bundle_hit: Hit = kwargs.get("cached_hit", None)
1075
+ bundle_hit: Hit = cast(Hit, kwargs.get("cached_hit", None))
1076
1076
  if not bundle_hit:
1077
1077
  return not_found(err="This bundle does not exist.")
1078
1078
 
@@ -1,6 +1,6 @@
1
1
  import re
2
2
  from hashlib import sha256
3
- from typing import Any, Optional
3
+ from typing import Any, Optional, cast
4
4
 
5
5
  from flask import request
6
6
 
@@ -128,7 +128,9 @@ def add_user_account(username, **_):
128
128
  data["name"] = data["uname"]
129
129
 
130
130
  # Add dynamic classification group
131
- data["classification"] = user_service.get_dynamic_classification(data.get("classification", None), data["email"])
131
+ data["classification"] = user_service.get_dynamic_classification(
132
+ cast(str | None, data.get("classification", None)), data["email"]
133
+ )
132
134
 
133
135
  # Clear non user account data
134
136
  avatar = data.pop("avatar", None)
@@ -44,25 +44,6 @@ This file provides utility functions to merge dictionaries together, find the di
44
44
 
45
45
  Where as the unflatten does the invert by taking the dotted notation and transforming it back to it's original multiple level dictionary.
46
46
 
47
- ## hexdump.py
48
-
49
- This file provide functions to take a binary data blob and transform it into and hexadecimal dump of its bytes. The `dump(buf)` function only outputs the bytes where as the `hexdump(buf)` function outputs also the offsets and some trimmed down ascii representation.
50
-
51
- `dump("HTTP/1.1 404 Not\r\nCont")`
52
-
53
- 48 54 54 50 2F 31 2E 31 20 34 30 34 20 4E 6F 74 20 46 6F 75 6E 64 0D 0A 43 6F 6E 74
54
-
55
- `hexdump("HTTP/1.1 404 Not\r\nCont")`
56
-
57
- 00000000: 48 54 54 50 2F 31 2E 31 20 34 30 34 20 4E 6F 74 HTTP/1.1 404 Not
58
- 00000010: 20 46 6F 75 6E 64 0D 0A 43 6F 6E 74 Found..Cont
59
-
60
- ## iprange.py
61
-
62
- This file provides you with a RangeTable class that let's you determine if and IP is part of a certain CIDR definition. It also provides to quick function that let you determine if an IP is in a private CIDR (`is_private(ip)`) or if an IP is in a reserved CIDR (`is_reserved(ip)`).
63
-
64
- *Note*: only IPV4 IPs are supported.
65
-
66
47
  ## isotime.py
67
48
 
68
49
  This file provides you which methods to transform date into strings or epoch values. It support local, ISO and epoch time. It also makes sure that the local and ISO time get up to a microsecond precision.
@@ -61,7 +61,7 @@ def parse_profile(profile: dict[str, Any], provider_config: OAuthProvider) -> di
61
61
  uname = profile.get("uname", profile.get("preferred_username", email_adr))
62
62
 
63
63
  # Did we default to email?
64
- if uname is not None and uname.lower() == email_adr.lower():
64
+ if email_adr is not None and uname is not None and uname.lower() == email_adr.lower():
65
65
  # 1. Use provided regex matcher
66
66
  if provider_config.uid_regex:
67
67
  match = re.match(provider_config.uid_regex, uname)
@@ -61,7 +61,7 @@ def _get_apikey_max_duration():
61
61
  return amount, unit
62
62
 
63
63
 
64
- def get_configuration(user: User, **kwargs):
64
+ def get_configuration(user: User | None, **kwargs):
65
65
  """Get system configration data for the Howler API
66
66
 
67
67
  Args:
@@ -314,7 +314,7 @@ def save_user_account(username: str, data: dict[str, Any], user: dict[str, Any])
314
314
  return storage.user.save(username, data)
315
315
 
316
316
 
317
- def get_dynamic_classification(current_c12n: str, email: str) -> str:
317
+ def get_dynamic_classification(current_c12n: str | None, email: str) -> str | None:
318
318
  """Get the classification of the user
319
319
 
320
320
  Args:
@@ -327,4 +327,5 @@ def get_dynamic_classification(current_c12n: str, email: str) -> str:
327
327
  if CLASSIFICATION.dynamic_groups and email:
328
328
  dyn_group = email.upper().split("@")[1]
329
329
  return CLASSIFICATION.build_user_classification(current_c12n, f"{CLASSIFICATION.UNRESTRICTED}//{dyn_group}")
330
+
330
331
  return current_c12n
@@ -148,7 +148,7 @@ suppress-none-returning = true
148
148
  [tool.poetry]
149
149
  package-mode = true
150
150
  name = "howler-api"
151
- version = "3.0.0.dev350"
151
+ version = "3.0.0.dev361"
152
152
  description = "Howler - API server"
153
153
  authors = [
154
154
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
@@ -1,48 +0,0 @@
1
- import binascii
2
-
3
- from howler.utils.chunk import chunk
4
-
5
- FILTER = b"".join([bytes([x]) if x in range(32, 127) else b"." for x in range(256)])
6
-
7
-
8
- def dump(binary: bytes, size: int = 2, sep: bytes = b" ") -> bytes:
9
- "Convert a binary file into a hexadecimal representation"
10
- hexstr = binascii.hexlify(binary)
11
- return sep.join(chunk(hexstr, size))
12
-
13
-
14
- def hexdump(
15
- binary: bytes,
16
- length: int = 16,
17
- indent: str = "",
18
- indent_size: int = 0,
19
- newline: str = "\n",
20
- prefix_offset: int = 0,
21
- ) -> str:
22
- """Create a string buffer that shows the given data in hexdump format.
23
-
24
- src -> source buffer
25
- length = 16 -> number of bytes per line
26
- indent = "" -> indentation before each lines
27
- indent_size = 0 -> number of time to repeat that indentation
28
- newline = "\n" -> chars used as newline char
29
-
30
- Example of output:
31
- 00000000: 48 54 54 50 2F 31 2E 31 20 34 30 34 20 4E 6F 74 HTTP/1.1 404 Not
32
- 00000010: 20 46 6F 75 6E 64 0D 0A 43 6F 6E 74 Found..Cont
33
- ...
34
- """
35
- generator = chunk(binary, length)
36
- line_frmt = "%%s%%08X: %%-%ss %%s" % ((length * 3) - 1)
37
-
38
- out = [
39
- line_frmt
40
- % (
41
- indent * indent_size,
42
- prefix_offset + (addr * length),
43
- dump(d).decode(),
44
- d.translate(FILTER).decode(),
45
- )
46
- for addr, d in enumerate(generator)
47
- ]
48
- return newline.join(out)
@@ -1,171 +0,0 @@
1
- from math import log
2
- from socket import inet_aton
3
- from struct import pack, unpack
4
-
5
- from howler.common.exceptions import InvalidRangeException
6
-
7
- # If you are tempted to extend this module to add support for IPv6 (or some
8
- # similar invasive change) take a look at using PySubnetTree and extending it
9
- # to allow arbitrary ranges instead.
10
-
11
-
12
- def _convert(ip):
13
- return unpack("!I", inet_aton(ip))[0]
14
-
15
-
16
- def _next(lower, upper):
17
- size = 2
18
- while lower + size - 1 <= upper and _valid(lower, lower + size - 1):
19
- size *= 2
20
-
21
- return int(size / 2)
22
-
23
-
24
- def _valid(lower, upper):
25
- return lower & (upper - lower) == 0
26
-
27
-
28
- # noinspection PyPep8Naming
29
- class _dict(dict): # noqa: N801
30
- pass
31
-
32
-
33
- def ip_to_int(ip):
34
- if isinstance(ip, int):
35
- return ip
36
-
37
- return _convert(ip)
38
-
39
-
40
- # noinspection PyTypeChecker
41
- class RangeTable(object):
42
- """Efficient storage of IPv4 ranges and lookup of IPv4 addresses."""
43
-
44
- def __init__(self):
45
- self.clear()
46
- self._trie = _dict()
47
-
48
- def _add_cidr(self, lower, upper, value):
49
- if not _valid(lower, upper):
50
- # The public add_range method should ensure this never happens.
51
- raise InvalidRangeException("invalid range: %d-%d" % (lower, upper))
52
-
53
- size = upper - lower
54
- points = 3 - int(log(size + 1, 256))
55
-
56
- lower = self._to_path(lower)
57
- upper = self._to_path(upper)
58
-
59
- for x in range(lower[points], upper[points] + 1):
60
- self._add_path(lower[:points] + (x,), value)
61
-
62
- def _add_path(self, path, value):
63
- trie = self._trie
64
- for point in path[:-1]:
65
- d = trie.get(point, _dict())
66
- if not isinstance(d, _dict):
67
- prev = d
68
- d = _dict()
69
- d.update({x: prev for x in range(256)})
70
- trie[point] = d
71
- trie = d
72
- trie[path[-1]] = value
73
-
74
- def _add_range(self, lower, upper, value):
75
- while lower <= upper:
76
- size = _next(lower, upper)
77
- self._add_cidr(lower, lower + size - 1, value)
78
- lower += size
79
-
80
- def _follow_path(self, path):
81
- entry = self._trie
82
- while isinstance(entry, _dict):
83
- entry = entry.get(path[0], None)
84
- path = path[1:]
85
- return entry
86
-
87
- @staticmethod
88
- def _to_path(integer):
89
- return unpack("B" * 4, pack("!I", integer))
90
-
91
- def __getitem__(self, key):
92
- return self._follow_path(self._to_path(ip_to_int(key)))
93
-
94
- def __setitem__(self, key, value):
95
- if isinstance(key, int):
96
- self._add_cidr(key, key, value)
97
- return
98
-
99
- span = key.split("-", 1)
100
- if len(span) == 1:
101
- span = key.split("/", 1)
102
- if len(span) == 1:
103
- span.append(span[0])
104
-
105
- span[0] = _convert(span[0].strip())
106
- if span[1].find(".") == -1:
107
- mask = 2 ** (32 - int(span[1])) - 1
108
- span[0] -= span[0] & mask
109
- span[1] = span[0] | mask
110
- else:
111
- span[1] = _convert(span[1].strip())
112
-
113
- self._add_range(span[0], span[1], value)
114
-
115
- def add_range(self, lower, upper, value):
116
- lower = ip_to_int(lower)
117
- upper = ip_to_int(upper)
118
-
119
- self._add_range(lower, upper, value)
120
-
121
- while lower <= upper:
122
- size = _next(lower, upper)
123
- self._add_cidr(lower, lower + size - 1, value)
124
- lower += size
125
-
126
- def clear(self):
127
- self._trie = _dict() # pylint:disable=W0201
128
-
129
- def dump(self):
130
- from pprint import pformat
131
-
132
- return pformat(self._trie)
133
-
134
-
135
- PRIVATE_NETWORKS = [
136
- "10.0.0.0/8",
137
- "172.16.0.0/12",
138
- "192.168.0.0/16",
139
- ]
140
-
141
- RESERVED_NETWORKS = [
142
- "0.0.0.0/8",
143
- "100.64.0.0/10",
144
- "127.0.0.0/8",
145
- "169.254.0.0/16",
146
- "192.0.0.0/24",
147
- "192.0.2.0/24",
148
- "192.88.99.0/24",
149
- "198.18.0.0/15",
150
- "198.51.100.0/24",
151
- "203.0.113.0/24",
152
- "240.0.0.0/4",
153
- "224.0.0.0/4",
154
- "255.255.255.255/32",
155
- ]
156
-
157
- _private_ips = RangeTable()
158
- for cidr in PRIVATE_NETWORKS:
159
- _private_ips[cidr] = True
160
-
161
- _reserved_ips = RangeTable()
162
- for cidr in RESERVED_NETWORKS:
163
- _reserved_ips[cidr] = True
164
-
165
-
166
- def is_ip_private(ip):
167
- return _private_ips[ip] or False
168
-
169
-
170
- def is_ip_reserved(ip):
171
- return _private_ips[ip] or _reserved_ips[ip] or False