From c1920eb566838b5245733ce2d93cf79e7cba0299 Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Sun, 15 Dec 2019 16:56:17 +0200 Subject: [PATCH] When updating user file, write to temp file first --- src/clientManager.js | 9 ++++++++- src/command-line/users/reset.js | 15 ++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/clientManager.js b/src/clientManager.js index 4e617519..4dc05385 100644 --- a/src/clientManager.js +++ b/src/clientManager.js @@ -195,8 +195,15 @@ ClientManager.prototype.updateUser = function(name, opts, callback) { return callback ? callback() : true; } + const pathReal = Helper.getUserConfigPath(name); + const pathTemp = pathReal + ".tmp"; + try { - fs.writeFileSync(Helper.getUserConfigPath(name), newUser); + // Write to a temp file first, in case the write fails + // we do not lose the original file (for example when disk is full) + fs.writeFileSync(pathTemp, newUser); + fs.renameSync(pathTemp, pathReal); + return callback ? callback() : true; } catch (e) { log.error(`Failed to update user ${colors.green(name)} (${e})`); diff --git a/src/command-line/users/reset.js b/src/command-line/users/reset.js index d81a36ff..ddb550fb 100644 --- a/src/command-line/users/reset.js +++ b/src/command-line/users/reset.js @@ -30,8 +30,10 @@ program return; } - const file = Helper.getUserConfigPath(name); - const user = require(file); + const pathReal = Helper.getUserConfigPath(name); + const pathTemp = pathReal + ".tmp"; + const user = JSON.parse(fs.readFileSync(pathReal, "utf-8")); + log.prompt( { text: "Enter new password:", @@ -44,7 +46,14 @@ program user.password = Helper.password.hash(password); user.sessions = {}; - fs.writeFileSync(file, JSON.stringify(user, null, "\t")); + + const newUser = JSON.stringify(user, null, "\t"); + + // Write to a temp file first, in case the write fails + // we do not lose the original file (for example when disk is full) + fs.writeFileSync(pathTemp, newUser); + fs.renameSync(pathTemp, pathReal); + log.info(`Successfully reset password for ${colors.bold(name)}.`); } );