bbot 2.4.2.6659rc0__tar.gz → 2.4.2.6706rc0__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 bbot might be problematic. Click here for more details.

Files changed (458) hide show
  1. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/PKG-INFO +2 -2
  2. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/__init__.py +1 -1
  3. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/async_helpers.py +29 -8
  4. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/defaults.yml +6 -0
  5. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/apkpure.py +5 -3
  6. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/base.py +86 -32
  7. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/docker_pull.py +3 -3
  8. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/filedownload.py +8 -4
  9. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/git_clone.py +5 -2
  10. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/gitdumper.py +14 -5
  11. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/github_workflows.py +12 -5
  12. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/nuclei.py +4 -2
  13. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/portscan.py +2 -0
  14. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/postman_download.py +6 -3
  15. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/trufflehog.py +2 -3
  16. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/args.py +10 -1
  17. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/preset.py +0 -2
  18. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/scanner.py +1 -4
  19. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scripts/docs.py +8 -0
  20. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_scan.py +57 -0
  21. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_apkpure.py +2 -0
  22. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_file_enum.py +8 -3
  23. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_docker_pull.py +2 -0
  24. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_filedownload.py +5 -1
  25. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_git_clone.py +4 -1
  26. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_gitdumper.py +2 -0
  27. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_portscan.py +3 -3
  28. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_postman_download.py +6 -1
  29. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_trufflehog.py +38 -12
  30. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/pyproject.toml +3 -3
  31. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/LICENSE +0 -0
  32. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/README.md +0 -0
  33. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/cli.py +0 -0
  34. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/__init__.py +0 -0
  35. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/config/__init__.py +0 -0
  36. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/config/files.py +0 -0
  37. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/config/logger.py +0 -0
  38. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/core.py +0 -0
  39. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/engine.py +0 -0
  40. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/event/__init__.py +0 -0
  41. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/event/base.py +0 -0
  42. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/event/helpers.py +0 -0
  43. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/flags.py +0 -0
  44. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/__init__.py +0 -0
  45. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/bloom.py +0 -0
  46. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/cache.py +0 -0
  47. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/command.py +0 -0
  48. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/depsinstaller/__init__.py +0 -0
  49. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/depsinstaller/installer.py +0 -0
  50. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/depsinstaller/sudo_askpass.py +0 -0
  51. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/diff.py +0 -0
  52. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/__init__.py +0 -0
  53. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/brute.py +0 -0
  54. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/dns.py +0 -0
  55. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/engine.py +0 -0
  56. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/helpers.py +0 -0
  57. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/dns/mock.py +0 -0
  58. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/files.py +0 -0
  59. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/helper.py +0 -0
  60. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/interactsh.py +0 -0
  61. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/libmagic.py +0 -0
  62. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/misc.py +0 -0
  63. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/names_generator.py +0 -0
  64. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/ntlm.py +0 -0
  65. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/process.py +0 -0
  66. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/ratelimiter.py +0 -0
  67. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/regex.py +0 -0
  68. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/regexes.py +0 -0
  69. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/url.py +0 -0
  70. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/validators.py +0 -0
  71. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/__init__.py +0 -0
  72. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/client.py +0 -0
  73. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/engine.py +0 -0
  74. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/envelopes.py +0 -0
  75. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/ssl_context.py +0 -0
  76. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/web/web.py +0 -0
  77. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/wordcloud.py +0 -0
  78. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/helpers/yara_helper.py +0 -0
  79. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/modules.py +0 -0
  80. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/multiprocess.py +0 -0
  81. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/core/shared_deps.py +0 -0
  82. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/db/sql/models.py +0 -0
  83. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/errors.py +0 -0
  84. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/logger.py +0 -0
  85. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/__init__.py +0 -0
  86. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ajaxpro.py +0 -0
  87. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/anubisdb.py +0 -0
  88. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/azure_realm.py +0 -0
  89. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/azure_tenant.py +0 -0
  90. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/baddns.py +0 -0
  91. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/baddns_direct.py +0 -0
  92. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/baddns_zone.py +0 -0
  93. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/badsecrets.py +0 -0
  94. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bevigil.py +0 -0
  95. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/binaryedge.py +0 -0
  96. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_amazon.py +0 -0
  97. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_azure.py +0 -0
  98. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_digitalocean.py +0 -0
  99. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_file_enum.py +0 -0
  100. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_firebase.py +0 -0
  101. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bucket_google.py +0 -0
  102. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bufferoverrun.py +0 -0
  103. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/builtwith.py +0 -0
  104. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/bypass403.py +0 -0
  105. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/c99.py +0 -0
  106. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/censys.py +0 -0
  107. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/certspotter.py +0 -0
  108. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/chaos.py +0 -0
  109. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/code_repository.py +0 -0
  110. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/credshed.py +0 -0
  111. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/crt.py +0 -0
  112. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/crt_db.py +0 -0
  113. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/deadly/medusa.py +0 -0
  114. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dehashed.py +0 -0
  115. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/digitorus.py +0 -0
  116. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnsbimi.py +0 -0
  117. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnsbrute.py +0 -0
  118. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnsbrute_mutations.py +0 -0
  119. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnscaa.py +0 -0
  120. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnscommonsrv.py +0 -0
  121. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnsdumpster.py +0 -0
  122. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dnstlsrpt.py +0 -0
  123. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dockerhub.py +0 -0
  124. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/dotnetnuke.py +0 -0
  125. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/emailformat.py +0 -0
  126. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/extractous.py +0 -0
  127. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ffuf.py +0 -0
  128. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ffuf_shortnames.py +0 -0
  129. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/fingerprintx.py +0 -0
  130. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/fullhunt.py +0 -0
  131. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/generic_ssrf.py +0 -0
  132. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/git.py +0 -0
  133. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/github_codesearch.py +0 -0
  134. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/github_org.py +0 -0
  135. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/github_usersearch.py +0 -0
  136. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/gitlab.py +0 -0
  137. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/google_playstore.py +0 -0
  138. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/gowitness.py +0 -0
  139. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/hackertarget.py +0 -0
  140. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/host_header.py +0 -0
  141. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/httpx.py +0 -0
  142. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/hunt.py +0 -0
  143. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/hunterio.py +0 -0
  144. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/iis_shortnames.py +0 -0
  145. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/__init__.py +0 -0
  146. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/aggregate.py +0 -0
  147. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/base.py +0 -0
  148. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/cloudcheck.py +0 -0
  149. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/dnsresolve.py +0 -0
  150. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/excavate.py +0 -0
  151. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/speculate.py +0 -0
  152. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/internal/unarchive.py +0 -0
  153. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ip2location.py +0 -0
  154. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ipneighbor.py +0 -0
  155. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ipstack.py +0 -0
  156. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/jadx.py +0 -0
  157. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/leakix.py +0 -0
  158. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/lightfuzz.py +0 -0
  159. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/__init__.py +0 -0
  160. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/base.py +0 -0
  161. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/cmdi.py +0 -0
  162. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/crypto.py +0 -0
  163. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/nosqli.py +0 -0
  164. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/path.py +0 -0
  165. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/serial.py +0 -0
  166. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/sqli.py +0 -0
  167. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/ssti.py +0 -0
  168. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/lightfuzz/submodules/xss.py +0 -0
  169. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/myssl.py +0 -0
  170. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/newsletters.py +0 -0
  171. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/ntlm.py +0 -0
  172. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/oauth.py +0 -0
  173. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/otx.py +0 -0
  174. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/__init__.py +0 -0
  175. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/asset_inventory.py +0 -0
  176. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/base.py +0 -0
  177. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/csv.py +0 -0
  178. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/discord.py +0 -0
  179. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/emails.py +0 -0
  180. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/http.py +0 -0
  181. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/json.py +0 -0
  182. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/mysql.py +0 -0
  183. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/neo4j.py +0 -0
  184. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/nmap_xml.py +0 -0
  185. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/postgres.py +0 -0
  186. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/python.py +0 -0
  187. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/slack.py +0 -0
  188. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/splunk.py +0 -0
  189. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/sqlite.py +0 -0
  190. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/stdout.py +0 -0
  191. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/subdomains.py +0 -0
  192. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/teams.py +0 -0
  193. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/txt.py +0 -0
  194. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/web_parameters.py +0 -0
  195. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/web_report.py +0 -0
  196. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/output/websocket.py +0 -0
  197. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/paramminer_cookies.py +0 -0
  198. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/paramminer_getparams.py +0 -0
  199. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/paramminer_headers.py +0 -0
  200. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/passivetotal.py +0 -0
  201. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/pgp.py +0 -0
  202. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/portfilter.py +0 -0
  203. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/postman.py +0 -0
  204. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/rapiddns.py +0 -0
  205. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/reflected_parameters.py +0 -0
  206. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/report/affiliates.py +0 -0
  207. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/report/asn.py +0 -0
  208. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/report/base.py +0 -0
  209. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/robots.py +0 -0
  210. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/securitytrails.py +0 -0
  211. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/securitytxt.py +0 -0
  212. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/shodan_dns.py +0 -0
  213. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/shodan_idb.py +0 -0
  214. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/sitedossier.py +0 -0
  215. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/skymem.py +0 -0
  216. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/smuggler.py +0 -0
  217. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/social.py +0 -0
  218. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/sslcert.py +0 -0
  219. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/subdomaincenter.py +0 -0
  220. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/subdomainradar.py +0 -0
  221. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/telerik.py +0 -0
  222. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/bucket.py +0 -0
  223. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/github.py +0 -0
  224. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/postman.py +0 -0
  225. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/shodan.py +0 -0
  226. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/sql.py +0 -0
  227. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/subdomain_enum.py +0 -0
  228. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/templates/webhook.py +0 -0
  229. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/trickest.py +0 -0
  230. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/url_manipulation.py +0 -0
  231. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/urlscan.py +0 -0
  232. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/vhost.py +0 -0
  233. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/viewdns.py +0 -0
  234. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/virustotal.py +0 -0
  235. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/wafw00f.py +0 -0
  236. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/wappalyzer.py +0 -0
  237. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/wayback.py +0 -0
  238. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/wpscan.py +0 -0
  239. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/modules/zoomeye.py +0 -0
  240. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/baddns-intense.yml +0 -0
  241. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/cloud-enum.yml +0 -0
  242. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/code-enum.yml +0 -0
  243. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/email-enum.yml +0 -0
  244. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/fast.yml +0 -0
  245. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/kitchen-sink.yml +0 -0
  246. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/nuclei/nuclei-budget.yml +0 -0
  247. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/nuclei/nuclei-intense.yml +0 -0
  248. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/nuclei/nuclei-technology.yml +0 -0
  249. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/nuclei/nuclei.yml +0 -0
  250. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/spider-intense.yml +0 -0
  251. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/spider.yml +0 -0
  252. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/subdomain-enum.yml +0 -0
  253. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/tech-detect.yml +0 -0
  254. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/dirbust-heavy.yml +0 -0
  255. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/dirbust-light.yml +0 -0
  256. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/dotnet-audit.yml +0 -0
  257. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/iis-shortnames.yml +0 -0
  258. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-heavy.yml +0 -0
  259. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-light.yml +0 -0
  260. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-medium.yml +0 -0
  261. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-superheavy.yml +0 -0
  262. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/lightfuzz-xss.yml +0 -0
  263. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web/paramminer.yml +0 -0
  264. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web-basic.yml +0 -0
  265. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web-screenshots.yml +0 -0
  266. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/presets/web-thorough.yml +0 -0
  267. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/__init__.py +0 -0
  268. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/dispatcher.py +0 -0
  269. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/manager.py +0 -0
  270. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/__init__.py +0 -0
  271. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/conditions.py +0 -0
  272. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/environ.py +0 -0
  273. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/preset/path.py +0 -0
  274. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/stats.py +0 -0
  275. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/scanner/target.py +0 -0
  276. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/__init__.py +0 -0
  277. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/bbot_fixtures.py +0 -0
  278. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/conftest.py +0 -0
  279. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/coverage.cfg +0 -0
  280. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/fastapi_test.py +0 -0
  281. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/owasp_mastg.apk +0 -0
  282. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/run_tests.sh +0 -0
  283. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test.conf +0 -0
  284. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_output.ndjson +0 -0
  285. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/__init__.py +0 -0
  286. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test__module__tests.py +0 -0
  287. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_bbot_fastapi.py +0 -0
  288. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_bloom_filter.py +0 -0
  289. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_cli.py +0 -0
  290. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_command.py +0 -0
  291. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_config.py +0 -0
  292. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_depsinstaller.py +0 -0
  293. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_dns.py +0 -0
  294. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_docs.py +0 -0
  295. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_engine.py +0 -0
  296. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_event_seeds.py +0 -0
  297. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_events.py +0 -0
  298. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_files.py +0 -0
  299. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_helpers.py +0 -0
  300. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_manager_deduplication.py +0 -0
  301. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_manager_scope_accuracy.py +0 -0
  302. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_modules_basic.py +0 -0
  303. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_presets.py +0 -0
  304. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_python_api.py +0 -0
  305. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_regexes.py +0 -0
  306. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_scope.py +0 -0
  307. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_target.py +0 -0
  308. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_web.py +0 -0
  309. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_1/test_web_envelopes.py +0 -0
  310. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/__init__.py +0 -0
  311. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/__init__.py +0 -0
  312. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/base.py +0 -0
  313. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_affiliates.py +0 -0
  314. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_aggregate.py +0 -0
  315. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ajaxpro.py +0 -0
  316. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_anubisdb.py +0 -0
  317. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_asn.py +0 -0
  318. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -0
  319. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_azure_realm.py +0 -0
  320. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +0 -0
  321. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_baddns.py +0 -0
  322. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +0 -0
  323. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_baddns_zone.py +0 -0
  324. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_badsecrets.py +0 -0
  325. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bevigil.py +0 -0
  326. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_binaryedge.py +0 -0
  327. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +0 -0
  328. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +0 -0
  329. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_digitalocean.py +0 -0
  330. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_firebase.py +0 -0
  331. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bucket_google.py +0 -0
  332. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +0 -0
  333. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_builtwith.py +0 -0
  334. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_bypass403.py +0 -0
  335. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_c99.py +0 -0
  336. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_censys.py +0 -0
  337. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_certspotter.py +0 -0
  338. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_chaos.py +0 -0
  339. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +0 -0
  340. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_code_repository.py +0 -0
  341. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_credshed.py +0 -0
  342. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_crt.py +0 -0
  343. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_crt_db.py +0 -0
  344. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_csv.py +0 -0
  345. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dehashed.py +0 -0
  346. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_digitorus.py +0 -0
  347. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_discord.py +0 -0
  348. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +0 -0
  349. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +0 -0
  350. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +0 -0
  351. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnscaa.py +0 -0
  352. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +0 -0
  353. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +0 -0
  354. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnsresolve.py +0 -0
  355. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dnstlsrpt.py +0 -0
  356. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dockerhub.py +0 -0
  357. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -0
  358. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_emailformat.py +0 -0
  359. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_emails.py +0 -0
  360. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_excavate.py +0 -0
  361. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_extractous.py +0 -0
  362. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf.py +0 -0
  363. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +0 -0
  364. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_fingerprintx.py +0 -0
  365. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_fullhunt.py +0 -0
  366. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_generic_ssrf.py +0 -0
  367. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_git.py +0 -0
  368. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_github_codesearch.py +0 -0
  369. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_github_org.py +0 -0
  370. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_github_usersearch.py +0 -0
  371. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_github_workflows.py +0 -0
  372. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_gitlab.py +0 -0
  373. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_google_playstore.py +0 -0
  374. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_gowitness.py +0 -0
  375. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_hackertarget.py +0 -0
  376. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_host_header.py +0 -0
  377. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_http.py +0 -0
  378. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_httpx.py +0 -0
  379. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_hunt.py +0 -0
  380. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_hunterio.py +0 -0
  381. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_iis_shortnames.py +0 -0
  382. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ip2location.py +0 -0
  383. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ipneighbor.py +0 -0
  384. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ipstack.py +0 -0
  385. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_jadx.py +0 -0
  386. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_json.py +0 -0
  387. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_leakix.py +0 -0
  388. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_lightfuzz.py +0 -0
  389. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_medusa.py +0 -0
  390. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_mysql.py +0 -0
  391. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_myssl.py +0 -0
  392. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_neo4j.py +0 -0
  393. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_newsletters.py +0 -0
  394. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_nmap_xml.py +0 -0
  395. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_ntlm.py +0 -0
  396. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_nuclei.py +0 -0
  397. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_oauth.py +0 -0
  398. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_otx.py +0 -0
  399. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +0 -0
  400. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -0
  401. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +0 -0
  402. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_passivetotal.py +0 -0
  403. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_pgp.py +0 -0
  404. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_portfilter.py +0 -0
  405. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_postgres.py +0 -0
  406. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_postman.py +0 -0
  407. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_python.py +0 -0
  408. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_rapiddns.py +0 -0
  409. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_reflected_parameters.py +0 -0
  410. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_robots.py +0 -0
  411. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_securitytrails.py +0 -0
  412. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_securitytxt.py +0 -0
  413. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +0 -0
  414. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_shodan_idb.py +0 -0
  415. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_sitedossier.py +0 -0
  416. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_skymem.py +0 -0
  417. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_slack.py +0 -0
  418. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_smuggler.py +0 -0
  419. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_social.py +0 -0
  420. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_speculate.py +0 -0
  421. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_splunk.py +0 -0
  422. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_sqlite.py +0 -0
  423. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_sslcert.py +0 -0
  424. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_stdout.py +0 -0
  425. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +0 -0
  426. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +0 -0
  427. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_subdomains.py +0 -0
  428. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_teams.py +0 -0
  429. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_telerik.py +0 -0
  430. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_trickest.py +0 -0
  431. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_txt.py +0 -0
  432. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_unarchive.py +0 -0
  433. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_url_manipulation.py +0 -0
  434. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_urlscan.py +0 -0
  435. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_vhost.py +0 -0
  436. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_viewdns.py +0 -0
  437. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_virustotal.py +0 -0
  438. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_wafw00f.py +0 -0
  439. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_wappalyzer.py +0 -0
  440. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_wayback.py +0 -0
  441. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_web_parameters.py +0 -0
  442. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_web_report.py +0 -0
  443. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_websocket.py +0 -0
  444. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_wpscan.py +0 -0
  445. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/module_tests/test_module_zoomeye.py +0 -0
  446. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/template_tests/__init__.py +0 -0
  447. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +0 -0
  448. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/testsslcert.pem +0 -0
  449. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/test/testsslkey.pem +0 -0
  450. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/devops_mutations.txt +0 -0
  451. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/ms_on_prem_subdomains.txt +0 -0
  452. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/nameservers.txt +0 -0
  453. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/paramminer_headers.txt +0 -0
  454. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/paramminer_parameters.txt +0 -0
  455. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +0 -0
  456. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/top_open_ports_nmap.txt +0 -0
  457. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/valid_url_schemes.txt +0 -0
  458. {bbot-2.4.2.6659rc0 → bbot-2.4.2.6706rc0}/bbot/wordlists/wordninja_dns.txt.gz +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bbot
