Skip to content

Commit d58f5fe

Browse files
fix: scrubNames() handle file exts better (aws#5332)
Problem: The scrubNames() function removes PII from file paths in a given string. The issue was that in certain cases where the file path extension was composed of multiple extensions, no file extension would be used. So instead of 'x.ext1.ext2' -> 'x.ext2', we would just get 'x'. Solution: Preserve the last file extension. Also, this indirectly fixed some of the unit tests that were returning unexpected results. Signed-off-by: Nikolas Komonen <[email protected]>
1 parent 66f55b1 commit d58f5fe

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

packages/core/src/shared/errors.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ export function getTelemetryResult(error: unknown | undefined): Result {
333333
*/
334334
export function scrubNames(s: string, username?: string) {
335335
let r = ''
336-
const fileExtRe = /\.[^.]{1,4}$/
336+
const fileExtRe = /\.[^.\/]{1,4}$/
337337
const slashdot = /^[~.]*[\/\\]*/
338338

339339
/** Allowlisted filepath segments. */
@@ -375,7 +375,6 @@ export function scrubNames(s: string, username?: string) {
375375
let scrubbed = ''
376376
// Get the frontmatter ("/", "../", "~/", or "./").
377377
const start = word.trimStart().match(slashdot)?.[0] ?? ''
378-
const fileExt = word.trimEnd().match(fileExtRe)?.[0] ?? ''
379378
pathSegments[0] = pathSegments[0].trimStart().replace(slashdot, '')
380379
for (const seg of pathSegments) {
381380
if (driveLetterRegex.test(seg)) {
@@ -391,6 +390,8 @@ export function scrubNames(s: string, username?: string) {
391390
}
392391
}
393392

393+
// includes leading '.', eg: '.json'
394+
const fileExt = pathSegments[pathSegments.length - 1].match(fileExtRe) ?? ''
394395
r += ` ${start.replace(/\\/g, '/')}${scrubbed.replace(/^[\/\\]+/, '')}${fileExt}`
395396
}
396397

packages/core/src/test/shared/errors.test.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -477,10 +477,10 @@ describe('util', function () {
477477
it('scrubNames()', async function () {
478478
const fakeUser = 'jdoe123'
479479
assert.deepStrictEqual(scrubNames('', fakeUser), '')
480-
assert.deepStrictEqual(scrubNames('a ./ b', fakeUser), 'a ././ b') // TODO: fix this
481-
assert.deepStrictEqual(scrubNames('a ../ b', fakeUser), 'a .././ b') // TODO: fix this
482-
assert.deepStrictEqual(scrubNames('a /.. b', fakeUser), 'a /.. b') // TODO: fix this
483-
assert.deepStrictEqual(scrubNames('a //..// b', fakeUser), 'a //..//.// b') // TODO: fix this
480+
assert.deepStrictEqual(scrubNames('a ./ b', fakeUser), 'a ./ b')
481+
assert.deepStrictEqual(scrubNames('a ../ b', fakeUser), 'a ../ b')
482+
assert.deepStrictEqual(scrubNames('a /.. b', fakeUser), 'a /.. b')
483+
assert.deepStrictEqual(scrubNames('a //..// b', fakeUser), 'a //..// b')
484484
assert.deepStrictEqual(scrubNames('a / b', fakeUser), 'a / b')
485485
assert.deepStrictEqual(scrubNames('a ~/ b', fakeUser), 'a ~/ b')
486486
assert.deepStrictEqual(scrubNames('a //// b', fakeUser), 'a //// b')
@@ -501,6 +501,9 @@ describe('util', function () {
501501
assert.deepStrictEqual(scrubNames('/Users/user1/foo.jso (?)', fakeUser), '/Users/x/x.jso (?)')
502502
assert.deepStrictEqual(scrubNames('/Users/user1/foo.js (?)', fakeUser), '/Users/x/x.js (?)')
503503
assert.deepStrictEqual(scrubNames('/Users/user1/foo.longextension (?)', fakeUser), '/Users/x/x (?)')
504+
assert.deepStrictEqual(scrubNames('/Users/user1/foo.ext1.ext2.ext3', fakeUser), '/Users/x/x.ext3')
505+
assert.deepStrictEqual(scrubNames('/Users/user1/extMaxLength.1234', fakeUser), '/Users/x/x.1234')
506+
assert.deepStrictEqual(scrubNames('/Users/user1/extExceedsMaxLength.12345', fakeUser), '/Users/x/x')
504507
assert.deepStrictEqual(scrubNames('c:\\fooß\\bar\\baz.txt', fakeUser), 'c:/xß/x/x.txt')
505508
assert.deepStrictEqual(
506509
scrubNames('uhh c:\\path with\\ spaces \\baz.. hmm...', fakeUser),

0 commit comments

Comments
 (0)