From bbe6141eb96511be5c620d80b8c4c0c5b9389203 Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Fri, 16 Feb 2024 21:41:27 +0600 Subject: [PATCH] SessionId duplicate fix (#4676) Signed-off-by: Denis Bykhov --- plugins/client-resources/src/connection.ts | 7 +++++++ server/rpc/src/rpc.ts | 1 + server/ws/src/server.ts | 11 +++++++++++ 3 files changed, 19 insertions(+) diff --git a/plugins/client-resources/src/connection.ts b/plugins/client-resources/src/connection.ts index 137740fa35..bb7b158ded 100644 --- a/plugins/client-resources/src/connection.ts +++ b/plugins/client-resources/src/connection.ts @@ -205,6 +205,13 @@ class Connection implements ClientConnection { websocket.onmessage = (event: MessageEvent) => { const resp = readResponse(event.data, binaryResponse) if (resp.id === -1 && resp.result === 'hello') { + if ((resp as HelloResponse).alreadyConnected === true) { + this.sessionId = generateId() + if (typeof sessionStorage !== 'undefined') { + sessionStorage.setItem('session.id.' + this.url, this.sessionId) + } + reject(new Error('alreadyConnected')) + } if ((resp as HelloResponse).binary) { binaryResponse = true } diff --git a/server/rpc/src/rpc.ts b/server/rpc/src/rpc.ts index f6e5b12516..55845dd05c 100644 --- a/server/rpc/src/rpc.ts +++ b/server/rpc/src/rpc.ts @@ -46,6 +46,7 @@ export interface HelloRequest extends Request { export interface HelloResponse extends Response { binary: boolean reconnect?: boolean + alreadyConnected?: boolean } /** diff --git a/server/ws/src/server.ts b/server/ws/src/server.ts index e9e1f749e2..a230c86326 100644 --- a/server/ws/src/server.ts +++ b/server/ws/src/server.ts @@ -214,6 +214,17 @@ class TSessionManager implements SessionManager { let workspace = this.workspaces.get(wsString) await workspace?.closing workspace = this.workspaces.get(wsString) + if (sessionId !== undefined && workspace?.sessions?.has(sessionId) === true) { + const helloResponse: HelloResponse = { + id: -1, + result: 'hello', + binary: false, + reconnect: false, + alreadyConnected: true + } + await ws.send(ctx, helloResponse, false, false) + return { error: new Error('Session already exists') } + } const workspaceName = workspaceInfo.workspaceName ?? workspaceInfo.workspaceUrl ?? workspaceInfo.workspace if (workspace === undefined) {