From 9e30ec63f616ba32aec68616df635e32dedf7c1f Mon Sep 17 00:00:00 2001 From: ArnoldSmith86 <73538315+ArnoldSmith86@users.noreply.github.com> Date: Tue, 17 Sep 2024 22:24:36 +0200 Subject: [PATCH] enforce `id` to be a string (#2313) --- client/js/jsonedit.js | 2 ++ client/js/serverstate.js | 2 ++ client/js/widgets/widget.js | 8 +++++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/client/js/jsonedit.js b/client/js/jsonedit.js index f57f6d12..fafc2e7b 100644 --- a/client/js/jsonedit.js +++ b/client/js/jsonedit.js @@ -2080,6 +2080,8 @@ function jeGetContext() { if(!jeStateNow.id) jeJSONerror = 'No ID given.'; + else if(typeof jeStateNow.id != 'string') + jeJSONerror = 'ID has to be a string.'; else if(JSON.parse(jeStateBefore).id != jeStateNow.id && widgets.has(jeStateNow.id)) jeJSONerror = `ID ${jeStateNow.id} is already in use.`; else if(jeStateNow.parent !== undefined && jeStateNow.parent !== null && !widgets.has(jeStateNow.parent)) diff --git a/client/js/serverstate.js b/client/js/serverstate.js index 7b639ae2..112238e5 100644 --- a/client/js/serverstate.js +++ b/client/js/serverstate.js @@ -108,6 +108,8 @@ export function addWidget(widget, instance) { async function addWidgetLocal(widget) { if (!widget.id) widget.id = generateUniqueWidgetID(); + else + widget.id = String(widget.id); if(widget.parent && !widgets.has(widget.parent)) { console.error(`Refusing to add widget ${widget.id} with invalid parent ${widget.parent}.`); diff --git a/client/js/widgets/widget.js b/client/js/widgets/widget.js index 6ca4667a..3c7455fe 100644 --- a/client/js/widgets/widget.js +++ b/client/js/widgets/widget.js @@ -1738,12 +1738,14 @@ export class Widget extends StateManaged { let newState = JSON.parse(JSON.stringify(oldWidget.state)); newState.id = await compute(a.relation, null, oldWidget.get(a.property), a.value); - if(!widgets.has(newState.id)) { + if(widgets.has(newState.id)) { + problems.push(`id ${newState.id} already in use, ignored.`); + } else if(typeof newState.id != 'string' || newState.id.length == 0) { + problems.push(`id ${newState.id} is not a string or empty, ignored.`); + } else { await updateWidgetId(newState, oldID); for(const c in collections) collections[c] = collections[c].map(w=>w.id==oldID ? widgets.get(newState.id) : w); - } else { - problems.push(`id ${newState.id} already in use, ignored.`); } } } else {