From dfab521f50593b97fc778475498920552cad15dc Mon Sep 17 00:00:00 2001 From: Jack Fragassi Date: Fri, 8 Jul 2022 15:17:01 -0700 Subject: [PATCH] fix(embedded): Ensure guest token is passed to log endpoint (#20647) * Pass guest token to sendBeacon * Add tests --- .../src/connection/SupersetClient.ts | 1 + .../src/connection/SupersetClientClass.ts | 4 +++ .../superset-ui-core/src/connection/types.ts | 1 + .../src/middleware/logger.test.js | 35 +++++++++++++++++++ .../src/middleware/loggerMiddleware.js | 4 +++ 5 files changed, 45 insertions(+) diff --git a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts index 530c71080906..f102cd197dab 100644 --- a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts +++ b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts @@ -44,6 +44,7 @@ const SupersetClient: SupersetClientInterface = { get: request => getInstance().get(request), init: force => getInstance().init(force), isAuthenticated: () => getInstance().isAuthenticated(), + getGuestToken: () => getInstance().getGuestToken(), post: request => getInstance().post(request), postForm: (...args) => getInstance().postForm(...args), put: request => getInstance().put(request), diff --git a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts index b7281d025903..fd040faed042 100644 --- a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts +++ b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts @@ -158,6 +158,10 @@ export default class SupersetClientClass { return this.csrfToken !== null && this.csrfToken !== undefined; } + getGuestToken() { + return this.guestToken; + } + async get( requestConfig: RequestConfig & { parseMethod?: T }, ) { diff --git a/superset-frontend/packages/superset-ui-core/src/connection/types.ts b/superset-frontend/packages/superset-ui-core/src/connection/types.ts index 06025956754d..80b40da030c2 100644 --- a/superset-frontend/packages/superset-ui-core/src/connection/types.ts +++ b/superset-frontend/packages/superset-ui-core/src/connection/types.ts @@ -152,6 +152,7 @@ export interface SupersetClientInterface | 'init' | 'isAuthenticated' | 'reAuthenticate' + | 'getGuestToken' > { configure: (config?: ClientConfig) => SupersetClientInterface; reset: () => void; diff --git a/superset-frontend/src/middleware/logger.test.js b/superset-frontend/src/middleware/logger.test.js index fd584c2b36ac..d67c681caaf1 100644 --- a/superset-frontend/src/middleware/logger.test.js +++ b/superset-frontend/src/middleware/logger.test.js @@ -109,4 +109,39 @@ describe('logger middleware', () => { SupersetClient.post.getCall(0).args[0].postPayload.events, ).toHaveLength(3); }); + + it('should use navigator.sendBeacon if it exists', () => { + const clock = sinon.useFakeTimers(); + const beaconMock = jest.fn(); + Object.defineProperty(navigator, 'sendBeacon', { + writable: true, + value: beaconMock, + }); + + logger(mockStore)(next)(action); + expect(beaconMock.mock.calls.length).toBe(0); + clock.tick(2000); + + expect(beaconMock.mock.calls.length).toBe(1); + const endpoint = beaconMock.mock.calls[0][0]; + expect(endpoint).toMatch('/superset/log/'); + }); + + it('should pass a guest token to sendBeacon if present', () => { + const clock = sinon.useFakeTimers(); + const beaconMock = jest.fn(); + Object.defineProperty(navigator, 'sendBeacon', { + writable: true, + value: beaconMock, + }); + SupersetClient.configure({ guestToken: 'token' }); + + logger(mockStore)(next)(action); + expect(beaconMock.mock.calls.length).toBe(0); + clock.tick(2000); + expect(beaconMock.mock.calls.length).toBe(1); + + const formData = beaconMock.mock.calls[0][1]; + expect(formData.getAll('guest_token')[0]).toMatch('token'); + }); }); diff --git a/superset-frontend/src/middleware/loggerMiddleware.js b/superset-frontend/src/middleware/loggerMiddleware.js index b88d55542851..14df9af7788a 100644 --- a/superset-frontend/src/middleware/loggerMiddleware.js +++ b/superset-frontend/src/middleware/loggerMiddleware.js @@ -44,6 +44,10 @@ const sendBeacon = events => { if (navigator.sendBeacon) { const formData = new FormData(); formData.append('events', safeStringify(events)); + if (SupersetClient.getGuestToken()) { + // if we have a guest token, we need to send it for auth via the form + formData.append('guest_token', SupersetClient.getGuestToken()); + } navigator.sendBeacon(endpoint, formData); } else { SupersetClient.post({