diff --git a/demo-shell/src/app/components/settings/host-settings.component.html b/demo-shell/src/app/components/settings/host-settings.component.html index 9a147ee5187..cca0e48ac07 100644 --- a/demo-shell/src/app/components/settings/host-settings.component.html +++ b/demo-shell/src/app/components/settings/host-settings.component.html @@ -67,10 +67,16 @@ - Code Flow - + Implicit Flow + + + Code Flow + + + + Redirect URI diff --git a/demo-shell/src/app/components/settings/host-settings.component.ts b/demo-shell/src/app/components/settings/host-settings.component.ts index 032e088a2eb..d5891f2c142 100644 --- a/demo-shell/src/app/components/settings/host-settings.component.ts +++ b/demo-shell/src/app/components/settings/host-settings.component.ts @@ -150,6 +150,7 @@ export class HostSettingsComponent implements OnInit { scope: [oauth.scope, Validators.required], secret: oauth.secret, silentLogin: oauth.silentLogin, + implicitFlow: oauth.implicitFlow, codeFlow: oauth.codeFlow, publicUrls: [oauth.publicUrls] }); @@ -160,10 +161,7 @@ export class HostSettingsComponent implements OnInit { } private createIdentityFormControl(): UntypedFormControl { - return new UntypedFormControl(this.appConfig.get(AppConfigValues.IDENTITY_HOST), [ - Validators.required, - Validators.pattern(HOST_REGEX) - ]); + return new UntypedFormControl(this.appConfig.get(AppConfigValues.IDENTITY_HOST), [Validators.required, Validators.pattern(HOST_REGEX)]); } private createECMFormControl(): UntypedFormControl { @@ -205,7 +203,7 @@ export class HostSettingsComponent implements OnInit { } private saveOAuthValues(values: any) { - if (values.oauthConfig.publicUrls && typeof values.oauthConfig.publicUrls === 'string') { + if (values.oauthConfig.publicUrls && (typeof values.oauthConfig.publicUrls === 'string')) { values.oauthConfig.publicUrls = values.oauthConfig.publicUrls.split(','); } @@ -280,4 +278,5 @@ export class HostSettingsComponent implements OnInit { get oauthConfig(): UntypedFormControl { return this.form.get('oauthConfig') as UntypedFormControl; } + } diff --git a/lib/core/src/lib/app-config/app-config.service.ts b/lib/core/src/lib/app-config/app-config.service.ts index a55efc394c6..6dd58b4de9b 100644 --- a/lib/core/src/lib/app-config/app-config.service.ts +++ b/lib/core/src/lib/app-config/app-config.service.ts @@ -63,6 +63,7 @@ export enum Status { providedIn: 'root' }) export class AppConfigService { + config: any = { application: { name: 'Alfresco ADF Application' @@ -96,10 +97,11 @@ export class AppConfigService { * @returns Property value, when loaded */ select(property: string): Observable { - return this.onLoadSubject.pipe( - map((config) => ObjectUtils.getValue(config, property)), - distinctUntilChanged() - ); + return this.onLoadSubject + .pipe( + map((config) => ObjectUtils.getValue(config, property)), + distinctUntilChanged() + ); } /** @@ -168,7 +170,9 @@ export class AppConfigService { protected onDataLoaded() { this.onLoadSubject.next(this.config); - this.extensionService.setup$.pipe(take(1)).subscribe((config) => this.onExtensionsLoaded(config)); + this.extensionService.setup$ + .pipe(take(1)) + .subscribe((config) => this.onExtensionsLoaded(config)); } protected onExtensionsLoaded(config: ExtensionConfig) { @@ -223,18 +227,20 @@ export class AppConfigService { * @param hostIdp host address * @returns Discovery configuration */ - loadWellKnown(hostIdp: string): Promise { + loadWellKnown(hostIdp: string): Promise { return new Promise((resolve, reject) => { - this.http.get(`${hostIdp}/.well-known/openid-configuration`).subscribe({ - next: (res: OpenidConfiguration) => { - resolve(res); - }, - error: (err: any) => { - // eslint-disable-next-line no-console - console.error('hostIdp not correctly configured or unreachable'); - reject(err); - } - }); + this.http + .get(`${hostIdp}/.well-known/openid-configuration`) + .subscribe({ + next: (res: OpenidConfiguration) => { + resolve(res); + }, + error: (err: any) => { + // eslint-disable-next-line no-console + console.error('hostIdp not correctly configured or unreachable'); + reject(err); + } + }); }); } @@ -245,11 +251,13 @@ export class AppConfigService { */ get oauth2(): OauthConfigModel { const config = this.get(AppConfigValues.OAUTHCONFIG, {}); + const implicitFlow = config['implicitFlow'] === true || config['implicitFlow'] === 'true'; const silentLogin = config['silentLogin'] === true || config['silentLogin'] === 'true'; const codeFlow = config['codeFlow'] === true || config['codeFlow'] === 'true'; return { ...(config as OauthConfigModel), + implicitFlow, silentLogin, codeFlow }; @@ -265,4 +273,5 @@ export class AppConfigService { return result; } + } diff --git a/lib/testing/package.json b/lib/testing/package.json index 97619251f57..0ea2a7c1fc6 100644 --- a/lib/testing/package.json +++ b/lib/testing/package.json @@ -11,7 +11,7 @@ "url": "https://github.com/Alfresco/alfresco-ng2-components/issues" }, "peerDependencies": { - "@alfresco/js-api": ">=7.9.0-0" + "@alfresco/js-api": ">=7.9.0" }, "keywords": [ "testing", diff --git a/lib/testing/src/lib/protractor/core/pages/settings.page.ts b/lib/testing/src/lib/protractor/core/pages/settings.page.ts index cf73e6a34ae..9fed0915ac5 100644 --- a/lib/testing/src/lib/protractor/core/pages/settings.page.ts +++ b/lib/testing/src/lib/protractor/core/pages/settings.page.ts @@ -32,8 +32,8 @@ export class SettingsPage { silentLoginToggleLabel = $(`${materialLocators.Slide.toggle.root}[formcontrolname="silentLogin"] label`); silentLoginToggleElement = $(`${materialLocators.Slide.toggle.root}[formcontrolname="silentLogin"]`); implicitFlowLabel = $(`${materialLocators.Slide.toggle.root}[formcontrolname="implicitFlow"] label`); + implicitFlowElement = $(`${materialLocators.Slide.toggle.root}[formcontrolname="implicitFlow"]`); codeFlowElement = $(`${materialLocators.Slide.toggle.root}[formcontrolname="codeFlow"]`); - codeFlowLabel = $(`${materialLocators.Slide.toggle.root}[formcontrolname="codeFlow"] label`); applyButton = $('button[data-automation-id="settings-apply-button"]'); providerDropdown = new DropdownPage($(`${materialLocators.Select.root}[id="adf-provider-selector"]`)); @@ -64,9 +64,10 @@ export class SettingsPage { authHost, identityHost, silentLogin = true, - codeFlow = true, + implicitFlow = true, clientId?: string, - logoutUrl: string = '/logout' + logoutUrl: string = '/logout', + codeFlow = true ) { await this.goToSettingsPage(); await this.setProvider('ECM'); @@ -74,8 +75,9 @@ export class SettingsPage { await this.setContentServicesURL(contentServiceURL); await this.setAuthHost(authHost); await this.setIdentityHost(identityHost); - await this.setCodeFlow(codeFlow); await this.setSilentLogin(silentLogin); + await this.setImplicitFlow(implicitFlow); + await this.setCodeFlow(codeFlow); await this.setClientId(clientId); await this.setLogoutUrl(logoutUrl); await this.clickApply(); @@ -87,7 +89,7 @@ export class SettingsPage { authHost, identityHost, silentLogin = true, - codeFlow = true, + implicitFlow = true, clientId?: string, logoutUrl: string = '/logout' ) { @@ -97,8 +99,9 @@ export class SettingsPage { await this.setContentServicesURL(contentServiceURL); await this.setAuthHost(authHost); await this.setIdentityHost(identityHost); - await this.setCodeFlow(codeFlow); await this.setSilentLogin(silentLogin); + await this.setCodeFlow(false); + await this.setImplicitFlow(implicitFlow); await this.setClientId(clientId); await this.setLogoutUrl(logoutUrl); await this.clickApply(); @@ -140,14 +143,23 @@ export class SettingsPage { } } + async setImplicitFlow(enableToggle) { + await BrowserVisibility.waitUntilElementIsVisible(this.implicitFlowElement); + + const isChecked = (await BrowserActions.getAttribute(this.implicitFlowElement, 'class')).includes(materialLocators.Slide.toggle.checked); + + if ((isChecked && !enableToggle) || (!isChecked && enableToggle)) { + await BrowserActions.click(this.implicitFlowLabel); + } + } + async setCodeFlow(enableToggle) { await BrowserVisibility.waitUntilElementIsVisible(this.codeFlowElement); - const classElements = await BrowserActions.getAttribute(this.codeFlowElement, 'class'); - const isChecked = classElements.includes(materialLocators.Slide.toggle.checked); + const isChecked = (await BrowserActions.getAttribute(this.codeFlowElement, 'class')).includes(materialLocators.Checked.root); if ((isChecked && !enableToggle) || (!isChecked && enableToggle)) { - await BrowserActions.click(this.codeFlowLabel); + await BrowserActions.click(this.codeFlowElement); } } }