Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion privacy.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@ function redactSensitive(text, { issue = false, preserveOfficialEmails = false }
out = out.replace(/https:\/\/(?:cdn\.discordapp\.com|media\.discordapp\.net)\/attachments\/[^\s)]+/gi, '[attachment in Discord]');
out = out.replace(/<@!?\d+>|<@&\d+>|(?<![\w.])@[A-Za-z0-9_.-]{2,32}/g, '[Discord user]');
out = out.replace(/\b(?:Discord\s+)?user(?:name)?\s*[:=]\s*[^\s,;]+/gi, '[Discord user]');
out = out.replace(/\b(?:order|ticket)\s*(?:number|no\.?|id|#)?\s*[:#]?\s*\d{3,}\b/gi, '[order number]');
// "order 22777" and "order number: 22777", and the same said in a sentence: "order number is 22777".
out = out.replace(
/\b(?:order|ticket)\s*(?:number|no\.?|id|#)?\s*(?:[:#]?\s*\d{3,}|(?:is|was|=|-)\s*#?\s*\d{4,})\b/gi,
'[order number]'
);
out = out.replace(/(?<!\w)#\d{4,}\b/g, (match, offset, source) =>
/\b(?:PR|pull request|(?:GitHub\s+)?issue)\s*$/i.test(source.slice(Math.max(0, offset - 30), offset)) ? match : '[order number]');
out = out.replace(/\b(?:sk-[A-Za-z0-9_-]{8,}|ghp_[A-Za-z0-9_]{8,}|github_pat_[A-Za-z0-9_]{8,}|xox[baprs]-[A-Za-z0-9-]{8,}|AIza[A-Za-z0-9_-]{16,}|user_[A-Za-z0-9]{20,})\b/g, '[token]');
Expand Down
14 changes: 14 additions & 0 deletions test/privacy.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,20 @@ test('provider redaction keeps support placeholders while removing short interna
assert.match(out, /\[phone\].*\[order number\].*\[token\]/);
});

test('an order or ticket number given in a sentence is redacted like one given after a colon', () => {
const input = 'My order number is 22777 and the ticket number was 138637367. Order ID is 31415, order no. is #27182.';
const out = redactSensitive(input, { issue: true });
for (const value of ['22777', '138637367', '31415', '27182']) {
assert.equal(out.includes(value), false, value);
}
assert.equal((out.match(/\[order number\]/g) || []).length, 4);
});

test('a price or a count after "order was" is not taken for an order number', () => {
const kept = 'My order was 299 dollars and the order is 2 weeks late.';
assert.equal(redactSensitive(kept, { issue: true }), kept);
});

test('public repository issue numbers survive while customer ticket numbers do not', () => {
const out = redactSensitive('GitHub issue #20172; support ticket #138637367; Order #18063', { issue: true });
assert.match(out, /GitHub issue #20172/);
Expand Down