Skip to content

Commit 7903e58

Browse files
refactor(logging): extract maskSensitiveData() to helpers (#398)
Extracted complex inline regex masking logic from loggingDatabaseOperations to a reusable maskSensitiveData function in helpers.ts. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
1 parent 5444010 commit 7903e58

2 files changed

Lines changed: 30 additions & 18 deletions

File tree

src/helpers.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,4 +206,32 @@ export function uiKindToString(uiKind: vsc.UIKind): 'web' | 'desktop' {
206206
return uiKind === vsc.UIKind.Web ? 'web' : 'desktop';
207207
}
208208

209+
// ============================================================================
210+
// PII/Secret Masking Utilities
211+
// ============================================================================
212+
213+
const EMAIL_REGEX = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
214+
const PHONE_REGEX = /(\+?\d{1,3}[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}/g;
215+
const API_KEY_REGEX = /\b(sk_live_|sk_test_|api_key_|token_|secret_|key_)[a-zA-Z0-9]{10,}\b/gi;
216+
const HEX_REGEX = /\b[a-fA-F0-9]{32,}\b/g;
217+
const CC_REGEX = /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g;
218+
const SSN_REGEX = /\b\d{3}-\d{2}-\d{4}\b/g;
219+
220+
/**
221+
* Masks sensitive data like emails, phone numbers, API keys, hex strings,
222+
* credit card numbers, and SSNs in a given string.
223+
*
224+
* @param message - The string to mask
225+
* @returns The masked string
226+
*/
227+
export function maskSensitiveData(message: string): string {
228+
let safeMessage = message;
229+
safeMessage = safeMessage.replace(EMAIL_REGEX, '***@***.***');
230+
safeMessage = safeMessage.replace(PHONE_REGEX, '***-***-****');
231+
safeMessage = safeMessage.replace(API_KEY_REGEX, '$1[REDACTED]');
232+
safeMessage = safeMessage.replace(HEX_REGEX, '[REDACTED_HEX]');
233+
safeMessage = safeMessage.replace(CC_REGEX, '****-****-****-****');
234+
safeMessage = safeMessage.replace(SSN_REGEX, '***-**-****');
235+
return safeMessage;
236+
}
209237

src/loggingDatabaseOperations.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
import * as vsc from 'vscode';
9+
import { maskSensitiveData } from './helpers';
910
import type {
1011
DatabaseOperations,
1112
CellValue,
@@ -78,24 +79,7 @@ export class LoggingDatabaseOperations implements DatabaseOperations {
7879

7980
// Basic PII/Secret masking in the log message itself if it contains SQL values directly
8081
// This is a heuristic attempt to mask email-like or key-like patterns in raw SQL
81-
let safeMessage = message;
82-
83-
// Mask email addresses
84-
safeMessage = safeMessage.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, '***@***.***');
85-
86-
// Mask phone numbers (various formats: +1-234-567-8901, (234) 567-8901, 234.567.8901, etc.)
87-
safeMessage = safeMessage.replace(/(\+?\d{1,3}[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}/g, '***-***-****');
88-
89-
// Mask API keys / tokens (long alphanumeric strings that look like secrets, 20+ chars)
90-
// Match patterns like: sk_live_xxx, api_key_xxx, or generic hex/base64 tokens
91-
safeMessage = safeMessage.replace(/\b(sk_live_|sk_test_|api_key_|token_|secret_|key_)[a-zA-Z0-9]{10,}\b/gi, '$1[REDACTED]');
92-
safeMessage = safeMessage.replace(/\b[a-fA-F0-9]{32,}\b/g, '[REDACTED_HEX]');
93-
94-
// Mask credit card numbers (basic pattern: 16 digits with optional separators)
95-
safeMessage = safeMessage.replace(/\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g, '****-****-****-****');
96-
97-
// Mask SSN patterns (###-##-####)
98-
safeMessage = safeMessage.replace(/\b\d{3}-\d{2}-\d{4}\b/g, '***-**-****');
82+
const safeMessage = maskSensitiveData(message);
9983

10084
this.outputChannel.appendLine(`${timestamp} ${type} [${this.filename}] ${safeMessage}`);
10185
}

0 commit comments

Comments
 (0)