assemblyline 4.7.5.dev13__tar.gz → 4.7.5.dev16__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 (179) hide show
  1. {assemblyline-4.7.5.dev13/assemblyline.egg-info → assemblyline-4.7.5.dev16}/PKG-INFO +1 -1
  2. assemblyline-4.7.5.dev16/assemblyline/VERSION +1 -0
  3. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datastore/collection.py +17 -2
  4. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/filestore/__init__.py +18 -2
  5. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/filestore/transport/azure.py +21 -2
  6. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/filestore/transport/base.py +10 -0
  7. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/filestore/transport/ftp.py +6 -1
  8. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/filestore/transport/s3.py +30 -2
  9. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/filestore/transport/sftp.py +5 -2
  10. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16/assemblyline.egg-info}/PKG-INFO +1 -1
  11. assemblyline-4.7.5.dev13/assemblyline/VERSION +0 -1
  12. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/LICENCE.md +0 -0
  13. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/MANIFEST.in +0 -0
  14. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/README.md +0 -0
  15. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/__init__.py +0 -0
  16. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/cachestore/__init__.py +0 -0
  17. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/__init__.py +0 -0
  18. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/archiving.py +0 -0
  19. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/attack_map.py +0 -0
  20. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/backupmanager.py +0 -0
  21. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/banner.py +0 -0
  22. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/bundling.py +0 -0
  23. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/caching.py +0 -0
  24. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/chunk.py +0 -0
  25. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/classification.py +0 -0
  26. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/classification.yml +0 -0
  27. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/cleanup_filestore.py +0 -0
  28. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/codec.py +0 -0
  29. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/comms.py +0 -0
  30. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/constants.py +0 -0
  31. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/custom.magic +0 -0
  32. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/custom.yara +0 -0
  33. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/dict_utils.py +0 -0
  34. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/digests.py +0 -0
  35. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/dispatcher.py +0 -0
  36. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/entropy.py +0 -0
  37. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/exceptions.py +0 -0
  38. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/file.py +0 -0
  39. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/forge.py +0 -0
  40. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/heuristics.py +0 -0
  41. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/hexdump.py +0 -0
  42. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/identify.py +0 -0
  43. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/identify_defaults.py +0 -0
  44. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/importing.py +0 -0
  45. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/iprange.py +0 -0
  46. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/isotime.py +0 -0
  47. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/log.py +0 -0
  48. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/logformat.py +0 -0
  49. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/lucene.lark +0 -0
  50. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/memory_zip.py +0 -0
  51. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/metrics.py +0 -0
  52. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/net.py +0 -0
  53. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/net_static.py +0 -0
  54. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/null.py +0 -0
  55. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/path.py +0 -0
  56. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/postprocess.py +0 -0
  57. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/random_user.py +0 -0
  58. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/safe_archive.py +0 -0
  59. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/security.py +0 -0
  60. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/signaturing.py +0 -0
  61. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/str_utils.py +0 -0
  62. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/tag_safelist.yml +0 -0
  63. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/tagging.py +0 -0
  64. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/threading.py +0 -0
  65. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/uid.py +0 -0
  66. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/common/version.py +0 -0
  67. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datasource/__init__.py +0 -0
  68. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datasource/al.py +0 -0
  69. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datasource/alert.py +0 -0
  70. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datasource/common.py +0 -0
  71. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datastore/__init__.py +0 -0
  72. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datastore/bulk.py +0 -0
  73. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datastore/exceptions.py +0 -0
  74. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datastore/helper.py +0 -0
  75. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datastore/store.py +0 -0
  76. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datastore/support/__init__.py +0 -0
  77. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datastore/support/build.py +0 -0
  78. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/datastore/support/schemas.py +0 -0
  79. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/filestore/transport/__init__.py +0 -0
  80. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/filestore/transport/http.py +0 -0
  81. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/filestore/transport/local.py +0 -0
  82. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/__init__.py +0 -0
  83. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/base.py +0 -0
  84. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/common.py +0 -0
  85. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/__init__.py +0 -0
  86. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/alert.py +0 -0
  87. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/alerter_heartbeat.py +0 -0
  88. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/archive_heartbeat.py +0 -0
  89. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/changes.py +0 -0
  90. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/dispatcher_heartbeat.py +0 -0
  91. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/dispatching.py +0 -0
  92. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/elastic_heartbeat.py +0 -0
  93. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/expiry_heartbeat.py +0 -0
  94. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/ingest_heartbeat.py +0 -0
  95. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/metrics.py +0 -0
  96. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/retrohunt_heartbeat.py +0 -0
  97. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/scaler_heartbeat.py +0 -0
  98. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/scaler_status_heartbeat.py +0 -0
  99. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/service_heartbeat.py +0 -0
  100. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/service_timing_heartbeat.py +0 -0
  101. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/submission.py +0 -0
  102. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/task.py +0 -0
  103. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/messages/vacuum_heartbeat.py +0 -0
  104. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/__init__.py +0 -0
  105. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/actions.py +0 -0
  106. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/alert.py +0 -0
  107. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/apikey.py +0 -0
  108. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/badlist.py +0 -0
  109. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/cached_file.py +0 -0
  110. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/config.py +0 -0
  111. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/emptyresult.py +0 -0
  112. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/error.py +0 -0
  113. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/file.py +0 -0
  114. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/filescore.py +0 -0
  115. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/heuristic.py +0 -0
  116. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/__init__.py +0 -0
  117. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/file.py +0 -0
  118. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/filetypes/__init__.py +0 -0
  119. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/filetypes/pe.py +0 -0
  120. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/ontology.py +0 -0
  121. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/results/__init__.py +0 -0
  122. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/results/antivirus.py +0 -0
  123. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/results/http.py +0 -0
  124. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/results/malware_config.py +0 -0
  125. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/results/network.py +0 -0
  126. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/results/process.py +0 -0
  127. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/results/sandbox.py +0 -0
  128. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/ontology/results/signature.py +0 -0
  129. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/replay.py +0 -0
  130. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/result.py +0 -0
  131. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/retrohunt.py +0 -0
  132. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/safelist.py +0 -0
  133. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/service.py +0 -0
  134. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/service_delta.py +0 -0
  135. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/signature.py +0 -0
  136. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/statistics.py +0 -0
  137. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/submission.py +0 -0
  138. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/submission_summary.py +0 -0
  139. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/submission_tree.py +0 -0
  140. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/tagging.py +0 -0
  141. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/user.py +0 -0
  142. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/user_favorites.py +0 -0
  143. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/user_settings.py +0 -0
  144. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/models/workflow.py +0 -0
  145. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/random_data/__init__.py +0 -0
  146. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/random_data/create_test_data.py +0 -0
  147. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/random_data/sample_rules.yar +0 -0
  148. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/random_data/sample_suricata.rules +0 -0
  149. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/odm/randomizer.py +0 -0
  150. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/py.typed +0 -0
  151. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/__init__.py +0 -0
  152. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/__init__.py +0 -0
  153. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/cache.py +0 -0
  154. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/counters.py +0 -0
  155. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/daily_quota_tracker.py +0 -0
  156. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/events.py +0 -0
  157. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/exporting_counter.py +0 -0
  158. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/hash.py +0 -0
  159. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/lock.py +0 -0
  160. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/queues/__init__.py +0 -0
  161. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/queues/comms.py +0 -0
  162. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/queues/multi.py +0 -0
  163. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/queues/named.py +0 -0
  164. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/queues/priority.py +0 -0
  165. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/set.py +0 -0
  166. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/remote/datatypes/user_quota_tracker.py +0 -0
  167. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/run/__init__.py +0 -0
  168. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/run/cli.py +0 -0
  169. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/run/pubsub_reader.py +0 -0
  170. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/run/suricata_importer.py +0 -0
  171. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline/run/yara_importer.py +0 -0
  172. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline.egg-info/SOURCES.txt +0 -0
  173. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline.egg-info/dependency_links.txt +0 -0
  174. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline.egg-info/entry_points.txt +0 -0
  175. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline.egg-info/requires.txt +0 -0
  176. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/assemblyline.egg-info/top_level.txt +0 -0
  177. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/pyproject.toml +0 -0
  178. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/setup.cfg +0 -0
  179. {assemblyline-4.7.5.dev13 → assemblyline-4.7.5.dev16}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline
