From b90f7f7e6583f437129df8900a652fdf3ffe2c48 Mon Sep 17 00:00:00 2001 From: Alexey Date: Thu, 18 May 2023 15:33:23 +0400 Subject: [PATCH] CB-3491 fix: restrict projects list loading (#1667) * CB-3491 fix: restrict projects list loading * CB-3491 allow listUserProfileProperties without license --------- Co-authored-by: Aleksandr Skoblikov --- .../cloudbeaver/service/auth/DBWServiceAuth.java | 2 +- webapp/packages/core-app/src/Body.tsx | 3 ++- .../src/ResourcesHooks/useResource.ts | 5 +++-- .../core-projects/src/ProjectInfoResource.ts | 3 +++ .../core-root/src/ServerConfigResource.ts | 16 +++++++++++++++- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java index feee6424f0..6fc4a9e512 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java @@ -56,7 +56,7 @@ public interface DBWServiceAuth extends DBWService { @WebAction() boolean changeLocalPassword(@NotNull WebSession webSession, @NotNull String oldPassword, @NotNull String newPassword) throws DBWebException; - @WebAction() + @WebAction(authRequired = false) WebPropertyInfo[] listUserProfileProperties(@NotNull WebSession webSession); @WebAction() diff --git a/webapp/packages/core-app/src/Body.tsx b/webapp/packages/core-app/src/Body.tsx index 24e90328ae..19d4c317b4 100644 --- a/webapp/packages/core-app/src/Body.tsx +++ b/webapp/packages/core-app/src/Body.tsx @@ -46,7 +46,8 @@ export const Body = observer(function Body() { const Screen = screenService.screen?.component; const { backendVersion } = useAppVersion(); - useResource(Body, ProjectInfoResource, CachedMapAllKey); + // TODO: must be loaded in place where it is used + useResource(Body, ProjectInfoResource, CachedMapAllKey, { silent: true }); // sync classes from theme with body for popup components and etc useLayoutEffect(() => { diff --git a/webapp/packages/core-blocks/src/ResourcesHooks/useResource.ts b/webapp/packages/core-blocks/src/ResourcesHooks/useResource.ts index 7dd94b2491..f399e5c138 100644 --- a/webapp/packages/core-blocks/src/ResourcesHooks/useResource.ts +++ b/webapp/packages/core-blocks/src/ResourcesHooks/useResource.ts @@ -250,7 +250,7 @@ export function useResource< await this.loadingPromise; this.exception = null; } catch (exception: any) { - if (propertiesRef.errorContext) { + if (actions?.silent !== true && propertiesRef.errorContext) { if (this.isResourceError()) { const errors = Array.isArray(this.resourceException) ? this.resourceException : [this.resourceException]; @@ -267,6 +267,7 @@ export function useResource< propertiesRef.errorContext.catch(this.exception); } } + actions?.onError?.(exception); } finally { this.loadingPromise = null; } @@ -439,7 +440,7 @@ export function useResource< if (!result.isError()) { return; } - if (propertiesRef.errorContext) { + if (actions?.silent !== true && propertiesRef.errorContext) { const errors = Array.isArray(exception) ? exception : [exception]; for (const error of errors) { diff --git a/webapp/packages/core-projects/src/ProjectInfoResource.ts b/webapp/packages/core-projects/src/ProjectInfoResource.ts index d6bd51383f..021e499855 100644 --- a/webapp/packages/core-projects/src/ProjectInfoResource.ts +++ b/webapp/packages/core-projects/src/ProjectInfoResource.ts @@ -8,6 +8,7 @@ import { AppAuthService, UserInfoResource } from '@cloudbeaver/core-authentication'; import { injectable } from '@cloudbeaver/core-di'; +import { ServerConfigResource } from '@cloudbeaver/core-root'; import { GraphQLService, ProjectInfo as SchemaProjectInfo, CachedMapResource, CachedMapAllKey, resourceKeyList, RmResourceType } from '@cloudbeaver/core-sdk'; export type ProjectInfo = SchemaProjectInfo; @@ -18,12 +19,14 @@ export class ProjectInfoResource extends CachedMapResource constructor( private readonly graphQLService: GraphQLService, private readonly userInfoResource: UserInfoResource, + serverConfigResource: ServerConfigResource, appAuthService: AppAuthService, ) { super(() => new Map(), []); this.sync(this.userInfoResource, () => {}, () => CachedMapAllKey); appAuthService.requireAuthentication(this); + serverConfigResource.requirePublic(this); this.userInfoResource.onUserChange.addPostHandler(() => { this.clear(); }); diff --git a/webapp/packages/core-root/src/ServerConfigResource.ts b/webapp/packages/core-root/src/ServerConfigResource.ts index 2abe6175ad..9567225bb6 100644 --- a/webapp/packages/core-root/src/ServerConfigResource.ts +++ b/webapp/packages/core-root/src/ServerConfigResource.ts @@ -9,7 +9,8 @@ import { action, makeObservable, observable } from 'mobx'; import { injectable } from '@cloudbeaver/core-di'; -import { GraphQLService, CachedDataResource, ServerConfig, ServerConfigInput, NavigatorSettingsInput } from '@cloudbeaver/core-sdk'; +import { ExecutorInterrupter } from '@cloudbeaver/core-executor'; +import { GraphQLService, CachedDataResource, ServerConfig, ServerConfigInput, NavigatorSettingsInput, CachedResource } from '@cloudbeaver/core-sdk'; import { isArraysEqual } from '@cloudbeaver/core-utils'; import { isNavigatorViewSettingsEqual } from './ConnectionNavigatorViewSettings'; @@ -61,6 +62,19 @@ export class ServerConfigResource extends CachedDataResource undefined, undefined, this); } + requirePublic( + resource: CachedResource, + map?: (param: void) => T + ): this { + resource + .preloadResource(this, () => {}) + .before(ExecutorInterrupter.interrupter(() => this.publicDisabled)); + + this.outdateResource(resource, map as any); + + return this; + } + get redirectOnFederatedAuth(): boolean { return this.data?.redirectOnFederatedAuth ?? false; }