1
0
mirror of https://github.com/MailHops/mailhops-plugin.git synced 2025-05-16 14:20:10 -07:00

Merge pull request #31 from jobisoft/master

remove Experiment and make mailHop multi-tab-aware
This commit is contained in:
Andrew Van Tassel 2023-04-07 17:10:41 -06:00 committed by GitHub
commit f8459dc4e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 458 additions and 604 deletions

49
js/bootstrap.js vendored
View File

@ -8,21 +8,27 @@
// } // }
// }); // });
browser.messageDisplayAction.onClicked.addListener((tabId) => { // Keep track of MailHops instances per tab.
if (MailHops.isLoaded) { let tabHops = new Map();
browser.messageDisplayAction.setPopup({popup: "content/mailhops_details.xhtml"});
browser.messageDisplayAction.onClicked.addListener((tab) => {
let mailHop = tabHops.get(tab.id);
if (mailHop.isLoaded) {
browser.messageDisplayAction.setPopup({
tabId: tab.id,
popup: `content/mailhops_details.xhtml?tabId=${tab.id}`
});
browser.messageDisplayAction.openPopup(); browser.messageDisplayAction.openPopup();
} }
}); });
messenger.messageDisplay.onMessageDisplayed.addListener((tabId, message) => { async function initMessageTab(tab, message) {
let mailHop = new MailHops();
messenger.messages.getFull(message.id).then((messagePart) => { let messagePart = await messenger.messages.getFull(message.id);
// get route await mailHop.init(tab.id, message.id, messagePart.headers);
MailHops.init(message.id, messagePart.headers); tabHops.set(tab.id, mailHop);
}); }
messenger.messageDisplay.onMessageDisplayed.addListener(initMessageTab);
});
var port; var port;
function connected(p) { function connected(p) {
@ -30,14 +36,29 @@ function connected(p) {
port.onMessage.addListener(function (m) { port.onMessage.addListener(function (m) {
switch (m.command) { switch (m.command) {
case 'details': case 'details':
let mailHop = tabHops.get(m.tabId);
port.postMessage({ port.postMessage({
"cmd": m.command, "cmd": m.command,
"message": MailHops.message, "message": mailHop.message,
"response": MailHops.response, "response": mailHop.response,
"options": MailHops.options "options": mailHop.options
}); });
break; break;
} }
}); });
} }
browser.runtime.onConnect.addListener(connected); browser.runtime.onConnect.addListener(connected);
// Update all messages currently displayed.
async function updateAllCurrentMessages() {
let tabs = await browser.tabs.query({})
let messageTabs = tabs.filter(tab => ["mail", "messageDisplay"].includes(tab.type));
for (let messageTab of messageTabs) {
let message = await browser.messageDisplay.getDisplayedMessage(messageTab.id);
if (message) {
await initMessageTab(messageTab, message);
}
}
}
updateAllCurrentMessages();

View File

@ -1,82 +0,0 @@
var { ExtensionCommon } = ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm");
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
const ehb = "expandedHeadersBottomBox";
const eh2 = "expandedHeaders2";
const win = Services.wm.getMostRecentWindow("mail:3pane");
const win2 = Services.wm.getMostRecentWindow("mail:messageWindow");
const mailHopsUI = class extends ExtensionCommon.ExtensionAPI {
getAPI(context) {
context.callOnClose(this);
return {
mailHopsUI: {
insert(wd, basePath, iconPath, iconText, id, target) {
let elm = wd.document.getElementById(target);
const compact = "compact";
let iconSize = 48, marginTop = 0;
if (wd.document.getElementById(eh2).getAttribute(compact) == compact) {
iconSize = 32, marginTop = -16;
}
let mailHops = wd.document.getElementById(id);
if (mailHops) {
mailHops.setAttribute("image", basePath + iconPath);
mailHops.setAttribute("tooltiptext", iconText);
mailHops.setAttribute("style", "flex-shrink: 0; padding: 0; margin:" + marginTop + "px 2px 0 2px");
for (let mhc of mailHops.children) {
if (mhc.nodeName == "image") {
mhc.width = iconSize;
mhc.height = iconSize;
mhc.setAttribute("style", "margin: 0 2px 0 2px");
break;
}
}
} else {
let mailHops = wd.document.createXULElement("toolbarbutton");
mailHops.id = id;
mailHops.setAttribute("image", basePath + iconPath);
mailHops.setAttribute("tooltiptext", iconText);
mailHops.setAttribute("style", "flex-shrink: 0; padding: 0; margin:" + marginTop + "px 2px 0 2px");
mailHops.addEventListener("click", () => {
wd.document.getElementById("mailhops-messageDisplayAction-toolbarbutton").click();
}, false);
wd.document.getElementById(ehb).insertBefore(mailHops, elm);
for (let mhc of mailHops.children) {
if (mhc.nodeName == "image") {
mhc.width = iconSize;
mhc.height = iconSize;
mhc.setAttribute("style", "margin: 0 2px 0 2px");
break;
}
}
}
},
mv(wd, id, target) {
let mailHops = wd.document.getElementById(id);
let elm = wd.document.getElementById(target);
wd.document.getElementById(ehb).insertBefore(mailHops, elm);
},
rm(wd, id) {
if (wd.document.getElementById(id)) wd.document.getElementById(id).remove();
},
async insertBefore(basePath, iconPath, iconText, id, target) {
this.insert(win, basePath, iconPath, iconText, id, target);
if (win2) {
this.insert(win2, basePath, iconPath, iconText, id, target);
}
},
async move(id, target) {
this.mv(win, id, target);
if (win2) this.mv(win2, id, target);
},
async remove(id) {
this.rm(win, id);
if (win2) this.rm(win2, id);
}
}
}
}
close() {
let id = "countryIcon";
if (win.document.getElementById(id)) win.document.getElementById(id).remove();
}
};

View File

@ -4,12 +4,12 @@
* @website: http://Mailhops.com * @website: http://Mailhops.com
*/ */
const MailHops = { class MailHops {
msgURI: null, msgURI = null
isLoaded: false, isLoaded = false
loading: false, loading = false
previousId: null, tabId = null
options: { options = {
version: 'MailHops Plugin 4.3.3', version: 'MailHops Plugin 4.3.3',
api_key: '', api_key: '',
owm_key: '', owm_key: '',
@ -21,8 +21,8 @@ const MailHops = {
debug: false, debug: false,
travel_time_junk: false, travel_time_junk: false,
country_filter: [] country_filter: []
}, }
message: { message = {
id: null id: null
, map_url: '' , map_url: ''
, time: null , time: null
@ -37,51 +37,46 @@ const MailHops = {
, description: '' , description: ''
}, },
error: '' error: ''
}, }
response: {}, response = {}
};
MailHops.LOG = function(msg) { LOG(msg) {
if(!MailHops.options.debug) if (!this.options.debug)
return; return;
console.log(msg); console.log(msg);
}; }
MailHops.init = function(id, headers) async init(tabId, id, headers) {
{ this.tabId = tabId;
// prevent multiple loading try {
if (id == MailHops.previousId) return; var data = await browser.storage.local.get();
previousId = id;
var getting = browser.storage.local.get();
getting.then(data => {
if (data.api_key) { if (data.api_key) {
MailHops.options.api_key = data.api_key; this.options.api_key = data.api_key;
} }
if (data.owm_key) { if (data.owm_key) {
MailHops.options.owm_key = data.owm_key; this.options.owm_key = data.owm_key;
} }
if (data.lang) { if (data.lang) {
MailHops.options.lang = data.lang; this.options.lang = data.lang;
} }
if (data.unit) { if (data.unit) {
MailHops.options.unit = data.unit; this.options.unit = data.unit;
} }
if (data.theme) { if (data.theme) {
MailHops.options.theme = data.theme; this.options.theme = data.theme;
} }
if (data.travel_time_junk && data.travel_time_junk != 'off') { if (data.travel_time_junk && data.travel_time_junk != 'off') {
MailHops.options.travel_time_junk = Boolean(data.travel_time_junk); this.options.travel_time_junk = Boolean(data.travel_time_junk);
} }
if (data.debug) { if (data.debug) {
MailHops.options.debug = Boolean(data.debug); this.options.debug = Boolean(data.debug);
} }
if (data.countries) { if (data.countries) {
MailHops.options.country_filter = data.countries.split(','); this.options.country_filter = data.countries.split(',');
} }
MailHops.LOG('load MailHops prefs'); this.LOG('load MailHops prefs');
// reset message // reset message
MailHops.message = { this.message = {
id: id id: id
, map_url: '' , map_url: ''
, time: null , time: null
@ -97,61 +92,57 @@ MailHops.init = function(id, headers)
}, },
error: '' error: ''
}; };
MailHops.getRoute(); this.getRoute();
}, (error) => { } catch (e) {
MailHops.LOG('Error loading MailHops prefs'); this.LOG('Error loading MailHops prefs');
MailHops.loading = false; }
}); }
}; async getRoute() {
if (this.loading) return;
MailHops.getRoute = async function () { this.loading = true;
if (MailHops.loading) return;
MailHops.loading = true;
// set loading icon // set loading icon
browser.messageDisplayAction.setPopup({ popup: '' }); browser.messageDisplayAction.setPopup({ popup: '', tabId: this.tabId });
browser.messageDisplayAction.setIcon({ path: '/images/refresh.png' }); browser.messageDisplayAction.setIcon({ path: '/images/refresh.png', tabId: this.tabId });
browser.messageDisplayAction.setTitle({ title: 'Loading...' }); browser.messageDisplayAction.setTitle({ title: 'Loading...', tabId: this.tabId });
if(browser.mailHopsUI)
browser.mailHopsUI.insertBefore("", '/images/refresh.png', '', "countryIcon", "expandedHeaders2");
//IP regex //IP regex
var regexIp = /(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)(\/(?:[012]\d?|3[012]?|[456789])){0,1}$/; var regexIp = /(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)(\/(?:[012]\d?|3[012]?|[456789])){0,1}$/;
var regexAllIp = /(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)(\/(?:[012]\d?|3[012]?|[456789])){0,1}/g; var regexAllIp = /(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)(\/(?:[012]\d?|3[012]?|[456789])){0,1}/g;
var regexIPV6 = /s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*/g; var regexIPV6 = /s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*/g;
var headReceived = MailHops.message.headers['received'] || []; var headReceived = this.message.headers['received'] || [];
var headDate = MailHops.message.headers['date'] ? MailHops.message.headers['date'][0] : ''; var headDate = this.message.headers['date'] ? this.message.headers['date'][0] : '';
var headXReceived = MailHops.message.headers['x-received'] ? MailHops.message.headers['x-received'][0] : ''; var headXReceived = this.message.headers['x-received'] ? this.message.headers['x-received'][0] : '';
var headXOrigIP = MailHops.message.headers['x-originating-ip'] ? MailHops.message.headers['x-originating-ip'][0] : ''; var headXOrigIP = this.message.headers['x-originating-ip'] ? this.message.headers['x-originating-ip'][0] : '';
// auth box // auth box
var headXMailer = MailHops.message.headers['x-mailer'] ? MailHops.message.headers['x-mailer'][0] : ''; var headXMailer = this.message.headers['x-mailer'] ? this.message.headers['x-mailer'][0] : '';
var headUserAgent = MailHops.message.headers['user-agent'] ? MailHops.message.headers['user-agent'][0] : ''; var headUserAgent = this.message.headers['user-agent'] ? this.message.headers['user-agent'][0] : '';
var headXMimeOLE = MailHops.message.headers['x-mimeole'] ? MailHops.message.headers['x-mimeole'][0] : ''; var headXMimeOLE = this.message.headers['x-mimeole'] ? this.message.headers['x-mimeole'][0] : '';
var headReceivedSPF = MailHops.message.headers['received-spf'] ? MailHops.message.headers['received-spf'][0] : ''; var headReceivedSPF = this.message.headers['received-spf'] ? this.message.headers['received-spf'][0] : '';
var headAuth = MailHops.message.headers['authentication-results'] ? MailHops.message.headers['authentication-results'][0] : ''; var headAuth = this.message.headers['authentication-results'] ? this.message.headers['authentication-results'][0] : '';
var headListUnsubscribe = MailHops.message.headers['list-unsubscribe'] ? MailHops.message.headers['list-unsubscribe'][0] : ''; var headListUnsubscribe = this.message.headers['list-unsubscribe'] ? this.message.headers['list-unsubscribe'][0] : '';
var all_ips = new Array(); var all_ips = new Array();
var rline = ''; var rline = '';
var firstDate = headDate; var firstDate = headDate;
var lastDate; var lastDate;
//empty secure and time //empty secure and time
MailHops.message.secure = []; this.message.secure = [];
MailHops.message.time = null; this.message.time = null;
try { try {
MailHops.message.date = new Date(headDate).toISOString(); this.message.date = new Date(headDate).toISOString();
} catch (error) { } catch (error) {
headDate = headDate.substring(0, headDate.lastIndexOf(' ')); headDate = headDate.substring(0, headDate.lastIndexOf(' '));
} }
try { try {
MailHops.message.date = new Date(headDate).toISOString(); this.message.date = new Date(headDate).toISOString();
} catch (error) { } catch (error) {
headDate = new Date(); headDate = new Date();
} }
MailHops.message.auth = MailHops.auth( headXMailer, headUserAgent, headXMimeOLE, headAuth, headReceivedSPF, headListUnsubscribe ); this.message.auth = this.auth(headXMailer, headUserAgent, headXMimeOLE, headAuth, headReceivedSPF, headListUnsubscribe);
//loop through the received headers and parse for IP addresses //loop through the received headers and parse for IP addresses
if (Boolean(headReceived)) { if (Boolean(headReceived)) {
@ -190,7 +181,7 @@ MailHops.getRoute = async function () {
return received_ips.indexOf(item) === pos; return received_ips.indexOf(item) === pos;
}); });
for (var r = received_ips.length; r >= 0; r--) { for (var r = received_ips.length; r >= 0; r--) {
if(regexIp.test(received_ips[r]) && MailHops.testIP(received_ips[r],rline)){ if (regexIp.test(received_ips[r]) && this.testIP(received_ips[r], rline)) {
all_ips.unshift(received_ips[r]); all_ips.unshift(received_ips[r]);
} }
} }
@ -208,13 +199,13 @@ MailHops.getRoute = async function () {
try { try {
firstDate = new Date(firstDate); firstDate = new Date(firstDate);
lastDate = new Date(lastDate); lastDate = new Date(lastDate);
MailHops.message.time = lastDate - firstDate; this.message.time = lastDate - firstDate;
} catch (e) { } catch (e) {
MailHops.LOG('travel dates parse Error: '+JSON.stringify(e)); this.LOG('travel dates parse Error: ' + JSON.stringify(e));
MailHops.message.time = null; this.message.time = null;
} }
} else { } else {
MailHops.message.time = null; this.message.time = null;
} }
//get the originating IP address //get the originating IP address
@ -233,22 +224,22 @@ MailHops.getRoute = async function () {
} }
if (all_ips.length) { if (all_ips.length) {
// set the message hash // set the message hash
MailHops.message.hash = btoa(MailHops.message.date + '' + all_ips.join(',')); this.message.hash = btoa(this.message.date + '' + all_ips.join(','));
const cached = await MailHops.getCacheResponse(); const cached = await this.getCacheResponse();
if (cached) { if (cached) {
MailHops.displayRoute(cached); this.displayRoute(cached);
MailHops.isLoaded = true; this.isLoaded = true;
MailHops.loading = false; this.loading = false;
} else { } else {
MailHops.lookupRoute( all_ips.join(',') ); this.lookupRoute(all_ips.join(','));
} }
} else { } else {
MailHops.clear(); this.clear();
} }
}; };
//another ip check, dates will throw off the regex //another ip check, dates will throw off the regex
MailHops.testIP = function(ip,header){ testIP(ip, header) {
var validIP = true; var validIP = true;
try { try {
@ -273,43 +264,38 @@ MailHops.testIP = function(ip,header){
|| header.indexOf('version=TLSv1/SSLv3') !== -1 || header.indexOf('version=TLSv1/SSLv3') !== -1
) { ) {
//check if this IP was part of a secure transmission //check if this IP was part of a secure transmission
MailHops.message.secure.push(ip); this.message.secure.push(ip);
} }
} catch (e) { } catch (e) {
MailHops.LOG('testIP Error: '+JSON.stringify(e)); this.LOG('testIP Error: ' + JSON.stringify(e));
} }
return validIP; return validIP;
}; }
MailHops.clear = function () { clear() {
MailHops.message.sender = { this.message.sender = {
title: 'Local', title: 'Local',
countryCode: '', countryCode: '',
icon: '/images/local.png' icon: '/images/local.png'
}; };
browser.messageDisplayAction.setIcon({ path: MailHops.message.sender.icon }); browser.messageDisplayAction.setIcon({ path: this.message.sender.icon, tabId: this.tabId });
browser.messageDisplayAction.setTitle({ title: MailHops.message.sender.title }); browser.messageDisplayAction.setTitle({ title: this.message.sender.title, tabId: this.tabId });
if (browser.mailHopsUI) { this.isLoaded = true;
browser.mailHopsUI.insertBefore("", MailHops.message.sender.icon, MailHops.message.sender.title, "countryIcon", "expandedHeaders2"); this.loading = false;
}
MailHops.isLoaded = true;
MailHops.loading = false;
} }
MailHops.error = function (status, data) { error(status, data) {
MailHops.message.error = (data && data.error && data.error.message) ? data && data.error.message : 'Service Unavailable'; this.message.error = (data && data.error && data.error.message) ? data && data.error.message : 'Service Unavailable';
MailHops.message.sender = { this.message.sender = {
title: (data && data.error && data.error.message) ? data && data.error.message : 'Service Unavailable', title: (data && data.error && data.error.message) ? data && data.error.message : 'Service Unavailable',
countryCode: '', countryCode: '',
icon: '/images/auth/error.png' icon: '/images/auth/error.png'
}; };
browser.messageDisplayAction.setIcon({ path: MailHops.message.sender.icon }); browser.messageDisplayAction.setIcon({ path: this.message.sender.icon, tabId: this.tabId });
browser.messageDisplayAction.setTitle({ title: MailHops.message.sender.title }); browser.messageDisplayAction.setTitle({ title: this.message.sender.title, tabId: this.tabId });
if (browser.mailHopsUI)
browser.mailHopsUI.insertBefore("", MailHops.message.sender.icon, MailHops.message.sender.title, "countryIcon", "expandedHeaders2");
} }
MailHops.auth = function (header_xmailer, header_useragent, header_xmimeole, header_auth, header_spf, header_unsubscribe) { auth(header_xmailer, header_useragent, header_xmimeole, header_auth, header_spf, header_unsubscribe) {
let auth = []; let auth = [];
//SPF //SPF
if (header_spf) { if (header_spf) {
@ -372,18 +358,19 @@ MailHops.auth = function (header_xmailer, header_useragent, header_xmimeole, hea
} }
//mailhops lookup //mailhops lookup
MailHops.lookupRoute = function(header_route){ lookupRoute(header_route) {
let mailHop = this;
let lookupURL = '?'+MailHopsUtils.getAPIUrlParams(MailHops.options)+'&r='+String(header_route)+'&l='+MailHops.options.lang+'&u='+MailHops.options.unit; let lookupURL = '?' + MailHopsUtils.getAPIUrlParams(this.options) + '&r=' + String(header_route) + '&l=' + this.options.lang + '&u=' + this.options.unit;
if(MailHops.options.owm_key != '') if (this.options.owm_key != '')
lookupURL += '&owm_key='+MailHops.options.owm_key; lookupURL += '&owm_key=' + this.options.owm_key;
if(MailHops.message.time != null) if (this.message.time != null)
lookupURL += '&t=' + MailHops.message.time; lookupURL += '&t=' + this.message.time;
if(MailHops.message.date != null) if (this.message.date != null)
lookupURL += '&d='+MailHops.message.date; lookupURL += '&d=' + this.message.date;
MailHops.message.map_url = MailHopsUtils.getAPIUrl() + '/map/' + lookupURL; this.message.map_url = MailHopsUtils.getAPIUrl() + '/map/' + lookupURL;
//call mailhops api for lookup //call mailhops api for lookup
var xmlhttp = new XMLHttpRequest(); var xmlhttp = new XMLHttpRequest();
@ -393,45 +380,41 @@ var xmlhttp = new XMLHttpRequest();
try { try {
let data = JSON.parse(xmlhttp.responseText); let data = JSON.parse(xmlhttp.responseText);
if (xmlhttp.status === 200) { if (xmlhttp.status === 200) {
MailHops.cacheResponse(data.response); mailHop.cacheResponse(data.response);
MailHops.displayRoute(data.response); mailHop.displayRoute(data.response);
//tag the result //tag the result
MailHops.tagResults(data, data.response.route); mailHop.tagResults(data, data.response.route);
} else if (data.error) { } else if (data.error) {
MailHops.LOG(JSON.stringify(data.error)); mailHop.LOG(JSON.stringify(data.error));
//display the error //display the error
MailHops.error(xmlhttp.status, data); mailHop.error(xmlhttp.status, data);
} }
} catch (e) { } catch (e) {
MailHops.LOG(e); mailHop.LOG(e);
MailHops.error(); mailHop.error();
} }
} }
MailHops.isLoaded = true; mailHop.isLoaded = true;
MailHops.loading = false; mailHop.loading = false;
}; };
xmlhttp.send(null); xmlhttp.send(null);
};
MailHops.displayRoute = function (response) {
MailHops.response = response;
MailHops.message.sender = MailHopsUtils.getSender(response.route);
if (MailHops.message.sender) {
browser.messageDisplayAction.setIcon({ path: MailHops.message.sender.icon });
browser.messageDisplayAction.setTitle({ title: MailHops.message.sender.title });
if (browser.mailHopsUI)
browser.mailHopsUI.insertBefore("", MailHops.message.sender.icon, MailHops.message.sender.title, "countryIcon", "expandedHeaders2");
} else {
browser.messageDisplayAction.setIcon({ path: '/images/local.png' });
browser.messageDisplayAction.setTitle({ title: 'Local' });
if (browser.mailHopsUI)
browser.mailHopsUI.insertBefore("", '/images/local.png', 'Local', "countryIcon", "expandedHeaders2");
} }
};
displayRoute(response) {
this.response = response;
this.message.sender = MailHopsUtils.getSender(response.route);
if (this.message.sender) {
browser.messageDisplayAction.setIcon({ path: this.message.sender.icon, tabId: this.tabId });
browser.messageDisplayAction.setTitle({ title: this.message.sender.title, tabId: this.tabId });
} else {
browser.messageDisplayAction.setIcon({ path: '/images/local.png', tabId: this.tabId });
browser.messageDisplayAction.setTitle({ title: 'Local', tabId: this.tabId });
}
}
// keep a daily cache // keep a daily cache
MailHops.cacheResponse = async function (response) { async cacheResponse(response) {
let data = await browser.storage.local.get('messages'); let data = await browser.storage.local.get('messages');
let cached_date = new Date(); let cached_date = new Date();
let messages = { let messages = {
@ -441,40 +424,40 @@ MailHops.cacheResponse = async function (response) {
if (data.messages && data.messages.list && data.messages.cached === messages.cached) { if (data.messages && data.messages.list && data.messages.cached === messages.cached) {
messages.list = data.messages.list; messages.list = data.messages.list;
} }
messages.list[MailHops.message.hash] = response; messages.list[this.message.hash] = response;
await browser.storage.local.set({ messages: messages }); await browser.storage.local.set({ messages: messages });
MailHops.LOG('Cached Message ' + MailHops.message.id + ' hash ' + MailHops.message.hash); this.LOG('Cached Message ' + this.message.id + ' hash ' + this.message.hash);
}; }
// get cached message // get cached message
MailHops.getCacheResponse = async function () { async getCacheResponse() {
let data = await browser.storage.local.get('messages'); let data = await browser.storage.local.get('messages');
if (data.messages && data.messages.list[MailHops.message.hash]) { if (data.messages && data.messages.list[this.message.hash]) {
MailHops.LOG('Found Cached Message '+MailHops.message.hash); this.LOG('Found Cached Message ' + this.message.hash);
return data.messages.list[MailHops.message.hash]; return data.messages.list[this.message.hash];
} }
return false; return false;
}; };
MailHops.tagResults = function(results, route){ tagResults(results, route) {
if (!results) { if (!results) {
return false; return false;
} }
//Add junk tag on messages taking too long to travel //Add junk tag on messages taking too long to travel
try { try {
if(Boolean(MailHops.options.travel_time_junk) && MailHops.message.time != null && MailHops.message.time > 10000){ if (Boolean(this.options.travel_time_junk) && this.message.time != null && this.message.time > 10000) {
messenger.messages.update(MailHops.message.id, { 'junk': true }); messenger.messages.update(this.message.id, { 'junk': true });
MailHops.LOG( "Junk: Travel time match for " + MailHops.message.time ); this.LOG("Junk: Travel time match for " + this.message.time);
} }
if (MailHops.options.country_filter.length && MailHops.message.sender && MailHops.message.sender.countryCode) { if (this.options.country_filter.length && this.message.sender && this.message.sender.countryCode) {
if (MailHops.options.country_filter.indexOf(MailHops.message.sender.countryCode.toUpperCase()) != -1) { if (this.options.country_filter.indexOf(this.message.sender.countryCode.toUpperCase()) != -1) {
messenger.messages.update(MailHops.message.id, { 'junk': true }); messenger.messages.update(this.message.id, { 'junk': true });
MailHops.LOG( "Junk: Country code match for " + MailHops.message.sender.countryCode ); this.LOG("Junk: Country code match for " + this.message.sender.countryCode);
} }
} }
} catch (e) { } catch (e) {
MailHops.LOG("Error tagResults: " + e); this.LOG("Error tagResults: " + e);
}
}
} }
};

View File

@ -1,5 +1,9 @@
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const tabId = parseInt(urlParams.get("tabId"), 10);
var port = browser.runtime.connect({ name: "MailHops" }); var port = browser.runtime.connect({ name: "MailHops" });
port.postMessage({ command: "details" }); port.postMessage({ command: "details", tabId });
port.onMessage.addListener(function (msg) { port.onMessage.addListener(function (msg) {
updateContent(msg); updateContent(msg);

View File

@ -11,24 +11,13 @@
"applications": { "applications": {
"gecko": { "gecko": {
"id": "thunderbird@mailhops.com", "id": "thunderbird@mailhops.com",
"strict_min_version": "74.0", "strict_min_version": "112.0"
"strict_max_version": "102.*"
} }
}, },
"default_locale": "en", "default_locale": "en",
"icons": { "icons": {
"32": "images/mailhops32.png" "32": "images/mailhops32.png"
}, },
"experiment_apis": {
"mailHopsUI": {
"schema": "schema.json",
"parent": {
"scopes": ["addon_parent"],
"paths": [["mailHopsUI"]],
"script": "js/experiment_apis.js"
}
}
},
"options_ui": { "options_ui": {
"page": "content/preferences.html", "page": "content/preferences.html",
"open_in_tab": true "open_in_tab": true

View File

@ -1,61 +0,0 @@
[
{
"namespace": "mailHops",
"functions": [
{
"name": "insertBefore",
"type": "function",
"async": true,
"parameters": [
{
"name": "basePath",
"type": "string"
},
{
"name": "iconPath",
"type": "string",
"description": "path of icon."
},
{
"name": "iconText",
"type": "string"
},
{
"name": "id",
"type": "string"
},
{
"name": "target",
"type": "string"
}
]
},
{
"name": "move",
"type": "function",
"async": true,
"parameters": [
{
"name": "id",
"type": "string"
},
{
"name": "target",
"type": "string"
}
]
},
{
"name": "remove",
"type": "function",
"async": true,
"parameters": [
{
"name": "id",
"type": "string"
}
]
}
]
}
]