Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
188 commits
Select commit Hold shift + click to select a range
e54618a
bump version
invalid-email-address Nov 22, 2024
723ea9a
fix conflict
invalid-email-address Nov 20, 2024
f60bd73
resolve conflict
invalid-email-address Nov 21, 2024
9e1e84a
more wip mongo
invalid-email-address Nov 19, 2024
1ebb942
more mongo wip
invalid-email-address Nov 20, 2024
23598a3
skip distro tests
invalid-email-address Nov 20, 2024
9af4583
more wip mongo
invalid-email-address Nov 21, 2024
e4e1c99
remove siem_friendly
invalid-email-address Nov 22, 2024
d9a3d9d
steady work on mongo, bbot 3.0
invalid-email-address Nov 22, 2024
ac9502b
flaked
invalid-email-address Nov 22, 2024
d3f8e93
fix tests
invalid-email-address Nov 22, 2024
3890057
fix utc bug
invalid-email-address Nov 22, 2024
00cf3c7
fix tests
invalid-email-address Nov 22, 2024
47538b3
elastic module
invalid-email-address Nov 22, 2024
8aafef5
Merge pull request #1992 from blacklanternsecurity/mongo
TheTechromancer Nov 22, 2024
ccd7da8
Merge pull request #2010 from blacklanternsecurity/elastic
TheTechromancer Nov 22, 2024
2ff94d1
new module: kafka
invalid-email-address Nov 22, 2024
88920d0
fix elastic tests
invalid-email-address Nov 22, 2024
10ed494
rabbitmq module
invalid-email-address Nov 22, 2024
6226727
better error handling in module
invalid-email-address Nov 23, 2024
996f8d5
better error handling in module
invalid-email-address Nov 23, 2024
571a6cd
fix tests, better error handling in module
invalid-email-address Nov 23, 2024
5fef8e2
better mongo error handling
invalid-email-address Nov 23, 2024
59be2b2
added zeromq output module
invalid-email-address Nov 23, 2024
4c75746
bump version
invalid-email-address Nov 22, 2024
7f99c7e
fix conflict
invalid-email-address Nov 20, 2024
bca0500
resolve conflict
invalid-email-address Nov 21, 2024
0eb565d
more wip mongo
invalid-email-address Nov 19, 2024
82aa48e
more mongo wip
invalid-email-address Nov 20, 2024
64b4312
skip distro tests
invalid-email-address Nov 20, 2024
56f3659
more wip mongo
invalid-email-address Nov 21, 2024
10834a0
remove siem_friendly
invalid-email-address Nov 22, 2024
5179013
steady work on mongo, bbot 3.0
invalid-email-address Nov 22, 2024
414d269
flaked
invalid-email-address Nov 22, 2024
7a24be6
fix tests
invalid-email-address Nov 22, 2024
cc89f77
fix utc bug
invalid-email-address Nov 22, 2024
059607c
fix tests
invalid-email-address Nov 22, 2024
d9cccf5
elastic module
invalid-email-address Nov 22, 2024
4778eec
fix conflict
invalid-email-address Nov 23, 2024
189d725
fix conflict
invalid-email-address Nov 23, 2024
59177c4
new module: kafka
invalid-email-address Nov 22, 2024
cb9bca2
fix elastic tests
invalid-email-address Nov 22, 2024
a0fc76a
better error handling in module
invalid-email-address Nov 23, 2024
6254dae
better error handling in module
invalid-email-address Nov 23, 2024
7476929
better mongo error handling
invalid-email-address Nov 23, 2024
eb668a6
add NATS module
invalid-email-address Nov 23, 2024
712845e
fix tests?
invalid-email-address Nov 23, 2024
e7e89e5
fix cli tests
invalid-email-address Nov 23, 2024
91893db
fix tests?
invalid-email-address Nov 23, 2024
a5b2a5d
fix elastic tests
invalid-email-address Nov 25, 2024
e2f4944
bump version
invalid-email-address Nov 22, 2024
21c2548
fix conflict
invalid-email-address Nov 20, 2024
90d6ba2
resolve conflict
invalid-email-address Nov 21, 2024
3f7be0b
more wip mongo
invalid-email-address Nov 19, 2024
f0b20da
more mongo wip
invalid-email-address Nov 20, 2024
f349876
skip distro tests
invalid-email-address Nov 20, 2024
2a5809c
more wip mongo
invalid-email-address Nov 21, 2024
2c1c021
fix conflict
invalid-email-address Nov 25, 2024
894c86c
steady work on mongo, bbot 3.0
invalid-email-address Nov 22, 2024
0200bd2
flaked
invalid-email-address Nov 22, 2024
70d0587
fix conflict
invalid-email-address Nov 25, 2024
c267994
fix utc bug
invalid-email-address Nov 22, 2024
f5e1695
fix tests
invalid-email-address Nov 22, 2024
44c8c6f
elastic module
invalid-email-address Nov 22, 2024
eb16a35
fixed conflict
invalid-email-address Nov 25, 2024
2b2cf74
fixed conflict
invalid-email-address Nov 25, 2024
32386e0
new module: kafka
invalid-email-address Nov 22, 2024
2f1cf40
fix elastic tests
invalid-email-address Nov 22, 2024
baa58ad
better error handling in module
invalid-email-address Nov 23, 2024
e757636
better error handling in module
invalid-email-address Nov 23, 2024
260e9ca
better mongo error handling
invalid-email-address Nov 23, 2024
f2bf501
fix conflicts
invalid-email-address Nov 25, 2024
6315002
fix conflicts
invalid-email-address Nov 25, 2024
9823dee
fix sql tests
invalid-email-address Nov 25, 2024
c9f292c
fix sql tests
invalid-email-address Nov 25, 2024
9955c5f
allow extra second for port to come online
invalid-email-address Nov 25, 2024
8eec9e7
merge dev
invalid-email-address Nov 25, 2024
fc9d12b
Merge pull request #2011 from blacklanternsecurity/kafka
TheTechromancer Nov 25, 2024
d63f636
Merge branch '3.0' into rabbitmq
TheTechromancer Nov 25, 2024
6a549ad
Merge pull request #2013 from blacklanternsecurity/rabbitmq
TheTechromancer Nov 25, 2024
2fbea44
Merge branch '3.0' into nats
TheTechromancer Nov 25, 2024
fe94c47
Merge branch '3.0' into zeromq
TheTechromancer Nov 25, 2024
8e08566
Merge pull request #2015 from blacklanternsecurity/zeromq
TheTechromancer Nov 25, 2024
22718c2
Merge pull request #2017 from blacklanternsecurity/nats
TheTechromancer Nov 25, 2024
1b5ff60
fix Event.hash()
invalid-email-address Dec 23, 2024
48b2086
fix Event.hash()
invalid-email-address Dec 23, 2024
dcf0cd6
merge dev
invalid-email-address Jan 2, 2025
4c4f982
merge dev
invalid-email-address Jan 13, 2025
6975fa3
Merge branch 'dev' into 3.0
TheTechromancer Jan 16, 2025
36bce51
merge dev
invalid-email-address Jan 21, 2025
07a6c48
reverse host
invalid-email-address Jan 22, 2025
66f80a2
merge dev
invalid-email-address Jan 26, 2025
09e861d
archived
invalid-email-address Feb 8, 2025
f226b08
resolve conflict
invalid-email-address Mar 5, 2025
bc97d68
cherry pick preset fix
invalid-email-address Mar 5, 2025
cd45037
fix conflict
invalid-email-address Mar 5, 2025
c2399cf
Merge branch 'dev' into 3.0
invalid-email-address Mar 14, 2025
a5959a6
add hashing to pydantic model
invalid-email-address Mar 18, 2025
6557fb2
ruffed
invalid-email-address Mar 18, 2025
dcf70f6
fix elastic
invalid-email-address Mar 18, 2025
f3f5fec
timezone things
invalid-email-address Mar 18, 2025
03eb3ca
fix elastic
invalid-email-address Mar 19, 2025
a657669
ruffed
invalid-email-address Mar 19, 2025
2e835fe
delete generic ssrf
invalid-email-address Mar 20, 2025
ded21dd
merge dev
invalid-email-address Apr 3, 2025
d3a84af
Merge branch 'dev' into 3.0
invalid-email-address Apr 4, 2025
7c8ce00
Merge branch 'dev' into 3.0
invalid-email-address Apr 14, 2025
288caba
strict dns scope
invalid-email-address Apr 16, 2025
7f3af82
ruffed
invalid-email-address Apr 16, 2025
275d6cd
strict dns scope
invalid-email-address Apr 16, 2025
42933e5
fix cli tests
invalid-email-address Apr 16, 2025
5788382
whitelist should be null if not specified
invalid-email-address Apr 16, 2025
2ea6cb6
fix tests
invalid-email-address Apr 16, 2025
5288bb0
better error handling in modules
invalid-email-address Apr 17, 2025
f5ce513
allow detailed status
invalid-email-address Apr 17, 2025
61234c4
fix scan tests
invalid-email-address Apr 17, 2025
12812b1
preserve 3
invalid-email-address Apr 17, 2025
f5f3049
none whitelist
invalid-email-address Apr 17, 2025
5c93543
fix sqlite test
invalid-email-address Apr 17, 2025
6b715b1
fix mongo?
invalid-email-address Apr 17, 2025
d99f0b8
fix kafka
invalid-email-address Apr 17, 2025
89c4fbd
mark scan as finished
invalid-email-address Apr 17, 2025
35cb491
fix rabbitmq tests
invalid-email-address Apr 19, 2025
0c6c9d6
keep dispatcher alive til end
invalid-email-address Apr 21, 2025
1148376
fix dispatcher
invalid-email-address Apr 21, 2025
27bd324
better status handling
invalid-email-address Apr 21, 2025
343b47f
better finishing
invalid-email-address Apr 21, 2025
4f2acba
fixed ctrl+c
invalid-email-address Apr 21, 2025
2d9d495
remove cleaning up status
invalid-email-address Apr 21, 2025
fec51cf
pika imports
invalid-email-address Apr 23, 2025
7730ae8
keep strict_scope in preset for backwards compatibility
invalid-email-address Apr 24, 2025
8813b78
fix preset
invalid-email-address Apr 24, 2025
6a0e5ad
fix preset again
invalid-email-address Apr 24, 2025
f09109e
union -> optional
invalid-email-address Apr 25, 2025
71a26a5
merge dev
invalid-email-address Apr 25, 2025
d490146
ruffed
invalid-email-address Apr 25, 2025
60c8e8f
merge dev
invalid-email-address Apr 27, 2025
e635624
Merge branch 'dev' into 3.0
invalid-email-address Apr 28, 2025
c166011
merge 3.0
invalid-email-address Apr 28, 2025
c64fdea
don't import scanner or preset in bbot __init__.py
invalid-email-address Apr 29, 2025
9b7475c
ruffed
invalid-email-address Apr 29, 2025
18de9a2
vuln rework
invalid-email-address Apr 29, 2025
9a4e7fc
tests
invalid-email-address Apr 29, 2025
baf6e62
tests
invalid-email-address Apr 29, 2025
4ae4d5d
fix tests
invalid-email-address Apr 30, 2025
6bdace9
padding oracle
invalid-email-address Apr 30, 2025
01767e4
Merge pull request #2436 from blacklanternsecurity/vulnerability-rework
TheTechromancer May 1, 2025
9eb507f
Merge pull request #2411 from blacklanternsecurity/strict_dns_scope
TheTechromancer May 1, 2025
18c40a0
fix vuln bug
invalid-email-address May 1, 2025
ee5ef08
ruffed
invalid-email-address May 1, 2025
355ca15
fix finding bug
invalid-email-address May 1, 2025
382c8b3
lowercase technology
invalid-email-address May 2, 2025
9418e05
bbot constants
invalid-email-address May 5, 2025
ffdf28d
ruffed
invalid-email-address May 5, 2025
4e0f0f9
ruffed
invalid-email-address May 5, 2025
25c20ff
include status code
invalid-email-address May 5, 2025
1ca1f55
fix bug
invalid-email-address May 5, 2025
1b08de1
scan status rework
invalid-email-address May 5, 2025
ea8b6fd
status code
invalid-email-address May 5, 2025
72ae23f
cancellation
invalid-email-address May 6, 2025
f67b97f
things
invalid-email-address May 6, 2025
f34d62b
tech port
invalid-email-address May 6, 2025
12bda75
bbot things
invalid-email-address May 6, 2025
9cdb3c7
stringify output dir
invalid-email-address May 6, 2025
db00fc5
merge dev
invalid-email-address May 8, 2025
11c684f
fix tests
invalid-email-address May 8, 2025
e48005b
fix tests
invalid-email-address May 9, 2025
9025464
Merge pull request #2438 from blacklanternsecurity/bbot-server-improv…
TheTechromancer May 9, 2025
00389b5
fix bug
invalid-email-address May 10, 2025
69c5fe5
scope test
invalid-email-address May 10, 2025
1c62084
tolerate 'target' and 'targets'
invalid-email-address May 10, 2025
7c6aa05
Merge pull request #2449 from blacklanternsecurity/bbot-server-improv…
TheTechromancer May 14, 2025
ea1d1b8
http headers
invalid-email-address May 27, 2025
17a0828
http headers
invalid-email-address May 27, 2025
e5c4eec
small updates
invalid-email-address Jun 2, 2025
09eb58a
fix http tests
invalid-email-address Jun 2, 2025
0af5e28
event pydantic updates
invalid-email-address Jun 3, 2025
6a36986
ruffed
invalid-email-address Jun 3, 2025
9973d01
Merge pull request #2486 from blacklanternsecurity/bbot-server-improv…
TheTechromancer Jun 6, 2025
cc1cf03
fix conflicts
invalid-email-address Jun 12, 2025
98087bd
merge dev
invalid-email-address Jul 16, 2025
6fe7195
fix conflict
TheTechromancer Aug 26, 2025
e8f2823
merge conflicts
TheTechromancer Sep 19, 2025
75b15ee
fix graphql, aspnet bin
TheTechromancer Sep 19, 2025
3a67e0c
fix iis shortnames
TheTechromancer Sep 19, 2025
83a87dc
fix medusa
TheTechromancer Sep 19, 2025
43936a1
fix tests
TheTechromancer Sep 20, 2025
28e4603
Merge pull request #2643 from blacklanternsecurity/3.0-update
TheTechromancer Oct 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions bbot/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,2 @@
# version placeholder (replaced by poetry-dynamic-versioning)
__version__ = "v0.0.0"