3
- Version: 2.4.2.6659rc0
3
+ Version: 2.4.2.6706rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  License: GPL-3.0
6
6
  Keywords: python,cli,automation,osint,threat-intel,intelligence,neo4j,scanner,python-library,hacking,recursion,pentesting,recon,command-line-tool,bugbounty,subdomains,security-tools,subdomain-scanner,osint-framework,attack-surface,subdomain-enumeration,osint-tool
@@ -18,7 +18,7 @@ Classifier: Topic :: Security
18
18
  Requires-Dist: ansible-core (>=2.15.13,<3.0.0)
19
19
  Requires-Dist: ansible-runner (>=2.3.2,<3.0.0)
20
20
  Requires-Dist: beautifulsoup4 (>=4.12.2,<5.0.0)
21
- Requires-Dist: cachetools (>=5.3.2,<6.0.0)
21
+ Requires-Dist: cachetools (>=5.3.2,<7.0.0)
22
22
  Requires-Dist: cloudcheck (>=7.2.11,<8.0.0)
23
23
  Requires-Dist: deepdiff (>=8.0.0,<9.0.0)
24
24
  Requires-Dist: dnspython (>=2.4.2,<3.0.0)
@@ -1,5 +1,5 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.4.2.6659rc"
2
+ __version__ = "v2.4.2.6706rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
5
5
 