3
- Version: 4.7.5.dev13
3
+ Version: 4.7.5.dev16
4
4
  Summary: Assemblyline 4 - Automated malware analysis framework
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-base
6
6
  Author: CCCS Assemblyline development team
@@ -0,0 +1 @@
1
+ 4.7.5.dev16
@@ -962,6 +962,8 @@ class ESCollection(Generic[ModelType]):
962
962
  # If this index has an archive, check is the document was found in it.
963
963
  if self.archive_name:
964
964
  doc['_source']['from_archive'] = self.is_archive_index(index)
965
+ elif 'from_archive' in doc['_source']:
966
+ doc['_source']['from_archive'] = False
965
967
 
966
968
  if version:
967
969
  return self._normalize_output(doc['_source']), f"{doc['_seq_no']}---{doc['_primary_term']}"
@@ -1012,14 +1014,25 @@ class ESCollection(Generic[ModelType]):
1012
1014
 
1013
1015
  @typing.overload
1014
1016
  def get_if_exists(self, key: str, as_obj: typing.Literal[True] = True, index_type: typing.Optional[Index] = None,
1015
- version=False) -> typing.Optional[ModelType]:
1017
+ version: typing.Literal[False] = False) -> typing.Optional[ModelType]:
1016
1018
  ...
1017
1019
 