from .scanner import Scanner, Preset

__all__ = ["Scanner", "Preset"]
72 changes: 72 additions & 0 deletions bbot/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
SCAN_STATUS_QUEUED = 0
SCAN_STATUS_NOT_STARTED = 1
SCAN_STATUS_STARTING = 2
SCAN_STATUS_RUNNING = 3
SCAN_STATUS_FINISHING = 4
SCAN_STATUS_ABORTING = 5
SCAN_STATUS_FINISHED = 6
SCAN_STATUS_FAILED = 7
SCAN_STATUS_ABORTED = 8


SCAN_STATUSES = {
"QUEUED": SCAN_STATUS_QUEUED,
"NOT_STARTED": SCAN_STATUS_NOT_STARTED,
"STARTING": SCAN_STATUS_STARTING,
"RUNNING": SCAN_STATUS_RUNNING,
"FINISHING": SCAN_STATUS_FINISHING,
"ABORTING": SCAN_STATUS_ABORTING,
"FINISHED": SCAN_STATUS_FINISHED,
"FAILED": SCAN_STATUS_FAILED,
"ABORTED": SCAN_STATUS_ABORTED,
}

SCAN_STATUS_CODES = {v: k for k, v in SCAN_STATUSES.items()}


def is_valid_scan_status(status):
"""
Check if a status is a valid scan status
"""
return status in SCAN_STATUSES


