diff --git a/CHANGELOG.md b/CHANGELOG.md index be715fd..6309a7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 4.3.0 - 2021-09-10 + +- Added support for Thunderbird 93 +- Added country filter option +- Fixes map launching on cached messages + ## 4.2.1 - 2021-03-29 - Added a check for parsing the mail date. A bad formatted message date was failing to load the plugin. diff --git a/content/mailhops_details.xhtml b/content/mailhops_details.xhtml index de90203..2aa4fb4 100644 --- a/content/mailhops_details.xhtml +++ b/content/mailhops_details.xhtml @@ -4,32 +4,22 @@ MailHops - + - -
+
@@ -37,7 +37,14 @@
Options
General Options
-
+
+
+ +
+
Filter
+
Country Filter
+
+
@@ -52,7 +59,7 @@
- +
@@ -129,10 +136,790 @@

Flag messages as junk if travel time takes longer than normal.

+
+
+ +
+ + +
+
+
+
+ + +
+
+

Error log debug messages.

+
+ + diff --git a/js/mailhops.js b/js/mailhops.js index 7bf1ef6..0d9a626 100644 --- a/js/mailhops.js +++ b/js/mailhops.js @@ -10,7 +10,7 @@ const MailHops = { loading: false, previousId: null, options: { - version: 'MailHops Plugin 4.2.1', + version: 'MailHops Plugin 4.3.0', api_key: '', owm_key: '', lang: 'en', @@ -19,7 +19,6 @@ const MailHops = { api_http: 'https://', api_host: 'api.Mailhops.com', debug: false, - country_tag: false, travel_time_junk: false, country_filter: [] }, @@ -70,10 +69,16 @@ MailHops.init = function(id, headers) } if (data.theme) { MailHops.options.theme = data.theme; - } - if (typeof data.travel_time_junk != 'undefined') { - MailHops.options.travel_time_junk = data.travel_time_junk == 'on' ? true : false; - } + } + if (data.travel_time_junk && data.travel_time_junk != 'off') { + MailHops.options.travel_time_junk = Boolean(data.travel_time_junk); + } + if (data.debug) { + MailHops.options.debug = Boolean(data.debug); + } + if (data.countries) { + MailHops.options.country_filter = data.countries.split(','); + } MailHops.LOG('load MailHops prefs'); // reset message MailHops.message = { @@ -369,16 +374,16 @@ MailHops.auth = function (header_xmailer, header_useragent, header_xmimeole, hea //mailhops lookup MailHops.lookupRoute = function(header_route){ - var lookupURL = '?'+MailHopsUtils.getAPIUrlParams(MailHops.options)+'&r='+String(header_route)+'&l='+MailHops.options.lang+'&u='+MailHops.options.unit; + let lookupURL = '?'+MailHopsUtils.getAPIUrlParams(MailHops.options)+'&r='+String(header_route)+'&l='+MailHops.options.lang+'&u='+MailHops.options.unit; if(MailHops.options.owm_key != '') lookupURL += '&owm_key='+MailHops.options.owm_key; if(MailHops.message.time != null) lookupURL += '&t=' + MailHops.message.time; - if(MailHops.message.date != null) + if(MailHops.message.date != null) lookupURL += '&d='+MailHops.message.date; - MailHops.message.map_url = MailHopsUtils.getAPIUrl() + '/map/' + lookupURL; + MailHops.message.map_url = MailHopsUtils.getAPIUrl() + '/map/' + lookupURL; //call mailhops api for lookup var xmlhttp = new XMLHttpRequest(); @@ -386,8 +391,8 @@ var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState===4){ try { - var data = JSON.parse(xmlhttp.responseText); - if (xmlhttp.status === 200) { + let data = JSON.parse(xmlhttp.responseText); + if (xmlhttp.status === 200) { MailHops.cacheResponse(data.response); MailHops.displayRoute(data.response); //tag the result @@ -437,10 +442,8 @@ MailHops.cacheResponse = async function (response) { messages.list = data.messages.list; } messages.list[MailHops.message.hash] = response; - browser.storage.local.set({ - messages: messages - }); - MailHops.LOG('Cached Message '+MailHops.message.id+' hash '+MailHops.message.hash); + await browser.storage.local.set({messages: messages}); + MailHops.LOG('Cached Message ' + MailHops.message.id + ' hash ' + MailHops.message.hash); }; // get cached message @@ -463,9 +466,15 @@ MailHops.tagResults = function(results, route){ try { if(Boolean(MailHops.options.travel_time_junk) && MailHops.message.time != null && MailHops.message.time > 10000){ messenger.messages.update(MailHops.message.id, { 'junk': true }); - MailHops.LOG( "Junk: Travel time match" ); + MailHops.LOG( "Junk: Travel time match for " + MailHops.message.time ); + } + if (MailHops.options.country_filter.length && MailHops.message.sender && MailHops.message.sender.countryCode) { + if (MailHops.options.country_filter.indexOf(MailHops.message.sender.countryCode.toUpperCase()) != -1) { + messenger.messages.update(MailHops.message.id, { 'junk': true }); + MailHops.LOG( "Junk: Country code match for " + MailHops.message.sender.countryCode ); + } } } catch(e){ - MailHops.LOG("Error tagging travel_time_junk: " + e); + MailHops.LOG("Error tagResults: " + e); } }; \ No newline at end of file diff --git a/js/mailhops_details.js b/js/mailhops_details.js index d93008c..e8b0673 100644 --- a/js/mailhops_details.js +++ b/js/mailhops_details.js @@ -1,10 +1,25 @@ var port = browser.runtime.connect({ name: "MailHops" }); port.postMessage({ command: "details" }); -port.onMessage.addListener(function(msg) { - updateContent(msg); +port.onMessage.addListener(function (msg) { + updateContent(msg); document.getElementById("mh-map-button").addEventListener("click", function () { - browser.tabs.create({ url: msg.message.map_url }); + // rebuild map url if it's not there + if (!msg.message.map_url && msg.response && msg.response.route && msg.response.route.length) { + let header_route = msg.response.route.map(r => r.ip).join(','); + let lookupURL = '?'+MailHopsUtils.getAPIUrlParams(msg.options)+'&r='+String(header_route)+'&l='+msg.options.lang+'&u='+msg.options.unit; + + if(msg.options.owm_key != '') + lookupURL += '&owm_key='+msg.options.owm_key; + if(msg.message.time != null) + lookupURL += '&t=' + msg.message.time; + if(msg.message.date != null) + lookupURL += '&d='+msg.message.date; + + msg.message.map_url = MailHopsUtils.getAPIUrl() + '/map/' + lookupURL; + } + if(msg.message.map_url) + browser.tabs.create({ url: msg.message.map_url }); }); }); @@ -12,16 +27,13 @@ document.getElementById("mh-options-button").addEventListener("click", function browser.tabs.create({ url: '/content/preferences.html' }); }); -function updateContent(msg) { +function updateContent(msg, noauth) { //setup reload document.getElementById("mh-reload-button").addEventListener("click", async function () { let data = await browser.storage.local.get('messages'); if (data.messages && data.messages.list[msg.message.hash]) { - console.log(data.messages); delete data.messages.list[msg.message.hash]; - browser.storage.local.set({ - messages: data.messages - }); + await browser.storage.local.set({messages: data.messages}); } this.innerHTML = "Removed!"; document.location.reload(); @@ -69,7 +81,6 @@ function updateContent(msg) { for (var i = 0; i < route.length; i++) { var header = 'Private'; var icon = '/images/local.png'; - var distance = ''; // set the client route if (route[i].client) client = route[i]; @@ -88,7 +99,7 @@ function updateContent(msg) { else if (route[i].countryName) header = route[i].countryName; - var description = '' + route[i].ip + '
'; + var description = '' + route[i].ip + '
'; if (msg.message.secure.indexOf(route[i].ip) !== -1) { description += ' '; @@ -115,12 +126,19 @@ function updateContent(msg) { } var auth = ''; - if (msg.message.auth.length) { + if (!noauth && msg.message.auth.length) { for (var a = 0; a < msg.message.auth.length; a++){ - if(msg.message.auth[a].icon) - auth += ''; - else if(msg.message.auth[a].link) - auth += '' + msg.message.auth[a].type + ''; + if (msg.message.auth[a].icon) { + auth += ''; + } + else if (msg.message.auth[a].link) { + if (msg.message.auth[a].link.indexOf(',')) { + auth += '' + msg.message.auth[a].type + ''; + } + else { + auth += '' + msg.message.auth[a].type + ''; + } + } } } // append child @@ -131,6 +149,7 @@ function updateContent(msg) { if (sender && client) { document.getElementById('hop-message-header').innerHTML += ' over '+MailHopsUtils.getDistance(sender, client, unit) + ' ' + unit; } + // hop list document.getElementById('hop-list').innerHTML = items.join(''); try { @@ -138,5 +157,8 @@ function updateContent(msg) { } catch (error) { if(error) console.error('MailHops', error); + // if auth has bad html load without auth + if(!noauth) + updateContent(msg, true); } } \ No newline at end of file diff --git a/js/preferences.js b/js/preferences.js index d77fa90..fa7aeac 100644 --- a/js/preferences.js +++ b/js/preferences.js @@ -3,7 +3,10 @@ const MailHopPreferences = { valid_api_key: false, unit: 'mi', theme: 'light', + debug: false, + travel_time_junk: false, owm_key: '', //OpenWeatherMap.org api key + countries: [], init: async function(){ var self = this; @@ -28,9 +31,20 @@ const MailHopPreferences = { self.savePreferences(); }); + document.getElementById("mh-save-filter").addEventListener("click", function () { + self.savePreferences(); + }); + + document.getElementById("mh-clear-filter").addEventListener("click", function () { + self.clearCountries(); + self.savePreferences(); + }); + document.getElementById("step_one").addEventListener("click", function () { document.getElementById("step_two").classList.remove('active'); + document.getElementById("step_three").classList.remove('active'); this.classList.add('active'); + document.getElementById("step_filter").style.display = 'none'; document.getElementById("step_settings").style.display = 'none'; document.getElementById("step_api_keys").style.display = 'block'; document.getElementById("saved_message").style.display = 'none'; @@ -39,49 +53,82 @@ const MailHopPreferences = { document.getElementById("step_two").addEventListener("click", function () { document.getElementById("step_one").classList.remove('active'); - this.classList.add('active'); + document.getElementById("step_three").classList.remove('active'); + this.classList.add('active'); + document.getElementById("step_filter").style.display = 'none'; document.getElementById("step_settings").style.display = 'block'; document.getElementById("step_api_keys").style.display = 'none'; document.getElementById("saved_message").style.display = 'none'; document.getElementById("error_message").style.display = 'none'; }); + document.getElementById("step_three").addEventListener("click", function () { + document.getElementById("step_one").classList.remove('active'); + document.getElementById("step_two").classList.remove('active'); + this.classList.add('active'); + document.getElementById("step_filter").style.display = 'block'; + document.getElementById("step_settings").style.display = 'none'; + document.getElementById("step_api_keys").style.display = 'none'; + document.getElementById("saved_message").style.display = 'none'; + document.getElementById("error_message").style.display = 'none'; + }); + const data = await browser.storage.local.get(); + this.theme = data.theme || 'light'; + this.unit = data.unit || 'mi'; + this.travel_time_junk = Boolean(data.travel_time_junk); + this.debug = Boolean(data.debug); + + if (data.countries) { + this.countries = data.countries.split(','); + } + + let countries = document.getElementsByClassName("country"); + + for(var i = 0; i < countries.length; i++) { + (function(index) { + countries[index].addEventListener("click", function () { + if (this.checked) { + self.countries.push(this.value); + } else if (self.countries.indexOf(this.value) != -1) { + self.countries.splice(self.countries.indexOf(this.value), 1); + } + }); + })(i); + } + if (data.api_key) { self.api_key.value = data.api_key; document.getElementById("join-link").innerHTML = 'My Account and Dashboard'; - document.getElementById("join-link").setAttribute('href', 'https://mailhops.com/account/' + data.api_key); - } + document.getElementById("join-link").setAttribute('href', 'https://www.mailhops.com/account/' + data.api_key); + } + if (data.owm_key) { self.owm_key.value = data.owm_key; } - if (data.unit) { - if (data.unit == "mi") - document.getElementById("unit_mi").setAttribute('checked', 'checked'); - else - document.getElementById("unit_km").setAttribute('checked', 'checked'); - } else { - document.getElementById("unit_mi").setAttribute('checked', 'checked'); - } - if (data.theme) { - if (data.theme == "dark") - document.getElementById("theme_dark").setAttribute('checked', 'checked'); - else - document.getElementById("theme_light").setAttribute('checked', 'checked'); - } else { - document.getElementById("theme_light").setAttribute('checked', 'checked'); - } - if (typeof data.travel_time_junk != 'undefined') { - if (data.travel_time_junk == 'on') - document.getElementById("travel_time_junk_on").setAttribute('checked', 'checked'); - else - document.getElementById("travel_time_junk_off").setAttribute('checked', 'checked'); - } else { - document.getElementById("travel_time_junk_off").setAttribute('checked', 'checked'); - } - if (data.theme && data.theme == "dark") { + if (data.unit == "mi") + document.getElementById("unit_mi").setAttribute('checked', 'checked'); + else + document.getElementById("unit_km").setAttribute('checked', 'checked'); + + if (this.theme == "dark") + document.getElementById("theme_dark").setAttribute('checked', 'checked'); + else + document.getElementById("theme_light").setAttribute('checked', 'checked'); + + if (this.travel_time_junk) + document.getElementById("travel_time_junk_on").setAttribute('checked', 'checked'); + else + document.getElementById("travel_time_junk_off").setAttribute('checked', 'checked'); + + if (this.debug) + document.getElementById("debug_on").setAttribute('checked', 'checked'); + else + document.getElementById("debug_off").setAttribute('checked', 'checked'); + + if (this.theme == "dark") { if (!document.getElementById("mh-main-segment").classList.contains("inverted")) { document.getElementById("mh-main-segment").classList.add("inverted"); document.getElementById("mh-steps").classList.add("inverted"); @@ -90,6 +137,8 @@ const MailHopPreferences = { document.getElementById("step_settings").classList.add("inverted"); document.getElementById("mh-save").classList.add("inverted"); document.getElementById("mh-save-options").classList.add("inverted"); + document.getElementById("mh-save-filter").classList.add("inverted"); + document.getElementById("mh-clear-filter").classList.add("inverted"); } } else { if (document.getElementById("mh-main-segment").classList.contains("inverted")) { @@ -100,39 +149,66 @@ const MailHopPreferences = { document.getElementById("step_settings").classList.remove("inverted"); document.getElementById("mh-save").classList.remove("inverted"); document.getElementById("mh-save-options").classList.remove("inverted"); + document.getElementById("mh-save-filter").classList.remove("inverted"); + document.getElementsByClassName("checkbox").classList.remove("inverted"); + document.getElementById("mh-clear-filter").classList.remove("inverted"); } } await this.saveAPIKey(true); await this.loadAccounts(); + + this.updateCountries(); }, loadAccounts: async function () { let accounts = await messenger.accounts.list(); if (accounts.length) { accounts.map(a => { - if (a.identities.length) { - if (a.identities.length && a.identities[0].email) { - var option = document.createElement('option'); - option.value = a.identities[0].email; - option.text = a.identities[0].email; - document.getElementById("accounts").add(option); - } + if (a.identities.length && a.identities[0].email) { + var option = document.createElement('option'); + option.value = a.identities[0].email; + option.text = a.identities[0].email; + document.getElementById("email-accounts").add(option); } }); - document.getElementById("accounts").selectedIndex = 0; + document.getElementById("email-accounts").selectedIndex = 0; } }, - savePreferences: function (init) { + updateCountries: function (clear) { + var countries = document.getElementById("country-list").getElementsByClassName("checkbox"); var self = this; - browser.storage.local.set({ + for(var i = 0; i < countries.length; i++) { + (function (index) { + if (clear) + countries[index].children[0].checked = false; + else if (self.countries.indexOf(countries[index].children[0].value) != -1) + countries[index].children[0].checked = true; + if (self.theme == 'dark') + countries[index].classList.add("inverted"); + else + countries[index].classList.remove("inverted"); + })(i); + } + }, + + clearCountries: function () { + this.countries = []; + this.updateCountries(true); + }, + + savePreferences: async function (init) { + var self = this; + await browser.storage.local.set({ api_key: self.api_key.value.trim(), owm_key: self.owm_key.value.trim(), unit: document.querySelector('input[name="unit"]:checked').value, theme: document.querySelector('input[name="theme"]:checked').value, - travel_time_junk: document.querySelector('input[name="travel_time_junk"]:checked').value, + travel_time_junk: document.querySelector('input[name="travel_time_junk"]:checked').value == 'on' ? true : false, + debug: document.querySelector('input[name="debug"]:checked').value == 'on' ? true : false, + countries: self.countries.join(','), }); if(!init) document.getElementById("saved_message").style.display = 'block'; @@ -145,8 +221,12 @@ const MailHopPreferences = { document.getElementById("mh-segment").classList.add("inverted"); document.getElementById("mh-form").classList.add("inverted"); document.getElementById("step_settings").classList.add("inverted"); + document.getElementById("step_api_keys").classList.add("inverted"); + document.getElementById("step_filter").classList.add("inverted"); document.getElementById("mh-save").classList.add("inverted"); document.getElementById("mh-save-options").classList.add("inverted"); + document.getElementById("mh-save-filter").classList.add("inverted"); + document.getElementById("mh-clear-filter").classList.add("inverted"); } } else { if (document.getElementById("mh-main-segment").classList.contains("inverted")) { @@ -155,19 +235,23 @@ const MailHopPreferences = { document.getElementById("mh-segment").classList.remove("inverted"); document.getElementById("mh-form").classList.remove("inverted"); document.getElementById("step_settings").classList.remove("inverted"); + document.getElementById("step_api_keys").classList.remove("inverted"); + document.getElementById("step_filter").classList.remove("inverted"); document.getElementById("mh-save").classList.remove("inverted"); document.getElementById("mh-save-options").classList.remove("inverted"); + document.getElementById("mh-save-filter").classList.remove("inverted"); + document.getElementById("mh-clear-filter").classList.remove("inverted"); } } + this.updateCountries(); return true; }, sendAPIKey: async function () { document.getElementById("saved_message").style.display = 'none'; document.getElementById("error_message").style.display = 'none'; - - if (document.getElementById("accounts").selectedIndex && document.getElementById("accounts").selectedIndex >= 0) { - var email = document.getElementById("accounts").options[document.getElementById("accounts").selectedIndex].text; + if (document.getElementById("email-accounts").selectedIndex && document.getElementById("email-accounts").selectedIndex >= 0) { + var email = document.getElementById("email-accounts").options[document.getElementById("email-accounts").selectedIndex].text; if (email) { var xmlhttp = new XMLHttpRequest(); var apiBase = 'https://www.mailhops.com/account/lostkey.php'; @@ -224,16 +308,16 @@ const MailHopPreferences = { document.getElementById("plan-error").style.display = 'none'; // set plan info if (data.account.subscriptions) { - document.getElementById("plan").innerHTML = "Plan: "+data.account.subscriptions.data[0].plan.name; - document.getElementById("status").innerHTML = "Status: "+data.account.subscriptions.data[0].status; + document.getElementById("plan").innerHTML = "Plan: " + data.account.subscriptions.data[0].plan.name; + document.getElementById("status").innerHTML = "Status: " + data.account.subscriptions.data[0].status; } else { document.getElementById("plan").innerHTML = "Plan: No Plan Yet"; document.getElementById("status").innerHTML = "Status: Not Active"; } - document.getElementById("rate-limit").innerHTML = "Limit: "+data.account.rate.limit; - document.getElementById("rate-remaining").innerHTML = "Remaining: "+data.account.rate.remaining; - if(data.account.rate.reset/60 < 60) - document.getElementById("rate-reset").innerHTML = "Resets in: "+Math.round(data.account.rate.reset/60)+" min."; + document.getElementById("rate-limit").innerHTML = "Limit: " + data.account.rate.limit; + document.getElementById("rate-remaining").innerHTML = "Remaining: " + data.account.rate.remaining; + if (data.account.rate.reset / 60 < 60) + document.getElementById("rate-reset").innerHTML = "Resets in: " + Math.round(data.account.rate.reset / 60) + " min."; else document.getElementById("rate-reset").innerHTML = "Resets in: " + Math.round(data.account.rate.reset / 60 / 60) + " hr."; @@ -250,7 +334,7 @@ const MailHopPreferences = { } MailHopPreferences.savePreferences(init); } catch (e){ - self.planError('Connection Failed to\n '+e+'!'); + self.planError('Connection Failed to\n ' + e + '!'); } } }; diff --git a/manifest.json b/manifest.json index 63d10e1..7325c88 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_appName__", "description": "__MSG_appDesc__", - "version": "4.2.1", + "version": "4.3.0", "author": "Hopsware LLC", "developer": { "name": "Andrew Van Tassel", @@ -11,7 +11,8 @@ "applications": { "gecko": { "id": "thunderbird@mailhops.com", - "strict_min_version": "74.0" + "strict_min_version": "74.0", + "strict_max_version": "93.*" } }, "default_locale": "en",