From 7ca37bd6c3b6c39cb40c34b5e9ac1824580e6281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 15 Sep 2023 09:35:51 -0400 Subject: [PATCH 1/4] fix: #12009, check if suggested/current versions are valid --- src/cli/upgrade-plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/upgrade-plugins.js b/src/cli/upgrade-plugins.js index e789993388..2c76a6c5b1 100644 --- a/src/cli/upgrade-plugins.js +++ b/src/cli/upgrade-plugins.js @@ -106,7 +106,7 @@ async function checkPlugins() { current = plugins[suggestObj.package]; suggested = suggestObj.version; - if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { + if (suggestObj.code === 'match-found' && semver.valid(current) && semver.valid(suggested) && semver.gt(suggested, current)) { return { name: suggestObj.package, current: current, From c805824f438827815393d7c9d16a9175c1b8ec4d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 18:28:38 -0400 Subject: [PATCH 2/4] fix(deps): update dependency nodebb-plugin-2factor to v7.3.0 (#12021) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 4e5423142d..bb792382bf 100644 --- a/install/package.json +++ b/install/package.json @@ -92,7 +92,7 @@ "mousetrap": "1.6.5", "multiparty": "4.2.3", "nconf": "0.12.0", - "nodebb-plugin-2factor": "7.2.2", + "nodebb-plugin-2factor": "7.3.0", "nodebb-plugin-composer-default": "10.2.20", "nodebb-plugin-dbsearch": "6.2.2", "nodebb-plugin-emoji": "5.1.5", @@ -194,4 +194,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} From aff19a6c6b6c678362c5de81f9524377f6cdb711 Mon Sep 17 00:00:00 2001 From: pkuanvil-uid1 <119569118+pkuanvil-uid1@users.noreply.github.com> Date: Mon, 25 Sep 2023 22:48:31 +0800 Subject: [PATCH 3/4] fix: properly wrap promise to callback-style function (#12030) Async function xhr use a mixture of await and callback, which is not correct when an exception is thrown before callback happens. Use only async/await for it and create a new callback-style wrapper. --- public/src/modules/api.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/public/src/modules/api.js b/public/src/modules/api.js index db8e0fb1b0..77e52148ca 100644 --- a/public/src/modules/api.js +++ b/public/src/modules/api.js @@ -27,16 +27,14 @@ function call(options, callback) { } }); } - return reject(err); } - resolve(data); }); }); } -async function xhr(options, cb) { +async function xhr_async(options) { // Normalize body based on type const { url } = options; delete options.url; @@ -79,16 +77,20 @@ async function xhr(options, cb) { if (!res.ok) { if (response) { - return cb(new Error(isJSON ? response.status.message : response)); + throw new Error(isJSON ? response.status.message : response); } - return cb(new Error(res.statusText)); + throw new Error(res.statusText); } - cb(null, ( - isJSON && response && response.hasOwnProperty('status') && response.hasOwnProperty('response') ? - response.response : - response - )); + return isJSON && response && response.hasOwnProperty('status') && response.hasOwnProperty('response') ? + response.response : + response; +} + +function xhr(options, callback) { + // then().catch() is not correct here because callback() is called twice when the first then() throws an exception. + // pass onfulfilled and onrejected here, as two parameters of Promise.prototype.then() + xhr_async(options).then(result => callback(null, result), error => callback(error)); } export function get(route, data, onSuccess) { From 379ed0e2e81f17678c2ebcc6bc7a7a7a00fbb812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 25 Sep 2023 10:49:14 -0400 Subject: [PATCH 4/4] refactor: remove nested promise --- public/src/modules/api.js | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/public/src/modules/api.js b/public/src/modules/api.js index 77e52148ca..f510586549 100644 --- a/public/src/modules/api.js +++ b/public/src/modules/api.js @@ -7,34 +7,32 @@ import { confirm } from 'bootbox'; const baseUrl = config.relative_path + '/api/v3'; -function call(options, callback) { +async function call(options, callback) { options.url = options.url.startsWith('/api') ? config.relative_path + options.url : baseUrl + options.url; if (typeof callback === 'function') { - xhr(options, callback); + xhr(options).then(result => callback(null, result), err => callback(err)); return; } - return new Promise((resolve, reject) => { - xhr(options, function (err, data) { - if (err) { - if (err.message === 'A valid login session was not found. Please log in and try again.') { - return confirm('[[error:api.reauth-required]]', (ok) => { - if (ok) { - ajaxify.go('login'); - } - }); + try { + const result = await xhr(options); + return result; + } catch (err) { + if (err.message === 'A valid login session was not found. Please log in and try again.') { + return confirm('[[error:api.reauth-required]]', (ok) => { + if (ok) { + ajaxify.go('login'); } - return reject(err); - } - resolve(data); - }); - }); + }); + } + throw err; + } } -async function xhr_async(options) { +async function xhr(options) { // Normalize body based on type const { url } = options; delete options.url; @@ -87,12 +85,6 @@ async function xhr_async(options) { response; } -function xhr(options, callback) { - // then().catch() is not correct here because callback() is called twice when the first then() throws an exception. - // pass onfulfilled and onrejected here, as two parameters of Promise.prototype.then() - xhr_async(options).then(result => callback(null, result), error => callback(error)); -} - export function get(route, data, onSuccess) { return call({ url: route + (data && Object.keys(data).length ? ('?' + $.param(data)) : ''),