Skip to content

Commit e81d70a

Browse files
committed
Fixes #12694 regex replace strips filepath when approot is configured as PIIPath
1 parent 8500a85 commit e81d70a

File tree

2 files changed

+66
-3
lines changed

2 files changed

+66
-3
lines changed

src/vs/platform/telemetry/common/telemetryService.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,16 @@ export class TelemetryService implements ITelemetryService {
5454
// #1 `file:///DANGEROUS/PATH/resources/app/Useful/Information`
5555
// #2 // Any other file path that doesn't match the approved form above should be cleaned.
5656
// #3 "Error: ENOENT; no such file or directory" is often followed with PII, clean it
57-
for (let piiPath of this._piiPaths) {
58-
this._cleanupPatterns.push([new RegExp(escapeRegExpCharacters(piiPath), 'gi'), '']);
59-
}
6057
this._cleanupPatterns.push(
6158
[/file:\/\/\/.*?\/resources\/app\//gi, ''],
6259
[/file:\/\/\/.*/gi, ''],
6360
[/ENOENT: no such file or directory.*?\'([^\']+)\'/gi, 'ENOENT: no such file or directory']
6461
);
6562

63+
for (let piiPath of this._piiPaths) {
64+
this._cleanupPatterns.push([new RegExp(escapeRegExpCharacters(piiPath), 'gi'), '']);
65+
}
66+
6667
if (this._configurationService) {
6768
this._updateUserOptIn();
6869
this._configurationService.onDidUpdateConfiguration(this._updateUserOptIn, this, this._disposables);

src/vs/platform/telemetry/test/node/telemetryService.test.ts

+62
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,68 @@ suite('TelemetryService', () => {
433433
service.dispose();
434434
}));
435435

436+
test('Unexpected Error Telemetry removes PII but preserves Code file path when PIIPath is configured', sinon.test(function () {
437+
438+
let origErrorHandler = Errors.errorHandler.getUnexpectedErrorHandler();
439+
Errors.setUnexpectedErrorHandler(() => { });
440+
441+
try {
442+
let settings = new ErrorTestingSettings();
443+
let testAppender = new TestTelemetryAppender();
444+
let service = new TelemetryService({ appender: testAppender, piiPaths: [ settings.personalInfo + '/resources/app/' ] }, undefined);
445+
const errorTelemetry = new ErrorTelemetry(service);
446+
447+
let dangerousPathWithImportantInfoError: any = new Error(settings.dangerousPathWithImportantInfo);
448+
dangerousPathWithImportantInfoError.stack = settings.stack;
449+
450+
// Test that important information remains but personal info does not
451+
Errors.onUnexpectedError(dangerousPathWithImportantInfoError);
452+
this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT);
453+
454+
assert.notEqual(testAppender.events[0].data.message.indexOf(settings.importantInfo), -1);
455+
assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1);
456+
assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1);
457+
assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.importantInfo), -1);
458+
assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1);
459+
assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1);
460+
assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4]), -1);
461+
assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length);
462+
463+
errorTelemetry.dispose();
464+
service.dispose();
465+
}
466+
finally {
467+
Errors.setUnexpectedErrorHandler(origErrorHandler);
468+
}
469+
}));
470+
471+
test('Uncaught Error Telemetry removes PII but preserves Code file path when PIIPath is configured', sinon.test(function () {
472+
let errorStub = this.stub(window, 'onerror');
473+
let settings = new ErrorTestingSettings();
474+
let testAppender = new TestTelemetryAppender();
475+
let service = new TelemetryService({ appender: testAppender, piiPaths: [ settings.personalInfo + '/resources/app/' ] }, undefined);
476+
const errorTelemetry = new ErrorTelemetry(service);
477+
478+
let dangerousPathWithImportantInfoError: any = new Error('dangerousPathWithImportantInfo');
479+
dangerousPathWithImportantInfoError.stack = settings.stack;
480+
(<any>window.onerror)(settings.dangerousPathWithImportantInfo, 'test.js', 2, 42, dangerousPathWithImportantInfoError);
481+
this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT);
482+
483+
assert.equal(errorStub.callCount, 1);
484+
// Test that important information remains but personal info does not
485+
assert.notEqual(testAppender.events[0].data.message.indexOf(settings.importantInfo), -1);
486+
assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1);
487+
assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1);
488+
assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.importantInfo), -1);
489+
assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1);
490+
assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1);
491+
assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4]), -1);
492+
assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length);
493+
494+
errorTelemetry.dispose();
495+
service.dispose();
496+
}));
497+
436498
test('Unexpected Error Telemetry removes PII but preserves Missing Model error message', sinon.test(function () {
437499

438500
let origErrorHandler = Errors.errorHandler.getUnexpectedErrorHandler();

0 commit comments

Comments
 (0)