From 2ec3a0f78e5cb5b65e573d2f36c805c647bb306b Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Tue, 5 May 2026 11:28:56 +0200 Subject: [PATCH 1/6] dbeaver/pro#8810 adds cancel action for auth via link --- .../src/CoreSessionActionsBootstrap.ts | 6 +++++- .../src/SessionActionsEventHandler.ts | 21 ++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts b/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts index f36caad83c4..5fd6047978a 100644 --- a/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts +++ b/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts @@ -31,7 +31,7 @@ export class CoreSessionActionsBootstrap extends Bootstrap { } private async handleOpenUrlEvent(event: WsOpenUrlEvent): Promise { - const { url, timestamp } = event; + const { url, timestamp, actionId } = event; try { const { status } = await this.commonDialogService.open(ConfirmationDialog, { @@ -54,6 +54,10 @@ export class CoreSessionActionsBootstrap extends Bootstrap { }); } } + + if (status === DialogueStateResult.Rejected) { + this.sessionActionsEventHandler.cancelAuth(actionId); + } } catch (exception: any) { this.notificationService.logException(exception, 'core_session_actions_open_url_error'); } diff --git a/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts b/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts index 0d897305d82..630e2bf7270 100644 --- a/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts +++ b/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts @@ -1,13 +1,20 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2025 DBeaver Corp and others + * Copyright (C) 2020-2026 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. */ import { injectable } from '@cloudbeaver/core-di'; -import { type ISessionEvent, type SessionEventId, SessionEventSource, SessionEventTopic, TopicEventHandler } from '@cloudbeaver/core-root'; -import { CbEventTopic, type WsOpenUrlEvent } from '@cloudbeaver/core-sdk'; +import { + ClientEventId, + type ISessionEvent, + type SessionEventId, + SessionEventSource, + SessionEventTopic, + TopicEventHandler, +} from '@cloudbeaver/core-root'; +import { CbEventTopic, type CbActionCancelledEvent, type WsOpenUrlEvent } from '@cloudbeaver/core-sdk'; @injectable(() => [SessionEventSource]) export class SessionActionsEventHandler extends TopicEventHandler { @@ -15,6 +22,14 @@ export class SessionActionsEventHandler extends TopicEventHandler({ + id: ClientEventId.CbClientCancelAction, + topicId: SessionEventTopic.CbSessionAction, + actionId, + }); + } + map(event: WsOpenUrlEvent): WsOpenUrlEvent { return event; } From 5a339aa40171c899f7b7d86b585dc96da8556b3f Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Tue, 5 May 2026 11:37:18 +0200 Subject: [PATCH 2/6] lint fix + handles edge case when no popup appeared --- .../src/CoreSessionActionsBootstrap.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts b/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts index 5fd6047978a..e2e8d4a49d7 100644 --- a/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts +++ b/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. */ import { Bootstrap, injectable } from '@cloudbeaver/core-di'; -import { ConfirmationDialog } from '@cloudbeaver/core-blocks'; +import { ConfirmationDialog, importLazyComponent } from '@cloudbeaver/core-blocks'; import { CommonDialogService, DialogueStateResult } from '@cloudbeaver/core-dialogs'; import { NotificationService } from '@cloudbeaver/core-events'; import { SessionResource } from '@cloudbeaver/core-root'; @@ -14,7 +14,8 @@ import { WindowsService } from '@cloudbeaver/core-routing'; import { CbServerEventId, type WsOpenUrlEvent } from '@cloudbeaver/core-sdk'; import { SessionActionsEventHandler } from './SessionActionsEventHandler.js'; -import { renderUrlConfirmationDetails } from './UrlConfirmationDetails.js'; + +const renderUrlConfirmationDetails = importLazyComponent(() => import('./UrlConfirmationDetails.js').then(m => m.renderUrlConfirmationDetails)); @injectable(() => [SessionActionsEventHandler, NotificationService, CommonDialogService, WindowsService, SessionResource]) export class CoreSessionActionsBootstrap extends Bootstrap { @@ -52,6 +53,9 @@ export class CoreSessionActionsBootstrap extends Bootstrap { this.notificationService.logError({ title: 'core_session_actions_popup_blocked', }); + + this.sessionActionsEventHandler.cancelAuth(actionId); + return; } } From dd15027459f469da48874304105ede8edd16639f Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Tue, 5 May 2026 11:44:07 +0200 Subject: [PATCH 3/6] reverts eslint fix --- .../core-session-actions/src/CoreSessionActionsBootstrap.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts b/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts index e2e8d4a49d7..8a77c38b866 100644 --- a/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts +++ b/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. */ import { Bootstrap, injectable } from '@cloudbeaver/core-di'; -import { ConfirmationDialog, importLazyComponent } from '@cloudbeaver/core-blocks'; +import { ConfirmationDialog } from '@cloudbeaver/core-blocks'; import { CommonDialogService, DialogueStateResult } from '@cloudbeaver/core-dialogs'; import { NotificationService } from '@cloudbeaver/core-events'; import { SessionResource } from '@cloudbeaver/core-root'; @@ -14,8 +14,7 @@ import { WindowsService } from '@cloudbeaver/core-routing'; import { CbServerEventId, type WsOpenUrlEvent } from '@cloudbeaver/core-sdk'; import { SessionActionsEventHandler } from './SessionActionsEventHandler.js'; - -const renderUrlConfirmationDetails = importLazyComponent(() => import('./UrlConfirmationDetails.js').then(m => m.renderUrlConfirmationDetails)); +import { renderUrlConfirmationDetails } from './UrlConfirmationDetails.js'; @injectable(() => [SessionActionsEventHandler, NotificationService, CommonDialogService, WindowsService, SessionResource]) export class CoreSessionActionsBootstrap extends Bootstrap { From 268e333196965dfb84eb5b18cb00c167964651a8 Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Tue, 5 May 2026 14:28:37 +0200 Subject: [PATCH 4/6] adds synchronization to connection init with oauth cancelling to remove stuck loading state --- .../src/ConnectionInfoResource.ts | 4 ++-- .../packages/core-session-actions/package.json | 1 + .../src/SessionActionsEventHandler.ts | 4 ++++ .../core-session-actions/tsconfig.json | 3 +++ .../packages/plugin-connections/package.json | 1 + .../useDatabaseCredentialsAuthDialog.ts | 18 +++++++++++++++--- .../packages/plugin-connections/tsconfig.json | 3 +++ webapp/yarn.lock | 2 ++ 8 files changed, 31 insertions(+), 5 deletions(-) diff --git a/webapp/packages/core-connections/src/ConnectionInfoResource.ts b/webapp/packages/core-connections/src/ConnectionInfoResource.ts index 11b944fb56a..119ed1b8931 100644 --- a/webapp/packages/core-connections/src/ConnectionInfoResource.ts +++ b/webapp/packages/core-connections/src/ConnectionInfoResource.ts @@ -405,7 +405,7 @@ export class ConnectionInfoResource extends CachedMapResource { + async init(config: ConnectionInitConfig, signal?: AbortSignal): Promise { const key: IConnectionInfoParams = { projectId: config.projectId, connectionId: config.connectionId }; await this.performUpdate(key, [], async () => { @@ -414,7 +414,7 @@ export class ConnectionInfoResource extends CachedMapResource [SessionEventSource]) export class SessionActionsEventHandler extends TopicEventHandler { + readonly onAuthCancelled = new SyncExecutor(); + constructor(sessionEventSource: SessionEventSource) { super(CbEventTopic.CbSessionAction, sessionEventSource); } @@ -28,6 +31,7 @@ export class SessionActionsEventHandler extends TopicEventHandler ({ @@ -127,15 +129,24 @@ export function useDatabaseCredentialsAuthDialog( return; } + const abortController = new AbortController(); + function abortHandler() { + abortController.abort(); + } + this.sessionActionsEventHandler.onAuthCancelled.addHandler(abortHandler); + try { this.authException = null; this.authenticating = true; - await this.connectionInfoResource.init(this.getConfig()); + await this.connectionInfoResource.init(this.getConfig(), abortController.signal); this.onInit?.(); } catch (exception: any) { - this.authException = exception; + if (exception?.name !== 'AbortError') { + this.authException = exception; + } } finally { this.authenticating = false; + this.sessionActionsEventHandler.onAuthCancelled.removeHandler(abortHandler); } }, getConfig() { @@ -189,6 +200,7 @@ export function useDatabaseCredentialsAuthDialog( resetCredentials, connectionInfoAuthPropertiesResource, connectionInfoNetworkHandlersLoader, + sessionActionsEventHandler, onInit, }, ); diff --git a/webapp/packages/plugin-connections/tsconfig.json b/webapp/packages/plugin-connections/tsconfig.json index 28285cbd4cf..0c3290a5ec5 100644 --- a/webapp/packages/plugin-connections/tsconfig.json +++ b/webapp/packages/plugin-connections/tsconfig.json @@ -61,6 +61,9 @@ { "path": "../core-sdk" }, + { + "path": "../core-session-actions" + }, { "path": "../core-settings" }, diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 6a011c572a5..690578fbabb 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2034,6 +2034,7 @@ __metadata: "@cloudbeaver/core-di": "workspace:*" "@cloudbeaver/core-dialogs": "workspace:*" "@cloudbeaver/core-events": "workspace:*" + "@cloudbeaver/core-executor": "workspace:*" "@cloudbeaver/core-localization": "workspace:*" "@cloudbeaver/core-root": "workspace:*" "@cloudbeaver/core-routing": "workspace:*" @@ -2795,6 +2796,7 @@ __metadata: "@cloudbeaver/core-resource": "workspace:*" "@cloudbeaver/core-root": "workspace:*" "@cloudbeaver/core-sdk": "workspace:*" + "@cloudbeaver/core-session-actions": "workspace:*" "@cloudbeaver/core-settings": "workspace:*" "@cloudbeaver/core-ui": "workspace:*" "@cloudbeaver/core-utils": "workspace:*" From e9cbda0ec6b50a411e5e2154c422cd9eb3d23c7d Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Mon, 11 May 2026 11:02:58 +0200 Subject: [PATCH 5/6] reverts abort logic --- .../core-connections/src/ConnectionInfoResource.ts | 4 ++-- .../useDatabaseCredentialsAuthDialog.ts | 14 +------------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/webapp/packages/core-connections/src/ConnectionInfoResource.ts b/webapp/packages/core-connections/src/ConnectionInfoResource.ts index 119ed1b8931..11b944fb56a 100644 --- a/webapp/packages/core-connections/src/ConnectionInfoResource.ts +++ b/webapp/packages/core-connections/src/ConnectionInfoResource.ts @@ -405,7 +405,7 @@ export class ConnectionInfoResource extends CachedMapResource { + async init(config: ConnectionInitConfig): Promise { const key: IConnectionInfoParams = { projectId: config.projectId, connectionId: config.connectionId }; await this.performUpdate(key, [], async () => { @@ -414,7 +414,7 @@ export class ConnectionInfoResource extends CachedMapResource ({ @@ -129,24 +127,15 @@ export function useDatabaseCredentialsAuthDialog( return; } - const abortController = new AbortController(); - function abortHandler() { - abortController.abort(); - } - this.sessionActionsEventHandler.onAuthCancelled.addHandler(abortHandler); - try { this.authException = null; this.authenticating = true; - await this.connectionInfoResource.init(this.getConfig(), abortController.signal); + await this.connectionInfoResource.init(this.getConfig()); this.onInit?.(); } catch (exception: any) { - if (exception?.name !== 'AbortError') { this.authException = exception; - } } finally { this.authenticating = false; - this.sessionActionsEventHandler.onAuthCancelled.removeHandler(abortHandler); } }, getConfig() { @@ -200,7 +189,6 @@ export function useDatabaseCredentialsAuthDialog( resetCredentials, connectionInfoAuthPropertiesResource, connectionInfoNetworkHandlersLoader, - sessionActionsEventHandler, onInit, }, ); From b615193e541716afd74f7b4545eb42cd0fc88b16 Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Mon, 11 May 2026 12:21:52 +0200 Subject: [PATCH 6/6] removes onAuthCancelled --- .../core-session-actions/src/SessionActionsEventHandler.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts b/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts index 8b3323ae83c..630e2bf7270 100644 --- a/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts +++ b/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts @@ -6,7 +6,6 @@ * you may not use this file except in compliance with the License. */ import { injectable } from '@cloudbeaver/core-di'; -import { SyncExecutor } from '@cloudbeaver/core-executor'; import { ClientEventId, type ISessionEvent, @@ -19,8 +18,6 @@ import { CbEventTopic, type CbActionCancelledEvent, type WsOpenUrlEvent } from ' @injectable(() => [SessionEventSource]) export class SessionActionsEventHandler extends TopicEventHandler { - readonly onAuthCancelled = new SyncExecutor(); - constructor(sessionEventSource: SessionEventSource) { super(CbEventTopic.CbSessionAction, sessionEventSource); } @@ -31,7 +28,6 @@ export class SessionActionsEventHandler extends TopicEventHandler