This is an automated email from the ASF dual-hosted git repository.

lilykuang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new dfab521f50 fix(embedded): Ensure guest token is passed to log endpoint 
(#20647)
dfab521f50 is described below

commit dfab521f50593b97fc778475498920552cad15dc
Author: Jack Fragassi <[email protected]>
AuthorDate: Fri Jul 8 15:17:01 2022 -0700

    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 +
 superset-frontend/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 530c710809..f102cd197d 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 b7281d0259..fd040faed0 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<T extends ParseMethod = 'json'>(
     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 0602595675..80b40da030 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 fd584c2b36..d67c681caa 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 b88d555428..14df9af778 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({

Reply via email to