diff options
-rw-r--r-- | content/contactFinder.js | 154 |
1 files changed, 75 insertions, 79 deletions
diff --git a/content/contactFinder.js b/content/contactFinder.js index 48f9c27..320bd2e 100644 --- a/content/contactFinder.js +++ b/content/contactFinder.js @@ -2,6 +2,7 @@ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. * * * Copyright (C) 2017 Nathan Nichols, Loic J. Duros, Nik Nyby +* Copyright (C) 2018 Giorgio Maone * * This file is part of GNU LibreJS. * @@ -23,8 +24,12 @@ // - open the manifest.json // - add a comma after the closing bracket of the key "background" // - Copy and paste this after it: -/* - "content_scripts": [{"matches": ["<all_urls>"],"js": ["contact_finder.js"]}] +/* + "content_scripts": [{ + "matches": ["<all_urls>"], + "js": ["/content/contactFinder.js"], + "css": ["/content/contactFinder.css"] + }] */ // Now, the contact finder will load on every page and you can test it where ever you want. @@ -34,7 +39,7 @@ //Copyright (C) 2011, 2012, 2014 Loic J. Duros //Copyright (C) 2014, 2015 Nik Nyby -console.log("contact_finder.js"); +console.debug("Injecting contact finder in %s", document.URL); // email address regexp var reEmail = /^mailto\:(admin|feedback|webmaster|info|contact|support|comments|team|help)\@[a-z0-9.\-]+\.[a-z]{2,4}$/i; @@ -121,33 +126,14 @@ var email_regex = new RegExp(/(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'* var prefs; /** -* -* Creates a transparent floating button from a name string and a callback -* -* -*/ -function new_debug_button(name_text,callback){ - if(document.getElementById("abc123_main_div") !== null){ - document.getElementById("abc123_main_div").remove(); - } - console.log("adding button"); - if(document.getElementById("abc123_main_div") === null){ - var to_insert = '<div style="opacity: 0.5; font-size: small; z-index: 2147483647; position: fixed; right: 1%; top: 4%;" id="abc123_main_div"></div>'; - document.body.insertAdjacentHTML('afterbegin', to_insert); - } - var button_html = '<input id="abc123_button_complain" value="' + name_text +'" type="button"></input><br>'; - document.getElementById("abc123_main_div").insertAdjacentHTML('afterbegin', button_html); document.getElementById("abc123_button_complain").addEventListener("click",callback); - -} -/** * returns input with all elements not of type string removed */ function remove_not_str(a){ - var new_a = []; + var new_a = []; for(var i in a){ if(typeof(a[i]) == "string"){ new_a.push(a[i]) - } + } } return new_a; } @@ -157,7 +143,7 @@ function remove_not_str(a){ * Will return either the first regex match from the selected certainty level or all regexes that * match on that certainty level. * -* certainty_lvl can be "certain" > "probable" > "uncertain" +* certainty_lvl can be "certain" > "probable" > "uncertain" */ function attempt(certainty_lvl, first=true){ // There needs to be some kind of max so that people can't troll by for example leaving a comment with a bunch of emails @@ -165,8 +151,8 @@ function attempt(certainty_lvl, first=true){ var fail_flag = true; var flag; var matches = []; - var result = []; - var str_under_test = ""; + var result = []; + var str_under_test = ""; for(var i in document.links){ if( typeof(document.links[i].innerText) != "string" || typeof(document.links[i].href) != "string"){ continue; @@ -176,10 +162,10 @@ function attempt(certainty_lvl, first=true){ for(var j in contactStr){ for(var k in contactStr[j][certainty_lvl]){ if(flag){ - result = []; + result = []; result = str_under_test.match(new RegExp(contactStr[j][certainty_lvl][k],"g")); result = remove_not_str(result); - if(result !== undefined && typeof(result[0]) == "string" ){ + if(result !== undefined && typeof(result[0]) == "string" ){ if(first){ return {"fail":false,"result":document.links[i]}; } else{ @@ -197,7 +183,7 @@ function attempt(certainty_lvl, first=true){ } /** -* "LibreJS detects contact pages, email addresses that are likely to be owned by the +* "LibreJS detects contact pages, email addresses that are likely to be owned by the * maintainer of the site, Twitter and identi.ca links, and phone numbers." */ function find_contacts(){ @@ -207,19 +193,19 @@ function find_contacts(){ var identi = []; var contact_pages = []; var res = attempt("certain"); - var flag = true; + var flag = true; var type = ""; if(res["fail"] == false){ type = "certain"; res = res["result"]; - flag = false; + flag = false; } if(flag){ res = attempt("probable"); if(res["fail"] == false){ type = "probable"; res = res["result"]; - flag = false; + flag = false; } } if(flag){ @@ -227,7 +213,7 @@ function find_contacts(){ if(res["fail"] == false){ type = "uncertain"; res = res["result"]; - flag = false; + flag = false; } } if(flag){ @@ -235,63 +221,73 @@ function find_contacts(){ } return [type,res]; } -// need to have this so the handler doesn't take too long -function handler(){ - var res = find_contacts(); - if(document.getElementById("librejs_contactfinder") != null){ - document.getElementById("librejs_contactfinder").remove(); - } - var to_insert; - if("fail" in res){ - to_insert = '<div style="font-size: small; z-index: 2147483647; background-color: #eeeeee;'+ - 'position: fixed; display:inline-block; border: 3px solid #990000; width: 50%;"'+ - ' id="librejs_contactfinder">'+ - "Contact finder failed."; - } else{ - if(typeof(res[1]) == "string"){ - to_insert = '<div style="font-size: small; z-index: 2147483647; background-color: #eeeeee;'+ - 'position: fixed; display:inline-block; border: 3px solid #990000; width: 50%;"'+ - ' id="librejs_contactfinder"><b>Result:</b><br>'+ - res[0] + ": " + '<a href="' + res[1] + '>'+res[1]+'</a>'; - } - if(typeof(res[1]) == "object"){ - to_insert = '<div style="font-size: small; z-index: 2147483647; background-color: #eeeeee;'+ - 'position: fixed; display:inline-block; border: 3px solid #990000; width: 50%;"'+ - ' id="librejs_contactfinder"><b>Result:</b><br>'+ - res[0]+": "+res[1].outerHTML; + +function createWidget(id, tag) { + let widget = document.getElementById(id); + if (widget) widget.remove(); + widget = document.body.appendChild(document.createElement(tag)); + widget.id = id; + return widget; +} + +/** +* +* Creates the contact finder / complain UI as a semi-transparent overlay +* +*/ + +function createOverlay() { + let res = find_contacts(); + let widget = createWidget("_LibreJS_CF_panel", "div"); + let addHTML = s => widget.insertAdjacentHTML("beforeend", s); + widget.innerHTML = "<h3>LibreJS Complaint</h3>"; + if ("fail" in res){ + widget.classList.toggle("_LibreJS_CF_fail", true) + addHTML("<div>Contact finder failed.</div>"); + } else { + addHTML("<h3>LibreJS</h3><h4>Contact info guessed for this site</h4>"); + if(typeof(res[1]) === "string") { + let a = document.createElement("a"); + a.href = a.textContent = res[1]; + widget.appendChild(a); + } else if (typeof(res[1]) === "object"){ + addHTML(`${res[0]}: ${res[1].outerHTML}`); } } - var email = document.documentElement.innerText.match(email_regex); - if(email != null){ - var max_i = 0; - if(email.length >= 10){ - max_i = 10; - } else{ - max_i = email.length; - } - for(var i = 0; i < max_i; i++){ - var mailto = "mailto:"+email[i]+"?subject="+encodeURI(prefs["pref_subject"])+"&body="+encodeURI(prefs["pref_body"]); - to_insert += '<br>' + 'Possible email: <a href="' + mailto + '">'+email[i]+'</a>'; + let email = document.documentElement.innerText.match(email_regex); + if (email != null) { + addHTML("<h5>Possible email addresses:</h5>"); + let list = document.createElement("ul"); + let max = Math.max(email.length, 10); + for (let i = 0; i < max; i++) { + let recipient = email[i]; + let a = document.createElement("a"); + a.href = `mailto:${recipient}?subject${ + encodeURIComponent(prefs["pref_subject"]) + }&body=${ + encodeURIComponent(prefs["pref_body"]) + }`; + a.textContent = recipient; + list.appendChild(document.createElement("li")).appendChild(a); } + widget.appendChild(list); } - to_insert += '</div>'; - - setTimeout(function(){document.getElementById("librejs_contactfinder").remove()}, 7500); - document.body.insertAdjacentHTML("afterbegin",to_insert); - return 0; - + let closeListener = e => { + if (!widget.contains(e.target)) { + widget.remove(); + window.removeEventListener("click", closeListener); + } + }; + window.addEventListener("click", closeListener); } -function main(){ - new_debug_button("Complain to website",handler); -} var myPort = browser.runtime.connect({name:"contact_finder"}); myPort.onMessage.addListener(function(m) { prefs = m; - main(); + createOverlay(); }); |