diff options
| -rw-r--r-- | eval_test.js | 195 | ||||
| -rw-r--r-- | html/display_panel/content/main_panel.js | 11 | ||||
| -rw-r--r-- | main_background.js | 55 | ||||
| -rw-r--r-- | manifest.json | 5 | 
4 files changed, 185 insertions, 81 deletions
| diff --git a/eval_test.js b/eval_test.js index d0de7e5..e930a48 100644 --- a/eval_test.js +++ b/eval_test.js @@ -50,17 +50,17 @@ var licenses = {  		'URL': 'http://www.apache.org/licenses/LICENSE-2.0',  		'Magnet link': 'magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7&dn=apache-2.0.txt'  	}, -	// No identifier was present +	// No identifier was present in documentation  	'Artistic-2.0':{  		'URL': 'http://www.perlfoundation.org/artistic_license_2_0',  		'Magnet link': 'magnet:?xt=urn:btih:54fd2283f9dbdf29466d2df1a98bf8f65cafe314&dn=artistic-2.0.txt'  	}, -	// No identifier was present +	// No identifier was present in documentation  	'Boost':{  		'URL': 'http://www.boost.org/LICENSE_1_0.txt',  		'Magnet link': 'magnet:?xt=urn:btih:89a97c535628232f2f3888c2b7b8ffd4c078cec0&dn=Boost-1.0.txt'  	}, -	// No identifier was present +	// No identifier was present in documentation  	'BSD-3-Clause':{  		'URL': 'http://opensource.org/licenses/BSD-3-Clause',  		'Magnet link': 'magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt', @@ -131,7 +131,7 @@ var licenses = {  		'URL': 'http://unlicense.org/UNLICENSE',  		'Magnet link': 'magnet:?xt=urn:btih:5ac446d35272cc2e4e85e4325b146d0b7ca8f50c&dn=unlicense.txt'  	}, -	// No identifier was present +	// No identifier was present in documentation  	'X11':{  		'URL': 'http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3',  		'Magnet link': 'magnet:?xt=urn:btih:5305d91886084f776adcf57509a648432709a7c7&dn=x11.txt'	 @@ -143,79 +143,206 @@ var licenses = {  	}  } -var license_regexes = { -	// Comments on a single line only -	"JScomment": /(\/\/.*\n)|(\/\*.*\*\/)/g, -	"JSallcomment": /(\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)|(\/\/.*)/g, -	// "@license [magnet link] [identifier]" -	"license_start": /@license[^\S\n]+magnet:\S+[^\S\n]+\S+/g,	 -	// "@license-end"	 -	"license_end": /\/\/\s*@license\-end/g -} -  /**  *  *	Runs regexes to search for explicit delcarations of script -*	licenses on the argument. (// @license, //@license-end) -*	 -*	Returns the identifier string or "fail". +*	licenses on the argument.  +*	It detects:	 +*	// @license, //@license-end +*	// licstart, //licend +*	Returns the identifier string of the license or "fail".  *  */  function license_read(script_src){ +	if(typeof(script_src) != "string"){ +		return "fail" +	}  	var license_attempts = []; -	var comment_regex = new RegExp(license_regexes["JSallcomment"]);	 -	var comments = script_src.match(comment_regex); +	// comment regex +	var comments = script_src.match(/(\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)|(\/\/.*)/g);  	if(comments == null){  		comments = [];  	}  	console.log("%c comments:","color:green;")  	console.log(comments); + +	// Not sure if there is any better way to do this.  	for(var i = 0; i < comments.length; i++){  		if(comments[i] !== undefined){ -			if(comments[i].match(license_regexes["license_start"]) != null){ -				console.log("License start:"); -				console.log(comments[i])			 +			// license_start regex +			if(comments[i].match(/@license[^\S\n]+magnet:\S+[^\S\n]+\S+/g) != null){ +				console.log("License start detected."); +				var content = comments[i].match(/(?:magnet:\S+)(\s+.+)/g); +				if(content != null){ +					content[0].replace(/\s+/g," "); +					content = content[0].split(" "); +					var magnet = content[0]; +					var identifier = ""; +					for(var i = 1; i < content.length; i++){ +						if(i == 1){						 +							identifier = identifier + content[i]; +						} else{ +							identifier = identifier + "-" + content[i]; +						}				 +					} +					var valid = true; +					if(licenses[identifier]["Magnet link"] != magnet){ +						valid = false; +					} +					if((identifier in licenses) == false){ +						valid = false; +					} +					console.log("Valid? "+ valid); +				} else{ +					console.log("Valid? false"); +				}	  			} - -			if(comments[i].match(license_regexes["license_end"]) != null){ +			// license-end regex +			if(comments[i].match(/\/\/\s*@license\-end/g) != null){  				console.log("License end:");  				console.log(comments[i])			  			}  		}  	} +	//console.log("VERDICT: probably nonfree"); +	//console.log("VERDICT: probably free"); +} + +/** +* +*	Checks the whitelist in storage +*	(Not the comma seperated whitelist from settings) +* +*/ +function is_whitelisted(){ +	// TODO: implement +	return false; +  } -// The Javascript evaluation can be tested as a content script	until we have -// the API features we need to make it run before the page's scripts do. -// To run this, set it as a content script active on all URLs in the manifest.json. +/** +* Parses the weblabels table from a DOM object +* +*/ +function read_weblabels_table(weblabel){ +	var tbody = weblabel.getElementsByTagName("td"); +	for(var i = 0; i < tbody.length; i++){ +		var link = tbody[i].getElementsByTagName("a")[0]; +		console.log(link.href); +		console.log(link.innerText); +	} +} + +/** +*	Reads the weblabels table from a link. +* +*/ +function get_table(url){ +	var xml = new XMLHttpRequest(); +	xml.open("get",url) +	xml.onload = function(){ +		var a = new DOMParser() +		var doc = a.parseFromString(this.responseText,"text/html"); +		var web_label = doc.getElementById("jslicense-labels1"); +		if(web_label != null){ +			read_weblabels_table(web_label); +		} +	} +	xml.send(); +}  // called when invoked by the button -function handler(){ +function analyze(){ +	// TODO: Call get_whitelisted_status on this page's URL +	 +	// Test "the first piece of Javascript available to the page" for the license comment +	// TODO: Is this supposed to test if the license is free or just assume that it is?	 +	if(document.scripts[0] !== undefined){ +		if(document.scripts[0].src != ""){ +			var name = document.scripts[0].src; +			var xml = new XMLHttpRequest(); +			xml.open("get", document.scripts[0].src); +			xml.onload = function(response){ +				var matches = this.responseText.match(/@licstart[\s\S]+@licend/g); +				if(matches != null){ +					console.log("License comment found:"); +					console.log(matches[0]); +				} +			} +			xml.send(); +		} else{ +			console.log("%c Script " + i + ": (src: inline)","color:red;"); +			var matches = document.scripts[0].innerText.match(/@licstart[\s\S]+@licend/g); +			if(matches != null){ +				console.log("License comment found:"); +				console.log(matches[0]); +			} +		}	 +	} +	// Test for the link that has rel="jslicense", data-jslicense="1"   +	for(var i = 0; i < document.links.length; i++){ +		// TODO: also check if data-jslicense == "1". (how?) +		if(document.links[i].rel == "jslicense"){ +			console.log("Found HTML table link:"); +			get_table(document.links[i].href);			 +			break; +		} +	} +	// Test for the JavaScript Web Labels table +	var weblabel = document.getElementById("jslicense-labels1"); +	if(weblabel !== undefined && weblabel != null){ +		console.log("Found web labels table"); +		read_weblabels_table(weblabel); +	} + +	// Call license_read on all the document's scripts  +	// This is done just to debug before we can implement this in a background script, +	// where it will have access to the individual script requests and HTML document.   	for(var i = 0; i < document.scripts.length; i++){  		if(document.scripts[i].src != ""){ +			// it is a remote script ("<script src='/script.js'></script>")  			var name = document.scripts[i].src;  			var xml = new XMLHttpRequest();  			xml.open("get", document.scripts[i].src);  			xml.onload = function(response){ -				console.log("%c Script " + i + ": (src: " + name + ")","color:red;"); +				console.log("%c Script " + i + ":","color:red;"); +				console.log(name);  				license_read(this.responseText);  			}  			xml.send();  		} else{ -			name = "inline"; -			source = document.scripts[i].innerText; +			// it is an inline script ("<script>console.log('test');</script>")  			console.log("%c Script " + i + ": (src: inline)","color:red;"); -			license_read(document.scripts[i]);	 +			//console.log(document.scripts[i].innerText); +			license_read(document.scripts[i].innerText);	  		}	  	} +	// Find all the document's elements with intrinsic events +	for(var i = 0; i < document.all.length; i++){ +		for(var j = 0; j < intrinsicEvents.length; j++){ +			if(intrinsicEvents[j] in document.all[i].attributes){ +				console.log("intrinsic event JS found in element:"); +				console.log(document.all[i][intrinsicEvents[j]].toString()); +			} +		} + +	} + +  } + +/** +*	Makes a button appear that calls a function when you press it. +* +*	I copied and pasted this from something else I wrote. It's quite useful. +*	 +*/  var button_i = 0;  if(document.getElementById("abc123_main_div") !== null){  	document.getElementById("abc123_main_div").remove();  } -  function new_debug_button(name_text,callback){  	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>'; @@ -227,7 +354,7 @@ function new_debug_button(name_text,callback){  	button_i = button_i + 1;  } -new_debug_button("Evaluate scripts",handler); +new_debug_button("Evaluate scripts",analyze);  new_debug_button("Remove these buttons",function(){  	if(document.getElementById("abc123_main_div") !== null){  		document.getElementById("abc123_main_div").remove(); diff --git a/html/display_panel/content/main_panel.js b/html/display_panel/content/main_panel.js index 3848a2e..c6d2059 100644 --- a/html/display_panel/content/main_panel.js +++ b/html/display_panel/content/main_panel.js @@ -1,3 +1,6 @@ +//TODO: there is a known bug involving "forget preference" not working correctly. + +  /**  *	  *	Sets global variable "webex" to either "chrome" or "browser" for @@ -114,6 +117,9 @@ var template = '<tr><td id="c1"></td><td id="c2"></td></tr>';  var lr_flag = true;  var button_num = 0;  function write_button(button,callback){ +	if(document.getElementById("buttons_table").innerHTML.indexOf(button) != -1){ +		return;	 +	}  	var id = "buttonno_"+button_num;  	if(lr_flag){  		document.getElementById("buttons_table").insertAdjacentHTML("beforeend",template); @@ -161,6 +167,8 @@ function generate_HTML(blocked_data){  	for(var i = 0; i < to_clr.length; i++){  		to_clr[i].innerHTML = "";  	} +	console.log("REGEN HTML:"); +	console.log(blocked_data);  	write_elements(blocked_data,"accepted","green");  	write_elements(blocked_data,"whitelisted","green");  	write_elements(blocked_data,"blocked","red"); @@ -181,8 +189,7 @@ function generate_HTML(blocked_data){  			myPort.postMessage({"open_popup_tab": blocked_data});  		});  	} else{ -		write_button(button_new_tab,"l",function(){ -			// NOTE: does not  +		write_button(button_new_tab,function(){  			myPort.postMessage({"open_popup_tab": blocked_data});  		});  	} diff --git a/main_background.js b/main_background.js index 1e31d64..cf8ca80 100644 --- a/main_background.js +++ b/main_background.js @@ -37,7 +37,7 @@ function options_listener(changes, area){  	function flushed(){  		console.log("cache flushed");  	}	 -	var flushingCache = webex.webRequest.handlerBehaviorChanged(flushed); +	//var flushingCache = webex.webRequest.handlerBehaviorChanged(flushed);  	console.log("Items updated in area" + area +": "); @@ -108,6 +108,10 @@ function debug_print_local(){  *		"url": "example.com"  *	}  * +*	NOTE: This WILL break if you provide inconsistent URLs to it. +*	Make sure it will use the right URL when refering to a certain script. +* +*  */  function update_popup(tab_id,blocked_info_arg,update=false){  	var new_blocked_data; @@ -168,12 +172,12 @@ function update_popup(tab_id,blocked_info_arg,update=false){  			for(var script_arr in blocked_info[type]){  				if(is_bl(blocked_info[type][script_arr][0])){  					new_blocked_data["blacklisted"].push(blocked_info[type][script_arr]); -					//console.log("Script " + blocked_info[type][script_arr][0] + " is blacklisted"); +					console.log("Script " + blocked_info[type][script_arr][0] + " is blacklisted");  					continue;  				}  				if(is_wl(blocked_info[type][script_arr][0])){  					new_blocked_data["whitelisted"].push(blocked_info[type][script_arr]); -					//console.log("Script " + blocked_info[type][script_arr][0] + " is whitelisted"); +					console.log("Script " + blocked_info[type][script_arr][0] + " is whitelisted");  					continue;  				}  				if(type == "url"){ @@ -181,9 +185,10 @@ function update_popup(tab_id,blocked_info_arg,update=false){  				}  				// either "blocked" or "accepted"  				new_blocked_data[type].push(blocked_info[type][script_arr]); -				//console.log("Script " + blocked_info[type][script_arr][0] + " isn't whitelisted or blacklisted");			 +				console.log("Script " + blocked_info[type][script_arr][0] + " isn't whitelisted or blacklisted");			  			}  		}		 +		console.log(new_blocked_data);  		//***********************************************************************************************//  		// store the blocked info until it is opened and needed  		if(update == false && active_connections[tab_id] === undefined){ @@ -221,16 +226,13 @@ function connected(p) {  				current_url = tabs[0]["url"];  				// The space char is a valid delimiter because encodeURI() replaces it with %20  -				  				var scriptkey = encodeURI(current_url)+" "+encodeURI(script); -				  				if(val == "forget"){  					var prom = webex.storage.local.remove(scriptkey);  					// TODO: This should produce a "Refresh the page for this change to take effect" message  				} else{  					var newitem = {};  					newitem[scriptkey] = val; -  					webex.storage.local.set(newitem);			  				}  			} @@ -275,15 +277,9 @@ function connected(p) {  				inject_contact_finder(tabs[0]["id"]);  			}  			if(update){ -				// TODO: check the Firefox equivalent reserved URL pattern -				if(typeof(tabs[0]["url"].match(/chrome\-extension:\/\/.*display-panel\.html/g)) == "object"){  -					console.log("%c Not updating popup because this is a reserved page","color: red;"); -					return; -				} else{ -					console.log("%c updating tab "+tabs[0]["id"],"color: red;"); -					update_popup(tabs[0]["id"],unused_data[tabs[0]["id"]],true); -					active_connections[tabs[0]["id"]] = p; -				}				 +				console.log("%c updating tab "+tabs[0]["id"],"color: red;"); +				update_popup(tabs[0]["id"],unused_data[tabs[0]["id"]],true); +				active_connections[tabs[0]["id"]] = p;  			}  			for(var i = 0; i < tabs.length; i++) {  				var tab = tabs[i]; @@ -331,33 +327,6 @@ function init_addon(){  	webex.runtime.onConnect.addListener(connected);  	webex.storage.onChanged.addListener(options_listener);  	webex.tabs.onRemoved.addListener(delete_removed_tab_info); - -	/** -	*	Callback for request traffic. -	* -	*/ -	/* -	function script_request(details){ -		console.log("Request:"+details.type) -		//return {redirectUrl: "about:blank"}; -		return true; -	} -	webex.webRequest.onResponseStarted.addListener(script_request,{ -		urls:["<all_urls>"] -	}); -	*/ - -	/**************** some debugging: ***************************/ -	// Valid input for update_popup -	var example_input = { -		"accepted": [["FILENAME 1","REASON 1"],["FILENAME 2","REASON 2"]], -		"blocked": [["FILENAME 3","REASON 1"],["FILENAME 4","REASON 2"]], -		"url":"chrome://extensions/" -	}; -	// To test the default text -	update_popup(4,example_input); -	console.log("Set the browser action contents"); -	/*****************************************************************/  }  /** diff --git a/manifest.json b/manifest.json index 9586586..bcf91f1 100644 --- a/manifest.json +++ b/manifest.json @@ -21,7 +21,8 @@  	"activeTab",  	"notifications",  	"storage", -	"tabs" +	"tabs", +	"<all_urls>"    ],    "browser_action": {      "browser_style": true, @@ -40,5 +41,5 @@    "background": {      "scripts": ["main_background.js"]    }, -  "content_scripts": [{"matches": ["<all_urls>"],"js": ["contact_finder.js"]}] +  "content_scripts": [{"matches": ["<all_urls>"],"js": ["eval_test.js"]}]  } | 
