import re import os from pathlib import Path from config import settings # Patterns resolved from env _REDACT_PATTERNS = settings.spooler_redact_patterns.split(",") _REDACTORS = [] def _build_redactors(): global _REDACTORS for pat in _REDACT_PATTERNS: pat = pat.strip() if pat == "api_key": # Matches common key formats _REDACTORS.append( (re.compile(r"(?i)(api[_-]?key|token|secret|password)\s*[:=]\s*['\"]?[\w\-]{8,}['\"]?"), "[REDACTED]") ) elif pat == "path": # Redact home dirs and usernames in paths _REDACTORS.append( (re.compile(r"/home/[^/]+|C:\\Users\\[^\\]+"), "[REDACTED_PATH]") ) elif pat == "base64": # Long base64-ish strings _REDACTORS.append( (re.compile(r"[A-Za-z0-9+/]{60,}={0,2}"), "[BASE64_REDACTED]") ) _build_redactors() def redact(text: str) -> str: for pattern, replacement in _REDACTORS: text = pattern.sub(replacement, text) return text