deCloudflare/tool/mypdns/sa/addon/firefox/main.js
#deCloudflare cf1cf3cc32 commit
2022-09-21 06:33:44 +00:00

302 lines
7.5 KiB
JavaScript

let _my_windowId = -1,
_my_tabId = -1,
_my_token = '',
_currentTest = [0, '', ''],
acGL = new AbortController(),
acUL = new AbortController(),
sgGL = acGL.signal,
sgUL = acUL.signal;
const _apiurl = 'https://karma.crimeflare.eu.org:1984',
selfActionURL = browser.runtime.getURL('screenshot/action.html');
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
function clean_all() {
_my_windowId = -1;
_my_tabId = -1;
_my_token = '';
_currentTest = [0, '', ''];
acGL.abort();
acGL = new AbortController();
sgGL = acGL.signal;
acUL.abort();
acUL = new AbortController();
sgUL = acUL.signal;
}
function iquery_issue(_a, _f, _j = '') {
return new Promise((g, b) => {
fetch(_apiurl + '/api/mypdns/issue/', {
signal: sgGL,
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'act=' + _a + '&k=' + _my_token + '&f=' + _f + (_j == '' ? '' : '&jdata=' + encodeURIComponent(JSON.stringify(_j)))
}).then(r => r.json()).then(r => {
g(r);
}).catch(e => {
console.log('Error!', e);
g([])
});
});
}
function iquery_upload(_f, _b) {
return new Promise((g, b) => {
fetch(_apiurl + '/api/mypdns/issue/', {
signal: sgUL,
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'act=upload&for=replace&k=' + _my_token + '&f=' + _f + '&body=' + encodeURIComponent(_b)
}).then(r => r.json()).then(r => {
g(r);
}).catch(e => {
console.log('Error!', e);
g([])
});
});
}
function ui_showmsg(s, ending = false) {
if (_my_tabId > 0) {
browser.tabs.update(_my_tabId, {
url: selfActionURL + '?' + (ending ? 'fin=1&' : '') + 'msg=' + encodeURI(s),
muted: true
});
}
if (ending) {
if (_my_windowId > 0) {
browser.windows.update(_my_windowId, {
drawAttention: true
});
}
clean_all();
}
}
browser.browserAction.onClicked.addListener(() => {
if (_my_windowId < 0) {
browser.windows.getAll({
windowTypes: ['popup'],
populate: true
}).then(wa => {
for (let wai of wa) {
if (wai['tabs'].length > 0) {
if (wai['tabs'][0]['url'].startsWith(selfActionURL)) {
browser.windows.remove(wai['id']);
}
}
}
});
clean_all();
browser.windows.create({
allowScriptsToClose: false,
focused: true,
width: 1000,
height: 800,
incognito: true,
type: 'popup',
url: 'about:blank'
}).then(w => {
_my_windowId = w.id;
_my_tabId = w['tabs'][0]['id'];
browser.tabs.update(_my_tabId, {
muted: true,
url: selfActionURL
});
}, e => {
console.log('open error! ', e);
});
} else {
browser.windows.update(_my_windowId, {
focused: true
});
}
});
browser.windows.onRemoved.addListener(w => {
if (_my_windowId > 0 && _my_windowId == w) {
clean_all();
}
});
async function checkWinSize() {
return new Promise((g, b) => {
if (_my_windowId < 0) {
g(false);
} else {
browser.windows.get(_my_windowId).then(n => {
if (n.width < 1500 && n.height < 1500) {
g(true);
} else {
g(false);
}
}, e => {
g(false);
});
}
});
}
function get_screenshot() {
return new Promise((g, b) => {
if (_my_tabId > 0) {
browser.tabs.captureTab(_my_tabId, {
format: 'jpeg',
quality: 100
}).then(ss => {
g([true, ss]);
}, x => {
g([false, '']);
});
} else {
g[false, ''];
}
});
}
async function step0_tryout() {
let got;
got = await checkWinSize();
if (!got) {
ui_showmsg('Big screenshot is not allowed.', true);
return;
}
if (_my_tabId < 0) {
return;
}
got = await iquery_issue('badss', 'mypdns.org');
if (got.length != 2) {
ui_showmsg('Client Connection Error', true);
return;
}
if (!got[0]) {
ui_showmsg(got[1], true);
return;
}
if (_my_tabId < 0) {
return;
}
_currentTest = [got[1]['iid'], got[1]['domain'], got[1]['url']];
step1_loadsite(_currentTest[2]);
}
let isSiteLoaded = false,
isSiteFinalU = '';
async function step1_loadsite(url) {
if (_my_tabId < 0) {
return;
}
if (!/^http(|s):\/\//.test(url)) {
ui_showmsg('Issue ' + _currentTest[0] + ', URL is invalid. Please fix the issue.', true);
return;
}
ui_showmsg('Begin Screenshot<br>Issue ' + _currentTest[0] + '<br>' + _currentTest[1]);
await sleep(1900);
isSiteLoaded = false;
isSiteFinalU = '';
if (_my_tabId < 0) {
return;
}
browser.tabs.update(_my_tabId, {
url: _currentTest[2],
muted: true
}).then(() => {
step2_destloaded();
}, () => {
ui_showmsg('Firefox Error', true);
});
}
async function step2_destloaded() {
if (_my_tabId < 0) {
return;
}
for (i = 0; i < 60; i++) {
await sleep(500);
if (isSiteLoaded) {
//console.log('site loaded! waiting 15s for complete shot');
await sleep(15000);
break;
}
}
if (_my_tabId < 0) {
return;
}
let got;
got = await checkWinSize();
if (!got) {
ui_showmsg('Big screenshot is not allowed.', true);
return;
}
if (isSiteLoaded) {
got = await get_screenshot();
if (!got[0]) {
ui_showmsg('Firefox ScreenshotTake error', true);
return;
}
ui_showmsg('Issue ' + _currentTest[0] + ': Uploading Screenshot...');
got = await iquery_upload(_currentTest[1], got[1]);
if (got.length != 2) {
ui_showmsg('Client Connection Error', true);
return;
}
if (!got[0]) {
ui_showmsg(got[1], true);
return;
}
if (_my_tabId < 0) {
return;
}
got = await iquery_issue('badissuefix', _currentTest[1], [_currentTest[2], isSiteFinalU]);
if (got.length != 2) {
ui_showmsg('Client Connection Error', true);
return;
}
if (!got[0]) {
ui_showmsg(got[1], true);
return;
}
if (_my_tabId < 0) {
return;
}
} else {
ui_showmsg('Issue ' + _currentTest[0] + ': Reporting...');
got = await iquery_issue('badissueurl', _currentTest[1]);
if (got.length != 2) {
ui_showmsg('Client Connection Error', true);
return;
}
if (!got[0]) {
ui_showmsg(got[1], true);
return;
}
if (_my_tabId < 0) {
return;
}
}
_currentTest = [0, '', ''];
ui_showmsg('Finding Job...');
step0_tryout();
}
browser.webRequest.onCompleted.addListener(r => {
if (_my_tabId < 0 || r.tabId != _my_tabId) {
return;
}
isSiteLoaded = true;
isSiteFinalU = r.url;
return;
}, {
types: ['main_frame'],
urls: ["http://*/*", "https://*/*"]
});
browser.runtime.onMessage.addListener((r, s, sr) => {
if (r[0] == 'token') {
_my_token = r[1];
browser.storage.local.set({
token: r[1]
});
ui_showmsg('Connecting...');
step0_tryout();
}
sr(true);
return true;
});