1018
1020
  @typing.overload
1019
1021
  def get_if_exists(self, key: str, as_obj: typing.Literal[False], index_type: typing.Optional[Index] = None,
1020
- version=False) -> typing.Optional[dict]:
1022
+ version: typing.Literal[False] = False) -> typing.Optional[dict]:
1021
1023
  ...
1022
1024
 
1025
+ @typing.overload
1026
+ def get_if_exists(self, key: str, as_obj: typing.Literal[True] = True, index_type: typing.Optional[Index] = None,
1027
+ version=True) -> tuple[typing.Optional[ModelType], str]:
1028
+ ...
1029
+
1030
+ @typing.overload
1031
+ def get_if_exists(self, key: str, as_obj: typing.Literal[False], index_type: typing.Optional[Index] = None,
1032
+ version=True) -> tuple[typing.Optional[dict], str]:
1033
+ ...
1034
+
1035
+
1023
1036
  def get_if_exists(self, key, as_obj=True, index_type=None, version=False):
1024
1037
  """
1025
1038
  Get a document from the datastore but do not retry if not found.
@@ -1378,6 +1391,8 @@ class ESCollection(Generic[ModelType]):
1378
1391
  # If this index has an archive, check is the document was found in it.
1379
1392
  if self.archive_name:
1380
1393
  source_data['from_archive'] = self.is_archive_index(result['_index'])
1394
+ elif 'from_archive' in source_data:
1395
+ source_data['from_archive'] = False
1381
1396
 
1382
1397
  if self.model_class:
1383
1398
  if not fields:
@@ -128,7 +128,7 @@ def create_transport(url, connection_attempts=None):
128
128
 
129
129
  elif scheme == 's3':
130
130
  valid_str_keys = ['aws_region', 's3_bucket']
131
- valid_bool_keys = ['use_ssl', 'verify', 'boto_defaults', 'read_only']
131
+ valid_bool_keys = ['use_ssl', 'verify', 'boto_defaults', 'read_only', 'use_batch_delete']
132
132
  extras = _get_extras(parse_qs(parsed.query), valid_str_keys=valid_str_keys, valid_bool_keys=valid_bool_keys)
133
133
 
134
134
  # If user/password not specified, access might be dictated by IAM roles
@@ -143,7 +143,7 @@ def create_transport(url, connection_attempts=None):
143
143
  valid_bool_keys = ['allow_directory_access', 'use_default_credentials', 'initalize_container', 'read_only']
144
144
  extras = _get_extras(parse_qs(parsed.query), valid_str_keys=valid_str_keys, valid_bool_keys=valid_bool_keys)
145
145
 
146
- t = TransportAzure(base=base, host=host, connection_attempts=connection_attempts, **extras)
146
+ t = TransportAzure(base=base, host=host, connection_attempts=connection_attempts, port=port, **extras)
147
147
 
148
148
  else:
149
149
  raise FileStoreException("Unknown transport: %s" % scheme)
@@ -200,6 +200,22 @@ class FileStore(object):
200
200
  trace = get_stacktrace_info(ex)
201
201
  self.log.info('Transport problem: %s', trace)
202
202
 
203
+ def delete_batch_chunk_size(self) -> int:
204
+ return min(transport.delete_batch_chunk_size() for transport in self.transports)
205
+
206
+ @elasticapm.capture_span(span_type='filestore')
207
+ def delete_batch(self, file_list: list[str], location='all'):
208
+ # Don't even call into the transports if there are no files given
209
+ if not file_list:
210
+ return
211
+
212
+ with elasticapm.capture_span(name='delete_batch', span_type='filestore', labels={'batch_size': len(file_list)}):
213
+ for t in self.slice(location):
214
+ if t.read_only:
215
+ # Don't attempt to delete from read only transports
216
+ continue
217
+ t.delete_batch(file_list)
218
+
203
219
  @elasticapm.capture_span(span_type='filestore')
204
220
  def download(self, src_path: str, dest_path: str, location='any'):
205
221
  successful = False
@@ -15,6 +15,7 @@ from azure.core.exceptions import (
15
15
  ServiceRequestError,
16
16
  TooManyRedirectsError,
17
17
  )
18
+ from azure.core.pipeline.transport import HttpResponse
18
19
  from azure.identity import (
19
20
  ClientSecretCredential,
20
21
  DefaultAzureCredential,
@@ -22,6 +23,7 @@ from azure.identity import (
22
23
  )
23
24
  from azure.storage.blob import BlobServiceClient
24
25
 
26
+ from assemblyline.common import chunk
25
27
  from assemblyline.common.exceptions import ChainAll
26
28
  from assemblyline.filestore.transport.base import Transport, TransportException
27
29
 
@@ -35,7 +37,7 @@ class TransportAzure(Transport):
35
37
 
36
38
  def __init__(self, base=None, access_key=None, tenant_id=None, client_id=None, client_secret=None,
37
39
  host=None, connection_attempts=None, allow_directory_access=False, use_default_credentials=False,
38
- initalize_container=True, read_only=False):
40
+ initalize_container=True, read_only=False, port=None):
39
41
  self.log = logging.getLogger('assemblyline.transport.azure')
40
42
  self.read_only = False
41
43
  self.connection_attempts: Optional[int] = connection_attempts
@@ -44,6 +46,8 @@ class TransportAzure(Transport):
44
46
  # Get URL
45
47
  self.host = host
46
48
  self.endpoint_url = f"https://{self.host}"
49
+ if port:
50
+ self.endpoint_url += ":" + str(port)
47
51
 
48
52
  # Get container and base_path
49
53
  parts = base.strip("/").split("/", 1)
@@ -57,7 +61,7 @@ class TransportAzure(Transport):
57
61
  if use_default_credentials:
58
62
  if (tenant_id and client_id) and (not client_secret):
59
63
  self.credential = WorkloadIdentityCredential(tenant_id=tenant_id,
60
- client_id=client_id)
64
+ client_id=client_id)
61
65
  else:
62
66
  # Service accounts will by default create the enviromental variables, and use them as params
63
67
  self.credential = DefaultAzureCredential()
@@ -144,6 +148,21 @@ class TransportAzure(Transport):
144
148
  if not isinstance(error.cause, ResourceNotFoundError):
145
149
  raise
146
150
 
151
+ def delete_batch_chunk_size(self) -> int:
152
+ return 256
153
+
154
+ def delete_batch(self, file_list: Iterable[str]):
155
+ """Deletes a batch of files."""
156
+ keys = [self.normalize(path) for path in file_list]
157
+ for key_chunk in chunk.chunk(keys, 256):
158
+ responses: Iterable[HttpResponse] = self.with_retries(
159
+ self.container_client.delete_blobs, *key_chunk, raise_on_any_failure=False
160
+ )
161
+ for response in responses:
162
+ if response.status_code == 404:
163
+ continue
164
+ response.raise_for_status()
165
+
147
166
  def exists(self, path):
148
167
  key = self.normalize(path)
149
168
  blob_client = self.service_client.get_blob_client(self.blob_container, key)
@@ -46,6 +46,16 @@ class Transport(object):
46
46
  """
