| import re |
| import os |
|
|
| def sanitize_error_message(error_text: str) -> str: |
| """ |
| Remove sensitive information from error messages to prevent API key exposure. |
| """ |
| if not error_text: |
| return "An unknown error occurred" |
| |
| sanitized = error_text |
| |
| api_key_patterns = [ |
| r'(Bearer\s+)[A-Za-z0-9_\-]+', |
| r'(bearer\s+)[A-Za-z0-9_\-]+', |
| r'(api_key["\']?\s*[:=]\s*["\']?)[A-Za-z0-9_\-]+', |
| r'(api-key["\']?\s*[:=]\s*["\']?)[A-Za-z0-9_\-]+', |
| r'gsk_[A-Za-z0-9_\-]{20,}', |
| r'(pin_[A-Za-z0-9_\-]{20,})', |
| r'(hf_[A-Za-z0-9]{20,})', |
| r'(github_pat_[A-Za-z0-9_\-]{20,})', |
| r'(xox[baprs]-[A-Za-z0-9]{10,})', |
| ] |
| |
| for pattern in api_key_patterns: |
| sanitized = re.sub(pattern, r'\1[REDACTED]', sanitized) |
| |
| return sanitized |
|
|
|
|
| def safe_error_response(original_error: str, user_message: str = "An error occurred while processing your request") -> str: |
| """ |
| Return a safe error message to the user without exposing sensitive data. |
| """ |
| return user_message |
|
|
|
|
| def log_sanitized_error(logger, error_text: str, extra_context: str = ""): |
| """ |
| Log an error message with sensitive data redacted. |
| """ |
| sanitized = sanitize_error_message(error_text) |
| if extra_context: |
| logger.error(f"{extra_context}: {sanitized}") |
| else: |
| logger.error(sanitized) |
|
|