@@ -1,10 +1,10 @@
1
+ import time
1
2
  import uuid
2
3
  import random
3
4
  import asyncio
4
5
  import logging
5
6
  import functools
6
- from datetime import datetime
7
- from .misc import human_timedelta
7
+ from contextlib import suppress
8
8
  from cachetools import keys, LRUCache
9
9
  from contextlib import asynccontextmanager
10
10
 
@@ -63,26 +63,27 @@ class TaskCounter:
63
63
  self._lock = asyncio.Lock()
64
64
  return self._lock
65
65
 
66
- def count(self, task_name, n=1, _log=True):
66
+ def count(self, task_name, n=1, asyncio_task=None, _log=True):
67
67
  if callable(task_name):
68
68
  task_name = f"{task_name.__qualname__}()"
69
- return self.Task(self, task_name, n=n, _log=_log)
69
+ return self.Task(self, task_name, n=n, _log=_log, asyncio_task=asyncio_task)
70
70
 
71
71
  class Task:
72
- def __init__(self, manager, task_name, n=1, _log=True):
72
+ def __init__(self, manager, task_name, n=1, _log=True, asyncio_task=None):
73
73
  self.manager = manager
74
74
  self.task_name = task_name
75
75
  self.task_id = None
76
76
  self.start_time = None
77
77
  self.log = _log
78
78
  self.n = n
79
+ self._asyncio_task = asyncio_task
79
80
 
80
81
  async def __aenter__(self):
81
82
  self.task_id = uuid.uuid4()
82
83
  # if self.log:
83
84
  # log.trace(f"Starting task {self.task_name} ({self.task_id})")
84
85
  async with self.manager.lock:
85
- self.start_time = datetime.now()
86
+ self.start_time = time.time()
86
87
  self.manager.tasks[self.task_id] = self
87
88
  return self
88
89
 
@@ -92,9 +93,29 @@ class TaskCounter:
92
93
  # if self.log:
93
94
  # log.trace(f"Finished task {self.task_name} ({self.task_id})")
94
95
 
96
+ @property
97
+ def asyncio_task(self):
98
+ if self._asyncio_task is None:
99
+ raise AttributeError("No asyncio task associated with this task")
100
+ return self._asyncio_task
101
+
102
+ @property
103
+ def function_name(self):
104
+ with suppress(AttributeError):
105
+ return self.asyncio_task.get_coro().__name__
106
+ return ""
107
+
108
+ async def cancel(self):
109
+ self.asyncio_task.cancel()
110
+ with suppress(asyncio.CancelledError):
111
+ await self.asyncio_task
112
+
113
+ @property
114
+ def running_for(self):
115
+ return time.time() - self.start_time
116
+
95
117
  def __str__(self):
96
- running_for = human_timedelta(datetime.now() - self.start_time)
97
- return f"{self.task_name} running for {running_for}"
118
+ return f"{self.task_name} running for {self.running_for:.1f}s"
98
119
 
99
120
 
100
121
  def get_event_loop():
@@ -133,6 +133,12 @@ deps:
133
133
  # Load BBOT modules from these custom paths
134
134
  module_dirs: []
135
135
 
136
+ # maximum runtime in seconds for each module's handle_event() is 60 minutes
137
+ # when the timeout is reached, the offending handle_event() will be cancelled and the module will move on to the next event
138
+ module_handle_event_timeout: 3600
139
+ # handle_batch() default timeout is 2 hours
140
+ module_handle_batch_timeout: 7200
141
+
136
142
  # Infer certain events from others, e.g. IPs from IP ranges, DNS_NAMEs from URLs, etc.
137
143
  speculate: True
138
144
  # Passively search event data for URLs, hostnames, emails, etc.
@@ -13,14 +13,16 @@ class apkpure(BaseModule):
13
13
  "author": "@domwhewell-sage",
14
14
  }
15
15
  options = {"output_folder": ""}
16
- options_desc = {"output_folder": "Folder to download apk's to"}
16
+ options_desc = {
17
+ "output_folder": "Folder to download APKs to. If not specified, downloaded APKs will be deleted when the scan completes, to minimize disk usage."
18
+ }
17
19
 
18
20
  async def setup(self):
19
- output_folder = self.config.get("output_folder")
21
+ output_folder = self.config.get("output_folder", "")
20
22
  if output_folder:
21
23
  self.output_dir = Path(output_folder) / "apk_files"
22
24
  else:
