mirror of
https://github.com/yogeshojha/rengine.git
synced 2026-10-20 07:11:28 +02:00
A full static review of the 3.0 tree, run as two fan-out passes with every
finding verified against the running stack rather than taken on inspection.
Correctness and security
- instance settings encrypted the mask over the stored AI key: `!= MASK` never
matched `••••••••abcd`, so saving settings destroyed the key and `test_ai`
posted the mask as a bearer token
- the MFA token was replayable for its full five-minute life; the gate now
checks revocation and consumes the token after a successful exchange
- logout revoked nothing for a bearer client while answering "Logged out"
- `POST /api-keys/{id}/test` returned the plaintext key inside httpx's error
string, which embeds the whole URL
- an interest rule could be edited or deleted through another project's id
- redis ran the celery broker under `allkeys-lru`, free to evict a queued task
or a chord counter; now `noeviction`
- nuclei's stored command carried the OAST token and every auth header
- a finalize step could poison the session and leave a scan RUNNING for ever
- `is:issue` raised TypeError on every search
- offset paging repeated and skipped rows in four dimensions
- a cancelled run kept a stale `scans.*_found` rollup
- every PDF report raised `KeyError: 'software'`
- `version_key` truncated a wide numeric run and inverted release ordering
- psycopg raises a NUL as a bare ValueError, above StatementError, so every
savepoint guard was blind to the case it was written for
Performance
- endpoints.host had no trigram index: 35.9ms seq scan -> 0.389ms
- free text compiled to one OR, not the prescribed UNION ALL: 132ms -> 41ms
- `/http-assets/summary` and `/ips/summary` materialised whole tables
- the cross-link `ip` kind ran an estate query per page and drew nothing
Frontend
- `$effect` loaders that read the state they write, an unbounded request loop
on a failing endpoint
- error states that rendered as empty states
- 2FA backup codes were unusable while the copy said they worked
- a "Scan history" dialog that always reported none
- ~400 duplicated lines across five filter bars, now one component
Build and tooling
- every scanner installed at @latest; all 13 pinned to the measured versions
- CI built `web/`, gone since 2.x, with tags that cannot be valid
- the prettier pre-commit hook discarded its filenames and always passed
- the test suite destroyed itself when run twice
Also: subdomains from public code, via a pinned github-subdomains source and a
GitHub API key that subfinder receives too; sublist3r and oneforall removed
after measuring one unique host in 89 across four targets.
Verified: 853 tests, ruff clean over eleven packages, svelte-check 0 errors,
the count-is-a-promise gate at 131 checks and 0 mismatches, and 143 GET routes
with no 5xx. Four migrations, each with an exercised downgrade.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DVkdx5ynZ6aof5kLFczmhX
167 lines
3.5 KiB
Python
167 lines
3.5 KiB
Python
import re
|
|
|
|
from sqlalchemy import case, func, literal
|
|
|
|
_WHITESPACE_RE = re.compile(r"\s+")
|
|
|
|
_NON_IDENTIFYING_EXACT = frozenset(
|
|
{
|
|
"",
|
|
"-",
|
|
"--",
|
|
"n/a",
|
|
"na",
|
|
"none",
|
|
"null",
|
|
"nil",
|
|
"no",
|
|
"tbd",
|
|
"unknown",
|
|
"not applicable",
|
|
"not available",
|
|
"not disclosed",
|
|
}
|
|
)
|
|
|
|
_REDACTED_NAME_MARKERS = frozenset(
|
|
{
|
|
"redacted",
|
|
"redact",
|
|
"privacy",
|
|
"whoisguard",
|
|
"data protected",
|
|
"data protection",
|
|
"non-public data",
|
|
"withheld for",
|
|
"domains by proxy",
|
|
"by proxy",
|
|
"proxy protection",
|
|
"identity protection",
|
|
"domain protection",
|
|
"private registration",
|
|
"registration private",
|
|
"registrant private",
|
|
"gdpr",
|
|
"statutory masking",
|
|
"masking enabled",
|
|
"obscured whois",
|
|
"privacydotlink",
|
|
"anonymize",
|
|
"anonymised",
|
|
"anonymized",
|
|
}
|
|
)
|
|
|
|
_REDACTED_EMAIL_MARKERS = frozenset(
|
|
{
|
|
"redacted",
|
|
"privacy",
|
|
"whoisguard",
|
|
"proxy",
|
|
"withheld",
|
|
"gdpr",
|
|
"anonym",
|
|
}
|
|
)
|
|
|
|
|
|
def _normalize(value: str) -> str:
|
|
return _WHITESPACE_RE.sub(" ", value).strip().lower()
|
|
|
|
|
|
def is_redacted_name(value: str | None) -> bool:
|
|
if not value:
|
|
return True
|
|
normalized = _normalize(value)
|
|
if normalized in _NON_IDENTIFYING_EXACT:
|
|
return True
|
|
return any(marker in normalized for marker in _REDACTED_NAME_MARKERS)
|
|
|
|
|
|
def is_redacted_email(value: str | None) -> bool:
|
|
if not value:
|
|
return True
|
|
normalized = value.strip().lower()
|
|
if "@" not in normalized:
|
|
return True
|
|
return any(marker in normalized for marker in _REDACTED_EMAIL_MARKERS)
|
|
|
|
|
|
def clean_name(value: str | None) -> str:
|
|
if not value or is_redacted_name(value):
|
|
return ""
|
|
return value.strip()
|
|
|
|
|
|
def clean_email(value: str | None) -> str:
|
|
if not value or is_redacted_email(value):
|
|
return ""
|
|
return value.strip().lower()
|
|
|
|
|
|
CORPORATE_SUFFIXES = (
|
|
"incorporated",
|
|
"corporation",
|
|
"limited",
|
|
"holdings",
|
|
"company",
|
|
"group",
|
|
"gmbh",
|
|
"corp",
|
|
"llc",
|
|
"ltd",
|
|
"inc",
|
|
"plc",
|
|
"sas",
|
|
"sarl",
|
|
"bv",
|
|
"nv",
|
|
"ab",
|
|
"as",
|
|
"oy",
|
|
"pty",
|
|
"pte",
|
|
"srl",
|
|
"spa",
|
|
"kk",
|
|
"co",
|
|
"sa",
|
|
)
|
|
|
|
|
|
def registrant_key(value: str | None) -> str:
|
|
"""A registrant name reduced to what two records must share to be the same party."""
|
|
name = clean_name(value)
|
|
if not name:
|
|
return ""
|
|
words = [w for w in re.split(r"[^a-z0-9]+", name.lower()) if w]
|
|
while words and words[-1] in CORPORATE_SUFFIXES:
|
|
words.pop()
|
|
return "".join(words)
|
|
|
|
|
|
def redacted_name_sql(column):
|
|
"""The SQL half of is_redacted_name."""
|
|
collapsed = func.btrim(func.regexp_replace(func.lower(column), r"\s+", " ", "g"))
|
|
markers = "|".join(sorted(_REDACTED_NAME_MARKERS))
|
|
return func.coalesce(collapsed, "").in_(
|
|
sorted(_NON_IDENTIFYING_EXACT)
|
|
) | collapsed.op("~")(markers)
|
|
|
|
|
|
def registrant_key_sql(column):
|
|
"""The SQL half of registrant_key: the two must agree, or a match is invisible."""
|
|
suffixes = "|".join(CORPORATE_SUFFIXES)
|
|
key = func.regexp_replace(
|
|
func.regexp_replace(
|
|
func.lower(column),
|
|
f"((^|[^a-z0-9]+)({suffixes}))+[^a-z0-9]*$",
|
|
"",
|
|
"g",
|
|
),
|
|
"[^a-z0-9]",
|
|
"",
|
|
"g",
|
|
)
|
|
return case((redacted_name_sql(column), literal("")), else_=key)
|