bbot 2.2.0.5311rc0__py3-none-any.whl → 2.3.0.5324rc0__py3-none-any.whl

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.

bbot/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.2.0.5311rc"
2
+ __version__ = "v2.3.0.5324rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
bbot/db/sql/models.py CHANGED
@@ -3,9 +3,9 @@
3
3
 
4
4
  import json
5
5
  import logging
6
- from datetime import datetime
7
6
  from pydantic import ConfigDict
8
7
  from typing import List, Optional
8
+ from datetime import datetime, timezone
9
9
  from typing_extensions import Annotated
10
10
  from pydantic.functional_validators import AfterValidator
11
11
  from sqlmodel import inspect, Column, Field, SQLModel, JSON, String, DateTime as SQLADateTime
@@ -114,6 +114,7 @@ class Event(BBOTBaseModel, table=True):
114
114
  discovery_context: str = ""
115
115
  discovery_path: List[str] = Field(default=[], sa_type=JSON)
116
116
  parent_chain: List[str] = Field(default=[], sa_type=JSON)
117
+ inserted_at: NaiveUTC = Field(default_factory=lambda: datetime.now(timezone.utc))
117
118
 
118
119
 
119
120
  ### SCAN ###
@@ -0,0 +1,49 @@
1
+ from bbot.modules.templates.sql import SQLTemplate
2
+
3
+
4
+ class Postgres(SQLTemplate):
5
+ watched_events = ["*"]
6
+ meta = {"description": "Output scan data to a SQLite database"}
7
+ options = {
8
+ "username": "postgres",
9
+ "password": "bbotislife",
10
+ "host": "localhost",
11
+ "port": 5432,
12
+ "database": "bbot",
13
+ }
14
+ options_desc = {
15
+ "username": "The username to connect to Postgres",
16
+ "password": "The password to connect to Postgres",
17
+ "host": "The server running Postgres",
18
+ "port": "The port to connect to Postgres",
19
+ "database": "The database name to connect to",
20
+ }
21
+ deps_pip = ["sqlmodel", "asyncpg"]
22
+ protocol = "postgresql+asyncpg"
23
+
24
+ async def create_database(self):
25
+ import asyncpg
26
+ from sqlalchemy import text
27
+ from sqlalchemy.ext.asyncio import create_async_engine
28
+
29
+ # Create the engine for the initial connection to the server
30
+ initial_engine = create_async_engine(self.connection_string().rsplit("/", 1)[0])
31
+
32
+ async with initial_engine.connect() as conn:
33
+ # Check if the database exists
34
+ result = await conn.execute(text(f"SELECT 1 FROM pg_database WHERE datname = '{self.database}'"))
35
+ database_exists = result.scalar() is not None
36
+
37
+ # Create the database if it does not exist
38
+ if not database_exists:
39
+ # Use asyncpg directly to create the database
40
+ raw_conn = await asyncpg.connect(
41
+ user=self.username,
42
+ password=self.password,
43
+ host=self.host,
44
+ port=self.port,
45
+ )
46
+ try:
47
+ await raw_conn.execute(f"CREATE DATABASE {self.database}")
48
+ finally:
49
+ await raw_conn.close()
@@ -12,7 +12,7 @@ class SQLite(SQLTemplate):
12
12
  options_desc = {
13
13
  "database": "The path to the sqlite database file",
14
14
  }
15
- deps_pip = ["sqlmodel", "sqlalchemy-utils", "aiosqlite"]
15
+ deps_pip = ["sqlmodel", "aiosqlite"]
16
16
 
17
17
  async def setup(self):
18
18
  db_file = self.config.get("database", "")
@@ -1,7 +1,6 @@
1
1
  from sqlmodel import SQLModel
2
2
  from sqlalchemy.orm import sessionmaker
3
3
  from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
4
- from sqlalchemy_utils.functions import database_exists, create_database
5
4
 
6
5
  from bbot.db.sql.models import Event, Scan, Target
