From 4c3bf5c085a12c6ea8a1986de4df4120134014fd Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Tue, 27 Jul 2021 08:38:55 +0000 Subject: [PATCH 1/2] fix(core): Skip anonymous callbacks while searching frame URLs. --- .../core/src/integrations/inboundfilters.ts | 19 ++++++++++-- .../lib/integrations/inboundfilters.test.ts | 31 +++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/packages/core/src/integrations/inboundfilters.ts b/packages/core/src/integrations/inboundfilters.ts index 61dfad5f47fd..7d49e3677c23 100644 --- a/packages/core/src/integrations/inboundfilters.ts +++ b/packages/core/src/integrations/inboundfilters.ts @@ -1,5 +1,5 @@ import { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub'; -import { Event, Integration } from '@sentry/types'; +import { Event, Integration, StackFrame } from '@sentry/types'; import { getEventDescription, isMatchingPattern, logger } from '@sentry/utils'; // "Script error." is hard coded into browsers for errors that it can't read. @@ -189,17 +189,30 @@ export class InboundFilters implements Integration { return []; } + /** JSDoc */ + private _getLastUrl(frames: StackFrame[]): string | null { + for (let i = frames.length - 1; i >= 0; i--) { + const frame = frames[i]; + + if (frame?.filename !== '') { + return frame.filename || null; + } + } + + return null; + } + /** JSDoc */ private _getEventFilterUrl(event: Event): string | null { try { if (event.stacktrace) { const frames = event.stacktrace.frames; - return (frames && frames[frames.length - 1].filename) || null; + return frames ? this._getLastUrl(frames) : null; } if (event.exception) { const frames = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames; - return (frames && frames[frames.length - 1].filename) || null; + return frames ? this._getLastUrl(frames) : null; } return null; } catch (oO) { diff --git a/packages/core/test/lib/integrations/inboundfilters.test.ts b/packages/core/test/lib/integrations/inboundfilters.test.ts index 75b6ad848fd8..283ae7404140 100644 --- a/packages/core/test/lib/integrations/inboundfilters.test.ts +++ b/packages/core/test/lib/integrations/inboundfilters.test.ts @@ -456,5 +456,36 @@ describe('InboundFilters', () => { ), ).toBe(true); }); + + it('should search for script names when there is an anonymous callback at the last frame', () => { + const messageEvent = { + message: 'any', + stacktrace: { + frames: [ + { filename: 'https://our-side.com/js/bundle.js' }, + { filename: 'https://awesome-analytics.io/some/file.js' }, + { filename: '' }, + ], + }, + }; + + expect( + inboundFilters._isAllowedUrl( + messageEvent, + inboundFilters._mergeOptions({ + allowUrls: ['https://awesome-analytics.io/some/file.js'], + }), + ), + ).toBe(true); + + expect( + inboundFilters._isDeniedUrl( + messageEvent, + inboundFilters._mergeOptions({ + denyUrls: ['https://awesome-analytics.io/some/file.js'], + }), + ), + ).toBe(true); + }); }); }); From 61237e8bc97780fef8eae4d06455abcbd92de4c4 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Tue, 27 Jul 2021 13:11:50 +0300 Subject: [PATCH 2/2] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kamil Ogórek --- packages/core/src/integrations/inboundfilters.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/integrations/inboundfilters.ts b/packages/core/src/integrations/inboundfilters.ts index 7d49e3677c23..fec0265e499b 100644 --- a/packages/core/src/integrations/inboundfilters.ts +++ b/packages/core/src/integrations/inboundfilters.ts @@ -190,7 +190,7 @@ export class InboundFilters implements Integration { } /** JSDoc */ - private _getLastUrl(frames: StackFrame[]): string | null { + private _getLastValidUrl(frames: StackFrame[] = []): string | null { for (let i = frames.length - 1; i >= 0; i--) { const frame = frames[i]; @@ -207,12 +207,12 @@ export class InboundFilters implements Integration { try { if (event.stacktrace) { const frames = event.stacktrace.frames; - return frames ? this._getLastUrl(frames) : null; + return this._getLastValidUrl(frames); } if (event.exception) { const frames = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames; - return frames ? this._getLastUrl(frames) : null; + return this._getLastValidUrl(frames); } return null; } catch (oO) {