diff --git a/api/tests/test_secret_guard.py b/api/tests/test_secret_guard.py index e7b2156..36aa3fb 100644 --- a/api/tests/test_secret_guard.py +++ b/api/tests/test_secret_guard.py @@ -146,3 +146,11 @@ def test_warn_kinds_do_not_block(monkeypatch): assert sg.status_for([f], True)[0] == "success" monkeypatch.setattr(sg, "WARN_KINDS", set()) assert sg.status_for([f], True)[0] == "failure" + + +def test_pypi_token_shape_hash_only(): + tok = "pypi-AgE" + "Ab1_-" * 20 # synthetic + got = ss.find(f"password = {tok}") + assert [k for k, _ in got] == ["pypi token"] and got[0][1] == ss.h8(tok) + assert tok not in repr(got) + assert ss.find("pypi-AgE-too-short") == [] diff --git a/scripts/secret_shapes.py b/scripts/secret_shapes.py index 533f9ba..d63efe5 100644 --- a/scripts/secret_shapes.py +++ b/scripts/secret_shapes.py @@ -23,13 +23,14 @@ PATTERNS: list[tuple[str, re.Pattern[str]]] = [ ("twilio sid/api key", re.compile(r"\b(?:AC|SK)[0-9a-f]{32}\b")), ("32-hex secret assignment", re.compile( r"(?i)\b[a-z0-9_.-]*(?:token|secret|key|password)[a-z0-9_.-]*[\"']?\s*[:=]\s*[\"']?(?P(? str: