#!/usr/bin/env python3 """Replace $e->getMessage() in client-facing JSON/echo responses with generic error + error_log.""" import os, re, glob BACKEND = "/Users/hamzaaleghwairyeen/development/App/Siro/backend" def fix_file(fpath): with open(fpath) as f: content = f.read() original = content base = os.path.basename(fpath) # Add error_log before any line that does jsonError/echo with $e->getMessage() inside a catch block # Pattern: catch (...) {\n jsonError/echo(... $e->getMessage() ) content = re.sub( r'(catch\s*\((?:PDOException|Exception|\\Exception|Throwable)\s*\$\w+\)\s*\{)\n(\s*)(jsonError|echo)\s*\(', lambda m: f"{m.group(1)}\n{m.group(2)}error_log(\"[{base}] \" . $e->getMessage());\n{m.group(2)}{m.group(3)}(", content, ) # Replace jsonError("... " . $e->getMessage()) with generic message content = re.sub( r'jsonError\s*\(\s*"[^"]*"\s*\.\s*\$\w+->getMessage\s*\(\s*\)\s*\)', 'jsonError("An internal error occurred. Please try again later.")', content, ) # Replace jsonError($e->getMessage()) content = re.sub( r'jsonError\s*\(\s*\$\w+->getMessage\s*\(\s*\)\s*\)', 'jsonError("An internal error occurred. Please try again later.")', content, ) # Replace echo "... " . $e->getMessage() content = re.sub( r'echo\s+"[^"]*"\s*\.\s*\$\w+->getMessage\s*\(\s*\)', 'echo "An internal error occurred"', content, ) # Replace echo $e->getMessage() content = re.sub( r'echo\s+\$\w+->getMessage\s*\(\s*\)', 'echo "An internal error occurred"', content, ) # Replace json_encode with $e->getMessage() in response content = re.sub( r'(json_encode\s*\(\s*(?:array\s*\(|\[)[^)]*"message"\s*=>?\s*)"[^"]*"\s*\.\s*\$\w+->getMessage\s*\(\s*\)([^)]*[)\]]\s*\))', r'\1"An internal error occurred"\2', content, ) content = re.sub( r'(json_encode\s*\(\s*(?:array\s*\(|\[)[^)]*"message"\s*=>?\s*)\$\w+->getMessage\s*\(\s*\)([^)]*[)\]]\s*\))', r'\1"An internal error occurred"\2', content, ) if content != original: with open(fpath, 'w') as f: f.write(content) return True return False fixed = 0 for fpath in glob.glob(os.path.join(BACKEND, '**/*.php'), recursive=True): if '/vendor/' in fpath: continue if fix_file(fpath): fixed += 1 rel = os.path.relpath(fpath, BACKEND) print(f" {rel}") print(f"\nFixed: {fixed} files")