r2mods/scripts/doxless.py

73 lines
2.4 KiB
Python
Executable File

#!/usr/bin/env python3
# NB: get aiofiles yeah?
import pathlib
import os
import time
import sys
def in_content(needle: str, pathlike: str | pathlib.Path):
content = ""
try:
# NB: latin-1 since we actually do have some language translation files
with open(pathlike, 'r', encoding='latin-1') as f:
content = f.read().lower()
except BaseException as e:
raise BaseException(f"Unable to determine content of {pathlike}: {e}") from e
return needle in content
def gitignore_patterns(gitignore_f: str):
with open(gitignore_f, 'r') as f:
return {line for line in (line.strip() for line in f) if not line.startswith('#') and line}
def main():
begin_stopwatch_s = time.perf_counter()
# if OSError, too bad, user probably knows why, so just throw xD
username = os.getlogin()
ignore_patterns = gitignore_patterns(os.getenv("IGNORE_FILE", ".gitignore"))
ignore_patterns.add(".git")
print(f"{ignore_patterns=}")
# NB: impure pattern due to walk being costly
username_in_file = []
username_in_content = []
user_lower = username.lower()
for _root, dirs, filenames in os.walk(pathlib.Path("./")):
root = pathlib.Path(_root)
absdirs = [
e
for e in ((root.joinpath(d), d) for d in dirs)
if all(not e[0].match(pat) for pat in ignore_patterns)
]
files = [
e
for e in ((root.joinpath(f), f) for f in filenames)
if all(not e[0].match(pat) for pat in ignore_patterns)
]
username_in_file.extend(
abspath
for abspath, fname in absdirs + files
if user_lower in fname.lower()
)
username_in_content.extend(
absfname
for absfname, _ in files
if in_content(user_lower, absfname)
)
print(f"Checked batch {[rel for _, rel in files + absdirs]} in {root}", file=sys.stderr)
nl = "\n"
if username_in_file != []:
print(f"Doxxed by username in file path:\n{nl.join(f'- {e}' for e in username_in_file)}")
if username_in_content != []:
print(f"Doxxed by username in file content:\n{nl.join(f'- {e}' for e in username_in_content)}")
stop_stopwatch_s = time.perf_counter()
print(f"done analyzing in {(stop_stopwatch_s - begin_stopwatch_s):.04}s")
if __name__ == "__main__":
main()