PenetrationTestingScripts/antSword/source/modules/settings/update.js

181 lines
5.2 KiB
JavaScript

/**
* 检查更新模块
*/
const LANG = antSword['language']['settings']['update'];
const LANG_T = antSword['language']['toastr'];
class Update {
constructor(sidebar) {
sidebar.addItem({
id: 'update',
text: `<i class="fa fa-cloud-download"></i> ${LANG['title']}`
});
const cell = sidebar.cells('update');
// 初始化toolbar
const toolbar = cell.attachToolbar();
toolbar.loadStruct([
{
id: 'check',
type: 'button',
// 调试或者windows平台不支持更新
disabled: antSword['package']['debug'] || process.platform === 'win32',
text: LANG['toolbar']['check'], icon: 'check-square-o'
}, { type: 'separator' }
]);
// toolbar点击事件
toolbar.attachEvent('onClick', (id) => {
switch(id) {
case 'check':
this.checkUpdate();
break;
}
});
// 显示当前版本号
cell.attachHTMLString(`
${LANG['current']}: ${antSword['package']['version']}
`);
this.cell = cell;
}
/**
* 检查更新
* @return {None} [description]
*/
checkUpdate() {
this.cell.progressOn();
toastr.info(LANG['check']['ing'], LANG_T['info']);
// 后台检查更新
antSword['ipcRenderer']
.once('update-check', (event, ret) => {
this.cell.progressOff();
let info = ret['retVal'];
// 木有更新
if (!ret['hasUpdate']) {
return typeof info === 'string'
? toastr.error(LANG['check']['fail'](info), LANG_T['error'])
: toastr.info(LANG['check']['none'](info['version']), LANG_T['info']);
}
// 发现更新
toastr.success(LANG['check']['found'](info['version']), LANG_T['success']);
// 更新来源html
let sources_html = `<select id="ant-update-source">`;
for (let s in info['update']['sources']) {
sources_html += `<option value="${s}">${s}</option>`;
}
sources_html += `</select>`;
// 提示更新
layer.open({
type: 1,
shift: 2,
skin: 'ant-update',
btn: [LANG['prompt']['btns']['ok'], LANG['prompt']['btns']['no']],
closeBtn: 0,
title: `<i class="fa fa-cloud-download"></i> ${LANG['prompt']['title']}[v${info['version']}]`,
content: `
<strong>${LANG['prompt']['changelog']}</strong>
<ol>
<li>${info['update']['logs'].split('\n').join('</li><li>')}
</ol>
<strong>${LANG['prompt']['sources']}</strong>${sources_html}
`,
yes: () => {
// 获取更新选择地址
const download_source = $('#ant-update-source').val();
// 开始更新
// 更新动画
this.updateLoading();
// 通知后台
antSword['ipcRenderer']
.once('update-download', (event, ret) => {
// 下载失败
console.log(ret);
if (!ret['done']) {
if (typeof ret['retVal'] === 'object') {
switch(ret['retVal']['type']) {
case 'md5':
this.updateFail(LANG['prompt']['fail']['md5']);
break;
case 'unzip':
this.updateFail(LANG['prompt']['fail']['unzip'](ret['retVal']['err']));
break;
default:
this.updateFail(ret['retVal']);
}
} else {
this.updateFail(ret['retVal']);
}
return;
}
this.updateSuccess();
})
.send('update-download', download_source);
}
});
})
.send('update-check', {
local_ver: antSword['package']['version']
});
}
/**
* 更新动画进度
* @return {[type]} [description]
*/
updateLoading() {
// 删除按钮
$('.layui-layer-btn').remove();
// 加载动画
$('.layui-layer-content').html(`
<div class="pacman">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
<p align="center"><strong>${LANG['message']['ing']}</strong></p>
`);
}
/**
* 更新失败提示界面
* @param {String} tip 失败信息
* @return {[type]} [description]
*/
updateFail(tip) {
$('.layui-layer-content').html(`
<div align="center" style="color: red">
<i class="fa fa-times-circle update-icon" />
<p><strong>${LANG['message']['fail'](tip)}</strong></p>
</div>
`);
toastr.error(LANG['message']['fail'](tip), LANG_T['error']);
setTimeout(layer.closeAll, 1024 * 5);
}
/**
* 更新成功提示界面
* @return {None} [description]
*/
updateSuccess() {
$('.layui-layer-content').html(`
<div align="center" style="color: green">
<i class="fa fa-check-circle update-icon" />
<p><strong>${LANG['message']['success']}</strong></p>
</div>
`);
toastr.success(LANG['message']['success'], LANG_T['success']);
setTimeout(() => {
antSword['ipcRenderer'].send('quit');
}, 1024 * 3);
}
}
export default Update;