PenetrationTestingScripts/antSword/modules/plugStore.js

133 lines
3.8 KiB
JavaScript

/**
* 应用商店后台模块
* - 用于进行下载、安装、卸载等后台操作
* create at: 2016/05/25
*/
let logger;
const fs = require('fs');
const path = require('path');
const CONF = require('./config');
const UNZIP = require('extract-zip');
class PlugStore {
constructor(electron, app, mainWindow) {
logger = new electron.Logger('PlugStore');
this.listenDownload(mainWindow);
electron.ipcMain
.on('store-uninstall', (event, plugName) => {
logger.warn('UnInstall', plugName);
// 删除目录
this.rmdir(
path.join(CONF.plugPath, `${plugName}-master`)
).then((ret) => {
event.returnValue = ret;
// 重新加载插件列表
mainWindow.webContents.send('reloadPlug', true);
});
})
.on('store-uninstall-dev', (event, plugPath) => {
logger.warn('UnInstall.DEV', plugPath);
// 删除目录
this.rmdir(plugPath).then((ret) => {
event.returnValue = ret;
// 重新加载插件列表
mainWindow.webContents.send('reloadPlug', true);
});
})
// 获取插件路径
.on('store-config-plugPath', (event) => {
event.returnValue = CONF.plugPath;
})
}
/**
* 监听下载
* @param {Object} mainWindow [description]
* @return {[type]} [description]
*/
listenDownload(mainWindow) {
mainWindow.webContents.session.on('will-download', (event, item, webContents) => {
let fileName = item.getFilename().replace(/\-master\.zip$/,'');
let downLink = item.getURL();
logger.info('down-store-plug', downLink);
// 判断是否下载为插件
if (downLink.indexOf('github.com/AntSword-Store') > 0) {
// 1. 设置插件存储目录
let savePath = path.join(CONF.tmpPath, `${fileName}.zip`);
item.setSavePath(savePath);
webContents.send('store-download-progress', {
file: fileName,
type: 'init',
total: item.getTotalBytes()
});
// 2. 插件下载进度更新
item.on('updated', () => {
webContents.send('store-download-progress', {
file: fileName,
type: 'downloading',
size: item.getReceivedBytes()
});
});
// 3. 插件下载完毕
item.on('done', (e, state) => {
webContents.send('store-download-progress', {
file: fileName,
path: savePath,
type: 'downloaded',
state: state
});
if (state !== 'completed') { return };
// 解压安装插件
UNZIP(savePath, {
dir: CONF.plugPath
}, (err) => {
webContents.send('store-download-progress', {
type: 'installed',
file: fileName
});
logger.info('Installed', fileName);
// 重新加载插件列表
mainWindow.webContents.send('reloadPlug', true);
});
});
}
});
}
/**
* 删除目录
* @param {String} dir 目录
* @return {[type]} [description]
*/
rmdir(dir) {
return new Promise((res, rej) => {
let ret = true;
// 循环删除目录
const _rmdir = (_dir) => {
if (!fs.existsSync(_dir)) { return }
fs.readdirSync(_dir).map((_) => {
// 生成完整路径
let _path = path.join(dir, _);
// 如果是目录,则继续循环,否则删除
if (fs.lstatSync(_path).isDirectory()) {
return this.rmdir(_path);
}
fs.unlinkSync(_path);
});
fs.rmdirSync(_dir);
}
try{
_rmdir(dir);
} catch (e) {
ret = e;
}
return res(ret);
});
}
}
module.exports = PlugStore;