From ad96cee008492684f2d416d688d56d798e05369b Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 6 Oct 2024 13:57:10 +0800 Subject: [PATCH] onlyoffice: handle invalid url error --- packages/onlyoffice/frontend/office.page.ts | 18 +++++++++++------- packages/onlyoffice/index.ts | 9 +++++++-- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/onlyoffice/frontend/office.page.ts b/packages/onlyoffice/frontend/office.page.ts index 4ed5f1dc1..d1fb097c4 100644 --- a/packages/onlyoffice/frontend/office.page.ts +++ b/packages/onlyoffice/frontend/office.page.ts @@ -23,13 +23,17 @@ const loader = (mode) => async (element) => { const id = `${mode}-${Math.random().toString()}`; $(element).attr('id', id); const url = new URL($(element).text(), window.location.href).toString(); - const payload = await request.get('/onlyoffice-jwt', { url }); - // @ts-ignore - window.editor = new DocsAPI.DocEditor(id, { - ...payload, - documentType: mode, - height: mode === 'slide' ? '560px' : '900px', - }); + try { + const payload = await request.get('/onlyoffice-jwt', { url }); + // @ts-ignore + window.editor = new DocsAPI.DocEditor(id, { + ...payload, + documentType: mode, + height: mode === 'slide' ? '560px' : '900px', + }); + } catch (e) { + console.error(e); + } }; const getEles = (types: string[]) => types.flatMap((type) => $(`div[data-${type}]`).get()); diff --git a/packages/onlyoffice/index.ts b/packages/onlyoffice/index.ts index 227f7c7c3..b35f78f37 100644 --- a/packages/onlyoffice/index.ts +++ b/packages/onlyoffice/index.ts @@ -1,7 +1,7 @@ import { sign } from 'jsonwebtoken'; import { } from '@hydrooj/ui-default/backendlib/markdown-it-media'; import { - Context, Handler, superagent, SystemModel, UiContextBase, + Context, Handler, superagent, SystemModel, UiContextBase, ValidationError, } from 'hydrooj'; declare module 'hydrooj' { @@ -19,7 +19,12 @@ class OnlyofficeJWTHandler extends Handler { const res = await superagent.get(SystemModel.get('onlyoffice.externalSign')).query({ url }); this.response.body = res.body; } - const path = new URL(url).pathname; + let path: string; + try { + path = new URL(url).pathname; + } catch (e) { + throw new ValidationError('url'); + } const allowDownload = !!SystemModel.get('onlyoffice.allowDownload'); const payload = { document: {