From 41a0deea5be47d8095810dfd3c06d3386e40643e Mon Sep 17 00:00:00 2001 From: adeelehsan Date: Tue, 30 Mar 2021 11:22:07 +0500 Subject: [PATCH] skip hinted login check added for enterprise SSO --- src/data/utils/dataUtils.js | 18 ++++-------- src/login/LoginPage.jsx | 4 +-- src/login/tests/LoginPage.test.jsx | 23 ++++++++++++++++ src/register/RegistrationPage.jsx | 4 +-- src/register/tests/RegistrationPage.test.jsx | 29 ++++++++++++++++++-- 5 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/data/utils/dataUtils.js b/src/data/utils/dataUtils.js index 9a763cda..52830137 100644 --- a/src/data/utils/dataUtils.js +++ b/src/data/utils/dataUtils.js @@ -13,22 +13,16 @@ export default function processLink(link) { export const getTpaProvider = (tpaHintProvider, primaryProviders, secondaryProviders) => { let tpaProvider = null; - let isSecondaryProvider = false; - primaryProviders.forEach((provider) => { + let skipHintedLogin = false; + [...primaryProviders, ...secondaryProviders].forEach((provider) => { if (provider.id === tpaHintProvider) { tpaProvider = provider; + if (provider.skipHintedLogin) { + skipHintedLogin = true; + } } }); - - if (!tpaProvider) { - secondaryProviders.forEach((provider) => { - if (provider.id === tpaHintProvider) { - tpaProvider = provider; - isSecondaryProvider = true; - } - }); - } - return { provider: tpaProvider, isSecondaryProvider }; + return { provider: tpaProvider, skipHintedLogin }; }; export const getTpaHint = () => { diff --git a/src/login/LoginPage.jsx b/src/login/LoginPage.jsx index 54673cfb..e36828ae 100644 --- a/src/login/LoginPage.jsx +++ b/src/login/LoginPage.jsx @@ -276,8 +276,8 @@ class LoginPage extends React.Component { if (thirdPartyAuthApiStatus === PENDING_STATE) { return ; } - const { provider, isSecondaryProvider } = getTpaProvider(this.tpaHint, providers, secondaryProviders); - if (isSecondaryProvider) { + const { provider, skipHintedLogin } = getTpaProvider(this.tpaHint, providers, secondaryProviders); + if (skipHintedLogin) { window.location.href = getConfig().LMS_BASE_URL + provider.loginUrl; return null; } diff --git a/src/login/tests/LoginPage.test.jsx b/src/login/tests/LoginPage.test.jsx index 34d64d8a..57cf9050 100644 --- a/src/login/tests/LoginPage.test.jsx +++ b/src/login/tests/LoginPage.test.jsx @@ -49,6 +49,7 @@ describe('LoginPage', () => { name: 'Test University', loginUrl: '/dummy-auth', registerUrl: '/dummy_auth', + skipHintedLogin: false, }; const appleProvider = { @@ -459,6 +460,28 @@ describe('LoginPage', () => { }); it('should render tpa button for tpa_hint id in secondary provider', () => { + const expectedMessage = `Sign in using ${secondaryProviders.name}`; + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + secondaryProviders: [secondaryProviders], + }, + thirdPartyAuthApiStatus: COMPLETE_STATE, + }, + }); + delete window.location; + window.location = { href: getConfig().BASE_URL.concat('/login'), search: `?next=/dashboard&tpa_hint=${secondaryProviders.id}` }; + secondaryProviders.iconImage = null; + + const loginPage = mount(reduxWrapper()); + expect(loginPage.find(`button#${secondaryProviders.id}`).find('span').text()).toEqual(expectedMessage); + }); + + it('should redirect to idp page if skipHinetedLogin is true', () => { + secondaryProviders.skipHintedLogin = true; store = mockStore({ ...initialState, commonComponents: { diff --git a/src/register/RegistrationPage.jsx b/src/register/RegistrationPage.jsx index 6b74efc4..6cc449f1 100644 --- a/src/register/RegistrationPage.jsx +++ b/src/register/RegistrationPage.jsx @@ -626,8 +626,8 @@ class RegistrationPage extends React.Component { if (thirdPartyAuthApiStatus === PENDING_STATE) { return ; } - const { provider, isSecondaryProvider } = getTpaProvider(this.tpaHint, providers, secondaryProviders); - if (isSecondaryProvider) { + const { provider, skipHintedLogin } = getTpaProvider(this.tpaHint, providers, secondaryProviders); + if (skipHintedLogin) { window.location.href = getConfig().LMS_BASE_URL + provider.registerUrl; return null; } diff --git a/src/register/tests/RegistrationPage.test.jsx b/src/register/tests/RegistrationPage.test.jsx index 3c6be5b7..3d5b20a2 100644 --- a/src/register/tests/RegistrationPage.test.jsx +++ b/src/register/tests/RegistrationPage.test.jsx @@ -65,6 +65,7 @@ describe('RegistrationPageTests', () => { name: 'Test University', loginUrl: '/dummy-auth', registerUrl: '/dummy_auth', + skipHintedLogin: false, }; const emptyFieldValidation = { @@ -667,7 +668,7 @@ describe('RegistrationPageTests', () => { }); delete window.location; - window.location = { href: getConfig().BASE_URL.concat('/login'), search: `?next=/dashboard&tpa_hint=${appleProvider.id}` }; + window.location = { href: getConfig().BASE_URL.concat('/register'), search: `?next=/dashboard&tpa_hint=${appleProvider.id}` }; appleProvider.iconImage = null; const registerPage = mount(reduxWrapper()); @@ -689,7 +690,7 @@ describe('RegistrationPageTests', () => { }); delete window.location; - window.location = { href: getConfig().BASE_URL.concat('/login'), search: '?next=/dashboard&tpa_hint=invalid' }; + window.location = { href: getConfig().BASE_URL.concat('/register'), search: '?next=/dashboard&tpa_hint=invalid' }; appleProvider.iconImage = null; const registerPage = mount(reduxWrapper()); @@ -697,6 +698,28 @@ describe('RegistrationPageTests', () => { }); it('should render tpa button for tpa_hint id in secondary provider', () => { + const expectedMessage = `Sign in using ${secondaryProviders.name}`; + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + secondaryProviders: [secondaryProviders], + }, + thirdPartyAuthApiStatus: COMPLETE_STATE, + }, + }); + delete window.location; + window.location = { href: getConfig().BASE_URL.concat('/register'), search: `?next=/dashboard&tpa_hint=${secondaryProviders.id}` }; + secondaryProviders.iconImage = null; + + const registerPage = mount(reduxWrapper()); + expect(registerPage.find(`button#${secondaryProviders.id}`).find('span').text()).toEqual(expectedMessage); + }); + + it('should redirect to idp page if skipHinetedLogin is true', () => { + secondaryProviders.skipHintedLogin = true; store = mockStore({ ...initialState, commonComponents: { @@ -710,7 +733,7 @@ describe('RegistrationPageTests', () => { }); delete window.location; - window.location = { href: getConfig().BASE_URL.concat('/login'), search: `?next=/dashboard&tpa_hint=${secondaryProviders.id}` }; + window.location = { href: getConfig().BASE_URL.concat('/register'), search: `?next=/dashboard&tpa_hint=${secondaryProviders.id}` }; secondaryProviders.iconImage = null; mount(reduxWrapper());