From 85ee40eee2fbf5a1e0ef2ec50456bb35ecffe079 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:40:29 +0000 Subject: [PATCH 1/2] Update regex patterns to securely redact PII --- package-lock.json | 10 +++++----- package.json | 4 ++-- src/helpers.ts | 6 +++--- tests/unit/helpers.test.ts | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a0212d..5d4cefd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sqlite-explorer", - "version": "1.3.5", + "version": "1.5.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sqlite-explorer", - "version": "1.3.5", + "version": "1.5.2", "funding": [ { "type": "github", @@ -241,9 +241,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 94f6543..5f5b3bb 100644 --- a/package.json +++ b/package.json @@ -102,14 +102,14 @@ "sqliteExplorer.defaultPageSize": { "type": "number", "minimum": 10, - "maximum": 1e5, + "maximum": 100000, "default": 500, "markdownDescription": "Default number of rows to display per page." }, "sqliteExplorer.maxRows": { "type": "number", "minimum": 0, - "maximum": 1e7, + "maximum": 10000000, "default": 0, "markdownDescription": "Maximum number of rows to load from a table. Set to 0 for unlimited." }, diff --git a/src/helpers.ts b/src/helpers.ts index 9017e16..d6fa54b 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -214,8 +214,8 @@ const EMAIL_REGEX = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g; const PHONE_REGEX = /(\+?\d{1,3}[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}/g; const API_KEY_REGEX = /\b(sk_live_|sk_test_|api_key_|token_|secret_|key_)[a-zA-Z0-9]{10,}\b/gi; const HEX_REGEX = /\b[a-fA-F0-9]{32,}\b/g; -const CC_REGEX = /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g; -const SSN_REGEX = /\b\d{3}-\d{2}-\d{4}\b/g; +const CC_REGEX = /\b(?:\d[ -]*?){13,16}\b/g; +const SSN_REGEX = /\b\d{3}[-\s]?\d{2}[-\s]?\d{4}\b/g; /** * Masks sensitive data like emails, phone numbers, API keys, hex strings, @@ -227,10 +227,10 @@ const SSN_REGEX = /\b\d{3}-\d{2}-\d{4}\b/g; export function maskSensitiveData(message: string): string { let safeMessage = message; safeMessage = safeMessage.replace(EMAIL_REGEX, '***@***.***'); + safeMessage = safeMessage.replace(CC_REGEX, '****-****-****-****'); safeMessage = safeMessage.replace(PHONE_REGEX, '***-***-****'); safeMessage = safeMessage.replace(API_KEY_REGEX, '$1[REDACTED]'); safeMessage = safeMessage.replace(HEX_REGEX, '[REDACTED_HEX]'); - safeMessage = safeMessage.replace(CC_REGEX, '****-****-****-****'); safeMessage = safeMessage.replace(SSN_REGEX, '***-**-****'); return safeMessage; } diff --git a/tests/unit/helpers.test.ts b/tests/unit/helpers.test.ts index e33766b..4ea050c 100644 --- a/tests/unit/helpers.test.ts +++ b/tests/unit/helpers.test.ts @@ -137,3 +137,20 @@ describe('uiKindToString', () => { assert.strictEqual(uiKindToString(vsc.UIKind.Desktop), 'desktop'); }); }); + +describe('maskSensitiveData', () => { + const { maskSensitiveData } = require('../../src/helpers'); + + it('should mask different formats of credit card numbers', () => { + assert.strictEqual(maskSensitiveData("My CC is 1234-5678-9012-3456"), "My CC is ****-****-****-****"); + assert.strictEqual(maskSensitiveData("My CC is 1234567890123456"), "My CC is ****-****-****-****"); + assert.strictEqual(maskSensitiveData("My CC is 1234 5678 9012 3456"), "My CC is ****-****-****-****"); + assert.strictEqual(maskSensitiveData("Amex: 378282246310005"), "Amex: ****-****-****-****"); + }); + + it('should mask different formats of SSN', () => { + assert.strictEqual(maskSensitiveData("My SSN is 123-45-6789"), "My SSN is ***-**-****"); + assert.strictEqual(maskSensitiveData("My SSN is 123 45 6789"), "My SSN is ***-**-****"); + assert.strictEqual(maskSensitiveData("My SSN is 123456789"), "My SSN is ***-**-****"); + }); +}); From 1ecf86eabcd1c08fd03ea53935ea8f9111439e66 Mon Sep 17 00:00:00 2001 From: zknpr Date: Mon, 8 Jun 2026 18:36:26 +0200 Subject: [PATCH 2/2] chore: drop unrelated package.json/lockfile changes from masking fix --- package-lock.json | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d4cefd..3a0212d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sqlite-explorer", - "version": "1.5.2", + "version": "1.3.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sqlite-explorer", - "version": "1.5.2", + "version": "1.3.5", "funding": [ { "type": "github", @@ -241,9 +241,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 5f5b3bb..94f6543 100644 --- a/package.json +++ b/package.json @@ -102,14 +102,14 @@ "sqliteExplorer.defaultPageSize": { "type": "number", "minimum": 10, - "maximum": 100000, + "maximum": 1e5, "default": 500, "markdownDescription": "Default number of rows to display per page." }, "sqliteExplorer.maxRows": { "type": "number", "minimum": 0, - "maximum": 10000000, + "maximum": 1e7, "default": 0, "markdownDescription": "Maximum number of rows to load from a table. Set to 0 for unlimited." },