def is_valid_scan_status_code(status):
"""
Check if a status is a valid scan status code
"""
return status in SCAN_STATUS_CODES


def get_scan_status_name(status):
"""
Convert a numeric scan status code to a string status name
"""
try:
if isinstance(status, str):
if not is_valid_scan_status(status):
raise ValueError(f"Invalid scan status: {status}")
return status
elif isinstance(status, int):
return SCAN_STATUS_CODES[status]
else:
raise ValueError(f"Invalid scan status: {status} (must be int or str)")
except KeyError:
raise ValueError(f"Invalid scan status: {status}")


def get_scan_status_code(status):
"""
Convert a scan status string to a numeric status code
"""
try:
if isinstance(status, int):
if not is_valid_scan_status_code(status):
raise ValueError(f"Invalid scan status code: {status}")
return status
elif isinstance(status, str):
return SCAN_STATUSES[status]
else:
raise ValueError(f"Invalid scan status: {status} (must be int or str)")
except KeyError:
raise ValueError(f"Invalid scan status: {status}")
6 changes: 5 additions & 1 deletion bbot/core/config/logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import sys
import atexit
import logging
import threading
from copy import copy
import multiprocessing
import logging.handlers
Expand Down Expand Up @@ -93,7 +94,10 @@ def cleanup_logging(self):

