From 4a86e51f98528b83330513ccbc1da57ddea84b7f Mon Sep 17 00:00:00 2001 From: Wroud Date: Mon, 5 Apr 2021 19:36:14 +0300 Subject: [PATCH] fix(plugin-authentication): CB-924 ignore enabled auth provider on administration page --- .../AdministrationScreenService.ts | 8 ++++++-- .../src/UserInfoResource.ts | 19 +++++++++---------- .../src/Dialog/AuthDialog.tsx | 11 +++++++++-- .../src/Dialog/AuthDialogController.ts | 19 ++++++++++++++----- 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/webapp/packages/core-administration/src/AdministrationScreen/AdministrationScreenService.ts b/webapp/packages/core-administration/src/AdministrationScreen/AdministrationScreenService.ts index 20eae196eb..6461c64cf3 100644 --- a/webapp/packages/core-administration/src/AdministrationScreen/AdministrationScreenService.ts +++ b/webapp/packages/core-administration/src/AdministrationScreen/AdministrationScreenService.ts @@ -249,7 +249,9 @@ export class AdministrationScreenService { return false; } - if (!(await this.isAccessProvided(state))) { + const accessProvided = await this.isAccessProvided(state); + + if (!accessProvided) { this.screenService.navigateToRoot(); return false; } @@ -269,7 +271,9 @@ export class AdministrationScreenService { await this.ensurePermissions.execute(); - if (!(await this.permissionsService.hasAsync(EAdminPermission.admin))) { + const administrator = await this.permissionsService.hasAsync(EAdminPermission.admin); + + if (!administrator) { return false; } diff --git a/webapp/packages/core-authentication/src/UserInfoResource.ts b/webapp/packages/core-authentication/src/UserInfoResource.ts index 34bba9c15b..6abddcdc63 100644 --- a/webapp/packages/core-authentication/src/UserInfoResource.ts +++ b/webapp/packages/core-authentication/src/UserInfoResource.ts @@ -46,17 +46,16 @@ export class UserInfoResource extends CachedDataResource } async login(provider: string, credentials: Record, link?: boolean): Promise { + const processedCredentials = await this.authProviderService.processCredentials(provider, credentials); + + const { authToken } = await this.graphQLService.sdk.authLogin({ + provider, + credentials: processedCredentials, + linkUser: link, + customIncludeOriginDetails: true, + }); + await this.performUpdate(undefined, undefined, async () => { - const processedCredentials = await this.authProviderService.processCredentials(provider, credentials); - - // TODO: will be replaced with another function - const { authToken } = await this.graphQLService.sdk.authLogin({ - provider, - credentials: processedCredentials, - linkUser: link, - customIncludeOriginDetails: true, - }); - if (this.data === null || link) { this.data = await this.loader(); } else { diff --git a/webapp/packages/plugin-authentication/src/Dialog/AuthDialog.tsx b/webapp/packages/plugin-authentication/src/Dialog/AuthDialog.tsx index 72f309eb4d..17484b13ac 100644 --- a/webapp/packages/plugin-authentication/src/Dialog/AuthDialog.tsx +++ b/webapp/packages/plugin-authentication/src/Dialog/AuthDialog.tsx @@ -9,6 +9,7 @@ import { observer } from 'mobx-react-lite'; import styled, { css } from 'reshadow'; +import { AdministrationScreenService } from '@cloudbeaver/core-administration'; import { UserInfoResource } from '@cloudbeaver/core-authentication'; import { SubmittingForm, ErrorMessage, TabsState, TabList, Tab, TabTitle, Loader @@ -91,16 +92,22 @@ interface IAuthPayload { } export const AuthDialog: DialogComponent = observer(function AuthDialog({ - payload: { provider, link }, + payload: { + provider, + link = false, + }, options, rejectDialog, }) { + const administrationScreenService = useService(AdministrationScreenService); const userInfo = useService(UserInfoResource); - const controller = useController(AuthDialogController, link || false, rejectDialog); + const controller = useController(AuthDialogController, link, rejectDialog); const translate = useTranslate(); if (provider) { controller.selectProvider(provider); + } else { + controller.admin = administrationScreenService.activeScreen !== null; } const showTabs = !provider && controller.providers.length > 1; diff --git a/webapp/packages/plugin-authentication/src/Dialog/AuthDialogController.ts b/webapp/packages/plugin-authentication/src/Dialog/AuthDialogController.ts index eb38e982b1..17a45c1feb 100644 --- a/webapp/packages/plugin-authentication/src/Dialog/AuthDialogController.ts +++ b/webapp/packages/plugin-authentication/src/Dialog/AuthDialogController.ts @@ -26,14 +26,19 @@ export class AuthDialogController implements IInitializableController, IDestruct } get providers(): AuthProvider[] { - return this.authProvidersResource - .getEnabledProviders() - .sort(this.compareProviders); + let providers = this.authProvidersResource.values; + + if (!this.admin) { + providers = this.authProvidersResource.getEnabledProviders(); + } + + return providers.sort(this.compareProviders); } readonly error = new GQLErrorCatcher(); private isDistructed = false; private link!: boolean; + admin: boolean; private close!: () => void; constructor( @@ -46,11 +51,14 @@ export class AuthDialogController implements IInitializableController, IDestruct provider: observable, isAuthenticating: observable, credentials: observable, + admin: observable, providers: computed, }); + + this.admin = false; } - init(link: boolean, onClose: () => void) { + init(link: boolean, onClose: () => void): void { this.link = link; this.close = onClose; this.loadProviders(); @@ -95,8 +103,9 @@ export class AuthDialogController implements IInitializableController, IDestruct private async loadProviders() { try { await this.authProvidersResource.loadAll(); + if (this.providers.length > 0) { - this.provider = this.providers[0]; + this.provider = this.providers.find(provider => provider.defaultProvider) ?? this.providers[0]; } } catch (exception) { this.notificationService.logException(exception, 'Can\'t load auth providers');