7
6
  from bbot.modules.output.base import BaseOutputModule
@@ -10,7 +9,6 @@ from bbot.modules.output.base import BaseOutputModule
10
9
  class SQLTemplate(BaseOutputModule):
11
10
  meta = {"description": "SQL output module template"}
12
11
  options = {
13
- "protocol": "",
14
12
  "database": "bbot",
15
13
  "username": "",
16
14
  "password": "",
@@ -18,7 +16,6 @@ class SQLTemplate(BaseOutputModule):
18
16
  "port": 0,
19
17
  }
20
18
  options_desc = {
21
- "protocol": "The protocol to use to connect to the database",
22
19
  "database": "The database to use",
23
20
  "username": "The username to use to connect to the database",
24
21
  "password": "The password to use to connect to the database",
@@ -26,6 +23,8 @@ class SQLTemplate(BaseOutputModule):
26
23
  "port": "The port to use to connect to the database",
27
24
  }
28
25
 
26
+ protocol = ""
27
+
29
28
  async def setup(self):
30
29
  self.database = self.config.get("database", "bbot")
31
30
  self.username = self.config.get("username", "")
@@ -33,11 +32,6 @@ class SQLTemplate(BaseOutputModule):
33
32
  self.host = self.config.get("host", "127.0.0.1")
34
33
  self.port = self.config.get("port", 0)
35
34
 
36
- self.log.info(f"Connecting to {self.connection_string(mask_password=True)}")
37
-
38
- self.engine = create_async_engine(self.connection_string())
39
- # Create a session factory bound to the engine
40
- self.async_session = sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession)
41
35
  await self.init_database()
42
36
  return True
43
37
 
@@ -65,12 +59,19 @@ class SQLTemplate(BaseOutputModule):
65
59
 
66
60
  await session.commit()
67
61
 
62
+ async def create_database(self):
63
+ pass
64
+
68
65
  async def init_database(self):
66
+ await self.create_database()
67
+
68
+ # Now create the engine for the actual database
69
+ self.engine = create_async_engine(self.connection_string())
70
+ # Create a session factory bound to the engine
71
+ self.async_session = sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession)
72
+
73
+ # Use the engine directly to create all tables
69
74
  async with self.engine.begin() as conn:
70
- # Check if the database exists using the connection's engine URL
71
- if not await conn.run_sync(lambda sync_conn: database_exists(sync_conn.engine.url)):
72
- await conn.run_sync(lambda sync_conn: create_database(sync_conn.engine.url))
73
- # Create all tables
74
75
  await conn.run_sync(SQLModel.metadata.create_all)
75
76
 
76
77
  def connection_string(self, mask_password=False):
@@ -20,6 +20,8 @@ class ModuleTestBase:
20
20
  config_overrides = {}
21
21
  modules_overrides = None
22
22
  log = logging.getLogger("bbot")
23
+ # if True, the test will be skipped (useful for tests that require docker)
24
+ skip_distro_tests = False
23
25
 
24
26
  class ModuleTest:
25
27
  def __init__(
@@ -90,7 +92,7 @@ class ModuleTestBase:
90
92
  self, httpx_mock, bbot_httpserver, bbot_httpserver_ssl, monkeypatch, request, caplog, capsys
91
93
  ):
92
94
  # Skip dastardly test if we're in the distro tests (because dastardly uses docker)
93
- if os.getenv("BBOT_DISTRO_TESTS") and self.name == "dastardly":
95
+ if os.getenv("BBOT_DISTRO_TESTS") and self.skip_distro_tests:
94
96
  pytest.skip("Skipping module_test for dastardly module due to BBOT_DISTRO_TESTS environment variable")
95
97
 
96
98
  self.log.info(f"Starting {self.name} module test")
@@ -112,7 +114,9 @@ class ModuleTestBase:
112
114
 
113
115
  @pytest.mark.asyncio
114
116
  async def test_module_run(self, module_test):