# Stop queue listener
with suppress(Exception):
self.listener.stop()
stop_thread = threading.Thread(target=self.listener.stop)
stop_thread.daemon = True
stop_thread.start()
stop_thread.join()

def setup_queue_handler(self, logging_queue=None, log_level=logging.DEBUG):
if logging_queue is None:
Expand Down
55 changes: 39 additions & 16 deletions bbot/core/event/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

from pathlib import Path
from typing import Optional
from zoneinfo import ZoneInfo
from copy import copy, deepcopy
from contextlib import suppress
from radixtarget import RadixTarget
Expand Down Expand Up @@ -40,6 +41,7 @@
validators,
get_file_extension,
)
from bbot.models.helpers import utc_datetime_validator
from bbot.core.helpers.web.envelopes import BaseEnvelope


Expand Down Expand Up @@ -401,14 +403,15 @@ def host_filterable(self):
@property
def port(self):
self.host
if self._port:
return self._port
if getattr(self, "parsed_url", None):
if self.parsed_url.port is not None:
return self.parsed_url.port
elif self.parsed_url.scheme == "https":
return 443
elif self.parsed_url.scheme == "http":
return 80
return self._port

@property
def netloc(self):
Expand Down Expand Up @@ -811,7 +814,7 @@ def __contains__(self, other):
return bool(radixtarget.search(other.host))
return False

