From 443d5cf55413b13b8610df88feb55ca8afff24f8 Mon Sep 17 00:00:00 2001 From: Peak Twilight <77903714+peaktwilight@users.noreply.github.com> Date: Sun, 15 Jun 2025 20:44:28 +0200 Subject: [PATCH 1/4] Improve UI: Edit Buttons in Status Page (#5920) Co-authored-by: Frank Elsinga --- src/layouts/Layout.vue | 2 +- src/pages/StatusPage.vue | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue index 9faedf589..e93a5159e 100644 --- a/src/layouts/Layout.vue +++ b/src/layouts/Layout.vue @@ -16,7 +16,7 @@ {{ $t("Uptime Kuma") }} - + {{ $t("New Update") }} diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue index 116968282..e0df74fde 100644 --- a/src/pages/StatusPage.vue +++ b/src/pages/StatusPage.vue @@ -157,12 +157,12 @@
- - + {{ $t("Go to Dashboard") }} From 4962817795804ea7dd875f65999b528f9769a7b4 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Thu, 19 Jun 2025 14:29:43 +0800 Subject: [PATCH 2/4] [Eliminate Blocking] User related (#5928) --- server/auth.js | 2 +- server/model/user.js | 4 ++-- server/password-hash.js | 4 ++-- server/server.js | 2 +- server/socket-handlers/api-key-socket-handler.js | 2 +- server/util-server.js | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/auth.js b/server/auth.js index 597cf3d75..a4aed50b8 100644 --- a/server/auth.js +++ b/server/auth.js @@ -26,7 +26,7 @@ exports.login = async function (username, password) { // Upgrade the hash to bcrypt if (passwordHash.needRehash(user.password)) { await R.exec("UPDATE `user` SET password = ? WHERE id = ? ", [ - passwordHash.generate(password), + await passwordHash.generate(password), user.id, ]); } diff --git a/server/model/user.js b/server/model/user.js index 329402ff5..33277d485 100644 --- a/server/model/user.js +++ b/server/model/user.js @@ -14,7 +14,7 @@ class User extends BeanModel { */ static async resetPassword(userID, newPassword) { await R.exec("UPDATE `user` SET password = ? WHERE id = ? ", [ - passwordHash.generate(newPassword), + await passwordHash.generate(newPassword), userID ]); } @@ -25,7 +25,7 @@ class User extends BeanModel { * @returns {Promise} */ async resetPassword(newPassword) { - const hashedPassword = passwordHash.generate(newPassword); + const hashedPassword = await passwordHash.generate(newPassword); await R.exec("UPDATE `user` SET password = ? WHERE id = ? ", [ hashedPassword, diff --git a/server/password-hash.js b/server/password-hash.js index 83a23d9e6..19aec193b 100644 --- a/server/password-hash.js +++ b/server/password-hash.js @@ -5,10 +5,10 @@ const saltRounds = 10; /** * Hash a password * @param {string} password Password to hash - * @returns {string} Hash + * @returns {Promise} Hash */ exports.generate = function (password) { - return bcrypt.hashSync(password, saltRounds); + return bcrypt.hash(password, saltRounds); }; /** diff --git a/server/server.js b/server/server.js index e328ff470..5b2f41a2e 100644 --- a/server/server.js +++ b/server/server.js @@ -674,7 +674,7 @@ let needSetup = false; let user = R.dispense("user"); user.username = username; - user.password = passwordHash.generate(password); + user.password = await passwordHash.generate(password); await R.store(user); needSetup = false; diff --git a/server/socket-handlers/api-key-socket-handler.js b/server/socket-handlers/api-key-socket-handler.js index f76b90991..d88151294 100644 --- a/server/socket-handlers/api-key-socket-handler.js +++ b/server/socket-handlers/api-key-socket-handler.js @@ -20,7 +20,7 @@ module.exports.apiKeySocketHandler = (socket) => { checkLogin(socket); let clearKey = nanoid(40); - let hashedKey = passwordHash.generate(clearKey); + let hashedKey = await passwordHash.generate(clearKey); key["key"] = hashedKey; let bean = await APIKey.save(key, socket.userID); diff --git a/server/util-server.js b/server/util-server.js index 08df728ed..4cc833330 100644 --- a/server/util-server.js +++ b/server/util-server.js @@ -51,7 +51,7 @@ exports.initJWTSecret = async () => { jwtSecretBean.key = "jwtSecret"; } - jwtSecretBean.value = passwordHash.generate(genSecret()); + jwtSecretBean.value = await passwordHash.generate(genSecret()); await R.store(jwtSecretBean); return jwtSecretBean; }; From e0335ecfbdfc2c8009c33447f9eaa9e69eb88f34 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Thu, 19 Jun 2025 14:30:24 +0800 Subject: [PATCH 3/4] [Eliminate Blocking] Database related (#5926) --- server/database.js | 7 ++++--- server/socket-handlers/database-socket-handler.js | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/server/database.js b/server/database.js index 582f19c29..206c2ffdc 100644 --- a/server/database.js +++ b/server/database.js @@ -1,4 +1,5 @@ const fs = require("fs"); +const fsAsync = fs.promises; const { R } = require("redbean-node"); const { setSetting, setting } = require("./util-server"); const { log, sleep } = require("../src/util"); @@ -707,12 +708,12 @@ class Database { /** * Get the size of the database (SQLite only) - * @returns {number} Size of database + * @returns {Promise} Size of database */ - static getSize() { + static async getSize() { if (Database.dbConfig.type === "sqlite") { log.debug("db", "Database.getSize()"); - let stats = fs.statSync(Database.sqlitePath); + let stats = await fsAsync.stat(Database.sqlitePath); log.debug("db", stats); return stats.size; } diff --git a/server/socket-handlers/database-socket-handler.js b/server/socket-handlers/database-socket-handler.js index ee2394bf6..33f8f3195 100644 --- a/server/socket-handlers/database-socket-handler.js +++ b/server/socket-handlers/database-socket-handler.js @@ -14,7 +14,7 @@ module.exports.databaseSocketHandler = (socket) => { checkLogin(socket); callback({ ok: true, - size: Database.getSize(), + size: await Database.getSize(), }); } catch (error) { callback({ From b1e8d9b4d290a293dfef51784e87a3cb863550cd Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Thu, 19 Jun 2025 15:41:21 +0800 Subject: [PATCH 4/4] [Eliminate Blocking] Push example (#5925) --- server/socket-handlers/general-socket-handler.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/socket-handlers/general-socket-handler.js b/server/socket-handlers/general-socket-handler.js index 0c11de295..b996efe7b 100644 --- a/server/socket-handlers/general-socket-handler.js +++ b/server/socket-handlers/general-socket-handler.js @@ -4,7 +4,7 @@ const { sendInfo } = require("../client"); const { checkLogin } = require("../util-server"); const GameResolver = require("gamedig/lib/GameResolver"); const { testChrome } = require("../monitor-types/real-browser-monitor-type"); -const fs = require("fs"); +const fsAsync = require("fs").promises; const path = require("path"); let gameResolver = new GameResolver(); @@ -90,7 +90,7 @@ module.exports.generalSocketHandler = (socket, server) => { } }); - socket.on("getPushExample", (language, callback) => { + socket.on("getPushExample", async (language, callback) => { try { checkLogin(socket); if (!/^[a-z-]+$/.test(language)) { @@ -106,13 +106,13 @@ module.exports.generalSocketHandler = (socket, server) => { try { let dir = path.join("./extra/push-examples", language); - let files = fs.readdirSync(dir); + let files = await fsAsync.readdir(dir); for (let file of files) { if (file.startsWith("index.")) { callback({ ok: true, - code: fs.readFileSync(path.join(dir, file), "utf8"), + code: await fsAsync.readFile(path.join(dir, file), "utf8"), }); return; }