From 7f4e0f29f11668b09c5343da2cbc97ac1d6d0acf Mon Sep 17 00:00:00 2001 From: leanneeliatra <131779422+leanneeliatra@users.noreply.github.com> Date: Mon, 19 Jun 2023 18:03:35 +0100 Subject: [PATCH] Switch to new tenant after loading a copied long URL (#1450) * Replace legacy template with index template (#1359) Signed-off-by: Chang Liu Signed-off-by: leanneeliatra * added loginEndPointWithPath (#1358) * added loginEndPointWithPath Signed-off-by: Mattijs Vanhaverbeke Signed-off-by: leanneeliatra * Add release notes for 1.3.9 (#1379) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * No blank backend role before adding a new one in Create User page (#1384) * Add last backend role empty check Signed-off-by: nursaadat Signed-off-by: Saadat Nursultan * Add backend role empty check Signed-off-by: nursaadat Signed-off-by: Saadat Nursultan * Add strict comparison Signed-off-by: nursaadat Signed-off-by: Saadat Nursultan * Fix lint errors Signed-off-by: nursaadat Signed-off-by: Saadat Nursultan * Add tests for backend role panel Signed-off-by: Saadat Nursultan * Fix lint errors Signed-off-by: Saadat Nursultan --------- Signed-off-by: nursaadat Signed-off-by: Saadat Nursultan Co-authored-by: nursaadat Co-authored-by: Saadat Nursultan Signed-off-by: leanneeliatra * Fix script for Windows (#1393) * Fix script for Windows Signed-off-by: nurbqq Signed-off-by: nurbqq <106753054+nurbq@users.noreply.github.com> Co-authored-by: Stephen Crawford <65832608+scrawfor99@users.noreply.github.com> Signed-off-by: leanneeliatra * Adding new actions for ppl and datasource apis (#1395) * Adding new actions for ppl and datasource apis Signed-off-by: vamsi-amazon Signed-off-by: leanneeliatra * Fix "Get started" image is not adaptive to the browser window size. (#1396) * Fixed get-started page image not adapting to the browser window size Signed-off-by: Sirazh Gabdullin * Update fix by applying suggested changes Signed-off-by: Sirazh Gabdullin * Update unit tests snapshot Signed-off-by: Sirazh Gabdullin --------- Signed-off-by: Sirazh Gabdullin Co-authored-by: Stephen Crawford <65832608+scrawfor99@users.noreply.github.com> Signed-off-by: leanneeliatra * Split up a value into multiple cookie payloads (#1352) * PoC for splitting up a value into multiple cookie payloads Signed-off-by: Jochen Kressin * Cookie splitting for OpenId and SAML Signed-off-by: Jochen Kressin * Changes after review comments Signed-off-by: Jochen Kressin * WIP: First unit tests Signed-off-by: Jochen Kressin * More unit tests Signed-off-by: Jochen Kressin * Fix for multi auth, request argument was missing Signed-off-by: Jochen Kressin * Fixed linting errors Signed-off-by: Jochen Kressin * Added one additional cookie for the SAML integration tests Signed-off-by: Jochen Kressin --------- Signed-off-by: Jochen Kressin Co-authored-by: Stephen Crawford <65832608+scrawfor99@users.noreply.github.com> Signed-off-by: leanneeliatra * Dynamic tenancy configurations (#1394) * Dynamic multitenancy feature. Signed-off-by: Abhi Kalra * Dynamic multitenancy feature -PR feedback Signed-off-by: Abhi Kalra --------- Signed-off-by: Abhi Kalra Co-authored-by: Abhi Kalra Signed-off-by: leanneeliatra * Add release notes for 2.7.0 (#1407) * Add release notes for 2.7.0 Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removes tiny.amazon.com links (#1420) Signed-off-by: Darshit Chanpura Signed-off-by: leanneeliatra * Fixing dynamic tenancy changes for issues 1412 (#1419) * Fixing dynamic tenancy changes for opensearchdasbhoard.yaml Signed-off-by: Abhi Kalra Co-authored-by: Abhi Kalra Co-authored-by: Stephen Crawford <65832608+scrawfor99@users.noreply.github.com> Signed-off-by: leanneeliatra * Change the testuser's password in some integration test cases into a stronger password (#1428) * Change the testuser's password into a stronger password Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Increment version to 3.0.0.0 (#1414) Signed-off-by: opensearch-ci-bot Co-authored-by: opensearch-ci-bot Signed-off-by: leanneeliatra * Adds the newly created admin api permissions to the static dropdown list (#1426) * Adds the newly created admin api permissions to the static dropdown of permissions displayed when creating/modifying a role --------- Signed-off-by: Darshit Chanpura Co-authored-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Update account-nav-button.tsx Fix added to set the window.location to the pathname, rather than just reload & clear lastURL as it would be from the previous tenant. Signed-off-by: Leanne Lacey-Byrne Signed-off-by: leanneeliatra * Update account-nav-button.tsx Adding comments to explain changes Signed-off-by: Leanne Lacey-Byrne Signed-off-by: leanneeliatra * add new cluster permissions constants for lron (#1444) Signed-off-by: zhichao-aws Signed-off-by: leanneeliatra * removing whitespace due to linting fix Signed-off-by: Leanne Lacey-Byrne Signed-off-by: leanneeliatra * Adding tests for account-nav-button wip Signed-off-by: leanneeliatra * put commented code to original state Signed-off-by: leanneeliatra * Skip flaky SAML test as it awaits a fix (#1453) Signed-off-by: Craig Perkins Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Use version from package.json for integration tests (#1463) * Use version from package.json for integration tests Signed-off-by: Craig Perkins Signed-off-by: leanneeliatra * Adds 2.8 release notes (#1464) Signed-off-by: Darshit Chanpura Co-authored-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Adding tests to jest test for tenant switch. Putting test in correct folder and renaming function. Signed-off-by: leanneeliatra Signed-off-by: leanneeliatra * handle switch calling correct function Signed-off-by: Leanne Lacey-Byrne Signed-off-by: leanneeliatra * checking for session storage Signed-off-by: leanneeliatra Signed-off-by: leanneeliatra * adding window to make sessionStorage more explicit Signed-off-by: leanneeliatra * Moved the test into account-nav-button.test.tsx Signed-off-by: leanneeliatra * Removing additional files. Signed-off-by: leanneeliatra * Declared session storage as a constant Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Update account-nav-button.tsx Fix added to set the window.location to the pathname, rather than just reload & clear lastURL as it would be from the previous tenant. Signed-off-by: Leanne Lacey-Byrne Signed-off-by: leanneeliatra * Update account-nav-button.tsx Adding comments to explain changes Signed-off-by: Leanne Lacey-Byrne Signed-off-by: leanneeliatra * removing whitespace due to linting fix Signed-off-by: Leanne Lacey-Byrne Signed-off-by: leanneeliatra * Adding tests for account-nav-button wip Signed-off-by: leanneeliatra * put commented code to original state Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Adding tests to jest test for tenant switch. Putting test in correct folder and renaming function. Signed-off-by: leanneeliatra Signed-off-by: leanneeliatra * handle switch calling correct function Signed-off-by: Leanne Lacey-Byrne Signed-off-by: leanneeliatra * Removing additional files. Signed-off-by: leanneeliatra * Fix unwanted changes Signed-off-by: Darshit Chanpura Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Update account-nav-button.tsx Fix added to set the window.location to the pathname, rather than just reload & clear lastURL as it would be from the previous tenant. Signed-off-by: Leanne Lacey-Byrne Signed-off-by: leanneeliatra * Adding tests for account-nav-button wip Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Adding tests to jest test for tenant switch. Putting test in correct folder and renaming function. Signed-off-by: leanneeliatra Signed-off-by: leanneeliatra * checking for session storage Signed-off-by: leanneeliatra Signed-off-by: leanneeliatra * Declared session storage as a constant Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Adding tests for account-nav-button wip Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Adding tests to jest test for tenant switch. Putting test in correct folder and renaming function. Signed-off-by: leanneeliatra Signed-off-by: leanneeliatra * Moved the test into account-nav-button.test.tsx Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Dynamic tenancy configurations (#1394) * Dynamic multitenancy feature. Signed-off-by: Abhi Kalra * Dynamic multitenancy feature -PR feedback Signed-off-by: Abhi Kalra --------- Signed-off-by: Abhi Kalra Co-authored-by: Abhi Kalra Signed-off-by: leanneeliatra * Fixing dynamic tenancy changes for issues 1412 (#1419) * Fixing dynamic tenancy changes for opensearchdasbhoard.yaml Signed-off-by: Abhi Kalra Co-authored-by: Abhi Kalra Co-authored-by: Stephen Crawford <65832608+scrawfor99@users.noreply.github.com> Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: leanneeliatra * Removing Prerequisite Checks Workflow (#1456) Signed-off-by: Ryan Liang Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: leanneeliatra * Use version from package.json for integration tests (#1463) * Use version from package.json for integration tests Signed-off-by: Craig Perkins Signed-off-by: leanneeliatra * Removing unneded file Signed-off-by: leanneeliatra --------- Signed-off-by: Chang Liu Signed-off-by: leanneeliatra Signed-off-by: Ryan Liang Signed-off-by: nursaadat Signed-off-by: Saadat Nursultan Signed-off-by: nurbqq Signed-off-by: nurbqq <106753054+nurbq@users.noreply.github.com> Signed-off-by: vamsi-amazon Signed-off-by: Sirazh Gabdullin Signed-off-by: Jochen Kressin Signed-off-by: Abhi Kalra Signed-off-by: Darshit Chanpura Signed-off-by: opensearch-ci-bot Signed-off-by: Leanne Lacey-Byrne Signed-off-by: zhichao-aws Signed-off-by: Craig Perkins Signed-off-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Signed-off-by: Craig Perkins Co-authored-by: Chang Liu Co-authored-by: mattieserver <3049868+mattieserver@users.noreply.github.com> Co-authored-by: Ryan Liang <109499885+RyanL1997@users.noreply.github.com> Co-authored-by: Saadat Nursultan <39532643+nurSaadat@users.noreply.github.com> Co-authored-by: nursaadat Co-authored-by: Saadat Nursultan Co-authored-by: Nurbakhyt Sembayev <106753054+nurbq@users.noreply.github.com> Co-authored-by: Stephen Crawford <65832608+scrawfor99@users.noreply.github.com> Co-authored-by: Vamsi Manohar Co-authored-by: Sirazh Gabdullin Co-authored-by: Jochen Kressin <126353411+jochen-kressin@users.noreply.github.com> Co-authored-by: Abhi Kalra <99718513+abhivka7@users.noreply.github.com> Co-authored-by: Abhi Kalra Co-authored-by: Darshit Chanpura <35282393+DarshitChanpura@users.noreply.github.com> Co-authored-by: opensearch-trigger-bot[bot] <98922864+opensearch-trigger-bot[bot]@users.noreply.github.com> Co-authored-by: opensearch-ci-bot Co-authored-by: zhichao-aws Co-authored-by: Craig Perkins Co-authored-by: Darshit Chanpura --- public/apps/account/account-nav-button.tsx | 23 +++++- .../account/test/account-nav-button.test.tsx | 59 ++++++++++++++- .../apps/account/test/switch-tenants.test.tsx | 73 +++++++++++++++++++ 3 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 public/apps/account/test/switch-tenants.test.tsx diff --git a/public/apps/account/account-nav-button.tsx b/public/apps/account/account-nav-button.tsx index 8f67c3328..02e04f3af 100644 --- a/public/apps/account/account-nav-button.tsx +++ b/public/apps/account/account-nav-button.tsx @@ -62,7 +62,7 @@ export function AccountNavButton(props: { }} handleSwitchAndClose={() => { setModal(null); - window.location.reload(); + reloadAfterTenantSwitch(); }} tenant={props.tenant!} /> @@ -186,3 +186,24 @@ export function AccountNavButton(props: { ); } + +export function reloadAfterTenantSwitch(): void { + // the below portion is to clear URLs starting with 'lastUrl' + // when switching tenants, the last URLs will be from the old tenancy therefore we need to remove these from sessionStorage. + const lastUrls = []; + const { sessionStorage } = window; + + for (let i = 0; i < sessionStorage.length; i++) { + const key = sessionStorage.key(i); + if (key?.startsWith('lastUrl')) { + lastUrls.push(key); + } + } + for (let i = 0; i < lastUrls.length; i++) { + sessionStorage.removeItem(lastUrls[i]); + } + + // rather than just reload when we switch tenants, we set the URL to the pathname. i.e. the portion like: '/app/dashboards' + // therefore, the copied URL will now allow tenancy changes. + window.location.href = window.location.pathname; +} diff --git a/public/apps/account/test/account-nav-button.test.tsx b/public/apps/account/test/account-nav-button.test.tsx index 0bf24798e..ff20b0f25 100644 --- a/public/apps/account/test/account-nav-button.test.tsx +++ b/public/apps/account/test/account-nav-button.test.tsx @@ -15,7 +15,7 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { AccountNavButton } from '../account-nav-button'; +import { AccountNavButton, reloadAfterTenantSwitch } from '../account-nav-button'; import { getShouldShowTenantPopup, setShouldShowTenantPopup } from '../../../utils/storage-utils'; import { getDashboardsInfo } from '../../../utils/dashboards-info-utils'; @@ -174,3 +174,60 @@ describe('Account navigation button, multitenancy disabled', () => { expect(setState).toBeCalledTimes(0); }); }); + +describe('Reload window after tenant switch', () => { + const originalLocation = window.location; + const mockSetWindowHref = jest.fn(); + let pathname: string = ''; + beforeAll(() => { + pathname = '/app/myapp'; + Object.defineProperty(window, 'location', { + value: { + get pathname() { + return pathname; + }, + get href() { + return '/app/dashboards?security_tenant=admin_tenant'; + }, + set href(value: string) { + mockSetWindowHref(value); + }, + }, + }); + }); + + afterAll(() => { + window.location = originalLocation; + }); + + it('should remove the tenant query parameter before reloading', () => { + pathname = '/app/pathname-only'; + reloadAfterTenantSwitch(); + expect(mockSetWindowHref).toHaveBeenCalledWith(pathname); + }); +}); + +describe('Clear lastUrls after tenant switch', () => { + afterAll(() => { + jest.clearAllMocks(); + }); + + it('should clear out keys with a lastUrl prefix', () => { + window.sessionStorage.setItem('lastUrl:dashboard', '/dashboard1'); + window.sessionStorage.setItem('lastUrl:otherApp', '/otherApp'); + window.sessionStorage.setItem('somethingElse:here', '/random'); + const mockRemoveItem = jest.spyOn(Object.getPrototypeOf(window.sessionStorage), 'removeItem'); + reloadAfterTenantSwitch(); + expect(mockRemoveItem).toHaveBeenCalledWith('lastUrl:dashboard'); + expect(mockRemoveItem).toHaveBeenCalledWith('lastUrl:otherApp'); + expect(mockRemoveItem).toHaveBeenCalledTimes(2); + }); + + it('should not clear out keys without a lastUrl prefix', () => { + window.sessionStorage.setItem('somethingElse:here', '/random'); + const mockRemoveItem = jest.spyOn(Object.getPrototypeOf(window.sessionStorage), 'removeItem'); + + reloadAfterTenantSwitch(); + expect(mockRemoveItem).toHaveBeenCalledTimes(0); + }); +}); diff --git a/public/apps/account/test/switch-tenants.test.tsx b/public/apps/account/test/switch-tenants.test.tsx new file mode 100644 index 000000000..1eb798fe0 --- /dev/null +++ b/public/apps/account/test/switch-tenants.test.tsx @@ -0,0 +1,73 @@ +/* + * Copyright OpenSearch Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +import { reloadAfterTenantSwitch } from '../account-nav-button'; + +describe('Reload window after tenant switch', () => { + const originalLocation = window.location; + const mockSetWindowHref = jest.fn(); + let pathname: string = ''; + beforeAll(() => { + pathname = '/app/myapp'; + Object.defineProperty(window, 'location', { + value: { + get pathname() { + return pathname; + }, + get href() { + return '/app/dashboards?security_tenant=admin_tenant'; + }, + set href(value: string) { + mockSetWindowHref(value); + }, + }, + }); + }); + + afterAll(() => { + window.location = originalLocation; + }); + + it('should remove the tenant query parameter before reloading', () => { + pathname = '/app/pathname-only'; + reloadAfterTenantSwitch(); + expect(mockSetWindowHref).toHaveBeenCalledWith(pathname); + }); +}); + +describe('Clear lastUrls after tenant switch', () => { + afterAll(() => { + jest.clearAllMocks(); + }); + + it('should clear out keys with a lastUrl prefix', () => { + window.sessionStorage.setItem('lastUrl:dashboard', '/dashboard1'); + window.sessionStorage.setItem('lastUrl:otherApp', '/otherApp'); + window.sessionStorage.setItem('somethingElse:here', '/random'); + const mockRemoveItem = jest.spyOn(Object.getPrototypeOf(window.sessionStorage), 'removeItem'); + reloadAfterTenantSwitch(); + expect(mockRemoveItem).toHaveBeenCalledWith('lastUrl:dashboard'); + expect(mockRemoveItem).toHaveBeenCalledWith('lastUrl:otherApp'); + expect(mockRemoveItem).toHaveBeenCalledTimes(2); + }); + + it('should not clear out keys without a lastUrl prefix', () => { + window.sessionStorage.setItem('somethingElse:here', '/random'); + const mockRemoveItem = jest.spyOn(Object.getPrototypeOf(window.sessionStorage), 'removeItem'); + + reloadAfterTenantSwitch(); + expect(mockRemoveItem).toHaveBeenCalledTimes(0); + }); +});