def json(self, mode="json", siem_friendly=False):
def json(self, mode="json"):
"""
Serializes the event object to a JSON-compatible dictionary.

Expand All @@ -820,7 +823,6 @@ def json(self, mode="json", siem_friendly=False):

Parameters:
mode (str): Specifies the data serialization mode. Default is "json". Other options include "graph", "human", and "id".
siem_friendly (bool): Whether to format the JSON in a way that's friendly to SIEM ingestion by Elastic, Splunk, etc. This ensures the value of "data" is always the same type (a dictionary).

Returns:
dict: JSON-serializable dictionary representation of the event object.
Expand All @@ -837,10 +839,12 @@ def json(self, mode="json", siem_friendly=False):
data = data_attr
else:
data = smart_decode(self.data)
if siem_friendly:
j["data"] = {self.type: data}
else:
if isinstance(data, str):
j["data"] = data
elif isinstance(data, dict):
j["data_json"] = data
else:
raise ValueError(f"Invalid data type: {type(data)}")
# host, dns children
if self.host:
j["host"] = str(self.host)
Expand All @@ -858,7 +862,7 @@ def json(self, mode="json", siem_friendly=False):
if self.scan:
j["scan"] = self.scan.id
# timestamp
j["timestamp"] = self.timestamp.isoformat()
j["timestamp"] = utc_datetime_validator(self.timestamp).timestamp()
# parent event
parent_id = self.parent_id
if parent_id:
Expand All @@ -867,8 +871,7 @@ def json(self, mode="json", siem_friendly=False):
if parent_uuid:
j["parent_uuid"] = parent_uuid
# tags
if self.tags:
j.update({"tags": list(self.tags)})
j.update({"tags": sorted(self.tags)})
# parent module
if self.module:
j.update({"module": str(self.module)})
Expand Down Expand Up @@ -1084,9 +1087,10 @@ def __init__(self, *args, **kwargs):
parent_path = parent.data.get("path", None)
if parent_path is not None:
self.data["path"] = parent_path
# inherit closest host
# inherit closest host+port
if parent.host:
self.data["host"] = str(parent.host)
self._port = parent.port
# we do this to refresh the hash
self.data = self.data
break
Expand All @@ -1097,6 +1101,7 @@ def __init__(self, *args, **kwargs):

class DictPathEvent(DictEvent):
def sanitize_data(self, data):
data = super().sanitize_data(data)
new_data = dict(data)
new_data["path"] = str(new_data["path"])
file_blobs = getattr(self.scan, "_file_blobs", False)
Expand Down Expand Up @@ -1550,19 +1555,23 @@ class VULNERABILITY(ClosestHostEvent):
"HIGH": "🟥",
"MEDIUM": "🟧",
"LOW": "🟨",
"INFO": "🟦",
"UNKNOWN": "⬜",
}

def sanitize_data(self, data):
data = super().sanitize_data(data)
self.add_tag(data["severity"].lower())
return data

class _data_validator(BaseModel):
host: Optional[str] = None
severity: str
name: str
description: str
url: Optional[str] = None
path: Optional[str] = None
cves: Optional[list[str]] = None
_validate_url = field_validator("url")(validators.validate_url)
_validate_host = field_validator("host")(validators.validate_host)
_validate_severity = field_validator("severity")(validators.validate_severity)
Expand All @@ -1577,6 +1586,7 @@ class FINDING(ClosestHostEvent):

class _data_validator(BaseModel):
host: Optional[str] = None
name: str
description: str
url: Optional[str] = None
path: Optional[str] = None
Expand All @@ -1595,6 +1605,11 @@ class _data_validator(BaseModel):
_validate_url = field_validator("url")(validators.validate_url)
_validate_host = field_validator("host")(validators.validate_host)

def _sanitize_data(self, data):
data = super()._sanitize_data(data)
data["technology"] = data["technology"].lower()
return data

def _data_id(self):
# dedupe by host+port+tech
tech = self.data.get("technology", "")
Expand Down Expand Up @@ -1724,6 +1739,7 @@ class MOBILE_APP(DictEvent):
_always_emit = True

def _sanitize_data(self, data):
data = super()._sanitize_data(data)
if isinstance(data, str):
data = {"url": data}
if "url" not in data:
Expand Down Expand Up @@ -1886,7 +1902,7 @@ def make_event(
)


def event_from_json(j, siem_friendly=False):
def event_from_json(j):
"""
Creates an event object from a JSON dictionary.

