|
1 | 1 | import re |
2 | 2 |
|
3 | 3 | _SECRET_KEYS = ( |
4 | | - r"(api_?key|access_?token|auth_?token|refresh_?token|session_?id|secret|password)" |
| 4 | + r"(?:api_?key|access_?token|auth_?token|refresh_?token|session_?id|secret|password)" |
5 | 5 | ) |
6 | 6 |
|
7 | 7 | _JSON_FIELD_PATTERN = re.compile( |
8 | | - rf"(?i)(['\"])({_SECRET_KEYS})\1\s*:\s*(['\"])[^'\"]+\3" |
| 8 | + rf"(?i)(?P<prefix>(?P<kq>['\"]){_SECRET_KEYS}(?P=kq)\s*:\s*)(?P<vq>['\"])(?P<value>[^'\"]+)(?P=vq)" |
9 | 9 | ) |
10 | 10 | _AUTH_JSON_FIELD_PATTERN = re.compile( |
11 | | - r"(?i)(['\"])authorization\1\s*:\s*(['\"])bearer\s+[^'\"]+\2" |
| 11 | + r"(?i)(?P<prefix>(?P<kq>['\"])authorization(?P=kq)\s*:\s*)(?P<vq>['\"])bearer\s+[^'\"]+(?P=vq)" |
| 12 | +) |
| 13 | +_QUERY_FIELD_PATTERN = re.compile( |
| 14 | + rf"(?i)(?P<prefix>{_SECRET_KEYS}\s*=\s*)(?P<value>[^&'\" ]+)" |
12 | 15 | ) |
13 | | -_QUERY_FIELD_PATTERN = re.compile(rf"(?i)\b{_SECRET_KEYS}\s*=\s*[^&'\" ]+") |
14 | 16 | _QUERY_PARAM_PATTERN = re.compile( |
15 | | - r"(?i)([?&](?:api_?key|key|access_?token|auth_?token))=[^&'\" ]+" |
| 17 | + r"(?i)(?P<prefix>[?&](?:api_?key|key|access_?token|auth_?token)=)(?P<value>[^&'\" ]+)" |
16 | 18 | ) |
17 | 19 | _AUTH_HEADER_PATTERN = re.compile( |
18 | | - r"(?i)\bauthorization\s*:\s*bearer\s+[A-Za-z0-9._\-]+" |
| 20 | + r"(?i)(?P<prefix>\bauthorization\s*:\s*bearer\s+)(?P<token>[A-Za-z0-9._\-]+)" |
19 | 21 | ) |
20 | | -_BEARER_PATTERN = re.compile(r"(?i)\bbearer\s+[A-Za-z0-9._\-]+") |
| 22 | +_BEARER_PATTERN = re.compile(r"(?i)(?P<prefix>\bbearer\s+)(?P<token>[A-Za-z0-9._\-]+)") |
21 | 23 | _SK_PATTERN = re.compile(r"\bsk-[A-Za-z0-9]{16,}\b") |
22 | 24 |
|
23 | 25 |
|
| 26 | +def _redact_json_field(match: re.Match[str]) -> str: |
| 27 | + quote = match.group("vq") |
| 28 | + return f"{match.group('prefix')}{quote}[REDACTED]{quote}" |
| 29 | + |
| 30 | + |
| 31 | +def _redact_auth_json_field(match: re.Match[str]) -> str: |
| 32 | + quote = match.group("vq") |
| 33 | + return f"{match.group('prefix')}{quote}Bearer [REDACTED]{quote}" |
| 34 | + |
| 35 | + |
| 36 | +def _redact_prefixed_value(match: re.Match[str]) -> str: |
| 37 | + return f"{match.group('prefix')}[REDACTED]" |
| 38 | + |
| 39 | + |
| 40 | +def _redact_bearer_token(match: re.Match[str]) -> str: |
| 41 | + return f"{match.group('prefix')}[REDACTED]" |
| 42 | + |
| 43 | + |
24 | 44 | def _redact_json_like(text: str) -> str: |
25 | | - text = _JSON_FIELD_PATTERN.sub("[REDACTED]", text) |
26 | | - return _AUTH_JSON_FIELD_PATTERN.sub("[REDACTED]", text) |
| 45 | + text = _JSON_FIELD_PATTERN.sub(_redact_json_field, text) |
| 46 | + return _AUTH_JSON_FIELD_PATTERN.sub(_redact_auth_json_field, text) |
27 | 47 |
|
28 | 48 |
|
29 | 49 | def _redact_query_like(text: str) -> str: |
30 | | - text = _QUERY_FIELD_PATTERN.sub("[REDACTED]", text) |
31 | | - return _QUERY_PARAM_PATTERN.sub("[REDACTED]", text) |
| 50 | + text = _QUERY_FIELD_PATTERN.sub(_redact_prefixed_value, text) |
| 51 | + return _QUERY_PARAM_PATTERN.sub(_redact_prefixed_value, text) |
32 | 52 |
|
33 | 53 |
|
34 | 54 | def _redact_tokens(text: str) -> str: |
35 | | - text = _AUTH_HEADER_PATTERN.sub("[REDACTED]", text) |
36 | | - text = _BEARER_PATTERN.sub("[REDACTED]", text) |
| 55 | + text = _AUTH_HEADER_PATTERN.sub(_redact_bearer_token, text) |
| 56 | + text = _BEARER_PATTERN.sub(_redact_bearer_token, text) |
37 | 57 | return _SK_PATTERN.sub("[REDACTED]", text) |
38 | 58 |
|
39 | 59 |
|
|
0 commit comments