23
- self.output_dir = self.scan.home / "apk_files"
25
+ self.output_dir = self.helpers.temp_dir / "apk_files"
24
26
  self.helpers.mkdir(self.output_dir)
25
27
  return await super().setup()
26
28
 
@@ -61,8 +61,6 @@ class BaseModule:
61
61
 
62
62
  batch_size (int): Size of batches processed by handle_batch(). Default is 1.
63
63
 
64
- batch_wait (int): Seconds to wait before force-submitting a batch. Default is 10.
65
-
66
64
  api_failure_abort_threshold (int): Threshold for setting error state after failed HTTP requests (only takes effect when `api_request()` is used. Default is 5.
67
65
 
68
66
  _preserve_graph (bool): When set to True, accept events that may be duplicates but are necessary for construction of complete graph. Typically only enabled for output modules that need to maintain full chains of events, e.g. `neo4j` and `json`. Default is False.
@@ -102,7 +100,6 @@ class BaseModule:
102
100
 
103
101
  _module_threads = 1
104
102
  _batch_size = 1
105
- batch_wait = 10
106
103
 
107
104
  # disable the module after this many failed attempts in a row
108
105
  _api_failure_abort_threshold = 3
@@ -159,6 +156,13 @@ class BaseModule:
159
156
 
160
157
  self._tasks = []
161
158
  self._event_received = None
159
+ # maximum runtime for each module's handle_event()
160
+ self._default_handle_event_timeout = self.scan.config.get("module_handle_event_timeout", 60 * 60) # 1 hour
161
+ self._default_handle_batch_timeout = self.scan.config.get(
162
+ "module_handle_batch_timeout", 60 * 60 * 2
163
+ ) # 2 hours
164
+ self._event_handler_watchdog_task = None
165
+ self._event_handler_watchdog_interval = self.event_handler_timeout / 10
162
166
 
163
167
  # used for optional "per host" tracking
164
168
  self._per_host_tracker = set()
@@ -399,6 +403,13 @@ class BaseModule:
399
403
  module_threads = self._module_threads
400
404
  return module_threads
401
405
 
406
+ @property
407
+ def event_handler_timeout(self):
408
+ module_timeout = self.config.get("module_timeout", None)
409
+ if module_timeout is not None:
410
+ return float(module_timeout)
411
+ return self._default_handle_event_timeout if self.batch_size <= 1 else self._default_handle_batch_timeout
412
+
402
413
  @property
403
414
  def auth_secret(self):
404
415
  """Indicates if the module is properly configured for authentication.
@@ -446,23 +457,28 @@ class BaseModule:
446
457
  - If a "FINISHED" event is found, invokes 'finish()' method of the module.
447
458
  """
448
459
  finish = False
449
- async with self._task_counter.count(f"{self.name}.handle_batch()") as counter:
450
- submitted = False
451
- if self.batch_size <= 1:
452
- return
453
- if self.num_incoming_events > 0:
454
- events, finish = await self._events_waiting()
455
- if events and not self.errored:
456
- counter.n = len(events)
457
- self.verbose(f"Handling batch of {len(events):,} events")
458
- submitted = True
459
- async with self.scan._acatch(f"{self.name}.handle_batch()"):
460
- await self.handle_batch(*events)
461
- self.verbose(f"Finished handling batch of {len(events):,} events")
460
+ submitted = False
461
+ if self.batch_size <= 1:
462
+ return
463
+ if self.num_incoming_events > 0:
464
+ events, finish = await self._events_waiting()
465
+ if events and not self.errored:
466
+ self.verbose(f"Handling batch of {len(events):,} events")
467
+ event_types = {}
468
+ for e in events:
469
+ event_types[e.type] = event_types.get(e.type, 0) + 1
470
+ event_types_sorted = sorted(event_types.items(), key=lambda x: x[1], reverse=True)
471
+ event_types_str = ", ".join(f"{k}: {v}" for k, v in event_types_sorted)
472
+ submitted = True
473
+ context = f"{self.name}.handle_batch({event_types_str})"
474
+ try:
475
+ await self.run_task(self.handle_batch(*events), context, n=len(events))
476
+ except asyncio.CancelledError:
477
+ self.debug(f"{context} was cancelled")
478
+ self.verbose(f"Finished handling batch of {len(events):,} events")
462
479
  if finish:
463
480
  context = f"{self.name}.finish()"
464
- async with self.scan._acatch(context), self._task_counter.count(context):
465
- await self.finish()
481
+ await self.run_task(self.finish(), context)
466
482
  return submitted
467
483
 
468
484
  def make_event(self, *args, **kwargs):
@@ -594,6 +610,10 @@ class BaseModule:
594
610
  asyncio.create_task(self._worker(), name=f"{self.scan.name}.{self.name}._worker()")
595
611
  for _ in range(self.module_threads)
596
612
  ]
613
+ self._event_handler_watchdog_task = asyncio.create_task(
614
+ self._event_handler_watchdog(),
615
+ name=f"{self.scan.name}.{self.name}._event_handler_watchdog()",
616
+ )
597
617
 
598
618
  async def _setup(self):
