From ed70e4e590f45fe06f2f91c6e3f2f7f21efc94bc Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Tue, 19 Apr 2016 09:40:25 -0400 Subject: [PATCH] Refactor initial elevation routine (#341) Signed-off-by: Juan Cruz Viotti --- lib/elevate.js | 68 +++++++++++++++++++------------------------------- lib/etcher.js | 3 ++- 2 files changed, 27 insertions(+), 44 deletions(-) diff --git a/lib/elevate.js b/lib/elevate.js index 983079c1..b921ece0 100644 --- a/lib/elevate.js +++ b/lib/elevate.js @@ -16,59 +16,41 @@ 'use strict'; -const electron = require('electron'); -const isElevated = require('is-elevated'); -const sudoPrompt = require('sudo-prompt'); -const os = require('os'); -const platform = os.platform(); -const packageJSON = require('../package.json'); +const Bluebird = require('bluebird'); +const isElevated = Bluebird.promisify(require('is-elevated')); +const sudoPrompt = Bluebird.promisifyAll(require('sudo-prompt')); +const platform = require('os').platform(); -exports.require = function(app, callback) { - isElevated(function(error, elevated) { - if (error) { - return callback(error); - } +exports.require = function(app, applicationName, callback) { + return isElevated().then(function(elevated) { if (elevated) { - return callback(); + return; } - if (!elevated) { - + return Bluebird.try(function() { if (platform === 'darwin') { // Keep parent process hidden app.dock.hide(); - sudoPrompt.exec(process.argv.join(' '), { - name: packageJSON.displayName - }, function(error) { - if (error) { - return callback(error); - } - - // Don't keep the original parent process alive - process.exit(0); + return sudoPrompt.execAsync(process.argv.join(' '), { + name: applicationName }); - } else if (platform === 'win32') { - const elevator = require('elevator'); - - elevator.execute(process.argv, {}, function(error) { - if (error) { - return callback(error); - } - - // Don't keep the original parent process alive - process.exit(0); - }); - } else { - electron.dialog.showErrorBox( - 'You don\'t have enough permissions', - 'Please run this application as root or administrator' - ); - - process.exit(1); } - } - }); + + if (platform === 'win32') { + const elevator = Bluebird.promisifyAll(require('elevator')); + return elevator.executeAsync(process.argv, {}); + } + + throw new Error('Please run this application as root or administrator'); + }).then(function() { + + // Don't keep the original parent process alive + process.exit(0); + + }); + + }).nodeify(callback); }; diff --git a/lib/etcher.js b/lib/etcher.js index c59ac37f..632ec862 100644 --- a/lib/etcher.js +++ b/lib/etcher.js @@ -19,6 +19,7 @@ const electron = require('electron'); const path = require('path'); const elevate = require('./elevate'); +const packageJSON = require('../package.json'); let mainWindow = null; electron.app.on('window-all-closed', electron.app.quit); @@ -28,7 +29,7 @@ electron.app.on('ready', function() { // No menu bar electron.Menu.setApplicationMenu(null); - elevate.require(electron.app, function(error) { + elevate.require(electron.app, packageJSON.displayName, function(error) { if (error) { electron.dialog.showErrorBox('Elevation Error', error.message);