115
- self.check(module_test, module_test.events)
117
+ from bbot.core.helpers.misc import execute_sync_or_async
118
+
119
+ await execute_sync_or_async(self.check, module_test, module_test.events)
116
120
  module_test.log.info(f"Finished {self.name} module test")
117
121
  current_task = asyncio.current_task()
118
122
  tasks = [t for t in asyncio.all_tasks() if t != current_task]
@@ -7,6 +7,7 @@ from .base import ModuleTestBase
7
7
  class TestDastardly(ModuleTestBase):
8
8
  targets = ["http://127.0.0.1:5556/"]
9
9
  modules_overrides = ["httpx", "dastardly"]
10
+ skip_distro_tests = True
10
11
 
11
12
  web_response = """<!DOCTYPE html>
12
13
  <html>
@@ -0,0 +1,74 @@
1
+ import time
2
+ import asyncio
3
+
4
+ from .base import ModuleTestBase
5
+
6
+
7
+ class TestPostgres(ModuleTestBase):
8
+ targets = ["evilcorp.com"]
9
+ skip_distro_tests = True
10
+
11
+ async def setup_before_prep(self, module_test):
12
+ process = await asyncio.create_subprocess_exec(
13
+ "docker",
14
+ "run",
15
+ "--name",
16
+ "bbot-test-postgres",
17
+ "--rm",
18
+ "-e",
19
+ "POSTGRES_PASSWORD=bbotislife",
20
+ "-e",
21
+ "POSTGRES_USER=postgres",
22
+ "-p",
23
+ "5432:5432",
24
+ "-d",
25
+ "postgres",
26
+ )
27
+
28
+ import asyncpg
29
+
30
+ # wait for the container to start
31
+ start_time = time.time()
32
+ while True:
33
+ try:
34
+ # Connect to the default 'postgres' database to create 'bbot'
35
+ conn = await asyncpg.connect(
36
+ user="postgres", password="bbotislife", database="postgres", host="127.0.0.1"
37
+ )
38
+ await conn.execute("CREATE DATABASE bbot")
39
+ await conn.close()
40
+ break
41
+ except asyncpg.exceptions.DuplicateDatabaseError:
42
+ # If the database already exists, break the loop
43
+ break
44
+ except Exception as e:
45
+ if time.time() - start_time > 60: # timeout after 60 seconds
46
+ self.log.error("PostgreSQL server did not start in time.")
47
+ raise e
48
+ await asyncio.sleep(1)
49
+
50
+ if process.returncode != 0:
51
+ self.log.error(f"Failed to start PostgreSQL server")
52
+
53
+ async def check(self, module_test, events):
54
+ import asyncpg
55
+
56
+ # Connect to the PostgreSQL database
57
+ conn = await asyncpg.connect(user="postgres", password="bbotislife", database="bbot", host="127.0.0.1")
58
+
59
+ try:
60
+ events = await conn.fetch("SELECT * FROM event")
61
+ assert len(events) == 3, "No events found in PostgreSQL database"
62
+ scans = await conn.fetch("SELECT * FROM scan")
63
+ assert len(scans) == 1, "No scans found in PostgreSQL database"
64
+ targets = await conn.fetch("SELECT * FROM target")
65
+ assert len(targets) == 1, "No targets found in PostgreSQL database"
66
+ finally:
67
+ await conn.close()
68
+ process = await asyncio.create_subprocess_exec(
69
+ "docker", "stop", "bbot-test-postgres", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
70
+ )
71
+ stdout, stderr = await process.communicate()
72
+
73
+ if process.returncode != 0:
74
+ raise Exception(f"Failed to stop PostgreSQL server: {stderr.decode()}")
@@ -10,9 +10,9 @@ class TestSQLite(ModuleTestBase):
10
10
  assert sqlite_output_file.exists(), "SQLite output file not found"
11
11
  with sqlite3.connect(sqlite_output_file) as db:
12
12
  cursor = db.cursor()
13
- cursor.execute("SELECT * FROM event")
14
- assert len(cursor.fetchall()) > 0, "No events found in SQLite database"
15
- cursor.execute("SELECT * FROM scan")
16
- assert len(cursor.fetchall()) > 0, "No scans found in SQLite database"
17
- cursor.execute("SELECT * FROM target")
18
- assert len(cursor.fetchall()) > 0, "No targets found in SQLite database"
13
+ results = cursor.execute("SELECT * FROM event").fetchall()
14
+ assert len(results) == 3, "No events found in SQLite database"
15
+ results = cursor.execute("SELECT * FROM scan").fetchall()
16
+ assert len(results) == 1, "No scans found in SQLite database"
17
+ results = cursor.execute("SELECT * FROM target").fetchall()
18
+ assert len(results) == 1, "No targets found in SQLite database"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bbot
3
- Version: 2.2.0.5311rc0
3
+ Version: 2.3.0.5324rc0
4
4
  Summary: OSINT automation for hackers.
5
5
  Home-page: https://github.com/blacklanternsecurity/bbot
6
6
  License: GPL-3.0
@@ -1,4 +1,4 @@
1
- bbot/__init__.py,sha256=IJDmS44EfZFhiXr86LJntbYUQPnCTDao5qvFbo3teKY,130
1
+ bbot/__init__.py,sha256=a2kbcfeOJIfDMDvqI_sIkvScZM1Tke0cjCzvDhgoWpA,130
2
2
  bbot/cli.py,sha256=-9d6yCAYZaP0lIOCja-fSk3MiNclc-kbEgos10jYNUQ,10440
3
3
  bbot/core/__init__.py,sha256=l255GJE_DvUnWvrRb0J5lG-iMztJ8zVvoweDOfegGtI,46
4
4
  bbot/core/config/__init__.py,sha256=zYNw2Me6tsEr8hOOkLb4BQ97GB7Kis2k--G81S8vofU,342
@@ -47,7 +47,7 @@ bbot/core/helpers/wordcloud.py,sha256=WdQwboCNcCxcUdLuB6MMMDQBL4ZshFM_f6GW7nUZEB
47
47
  bbot/core/modules.py,sha256=OOUSncr-EM6bJBrI3iH5wvfnpTXKQ-A8OL8UMvkL0CU,31432
48
48
  bbot/core/multiprocess.py,sha256=ocQHanskJ09gHwe7RZmwNdZyCOQyeyUoIHCtLbtvXUk,1771
49
49
  bbot/core/shared_deps.py,sha256=A3vrI62uPTTayNIHhWAj6xz43cj--oXWC4prmDlgJnw,6958
50
- bbot/db/sql/models.py,sha256=AXefz4nEtpV2p19d6rLaEcCQNnqXODpldA-P5uSUntg,4729
50
+ bbot/db/sql/models.py,sha256=mrC8-Okp1iDcJ3d2hOZsCb8Xg6HHFfCWA3LDu4kRS-4,4825
51
51
  bbot/defaults.yml,sha256=v6YZ2g-nnUZQdhD-rhod4LZiYciI-cMDFz4JF7Kh5Lk,6213
52
52
  bbot/errors.py,sha256=xwQcD26nU9oc7-o0kv5jmEDTInmi8_W8eKAgQZZxdVM,953
53
53
  bbot/logger.py,sha256=rLcLzNDvfR8rFj7_tZ-f5QB3Z8T0RVroact3W0ogjpA,1408
@@ -144,10 +144,11 @@ bbot/modules/output/emails.py,sha256=mzZideMCNfB8-naQANO5g8Y9HdgviAihRsdY_xPQjbQ
144
144
  bbot/modules/output/http.py,sha256=4UWKpbQx3EHpi24VIem6oSvXr0W0NZ3lDpJOmQ3Mwik,2582
145
145
  bbot/modules/output/json.py,sha256=zvM2NwWScGk3pN4wF0mm-OqVW_0ADYy95Am4T02VVD4,1289
146
146
  bbot/modules/output/neo4j.py,sha256=u950eUwu8YMql_WaBA38TN2bUhx7xnZdIIvYfR3xVcY,6114
147
+ bbot/modules/output/postgres.py,sha256=2JdEF6mU-VmVqPrgEh5L2MGv-s0BoNwoz8EnG5i3u2s,1847
147
148
  bbot/modules/output/python.py,sha256=RvK2KN-Zp0Vy_1zGSNioE5eeL5hIh6Z_riFtaTymyIM,270
148
149
  bbot/modules/output/slack.py,sha256=Ir_z11VYBdXDx8DwntWCv33Ic43vO1UIbxcp9gj0vvk,1181
149
150
  bbot/modules/output/splunk.py,sha256=TjTCUmDwRwKOFKBJw-Xbjku64U77OauHjtR56gyaAPs,1952
150
- bbot/modules/output/sqlite.py,sha256=kR5JSYbenCVrFfwMyHtOmuRyGdBK-xTEfVZMUeedYs8,908
151
+ bbot/modules/output/sqlite.py,sha256=GCtm1UoKfewtEKE79gBcj_UlTXO7jNHEEEuhqQ_iUnQ,888
151
152
  bbot/modules/output/stdout.py,sha256=kRVlliUcQ6aZeweZvTsl12IqVbQdnPIhTO0Bid-ILaI,3024
152
153
  bbot/modules/output/subdomains.py,sha256=3KZz4vD0itmqpo56uCyk43Z_zN1Q0Q_nyXjdnEublPA,1515
153
154
  bbot/modules/output/teams.py,sha256=I2d52LqDC7e_oboLHoYBaRK6UpN0nkJ0uRnBXrhZf9E,4628
@@ -183,7 +184,7 @@ bbot/modules/templates/bucket.py,sha256=x-c_iAeMILux6wRm0xkUUJkc2P69hYWS6DxqD7g5
183
184
  bbot/modules/templates/github.py,sha256=ENnDWpzzmZBsTisDx6Cg9V_NwJKyVyPIOpGAPktigdI,1455
184
185
  bbot/modules/templates/postman.py,sha256=oxwVusW2EdNotVX7xnnxCTnWtj3xNPbfs8aff9s4phs,614
185
186
  bbot/modules/templates/shodan.py,sha256=BfI0mNPbqkykGmjMtARhmCGKmk1uq7yTlZoPgzzJ040,1175
186
- bbot/modules/templates/sql.py,sha256=7HRp4gBA7NipZeUL5OACiWkHf4jYJTX1j30Yv50d4eQ,3748
187
+ bbot/modules/templates/sql.py,sha256=bn8ZbTC0RkrA5wYOQ7RtSHfIywBm03L3mY344xH1Ue4,3417
187
188
  bbot/modules/templates/subdomain_enum.py,sha256=h2YhIWoMLUXV7EBIidiQezuwXf35T8tXmOO9Vg__sIY,8393
188
189
  bbot/modules/templates/webhook.py,sha256=MYhKWrNYrsfM0a4PR6yVotudLyyCwgmy2eI-l9LvpBs,3706
189
190
  bbot/modules/trickest.py,sha256=MRgLW0YiDWzlWdAjyqfPPLFb-a51r-Ffn_dphiJI_gA,1550
@@ -261,7 +262,7 @@ bbot/test/test_step_1/test_target.py,sha256=9rJyKrMQqrCkCqnw4RH10DlfSrG8tw9k3HKo
261
262
  bbot/test/test_step_1/test_web.py,sha256=sFkUutelRBXn2L48vZEMzB3LS5nHLQ-vzAH4cbPXo1c,18811
262
263
  bbot/test/test_step_2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
263
264
  bbot/test/test_step_2/module_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
264
- bbot/test/test_step_2/module_tests/base.py,sha256=ewnKM4yQr0HfZD51L2iEwtwlR8sCvGz7qA9yqPU5OM4,5821
265
+ bbot/test/test_step_2/module_tests/base.py,sha256=7SqVhwZYTOd85qhF_cSx4NChbAZmtj6LtwbzGlBBwOY,6023
265
266
  bbot/test/test_step_2/module_tests/test_module_affiliates.py,sha256=d6uAzb_MF4oNGFEBG7Y6T2y0unWpf1gqNxUXRaYqOdk,673
266
267
  bbot/test/test_step_2/module_tests/test_module_aggregate.py,sha256=hjxbMxAEFhS7W8RamBrM1t6T-tsLHq95MmQVfrYsock,487
267
268
  bbot/test/test_step_2/module_tests/test_module_ajaxpro.py,sha256=0sPzcm0O3mmeqcOb8BUPijdAwt5TJvyaGDdbJdDMgYI,2789
@@ -296,7 +297,7 @@ bbot/test/test_step_2/module_tests/test_module_columbus.py,sha256=JZG_EvDQoKGNcB
296
297
  bbot/test/test_step_2/module_tests/test_module_credshed.py,sha256=rlvKZERFoAS-gg7sdgk6Pa2JbySmHDPee3zKUYATWlw,3362
297
298
  bbot/test/test_step_2/module_tests/test_module_crt.py,sha256=V15tE1jcXdXJEzEEdAJvSMRWhKBFtxBBUJ_eewvV3U4,717
298
299
  bbot/test/test_step_2/module_tests/test_module_csv.py,sha256=UJqMqdiPjx-UjJw10OoVMAj378wu5mWIq0v04TCljTM,579
299
- bbot/test/test_step_2/module_tests/test_module_dastardly.py,sha256=DxmsEh2NPDw8KCdsnUthVe3dZSZx07Ig9QnfRfdUSrc,2324
300
+ bbot/test/test_step_2/module_tests/test_module_dastardly.py,sha256=jjpJD9mdCcbaJgnG63xE-J_Qqpjt9hpm_WvfHDLfTsc,2353
300
301
  bbot/test/test_step_2/module_tests/test_module_dehashed.py,sha256=YVsTEFEPchahDT7q_8BofMsH4tYQlN-G1QtAxq6YUn0,3626
301
302
  bbot/test/test_step_2/module_tests/test_module_digitorus.py,sha256=81mNwDb4WLUibstUSD8TowSJB3B5DBneS2LWimie9y4,1613
302
303
  bbot/test/test_step_2/module_tests/test_module_discord.py,sha256=Z66fGb-kkdZTQfUh6WZiM35Ad-gDyvwxlA7mUUB2vnQ,1838
@@ -355,6 +356,7 @@ bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py,sha256=qTT-
355
356
  bbot/test/test_step_2/module_tests/test_module_passivetotal.py,sha256=fTGQECQ0OzcwiH64-0igFRKO-rs3kXScivZord_oWWU,1120
356
357
  bbot/test/test_step_2/module_tests/test_module_pgp.py,sha256=-m-nPq6WR5UzPDuxeZbuzBQfFi1QfrZQ8RZH4g11ocE,1609
357
358
  bbot/test/test_step_2/module_tests/test_module_portscan.py,sha256=StCm93P4q3o-NhPtUDOA6g_LTH2cwzEw0l2V5ZN5eeI,7306
359
+ bbot/test/test_step_2/module_tests/test_module_postgres.py,sha256=6Seqq1Bq2FEXbJnTi_BYv8ZZPWdy-SfnY8UJN24Op0Q,2689
358
360
  bbot/test/test_step_2/module_tests/test_module_postman.py,sha256=XvgfMgUhJuVgGkgT-JzxJyevNSVv7YvX1yLKJHmD3dw,5026
359
361
  bbot/test/test_step_2/module_tests/test_module_postman_download.py,sha256=B_NajQaGQjwMSmcBCr37_7cvcnw4Zmh8k_hVoWL7bVI,21623
360
362
  bbot/test/test_step_2/module_tests/test_module_python.py,sha256=6UQVXGJ1ugfNbt9l_nN0q5FVxNWlpq6j0sZcB0Nh_Pg,184
@@ -371,7 +373,7 @@ bbot/test/test_step_2/module_tests/test_module_smuggler.py,sha256=J23iNHxJFbZ0vd
371
373
  bbot/test/test_step_2/module_tests/test_module_social.py,sha256=McjY8g97HbZm5xnarW924pGytwwGGnzA6MfD0HmBPMU,2050
372
374
  bbot/test/test_step_2/module_tests/test_module_speculate.py,sha256=UvlSWOAtxl6jS63m4JXFRUrBHuCZZzRCsTRgdbljSeQ,3131
373
375
  bbot/test/test_step_2/module_tests/test_module_splunk.py,sha256=zCHVlgTVlFiXwhcYBeGb9Fy2RlmvVodpl4pq3j-8jJw,1859
374
- bbot/test/test_step_2/module_tests/test_module_sqlite.py,sha256=9Q-V4wwezgJN0vdBKhkWYePuHO5zOdw98schSFhfj1c,793
376
+ bbot/test/test_step_2/module_tests/test_module_sqlite.py,sha256=mpplbL84zPuH4WJgbmm698gFTJewi1Qw_e4AG_ZOTfE,829
375
377
  bbot/test/test_step_2/module_tests/test_module_sslcert.py,sha256=XeiV9eQZNnA5oALCVnP7bEs3m9kMaVwEtg-hvYfgi3Y,711
376
378
  bbot/test/test_step_2/module_tests/test_module_stdout.py,sha256=JbvSUCygrG3Tq225i9dabqeUFxBHUq44TeuxH-tEWpc,3250
377
379
  bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py,sha256=sNWlk4_dDtFhMtGGr7VLnMukJkVwcEGpCYViEcqrVEw,610
@@ -408,8 +410,8 @@ bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt,sha256=ruUQwVfia1_m2u
408
410
  bbot/wordlists/top_open_ports_nmap.txt,sha256=LmdFYkfapSxn1pVuQC2LkOIY2hMLgG-Xts7DVtYzweM,42727
409
411
  bbot/wordlists/valid_url_schemes.txt,sha256=VciB-ww0y-O8Ii1wpTR6rJzGDiC2r-dhVsIJApS1ZYU,3309
410
412
  bbot/wordlists/wordninja_dns.txt.gz,sha256=DYHvvfW0TvzrVwyprqODAk4tGOxv5ezNmCPSdPuDUnQ,570241
411
- bbot-2.2.0.5311rc0.dist-info/LICENSE,sha256=GzeCzK17hhQQDNow0_r0L8OfLpeTKQjFQwBQU7ZUymg,32473
412
- bbot-2.2.0.5311rc0.dist-info/METADATA,sha256=LhF8E7YO7FF5eAUkzWICC2rtmCTq35rD3crP4lDKhh0,17135
413
- bbot-2.2.0.5311rc0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
414
- bbot-2.2.0.5311rc0.dist-info/entry_points.txt,sha256=cWjvcU_lLrzzJgjcjF7yeGuRA_eDS8pQ-kmPUAyOBfo,38
415
- bbot-2.2.0.5311rc0.dist-info/RECORD,,
413
+ bbot-2.3.0.5324rc0.dist-info/LICENSE,sha256=GzeCzK17hhQQDNow0_r0L8OfLpeTKQjFQwBQU7ZUymg,32473
414
+ bbot-2.3.0.5324rc0.dist-info/METADATA,sha256=je-AQ1wE_cN7FZWBuYG3YKOHfqij2JVkhQri4AGreYc,17135
415
+ bbot-2.3.0.5324rc0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
416
+ bbot-2.3.0.5324rc0.dist-info/entry_points.txt,sha256=cWjvcU_lLrzzJgjcjF7yeGuRA_eDS8pQ-kmPUAyOBfo,38
417
+ bbot-2.3.0.5324rc0.dist-info/RECORD,,