599
619
  """
@@ -662,11 +682,6 @@ class BaseModule:
662
682
  async with self.scan._acatch(context=self._worker, unhandled_is_critical=True):
663
683
  try:
664
684
  while not self.scan.stopping and not self.errored:
665
- # hold the reigns if our outgoing queue is full
666
- if self._qsize > 0 and self.outgoing_event_queue.qsize() >= self._qsize:
667
- await asyncio.sleep(0.1)
668
- continue
669
-
670
685
  # if batch wasn't big enough, we wait for the next event before continuing
671
686
  if self.batch_size > 1:
672
687
  submitted = await self._handle_batch()
@@ -689,14 +704,20 @@ class BaseModule:
689
704
  if acceptable:
690
705
  if event.type == "FINISHED":
691
706
  context = f"{self.name}.finish()"
692
- async with self.scan._acatch(context), self._task_counter.count(context):
693
- await self.finish()
707
+ try:
708
+ await self.run_task(self.finish(), context)
709
+ except asyncio.CancelledError:
710
+ self.debug(f"{context} was cancelled")
711
+ continue
694
712
  else:
695
713
  context = f"{self.name}.handle_event({event})"
696
714
  self.scan.stats.event_consumed(event, self)
697
715
  self.debug(f"Handling {event}")
698
- async with self.scan._acatch(context), self._task_counter.count(context):
699
- await self.handle_event(event)
716
+ try:
717
+ await self.run_task(self.handle_event(event), context)
718
+ except asyncio.CancelledError:
719
+ self.debug(f"{context} was cancelled")
720
+ continue
700
721
  self.debug(f"Finished handling {event}")
701
722
  else:
702
723
  self.debug(f"Not accepting {event} because {reason}")
@@ -852,6 +873,36 @@ class BaseModule:
852
873
  async with self.scan._acatch(context), self._task_counter.count(context):
853
874
  await self.helpers.execute_sync_or_async(callback)
854
875
 
876
+ async def run_task(self, coro, name, n=1):
877
+ """
878
+ Start a task while tracking it in the module's task counter.
879
+
880
+ This lets us keep a detailed module status and selectively cancel tasks when needed, like when handle_event exceeds its max runtime.
881
+ """
882
+ task = asyncio.create_task(coro)
883
+ async with self.scan._acatch(context=name), self._task_counter.count(task_name=name, asyncio_task=task, n=n):
884
+ return await task
885
+
886
+ async def _event_handler_watchdog(self):
887
+ """
888
+ Watches handle_event and handle_batch tasks and cancels them if they exceed their max runtime.
889
+ """
890
+ while not self.scan.stopping and not self.errored:
891
+ # if there are events in the outgoing queue, we leave the tasks alone
892
+ if self.outgoing_event_queue.qsize() > 0:
893
+ await self.helpers.sleep(self._event_handler_watchdog_interval)
894
+ continue
895
+ event_handler_tasks = [
896
+ t for t in self._task_counter.tasks.values() if t.function_name in ("handle_event", "handle_batch")
897
+ ]
898
+ for task in event_handler_tasks:
899
+ if task.running_for > self.event_handler_timeout:
900
+ self.warning(
901
+ f"{self.name} Cancelling event handler task {task.task_name} because it's been running for {task.running_for:.1f}s (max timeout is {self.event_handler_timeout})"
902
+ )
903
+ await task.cancel()
904
+ await asyncio.sleep(self._event_handler_watchdog_interval)
905
+
855
906
  async def queue_event(self, event):
856
907
  """
857
908
  Asynchronously queues an incoming event to the module's event queue for further processing.
@@ -1266,7 +1317,7 @@ class BaseModule:
1266
1317
  new_url, new_kwargs = iter_key(url, page, page_size, offset, **requests_kwargs)
1267
1318
  result = await self.api_request(new_url, **new_kwargs)
1268
1319
  if result is None:
1269
- self.verbose(f"api_page_iter() got no response for {url}")
1320
+ self.verbose(f"api_page_iter() got no response for {new_url}")
1270
1321
  break
1271
1322
  try:
1272
1323
  if _json:
@@ -1708,10 +1759,13 @@ class BaseInterceptModule(BaseModule):
1708
1759
  context = f"{self.name}.handle_event({event, kwargs})"
1709
1760
  self.scan.stats.event_consumed(event, self)
1710
1761
  self.debug(f"Intercepting {event}")
1711
- async with self.scan._acatch(context), self._task_counter.count(context):
1712
- forward_event = await self.handle_event(event, **kwargs)
1713
- with suppress(ValueError, TypeError):
1714
- forward_event, forward_event_reason = forward_event
1762
+ try:
1763
+ forward_event = await self.run_task(self.handle_event(event, **kwargs), context)
1764
+ except asyncio.CancelledError:
1765
+ self.debug(f"{context} was cancelled")
1766
+ continue
1767
+ with suppress(ValueError, TypeError):
1768
+ forward_event, forward_event_reason = forward_event
1715
1769
 
1716
1770
  if forward_event is False:
1717
1771
  self.debug(f"Not forwarding {event} because {forward_event_reason}")
@@ -17,7 +17,7 @@ class docker_pull(BaseModule):
17
17
  options = {"all_tags": False, "output_folder": ""}
18
18
  options_desc = {
19
19
  "all_tags": "Download all tags from each registry (Default False)",
20
- "output_folder": "Folder to download docker repositories to",
20
+ "output_folder": "Folder to download docker repositories to. If not specified, downloaded docker images will be deleted when the scan completes, to minimize disk usage.",
21
21
  }
22
22
 
23
23
  scope_distance_modifier = 2
@@ -34,11 +34,11 @@ class docker_pull(BaseModule):
34
34
  )
35
35
  }
36
36
  self.all_tags = self.config.get("all_tags", True)
37
- output_folder = self.config.get("output_folder")
37
+ output_folder = self.config.get("output_folder", "")
38
38
  if output_folder:
39
39
  self.output_dir = Path(output_folder) / "docker_images"
40
40
  else:
41
- self.output_dir = self.scan.home / "docker_images"
41
+ self.output_dir = self.helpers.temp_dir / "docker_images"
42
42
  self.helpers.mkdir(self.output_dir)
43
43
  return await super().setup()
44
44
 
@@ -84,12 +84,12 @@ class filedownload(BaseModule):
84
84
  "bz2", # Bzip2 Compressed File
85
85
  ],
86
86
  "max_filesize": "10MB",
87
- "base_64_encoded_file": "false",
87
+ "output_folder": "",
88
88
  }
89
89
  options_desc = {
90
90
  "extensions": "File extensions to download",
91
91
  "max_filesize": "Cancel download if filesize is greater than this size",
92
- "base_64_encoded_file": "Stream the bytes of a file and encode them in base 64 for event data.",
92
+ "output_folder": "Folder to download files to. If not specified, downloaded files will be deleted when the scan completes, to minimize disk usage.",
93
93
  }
94
94
 
95
95
  scope_distance_modifier = 3
@@ -97,10 +97,14 @@ class filedownload(BaseModule):
97
97
  async def setup(self):
98
98
  self.extensions = list({e.lower().strip(".") for e in self.config.get("extensions", [])})
99
99
  self.max_filesize = self.config.get("max_filesize", "10MB")
100
- self.download_dir = self.scan.home / "filedownload"
101
- self.helpers.mkdir(self.download_dir)
102
100
  self.urls_downloaded = set()
103
101
  self.files_downloaded = 0
