Skip to content

Commit

Permalink
Merge pull request #1997 from cclauss/ruff-check--fix
Browse files Browse the repository at this point in the history
ruff check --fix --unsafe-fixes
  • Loading branch information
TheTechromancer authored Nov 23, 2024
2 parents 0b8a869 + 3c9117b commit 5e8148b
Show file tree
Hide file tree
Showing 116 changed files with 851 additions and 935 deletions.
5 changes: 0 additions & 5 deletions .flake8

This file was deleted.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[![bbot_banner](https://github.com/user-attachments/assets/f02804ce-9478-4f1e-ac4d-9cf5620a3214)](https://github.com/blacklanternsecurity/bbot)

[![Python Version](https://img.shields.io/badge/python-3.9+-FF8400)](https://www.python.org) [![License](https://img.shields.io/badge/license-GPLv3-FF8400.svg)](https://github.com/blacklanternsecurity/bbot/blob/dev/LICENSE) [![DEF CON Recon Village 2024](https://img.shields.io/badge/DEF%20CON%20Demo%20Labs-2023-FF8400.svg)](https://www.reconvillage.org/talks) [![PyPi Downloads](https://static.pepy.tech/personalized-badge/bbot?right_color=orange&left_color=grey)](https://pepy.tech/project/bbot) [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Tests](https://github.com/blacklanternsecurity/bbot/actions/workflows/tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/bbot/actions?query=workflow%3A"tests") [![Codecov](https://codecov.io/gh/blacklanternsecurity/bbot/branch/dev/graph/badge.svg?token=IR5AZBDM5K)](https://codecov.io/gh/blacklanternsecurity/bbot) [![Discord](https://img.shields.io/discord/859164869970362439)](https://discord.com/invite/PZqkgxu5SA)
[![Python Version](https://img.shields.io/badge/python-3.9+-FF8400)](https://www.python.org) [![License](https://img.shields.io/badge/license-GPLv3-FF8400.svg)](https://github.com/blacklanternsecurity/bbot/blob/dev/LICENSE) [![DEF CON Recon Village 2024](https://img.shields.io/badge/DEF%20CON%20Demo%20Labs-2023-FF8400.svg)](https://www.reconvillage.org/talks) [![PyPi Downloads](https://static.pepy.tech/personalized-badge/bbot?right_color=orange&left_color=grey)](https://pepy.tech/project/bbot) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![Tests](https://github.com/blacklanternsecurity/bbot/actions/workflows/tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/bbot/actions?query=workflow%3A"tests") [![Codecov](https://codecov.io/gh/blacklanternsecurity/bbot/branch/dev/graph/badge.svg?token=IR5AZBDM5K)](https://codecov.io/gh/blacklanternsecurity/bbot) [![Discord](https://img.shields.io/discord/859164869970362439)](https://discord.com/invite/PZqkgxu5SA)

### **BEE·bot** is a multipurpose scanner inspired by [Spiderfoot](https://github.com/smicallef/spiderfoot), built to automate your **Recon**, **Bug Bounties**, and **ASM**!

Expand Down
4 changes: 2 additions & 2 deletions bbot/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,8 @@ async def _main():
]
if deadly_modules and not options.allow_deadly:
log.hugewarning(f"You enabled the following deadly modules: {','.join(deadly_modules)}")
log.hugewarning(f"Deadly modules are highly intrusive")
log.hugewarning(f"Please specify --allow-deadly to continue")
log.hugewarning("Deadly modules are highly intrusive")
log.hugewarning("Please specify --allow-deadly to continue")
return False

# --current-preset
Expand Down
2 changes: 1 addition & 1 deletion bbot/core/config/logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def __init__(self, core):
self.listener = None

# if we haven't set up logging yet, do it now
if not "_BBOT_LOGGING_SETUP" in os.environ:
if "_BBOT_LOGGING_SETUP" not in os.environ:
os.environ["_BBOT_LOGGING_SETUP"] = "1"
self.queue = multiprocessing.Queue()
self.setup_queue_handler()
Expand Down
2 changes: 1 addition & 1 deletion bbot/core/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ def default_config(self):
if DEFAULT_CONFIG is None:
self.default_config = self.files_config.get_default_config()
# ensure bbot home dir
if not "home" in self.default_config:
if "home" not in self.default_config:
self.default_config["home"] = "~/.bbot"
return DEFAULT_CONFIG

Expand Down
18 changes: 9 additions & 9 deletions bbot/core/event/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ def __init__(
# self.scan holds the instantiated scan object (for helpers, etc.)
self.scan = scan
if (not self.scan) and (not self._dummy):
raise ValidationError(f"Must specify scan")
raise ValidationError("Must specify scan")
# self.scans holds a list of scan IDs from scans that encountered this event
self.scans = []
if scans is not None:
Expand All @@ -222,7 +222,7 @@ def __init__(

self.parent = parent
if (not self.parent) and (not self._dummy):
raise ValidationError(f"Must specify event parent")
raise ValidationError("Must specify event parent")

if tags is not None:
for tag in tags:
Expand Down Expand Up @@ -301,9 +301,9 @@ def internal(self, value):
The purpose of internal events is to enable speculative/explorative discovery without cluttering
the console with irrelevant or uninteresting events.
"""
if not value in (True, False):
if value not in (True, False):
raise ValueError(f'"internal" must be boolean, not {type(value)}')
if value == True:
if value is True:
self.add_tag("internal")
else:
self.remove_tag("internal")
Expand Down Expand Up @@ -1013,12 +1013,12 @@ def __init__(self, *args, **kwargs):
if not self.host:
for parent in self.get_parents(include_self=True):
# inherit closest URL
if not "url" in self.data:
if "url" not in self.data:
parent_url = getattr(parent, "parsed_url", None)
if parent_url is not None:
self.data["url"] = parent_url.geturl()
# inherit closest path
if not "path" in self.data and isinstance(parent.data, dict) and not parent.type == "HTTP_RESPONSE":
if "path" not in self.data and isinstance(parent.data, dict) and not parent.type == "HTTP_RESPONSE":
parent_path = parent.data.get("path", None)
if parent_path is not None:
self.data["path"] = parent_path
Expand Down Expand Up @@ -1227,7 +1227,7 @@ def sanitize_data(self, data):

def add_tag(self, tag):
host_same_as_parent = self.parent and self.host == self.parent.host
if tag == "spider-danger" and host_same_as_parent and not "spider-danger" in self.tags:
if tag == "spider-danger" and host_same_as_parent and "spider-danger" not in self.tags:
# increment the web spider distance
if self.type == "URL_UNVERIFIED":
self.web_spider_distance += 1
Expand All @@ -1249,7 +1249,7 @@ def with_port(self):

def _words(self):
first_elem = self.parsed_url.path.lstrip("/").split("/")[0]
if not "." in first_elem:
if "." not in first_elem:
return extract_words(first_elem)
return set()

Expand Down Expand Up @@ -1665,7 +1665,7 @@ def make_event(
event.parent = parent
if context is not None:
event.discovery_context = context
if internal == True:
if internal is True:
event.internal = True
if tags:
event.tags = tags.union(event.tags)
Expand Down
8 changes: 4 additions & 4 deletions bbot/core/helpers/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,11 +269,11 @@ def _prepare_command_kwargs(self, command, kwargs):
(['sudo', '-E', '-A', 'LD_LIBRARY_PATH=...', 'PATH=...', 'ls', '-l'], {'limit': 104857600, 'stdout': -1, 'stderr': -1, 'env': environ(...)})
"""
# limit = 100MB (this is needed for cases like httpx that are sending large JSON blobs over stdout)
if not "limit" in kwargs:
if "limit" not in kwargs:
kwargs["limit"] = 1024 * 1024 * 100
if not "stdout" in kwargs:
if "stdout" not in kwargs:
kwargs["stdout"] = asyncio.subprocess.PIPE
if not "stderr" in kwargs:
if "stderr" not in kwargs:
kwargs["stderr"] = asyncio.subprocess.PIPE
sudo = kwargs.pop("sudo", False)

Expand All @@ -286,7 +286,7 @@ def _prepare_command_kwargs(self, command, kwargs):

# use full path of binary, if not already specified
binary = command[0]
if not "/" in binary:
if "/" not in binary:
binary_full_path = which(binary)
if binary_full_path is None:
raise SubprocessError(f'Command "{binary}" was not found')
Expand Down
8 changes: 4 additions & 4 deletions bbot/core/helpers/depsinstaller/installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,11 @@ async def install(self, *modules):
or self.deps_behavior == "force_install"
):
if not notified:
log.hugeinfo(f"Installing module dependencies. Please be patient, this may take a while.")
log.hugeinfo("Installing module dependencies. Please be patient, this may take a while.")
notified = True
log.verbose(f'Installing dependencies for module "{m}"')
# get sudo access if we need it
if preloaded.get("sudo", False) == True:
if preloaded.get("sudo", False) is True:
self.ensure_root(f'Module "{m}" needs root privileges to install its dependencies.')
success = await self.install_module(m)
self.setup_status[module_hash] = success
Expand Down Expand Up @@ -159,7 +159,7 @@ async def install_module(self, module):
deps_common = preloaded["deps"]["common"]
if deps_common:
for dep_common in deps_common:
if self.setup_status.get(dep_common, False) == True:
if self.setup_status.get(dep_common, False) is True:
log.debug(
f'Skipping installation of dependency "{dep_common}" for module "{module}" since it is already installed'
)
Expand Down Expand Up @@ -244,7 +244,7 @@ def shell(self, module, commands):
if success:
log.info(f"Successfully ran {len(commands):,} shell commands")
else:
log.warning(f"Failed to run shell dependencies")
log.warning("Failed to run shell dependencies")
return success

def tasks(self, module, tasks):
Expand Down
10 changes: 5 additions & 5 deletions bbot/core/helpers/diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ async def compare(

await self._baseline()

if timeout == None:
if timeout is None:
timeout = self.timeout

reflection = False
Expand Down Expand Up @@ -238,11 +238,11 @@ async def compare(

different_headers = self.compare_headers(self.baseline.headers, subject_response.headers)
if different_headers:
log.debug(f"headers were different, no match")
log.debug("headers were different, no match")
diff_reasons.append("header")

if self.compare_body(self.baseline_json, subject_json) == False:
log.debug(f"difference in HTML body, no match")
if self.compare_body(self.baseline_json, subject_json) is False:
log.debug("difference in HTML body, no match")

diff_reasons.append("body")

Expand Down Expand Up @@ -275,6 +275,6 @@ async def canary_check(self, url, mode, rounds=3):
)

# if a nonsense header "caused" a difference, we need to abort. We also need to abort if our canary was reflected
if match == False or reflection == True:
if match is False or reflection is True:
return False
return True
2 changes: 1 addition & 1 deletion bbot/core/helpers/dns/dns.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ def _wildcard_prevalidation(self, host):

host = clean_dns_record(host)
# skip check if it's an IP or a plain hostname
if is_ip(host) or not "." in host:
if is_ip(host) or "." not in host:
return False

# skip if query isn't a dns name
Expand Down
2 changes: 1 addition & 1 deletion bbot/core/helpers/dns/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -638,7 +638,7 @@ async def _connectivity_check(self, interval=5):
self._last_dns_success = time.time()
return True
if time.time() - self._last_connectivity_warning > interval:
self.log.warning(f"DNS queries are failing, please check your internet connection")
self.log.warning("DNS queries are failing, please check your internet connection")
self._last_connectivity_warning = time.time()
self._errors.clear()
return False
Expand Down
2 changes: 1 addition & 1 deletion bbot/core/helpers/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def _feed_pipe(self, pipe, content, text=True):
for c in content:
p.write(decode_fn(c) + newline)
except BrokenPipeError:
log.debug(f"Broken pipe in _feed_pipe()")
log.debug("Broken pipe in _feed_pipe()")
except ValueError:
log.debug(f"Error _feed_pipe(): {traceback.format_exc()}")
except KeyboardInterrupt:
Expand Down
4 changes: 3 additions & 1 deletion bbot/core/helpers/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,9 @@ def temp_filename(self, extension=None):
return self.temp_dir / filename

def clean_old_scans(self):
_filter = lambda x: x.is_dir() and self.regexes.scan_name_regex.match(x.name)
def _filter(x):
return x.is_dir() and self.regexes.scan_name_regex.match(x.name)

self.clean_old(self.scans_dir, keep=self.keep_old_scans, filter=_filter)

def make_target(self, *targets, **kwargs):
Expand Down
6 changes: 3 additions & 3 deletions bbot/core/helpers/interactsh.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ async def register(self, callback=None):
break

if not self.server:
raise InteractshError(f"Failed to register with an interactsh server")
raise InteractshError("Failed to register with an interactsh server")

log.info(
f"Successfully registered to interactsh server {self.server} with correlation_id {self.correlation_id} [{self.domain}]"
Expand All @@ -181,7 +181,7 @@ async def deregister(self):
>>> await interactsh_client.deregister()
"""
if not self.server or not self.correlation_id or not self.secret:
raise InteractshError(f"Missing required information to deregister")
raise InteractshError("Missing required information to deregister")

headers = {}
if self.token:
Expand Down Expand Up @@ -226,7 +226,7 @@ async def poll(self):
]
"""
if not self.server or not self.correlation_id or not self.secret:
raise InteractshError(f"Missing required information to poll")
raise InteractshError("Missing required information to poll")

headers = {}
if self.token:
Expand Down
4 changes: 2 additions & 2 deletions bbot/core/helpers/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ def url_parents(u):
parent_list = []
while 1:
parent = parent_url(u)
if parent == None:
if parent is None:
return parent_list
elif parent not in parent_list:
parent_list.append(parent)
Expand Down Expand Up @@ -512,7 +512,7 @@ def domain_stem(domain):
- Utilizes the `tldextract` function for domain parsing.
"""
parsed = tldextract(str(domain))
return f".".join(parsed.subdomain.split(".") + parsed.domain.split(".")).strip(".")
return ".".join(parsed.subdomain.split(".") + parsed.domain.split(".")).strip(".")


def ip_network_parents(i, include_self=False):
Expand Down
2 changes: 1 addition & 1 deletion bbot/core/helpers/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ def validate_host(host: Union[str, ipaddress.IPv4Address, ipaddress.IPv6Address]
@validator
def validate_severity(severity: str):
severity = str(severity).strip().upper()
if not severity in ("UNKNOWN", "INFO", "LOW", "MEDIUM", "HIGH", "CRITICAL"):
if severity not in ("UNKNOWN", "INFO", "LOW", "MEDIUM", "HIGH", "CRITICAL"):
raise ValueError(f"Invalid severity: {severity}")
return severity

Expand Down
2 changes: 1 addition & 1 deletion bbot/core/helpers/web/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def __init__(self, *args, **kwargs):

# timeout
http_timeout = self._web_config.get("http_timeout", 20)
if not "timeout" in kwargs:
if "timeout" not in kwargs:
kwargs["timeout"] = http_timeout

# headers
Expand Down
2 changes: 1 addition & 1 deletion bbot/core/helpers/web/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ async def stream_request(self, url, **kwargs):
if max_size is not None:
max_size = human_to_bytes(max_size)
kwargs["follow_redirects"] = follow_redirects
if not "method" in kwargs:
if "method" not in kwargs:
kwargs["method"] = "GET"
try:
total_size = 0
Expand Down
4 changes: 2 additions & 2 deletions bbot/core/helpers/web/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ async def wordlist(self, path, lines=None, **kwargs):
"""
if not path:
raise WordlistError(f"Invalid wordlist: {path}")
if not "cache_hrs" in kwargs:
if "cache_hrs" not in kwargs:
kwargs["cache_hrs"] = 720
if self.parent_helper.is_url(path):
filename = await self.download(str(path), **kwargs)
Expand Down Expand Up @@ -350,7 +350,7 @@ async def curl(self, *args, **kwargs):
headers[hk] = hv

# add the timeout
if not "timeout" in kwargs:
if "timeout" not in kwargs:
timeout = http_timeout

curl_command.append("-m")
Expand Down
8 changes: 4 additions & 4 deletions bbot/core/helpers/wordcloud.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,15 +111,15 @@ def mutations(
results = set()
for word in words:
h = hash(word)
if not h in results:
if h not in results:
results.add(h)
yield (word,)
if numbers > 0:
if substitute_numbers:
for word in words:
for number_mutation in self.get_number_mutations(word, n=numbers, padding=number_padding):
h = hash(number_mutation)
if not h in results:
if h not in results:
results.add(h)
yield (number_mutation,)
for word in words:
Expand Down Expand Up @@ -322,7 +322,7 @@ def json(self, limit=None):

@property
def default_filename(self):
return self.parent_helper.preset.scan.home / f"wordcloud.tsv"
return self.parent_helper.preset.scan.home / "wordcloud.tsv"

def save(self, filename=None, limit=None):
"""
Expand Down Expand Up @@ -357,7 +357,7 @@ def save(self, filename=None, limit=None):
log.debug(f"Saved word cloud ({len(self):,} words) to {filename}")
return True, filename
else:
log.debug(f"No words to save")
log.debug("No words to save")
except Exception as e:
import traceback

Expand Down
10 changes: 5 additions & 5 deletions bbot/core/modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ def preload(self, module_dirs=None):
else:
log.debug(f"Preloading {module_name} from disk")
if module_dir.name == "modules":
namespace = f"bbot.modules"
namespace = "bbot.modules"
else:
namespace = f"bbot.modules.{module_dir.name}"
try:
Expand Down Expand Up @@ -400,10 +400,10 @@ def preload_module(self, module_file):
deps_common.append(dep_common.value)

for task in ansible_tasks:
if not "become" in task:
if "become" not in task:
task["become"] = False
# don't sudo brew
elif os_platform() == "darwin" and ("package" in task and task.get("become", False) == True):
elif os_platform() == "darwin" and ("package" in task and task.get("become", False) is True):
task["become"] = False

preloaded_data = {
Expand Down Expand Up @@ -436,8 +436,8 @@ def preload_module(self, module_file):
f'Error while preloading module "{module_file}": No shared dependency named "{dep_common}" (choices: {common_choices})'
)
for ansible_task in ansible_task_list:
if any(x == True for x in search_dict_by_key("become", ansible_task)) or any(
x == True for x in search_dict_by_key("ansible_become", ansible_tasks)
if any(x is True for x in search_dict_by_key("become", ansible_task)) or any(
x is True for x in search_dict_by_key("ansible_become", ansible_tasks)
):
preloaded_data["sudo"] = True
return preloaded_data
Expand Down
Loading

0 comments on commit 5e8148b

Please sign in to comment.