Refactoring Electron IPC
This commit is contained in:
116
src/renderer/ipc/UpgradeIPC.js
Normal file
116
src/renderer/ipc/UpgradeIPC.js
Normal file
@@ -0,0 +1,116 @@
|
||||
const Constants = require('../../constants');
|
||||
const fs = require('fs');
|
||||
const helpers = require('../../helpers');
|
||||
const os = require('os');
|
||||
|
||||
const addListeners = (ipcMain, setIsInstalling, unmountAllDrives, standardIPCReply) => {
|
||||
ipcMain.on(Constants.IPC_Install_Upgrade, (event, data) => {
|
||||
let allowSkipVerification = true;
|
||||
|
||||
unmountAllDrives();
|
||||
|
||||
let tempSig;
|
||||
let tempPub;
|
||||
const cleanupFiles = () => {
|
||||
try {
|
||||
if (tempSig) {
|
||||
fs.unlinkSync(tempSig);
|
||||
}
|
||||
if (tempPub) {
|
||||
fs.unlinkSync(tempPub);
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
};
|
||||
|
||||
const errorHandler = err => {
|
||||
cleanupFiles();
|
||||
setIsInstalling(false);
|
||||
standardIPCReply(event, Constants.IPC_Install_Upgrade_Reply, {
|
||||
AllowSkipVerification: allowSkipVerification,
|
||||
Source: data.Source,
|
||||
}, err);
|
||||
};
|
||||
|
||||
// TODO Enable verification in 1.0.4
|
||||
const hasSignature = false;//!data.SkipVerification && data.Signature && (data.Signature.length > 0);
|
||||
const hasHash = false;//!data.SkipVerification && data.Sha256 && (data.Sha256.length > 0);
|
||||
if (hasSignature) {
|
||||
try {
|
||||
const files = helpers.createSignatureFiles(data.Signature, Constants.DEV_PUBLIC_KEY);
|
||||
tempPub = files.PublicKeyFile;
|
||||
tempSig = files.SignatureFile;
|
||||
} catch (e) {
|
||||
errorHandler(e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
let command;
|
||||
let args;
|
||||
const platform = os.platform();
|
||||
if (platform === 'win32') {
|
||||
command = data.Source;
|
||||
} else if (platform === 'darwin') {
|
||||
command = 'open';
|
||||
args = ['-a', 'Finder', data.Source];
|
||||
} else if (platform === 'linux') {
|
||||
try {
|
||||
command = data.Source;
|
||||
fs.chmodSync(command, '750');
|
||||
} catch (e) {
|
||||
errorHandler(e);
|
||||
}
|
||||
} else {
|
||||
errorHandler(Error('Platform not supported: ' + os.platform()));
|
||||
}
|
||||
|
||||
if (command) {
|
||||
const executeInstall = () => {
|
||||
setIsInstalling(true);
|
||||
helpers
|
||||
.executeAsync(command, args)
|
||||
.then(() => {
|
||||
cleanupFiles();
|
||||
standardIPCReply(event, Constants.IPC_Install_Upgrade_Reply)
|
||||
})
|
||||
.catch(error => {
|
||||
setIsInstalling(false);
|
||||
errorHandler(error);
|
||||
});
|
||||
};
|
||||
|
||||
if (hasSignature) {
|
||||
helpers
|
||||
.verifySignature(data.Source, tempSig, tempPub)
|
||||
.then(() => {
|
||||
executeInstall();
|
||||
})
|
||||
.catch(() => {
|
||||
errorHandler(Error('Failed to verify installation package signature'));
|
||||
});
|
||||
} else if (hasHash) {
|
||||
helpers
|
||||
.verifyHash(data.Source, data.Sha256)
|
||||
.then(()=> {
|
||||
executeInstall();
|
||||
})
|
||||
.catch(() => {
|
||||
errorHandler(Error('Failed to verify installation package hash'));
|
||||
});
|
||||
} else {
|
||||
if (platform === 'darwin') {
|
||||
setTimeout(executeInstall, 3000);
|
||||
} else {
|
||||
executeInstall();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
errorHandler(Error('Unsupported upgrade: ' + data.Source));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
addListeners
|
||||
};
|
||||
Reference in New Issue
Block a user