Expand Down Expand Up @@ -1917,10 +1933,12 @@ def event_from_json(j, siem_friendly=False):
"context": j.get("discovery_context", None),
"dummy": True,
}
if siem_friendly:
data = j["data"][event_type]
else:
data = j["data"]
data = j.get("data_json", None)
if data is None:
data = j.get("data", None)
if data is None:
json_pretty = json.dumps(j, indent=2)
raise ValueError(f"data or data_json must be provided. JSON: {json_pretty}")
kwargs["data"] = data
event = make_event(**kwargs)
event_uuid = j.get("uuid", None)
Expand All @@ -1929,7 +1947,12 @@ def event_from_json(j, siem_friendly=False):

resolved_hosts = j.get("resolved_hosts", [])
event._resolved_hosts = set(resolved_hosts)
event.timestamp = datetime.datetime.fromisoformat(j["timestamp"])

# accept both isoformat and unix timestamp
try:
event.timestamp = datetime.datetime.fromtimestamp(j["timestamp"], ZoneInfo("UTC"))
except Exception:
event.timestamp = datetime.datetime.fromisoformat(j["timestamp"])
event.scope_distance = j["scope_distance"]
parent_id = j.get("parent", None)
if parent_id is not None:
Expand Down
11 changes: 10 additions & 1 deletion bbot/defaults.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
### BASIC OPTIONS ###

# NOTE: If used in a preset, these options must be nested underneath "config:" like so:
# config:
# home: ~/.bbot
# keep_scans: 20
# scope:
# strict: true
# dns:
# minimal: true

# BBOT working directory
home: ~/.bbot
# How many scan results to keep before cleaning up the older ones
Expand All @@ -15,7 +24,7 @@ folder_blobs: false

scope:
# strict scope means only exact DNS names are considered in-scope
# subdomains are not included unless they are explicitly provided in the target list
# their subdomains are not included unless explicitly whitelisted
strict: false
# Filter by scope distance which events are displayed in the output
# 0 == show only in-scope events (affiliates are always shown)
Expand Down
20 changes: 20 additions & 0 deletions bbot/models/helpers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from datetime import datetime
from zoneinfo import ZoneInfo


def utc_datetime_validator(d: datetime) -> datetime:
"""
Converts all dates into UTC
"""
if d.tzinfo is not None:
return d.astimezone(ZoneInfo("UTC"))
else:
return d.replace(tzinfo=ZoneInfo("UTC"))


def utc_now() -> datetime:
return datetime.now(ZoneInfo("UTC"))


def utc_now_timestamp() -> datetime:
return utc_now().timestamp()
Loading
Loading