From 6eef53e3cdb185f68a6ef361d2f0dc2f400181ac Mon Sep 17 00:00:00 2001 From: kptdobe Date: Mon, 15 Sep 2025 11:49:10 +0200 Subject: [PATCH 1/7] feat: log out user if not authorized --- blocks/edit/prose/index.js | 14 ++++++++++++-- blocks/shared/utils.js | 6 ++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/blocks/edit/prose/index.js b/blocks/edit/prose/index.js index 2a4d3601..96a5c28d 100644 --- a/blocks/edit/prose/index.js +++ b/blocks/edit/prose/index.js @@ -31,6 +31,7 @@ import linkConverter from './plugins/linkConverter.js'; import sectionPasteHandler from './plugins/sectionPasteHandler.js'; import base64Uploader from './plugins/base64uploader.js'; import { COLLAB_ORIGIN, DA_ORIGIN } from '../../shared/constants.js'; +import { logOut } from '../../shared/utils.js'; import toggleLibrary from '../da-library/da-library.js'; import { getLocClass } from './loc-utils.js'; import { getSchema } from './schema.js'; @@ -133,12 +134,16 @@ export function createAwarenessStatusWidget(wsProvider, win) { } function registerErrorHandler(ydoc) { - ydoc.on('update', () => { + ydoc.on('update', async () => { const errorMap = ydoc.getMap('error'); if (errorMap && errorMap.size > 0) { + const str = JSON.stringify(errorMap); // eslint-disable-next-line no-console - console.log('Error from server', JSON.stringify(errorMap)); + console.log('Error from server', str); errorMap.clear(); + if (str.includes('403 - Forbidden') || str.includes('401 - Unauthorized')) { + await logOut(); + } } }); } @@ -218,6 +223,11 @@ export default function initProse({ path, permissions }) { const canWrite = permissions.some((permission) => permission === 'write'); const wsProvider = new WebsocketProvider(server, roomName, ydoc, opts); + wsProvider.on('connection-error', async () => { + await logOut(); + wsProvider.disconnect(); + }); + addSyncedListener(wsProvider, canWrite); createAwarenessStatusWidget(wsProvider, window); diff --git a/blocks/shared/utils.js b/blocks/shared/utils.js index 0c26927b..73db80ac 100644 --- a/blocks/shared/utils.js +++ b/blocks/shared/utils.js @@ -21,6 +21,12 @@ export async function initIms() { } } +export async function logOut() { + imsDetails = null; + const { handleSignOut } = await import(`${getNx()}/utils/ims.js`); + handleSignOut(); +} + export const daFetch = async (url, opts = {}) => { opts.headers = opts.headers || {}; let accessToken; From 25a94794cc89bce0f0300d855320b30c5bab8a72 Mon Sep 17 00:00:00 2001 From: kptdobe Date: Tue, 16 Sep 2025 14:46:06 +0200 Subject: [PATCH 2/7] chore: add async delay to give IMS time --- blocks/shared/utils.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blocks/shared/utils.js b/blocks/shared/utils.js index 73db80ac..18ce61d0 100644 --- a/blocks/shared/utils.js +++ b/blocks/shared/utils.js @@ -56,6 +56,8 @@ export const daFetch = async (url, opts = {}) => { const { loadIms, handleSignIn } = await import(`${getNx()}/utils/ims.js`); await loadIms(); handleSignIn(); + // wait 1 second to let ims do its things + await new Promise((resolve) => { setTimeout(resolve, 1000); }); } } From 9a7f4cae831c011e8f7fbbe8bd69e52b828ebd15 Mon Sep 17 00:00:00 2001 From: kptdobe Date: Tue, 16 Sep 2025 15:48:52 +0200 Subject: [PATCH 3/7] fix: properly init permissions --- blocks/edit/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/edit/edit.js b/blocks/edit/edit.js index fdfb0688..6882d9ec 100644 --- a/blocks/edit/edit.js +++ b/blocks/edit/edit.js @@ -36,7 +36,7 @@ async function setUI(el, utils) { } const { daFetch } = await utils; - const { permissions } = await daFetch(details.sourceUrl, { method: 'HEAD' }); + const { permissions = [] } = await daFetch(details.sourceUrl, { method: 'HEAD' }); daTitle.permissions = permissions; daContent.permissions = permissions; From 5e76a442a8e735d54164fe4707a40e441c370160 Mon Sep 17 00:00:00 2001 From: kptdobe Date: Wed, 17 Sep 2025 09:32:30 +0200 Subject: [PATCH 4/7] chore: try with a page reload --- blocks/edit/prose/index.js | 1 - blocks/shared/utils.js | 8 +++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/blocks/edit/prose/index.js b/blocks/edit/prose/index.js index 96a5c28d..85681714 100644 --- a/blocks/edit/prose/index.js +++ b/blocks/edit/prose/index.js @@ -225,7 +225,6 @@ export default function initProse({ path, permissions }) { const wsProvider = new WebsocketProvider(server, roomName, ydoc, opts); wsProvider.on('connection-error', async () => { await logOut(); - wsProvider.disconnect(); }); addSyncedListener(wsProvider, canWrite); diff --git a/blocks/shared/utils.js b/blocks/shared/utils.js index 18ce61d0..02ce4518 100644 --- a/blocks/shared/utils.js +++ b/blocks/shared/utils.js @@ -25,6 +25,7 @@ export async function logOut() { imsDetails = null; const { handleSignOut } = await import(`${getNx()}/utils/ims.js`); handleSignOut(); + window.location.reload(); } export const daFetch = async (url, opts = {}) => { @@ -53,11 +54,8 @@ export const daFetch = async (url, opts = {}) => { } // eslint-disable-next-line no-console console.warn('You need to sign in because you are not authorized to access this page', url); - const { loadIms, handleSignIn } = await import(`${getNx()}/utils/ims.js`); - await loadIms(); - handleSignIn(); - // wait 1 second to let ims do its things - await new Promise((resolve) => { setTimeout(resolve, 1000); }); + // try a clean log out and let ims do its thing + await logOut(); } } From b13fd4b337510dfc9ec77f61c97265a9ae261faf Mon Sep 17 00:00:00 2001 From: kptdobe Date: Wed, 17 Sep 2025 11:47:44 +0200 Subject: [PATCH 5/7] chore: restore necessary --- blocks/shared/utils.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/blocks/shared/utils.js b/blocks/shared/utils.js index 02ce4518..d34299cb 100644 --- a/blocks/shared/utils.js +++ b/blocks/shared/utils.js @@ -23,8 +23,12 @@ export async function initIms() { export async function logOut() { imsDetails = null; - const { handleSignOut } = await import(`${getNx()}/utils/ims.js`); - handleSignOut(); + try { + const { handleSignOut } = await import(`${getNx()}/utils/ims.js`); + handleSignOut(); + } catch { + // do nothing + } window.location.reload(); } @@ -54,8 +58,11 @@ export const daFetch = async (url, opts = {}) => { } // eslint-disable-next-line no-console console.warn('You need to sign in because you are not authorized to access this page', url); - // try a clean log out and let ims do its thing - await logOut(); + const { loadIms, handleSignIn } = await import(`${getNx()}/utils/ims.js`); + await loadIms(); + handleSignIn(); + // wait 1 second to let ims do its things + await new Promise((resolve) => { setTimeout(resolve, 1000); }); } } From 97ee2220010f23a5d0c8895a2b86ed74de7c1ed5 Mon Sep 17 00:00:00 2001 From: kptdobe Date: Tue, 23 Sep 2025 11:11:08 +0200 Subject: [PATCH 6/7] fix: on signout on socket error --- blocks/edit/prose/index.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/blocks/edit/prose/index.js b/blocks/edit/prose/index.js index 87530c99..4094f93f 100644 --- a/blocks/edit/prose/index.js +++ b/blocks/edit/prose/index.js @@ -142,9 +142,6 @@ function registerErrorHandler(ydoc) { // eslint-disable-next-line no-console console.log('Error from server', str); errorMap.clear(); - if (str.includes('403 - Forbidden') || str.includes('401 - Unauthorized')) { - await logOut(); - } } }); } From a26179aa52fb4e7aab9d1977a6d463a551adb07c Mon Sep 17 00:00:00 2001 From: kptdobe Date: Tue, 23 Sep 2025 14:41:34 +0200 Subject: [PATCH 7/7] chore: revert --- blocks/edit/prose/index.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/blocks/edit/prose/index.js b/blocks/edit/prose/index.js index 4094f93f..e4fa2770 100644 --- a/blocks/edit/prose/index.js +++ b/blocks/edit/prose/index.js @@ -135,12 +135,11 @@ export function createAwarenessStatusWidget(wsProvider, win) { } function registerErrorHandler(ydoc) { - ydoc.on('update', async () => { + ydoc.on('update', () => { const errorMap = ydoc.getMap('error'); if (errorMap && errorMap.size > 0) { - const str = JSON.stringify(errorMap); // eslint-disable-next-line no-console - console.log('Error from server', str); + console.log('Error from server', JSON.stringify(errorMap)); errorMap.clear(); } });