47
47
  raise TransportException("Not Implemented")
48
48
 
49
+ def delete_batch_chunk_size(self) -> int:
50
+ return 1
51
+
52
+ def delete_batch(self, file_list: Iterable[str]):
53
+ """
54
+ Deletes a batch of files
55
+ """
56
+ for path in file_list:
57
+ self.delete(path)
58
+
49
59
  def exists(self, path: str) -> bool:
50
60
  """
51
61
  Returns True if the path exists, False otherwise.
@@ -154,7 +154,12 @@ class TransportFTP(Transport):
154
154
  @reconnect_retry_on_fail
155
155
  def delete(self, path):
156
156
  path = self.normalize(path)
157
- self.ftp.delete(path)
157
+ try:
158
+ self.ftp.delete(path)
159
+ except ftplib.error_perm as e:
160
+ # If the file doesnt exist we get a 550.
161
+ if not str(e).startswith('550'):
162
+ raise
158
163
 
159
164
  @reconnect_retry_on_fail
160
165
  def exists(self, path) -> bool:
@@ -12,6 +12,7 @@ from botocore.exceptions import (
12
12
  EndpointConnectionError,
13
13
  )
14
14
 
15
+ from assemblyline.common import chunk
15
16
  from assemblyline.common.exceptions import ChainAll
16
17
  from assemblyline.filestore.transport.base import Transport, TransportException
17
18
 
@@ -35,12 +36,14 @@ class TransportS3(Transport):
35
36
  DEFAULT_HOST = "s3.amazonaws.com"
36
37
 
37
38
  def __init__(self, base=None, accesskey=None, secretkey=None, aws_region=None, s3_bucket="al-storage",
38
- host=None, port=None, use_ssl=None, verify=True, connection_attempts=None, boto_defaults=False, read_only=False):
39
+ host=None, port=None, use_ssl=None, verify=True, connection_attempts=None,
40
+ boto_defaults=False, read_only=False, use_batch_delete: bool = False):
39
41
  self.log = logging.getLogger('assemblyline.transport.s3')
40
42
  self.base = base
41
43
  self.bucket = s3_bucket
42
44
  self.accesskey = accesskey
43
45
  self.retry_limit: int = connection_attempts
46
+ self.use_batch_delete: bool = use_batch_delete
44
47
 
45
48
  if use_ssl is None:
46
49
  self.use_ssl = True
@@ -131,7 +134,7 @@ class TransportS3(Transport):
131
134
  return ret_val
132
135
 
133
136
  except (EndpointConnectionError, ConnectionClosedError):
134
- self.log.warning(f"No connection to S3 transport {self.endpoint_url}, retrying...")
137
+ self.log.warning("No connection to S3 transport %s, retrying...", self.endpoint_url)
135
138
  retries += 1
136
139
  raise ConnectionError(f"Couldn't connect to the requested S3 endpoint {self.endpoint_url} inside retry limit")
137
140
 
@@ -139,6 +142,31 @@ class TransportS3(Transport):
139
142
  key = self.normalize(path)
140
143
  self.with_retries(self.client.delete_object, Bucket=self.bucket, Key=key)
141
144
 
145
+ def delete_batch_chunk_size(self) -> int:
146
+ if self.use_batch_delete:
147
+ return 1000
148
+ else:
149
+ return 1
150
+
151
+ def delete_batch(self, file_list: Iterable[str]):
152
+ """Deletes a batch of files."""
153
+ if not self.use_batch_delete:
154
+ return super().delete_batch(file_list)
155
+
156
+ keys = [self.normalize(path) for path in file_list]
157
+ for key_chunk in chunk.chunk(keys, 1000):
158
+ response = self.with_retries(
159
+ self.client.delete_objects,
160
+ Bucket=self.bucket,
161
+ Delete={
162
+ 'Objects': [{'Key': key} for key in key_chunk],
163
+ 'Quiet': True,
164
+ },
165
+ )
166
+
167
+ if response['Errors']:
168
+ raise TransportException('Could not delete some member of batch', response['Errors'][0]['Message'])
169
+
142
170
  def exists(self, path):
143
171
  # checks to see if KEY exists
144
172
  key = self.normalize(path)
@@ -117,8 +117,11 @@ class TransportSFTP(Transport):
117
117
 
118
118
  @reconnect_retry_on_fail
119
119
  def delete(self, path):
120
- path = self.normalize(path)
121
- self.sftp.remove(path)
120
+ try:
121
+ path = self.normalize(path)
122
+ self.sftp.remove(path)
123
+ except FileNotFoundError:
124
+ pass
122
125
 
123
126
  @reconnect_retry_on_fail
124
127
  def exists(self, path):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline
3
- Version: 4.7.5.dev13
3
+ Version: 4.7.5.dev16
4
4
  Summary: Assemblyline 4 - Automated malware analysis framework
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-base
6
6
  Author: CCCS Assemblyline development team
@@ -1 +0,0 @@
1
- 4.7.5.dev13