102
+ output_dir = self.config.get("output_folder", "")
103
+ if output_dir:
104
+ self.download_dir = Path(output_dir) / "filedownload"
105
+ else:
106
+ self.download_dir = self.helpers.temp_dir / "filedownload"
107
+ self.helpers.mkdir(self.download_dir)
104
108
  self.mime_db_file = await self.helpers.wordlist(
105
109
  "https://raw.githubusercontent.com/jshttp/mime-db/master/db.json"
106
110
  )
@@ -13,7 +13,10 @@ class git_clone(github):
13
13
  "author": "@domwhewell-sage",
14
14
  }
15
15
  options = {"api_key": "", "output_folder": ""}
16
- options_desc = {"api_key": "Github token", "output_folder": "Folder to clone repositories to"}
16
+ options_desc = {
17
+ "api_key": "Github token",
18
+ "output_folder": "Folder to clone repositories to. If not specified, cloned repositories will be deleted when the scan completes, to minimize disk usage.",
19
+ }
17
20
 
18
21
  deps_apt = ["git"]
19
22
 
@@ -24,7 +27,7 @@ class git_clone(github):
24
27
  if output_folder:
25
28
  self.output_dir = Path(output_folder) / "git_repos"
26
29
  else:
27
- self.output_dir = self.scan.home / "git_repos"
30
+ self.output_dir = self.helpers.temp_dir / "git_repos"
28
31
  self.helpers.mkdir(self.output_dir)
29
32
  return await super().setup()
30
33
 
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import regex as re
2
3
  from pathlib import Path
3
4
  from subprocess import CalledProcessError
@@ -19,7 +20,7 @@ class gitdumper(BaseModule):
19
20
  "max_semanic_version": 10,
20
21
  }
21
22
  options_desc = {
22
- "output_folder": "Folder to download repositories to",
23
+ "output_folder": "Folder to download repositories to. If not specified, downloaded repositories will be deleted when the scan completes, to minimize disk usage.",
23
24
  "fuzz_tags": "Fuzz for common git tag names (v0.0.1, 0.0.2, etc.) up to the max_semanic_version",
24
25
  "max_semanic_version": "Maximum version number to fuzz for (default < v10.10.10)",
25
26
  }
@@ -28,11 +29,11 @@ class gitdumper(BaseModule):
28
29
 
29
30
  async def setup(self):
30
31
  self.urls_downloaded = set()
31
- output_folder = self.config.get("output_folder")
32
+ output_folder = self.config.get("output_folder", "")
32
33
  if output_folder:
33
34
  self.output_dir = Path(output_folder) / "git_repos"
34
35
  else:
35
- self.output_dir = self.scan.home / "git_repos"
36
+ self.output_dir = self.helpers.temp_dir / "git_repos"
36
37
  self.helpers.mkdir(self.output_dir)
37
38
  self.unsafe_regex = self.helpers.re.compile(r"^\s*fsmonitor|sshcommand|askpass|editor|pager", re.IGNORECASE)
38
39
  self.ref_regex = self.helpers.re.compile(r"ref: refs/heads/([a-zA-Z\d_-]+)")
@@ -79,6 +80,7 @@ class gitdumper(BaseModule):
79
80
  "staging",
80
81
  "test",
81
82
  "testing",
83
+ "trunk",
82
84
  "wip",
83
85
  ]
84
86
  url_patterns = [
@@ -121,7 +123,11 @@ class gitdumper(BaseModule):
121
123
  dir_listing = await self.directory_listing_enabled(repo_url)
122
124
  if dir_listing:
123
125
  urls = await self.recursive_dir_list(dir_listing)
124
- result = await self.download_files(urls, repo_folder)
126
+ try:
127
+ result = await self.download_files(urls, repo_folder)
128
+ except asyncio.CancelledError:
129
+ self.verbose(f"Cancellation requested while downloading files from {repo_url}")
130
+ result = True
125
131
  else:
126
132
  result = await self.git_fuzz(repo_url, repo_folder)
127
133
  if result:
@@ -171,7 +177,10 @@ class gitdumper(BaseModule):
171
177
  result = await self.download_files(url_list, repo_folder)
172
178
  if result:
173
179
  await self.download_current_branch(repo_url, repo_folder)
174
- await self.download_git_objects(repo_url, repo_folder)
180
+ try:
181
+ await self.download_git_objects(repo_url, repo_folder)
182
+ except asyncio.CancelledError:
183
+ self.verbose(f"Cancellation requested while downloading git objects from {repo_url}")
175
184
  await self.download_git_packs(repo_url, repo_folder)
176
185
  return True
177
186
  else:
@@ -1,5 +1,6 @@
1
1
  import zipfile
2
2
  import fnmatch
3
+ from pathlib import Path
3
4
 
4
5
  from bbot.modules.templates.github import github
5
6
 
@@ -13,10 +14,11 @@ class github_workflows(github):
13
14
  "created_date": "2024-04-29",
14
15
  "author": "@domwhewell-sage",
15
16
  }
16
- options = {"api_key": "", "num_logs": 1}
17
+ options = {"api_key": "", "num_logs": 1, "output_folder": ""}
17
18
  options_desc = {
18
19
  "api_key": "Github token",
19
20
  "num_logs": "For each workflow fetch the last N successful runs logs (max 100)",
21
+ "output_folder": "Folder to download workflow logs and artifacts to",
20
22
  }
21
23
 
22
24
  scope_distance_modifier = 2
@@ -26,7 +28,11 @@ class github_workflows(github):
26
28
  if self.num_logs > 100:
27
29
  self.log.error("num_logs option is capped at 100")
28
30
  return False
29
- self.output_dir = self.scan.home / "workflow_logs"
31
+ output_folder = self.config.get("output_folder", "")
32
+ if output_folder:
33
+ self.output_dir = Path(output_folder) / "workflow_logs"
34
+ else:
35
+ self.output_dir = self.scan.home / "workflow_logs"
30
36
  self.helpers.mkdir(self.output_dir)
31
37
  return await super().setup()
32
38
 
@@ -35,9 +41,10 @@ class github_workflows(github):
35
41
  return r.is_success or getattr(r, "status_code", 0) == 404
36
42
 
37
43
  async def filter_event(self, event):
38
- if event.type == "CODE_REPOSITORY":
39
- if "git" not in event.tags and "github" not in event.data.get("url", ""):
40
- return False, "event is not a git repository"
44
+ if "git" not in event.tags:
45
+ return False, "event is not a git repository"
46
+ elif "github.com" not in event.data.get("url", ""):
47
+ return False, "event is not a github repository"
41
48
  return True
