|
| 1 | +(function executeRule(current, previous /*null when async*/) { |
| 2 | + |
| 3 | + |
| 4 | + |
| 5 | + // Only run if description has a value |
| 6 | + if (current.description) { |
| 7 | + var desc = current.description.toString(); |
| 8 | + |
| 9 | + |
| 10 | + // Regex patterns for sensitive data |
| 11 | + var ccRegex = /\b\d{13,16}\b/g; // 13–16 continuous digits |
| 12 | + var ccSpaced = /\b(\d{4}[- ]?){3}\d{4}\b/g; // 4-4-4-4 with spaces/dashes |
| 13 | + var ssnRegex = /\b\d{3}-\d{2}-\d{4}\b/g; // US SSN |
| 14 | + var phoneRegex = /(\+?\d{1,2}[- ]?)?\(?\d{3}\)?[- ]?\d{3}[- ]?\d{4}/g; // phone |
| 15 | + |
| 16 | + var masked = desc; |
| 17 | + |
| 18 | + // Apply masking with messages |
| 19 | + if (ccRegex.test(desc)) { |
| 20 | + gs.addInfoMessage("Credit card pattern found → masking"); |
| 21 | + masked = masked.replace(ccRegex, "****-****-****-****"); |
| 22 | + } |
| 23 | + |
| 24 | + if (ccSpaced.test(desc)) { |
| 25 | + gs.addInfoMessage("Spaced/dashed credit card pattern found → masking"); |
| 26 | + masked = masked.replace(ccSpaced, "****-****-****-****"); |
| 27 | + } |
| 28 | + |
| 29 | + if (ssnRegex.test(desc)) { |
| 30 | + gs.addInfoMessage("SSN pattern found → masking"); |
| 31 | + masked = masked.replace(ssnRegex, "***-**-****"); |
| 32 | + } |
| 33 | + |
| 34 | + if (phoneRegex.test(desc)) { |
| 35 | + gs.addInfoMessage("Phone number pattern found → masking"); |
| 36 | + masked = masked.replace(phoneRegex, "**********"); |
| 37 | + } |
| 38 | + |
| 39 | + // If changes were made, update the description |
| 40 | + if (masked !== desc) { |
| 41 | + current.description = masked; |
| 42 | + gs.addInfoMessage("Final masked description: " + masked); |
| 43 | + gs.log("Masking rule triggered on record: " + current.number, "MaskingRule"); |
| 44 | + } else { |
| 45 | + gs.addInfoMessage("No sensitive data detected, nothing masked."); |
| 46 | + } |
| 47 | + } |
| 48 | + |
| 49 | +})(current, previous); |
0 commit comments