42
49
 
43
50
  async def handle_event(self, event):
@@ -28,6 +28,7 @@ class nuclei(BaseModule):
28
28
  "directory_only": True,
29
29
  "retries": 0,
30
30
  "batch_size": 200,
31
+ "module_timeout": 21600, # 6 hours
31
32
  }
32
33
  options_desc = {
33
34
  "version": "nuclei version",
@@ -38,11 +39,12 @@ class nuclei(BaseModule):
38
39
  "concurrency": "maximum number of templates to be executed in parallel (default 25)",
39
40
  "mode": "manual | technology | severe | budget. Technology: Only activate based on technology events that match nuclei tags (nuclei -as mode). Manual (DEFAULT): Fully manual settings. Severe: Only critical and high severity templates without intrusive. Budget: Limit Nuclei to a specified number of HTTP requests",
40
41
  "etags": "tags to exclude from the scan",
41
- "budget": "Used in budget mode to set the number of requests which will be allotted to the nuclei scan",
42
+ "budget": "Used in budget mode to set the number of allowed requests per host",
42
43
  "silent": "Don't display nuclei's banner or status messages",
43
44
  "directory_only": "Filter out 'file' URL event (default True)",
44
45
  "retries": "number of times to retry a failed request (default 0)",
45
46
  "batch_size": "Number of targets to send to Nuclei per batch (default 200)",
47
+ "module_timeout": "Max time in seconds to spend handling each batch of events",
46
48
  }
47
49
  deps_ansible = [
48
50
  {
@@ -57,7 +59,7 @@ class nuclei(BaseModule):
57
59
  ]
58
60
  deps_pip = ["pyyaml~=6.0"]
59
61
  in_scope_only = True
60
- _batch_size = 25
62
+ _batch_size = 200
61
63
 
62
64
  async def setup(self):
63
65
  # attempt to update nuclei templates
@@ -30,6 +30,7 @@ class portscan(BaseModule):
30
30
  "adapter_ip": "",
31
31
  "adapter_mac": "",
32
32
  "router_mac": "",
33
+ "module_timeout": 259200, # 3 days
33
34
  }
34
35
  options_desc = {
35
36
  "top_ports": "Top ports to scan (default 100) (to override, specify 'ports')",
@@ -42,6 +43,7 @@ class portscan(BaseModule):
42
43
  "adapter_ip": "Send packets using this IP address. Not needed unless masscan's autodetection fails",
43
44
  "adapter_mac": "Send packets using this as the source MAC address. Not needed unless masscan's autodetection fails",
44
45
  "router_mac": "Send packets to this MAC address as the destination. Not needed unless masscan's autodetection fails",
46
+ "module_timeout": "Max time in seconds to spend handling each batch of events",
45
47
  }
46
48
  deps_common = ["masscan"]
47
49
  batch_size = 1000000
@@ -14,15 +14,18 @@ class postman_download(postman):
14
14
  "author": "@domwhewell-sage",
15
15
  }
16
16
  options = {"output_folder": "", "api_key": ""}
17
- options_desc = {"output_folder": "Folder to download postman workspaces to", "api_key": "Postman API Key"}
17
+ options_desc = {
18
+ "output_folder": "Folder to download postman workspaces to. If not specified, downloaded workspaces will be deleted when the scan completes, to minimize disk usage.",
19
+ "api_key": "Postman API Key",
20
+ }
18
21
  scope_distance_modifier = 2
19
22
 
20
23
  async def setup(self):
21
- output_folder = self.config.get("output_folder")
24
+ output_folder = self.config.get("output_folder", "")
22
25
  if output_folder:
23
26
  self.output_dir = Path(output_folder) / "postman_workspaces"
24
27
  else:
25
- self.output_dir = self.scan.home / "postman_workspaces"
28
+ self.output_dir = self.helpers.temp_dir / "postman_workspaces"
26
29
  self.helpers.mkdir(self.output_dir)
27
30
  return await super().setup()
28
31
 
@@ -14,7 +14,7 @@ class trufflehog(BaseModule):
14
14
  }
15
15
 
16
16
  options = {
17
- "version": "3.88.31",
17
+ "version": "3.88.34",
18
18
  "config": "",
19
19
  "only_verified": True,
20
20
  "concurrency": 8,
@@ -88,8 +88,7 @@ class trufflehog(BaseModule):
88
88
 
89
89
  if event.type == "CODE_REPOSITORY":
90
90
  path = event.data["url"]
91
- if "git" in event.tags:
92
- module = "github-experimental"
91
+ module = "github-experimental"
93
92
  elif event.type == "FILESYSTEM":
94
93
  path = event.data["path"]
95
94
  if "git" in event.tags:
@@ -9,9 +9,18 @@ from bbot.core.helpers.misc import chain_lists, get_closest_match, get_keys_in_d
9
9
  log = logging.getLogger("bbot.presets.args")
10
10
 
11
11
 
12
+ universal_module_options = {
13
+ "batch_size": "The number of events to process in a single batch (only applies to batch modules)",
14
+ "module_threads": "How many event handlers to run in parallel",
15
+ "module_timeout": "Max time in seconds to spend handling each event or batch of events",
16
+ }
17
+
18
+
12
19
  class BBOTArgs:
13
20
  # module config options to exclude from validation
14
- exclude_from_validation = re.compile(r".*modules\.[a-z0-9_]+\.(?:batch_size|module_threads)$")
21
+ exclude_from_validation = re.compile(
22
+ r".*modules\.[a-z0-9_]+\.(?:" + "|".join(universal_module_options.keys()) + ")$"
23
+ )
15
24
 
16
25
  scan_examples = [
17
26
  (
@@ -276,8 +276,6 @@ class Preset(metaclass=BasePreset):
276
276
  self.exclude_flags.update(set(exclude_flags))
277
277
  self.require_flags.update(set(require_flags))
278
278
 
279
- # log.critical(f"{self.name}: verbose: {self.verbose}, debug: {self.debug}, silent: {self.silent}")
280
-
281
279
  @property
282
280
  def bbot_home(self):
283
281
  return Path(self.config.get("home", "~/.bbot")).expanduser().resolve()