aboutsummaryrefslogtreecommitdiff
path: root/main_background.js
diff options
context:
space:
mode:
authorNateN1222 <nathannichols454@gmail.com>2017-10-07 14:18:00 -0500
committerNateN1222 <nathannichols454@gmail.com>2017-10-07 14:18:00 -0500
commit10d79a38013a174f7408e8c98b3ed05b468ae914 (patch)
tree60dc05521cc6d4e2285a3e74fb9fd1ae12a3b261 /main_background.js
parente7c570bb8a141c65ba0c4444db6c1eb04b8a0ee5 (diff)
Broke up the main file and fixed the bug causing the page to get corrupted
Diffstat (limited to 'main_background.js')
-rw-r--r--main_background.js186
1 files changed, 72 insertions, 114 deletions
diff --git a/main_background.js b/main_background.js
index c4a2b7c..b91eeca 100644
--- a/main_background.js
+++ b/main_background.js
@@ -1,43 +1,15 @@
+var acorn = require('acorn');
+var jssha = require('jssha');
-
-/*
- A JavaScript implementation of the SHA family of hashes, as
- defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding
- HMAC implementation as defined in FIPS PUB 198a
- Copyright Brian Turek 2008-2017
- Distributed under the BSD License
- See http://caligatio.github.com/jsSHA/ for more information
- Several functions taken from Paul Johnston
-*/
-
-'use strict';(function(I){function w(c,a,d){var l=0,b=[],g=0,f,n,k,e,h,q,y,p,m=!1,t=[],r=[],u,z=!1;d=d||{};f=d.encoding||"UTF8";u=d.numRounds||1;if(u!==parseInt(u,10)||1>u)throw Error("numRounds must a integer >= 1");if(0===c.lastIndexOf("SHA-",0))if(q=function(b,a){return A(b,a,c)},y=function(b,a,l,f){var g,e;if("SHA-224"===c||"SHA-256"===c)g=(a+65>>>9<<4)+15,e=16;else throw Error("Unexpected error in SHA-2 implementation");for(;b.length<=g;)b.push(0);b[a>>>5]|=128<<24-a%32;a=a+l;b[g]=a&4294967295;
-b[g-1]=a/4294967296|0;l=b.length;for(a=0;a<l;a+=e)f=A(b.slice(a,a+e),f,c);if("SHA-224"===c)b=[f[0],f[1],f[2],f[3],f[4],f[5],f[6]];else if("SHA-256"===c)b=f;else throw Error("Unexpected error in SHA-2 implementation");return b},p=function(b){return b.slice()},"SHA-224"===c)h=512,e=224;else if("SHA-256"===c)h=512,e=256;else throw Error("Chosen SHA variant is not supported");else throw Error("Chosen SHA variant is not supported");k=B(a,f);n=x(c);this.setHMACKey=function(b,a,g){var e;if(!0===m)throw Error("HMAC key already set");
-if(!0===z)throw Error("Cannot set HMAC key after calling update");f=(g||{}).encoding||"UTF8";a=B(a,f)(b);b=a.binLen;a=a.value;e=h>>>3;g=e/4-1;if(e<b/8){for(a=y(a,b,0,x(c));a.length<=g;)a.push(0);a[g]&=4294967040}else if(e>b/8){for(;a.length<=g;)a.push(0);a[g]&=4294967040}for(b=0;b<=g;b+=1)t[b]=a[b]^909522486,r[b]=a[b]^1549556828;n=q(t,n);l=h;m=!0};this.update=function(a){var c,f,e,d=0,p=h>>>5;c=k(a,b,g);a=c.binLen;f=c.value;c=a>>>5;for(e=0;e<c;e+=p)d+h<=a&&(n=q(f.slice(e,e+p),n),d+=h);l+=d;b=f.slice(d>>>
-5);g=a%h;z=!0};this.getHash=function(a,f){var d,h,k,q;if(!0===m)throw Error("Cannot call getHash after setting HMAC key");k=C(f);switch(a){case "HEX":d=function(a){return D(a,e,k)};break;case "B64":d=function(a){return E(a,e,k)};break;case "BYTES":d=function(a){return F(a,e)};break;case "ARRAYBUFFER":try{h=new ArrayBuffer(0)}catch(v){throw Error("ARRAYBUFFER not supported by this environment");}d=function(a){return G(a,e)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");
-}q=y(b.slice(),g,l,p(n));for(h=1;h<u;h+=1)q=y(q,e,0,x(c));return d(q)};this.getHMAC=function(a,f){var d,k,t,u;if(!1===m)throw Error("Cannot call getHMAC without first setting HMAC key");t=C(f);switch(a){case "HEX":d=function(a){return D(a,e,t)};break;case "B64":d=function(a){return E(a,e,t)};break;case "BYTES":d=function(a){return F(a,e)};break;case "ARRAYBUFFER":try{d=new ArrayBuffer(0)}catch(v){throw Error("ARRAYBUFFER not supported by this environment");}d=function(a){return G(a,e)};break;default:throw Error("outputFormat must be HEX, B64, BYTES, or ARRAYBUFFER");
-}k=y(b.slice(),g,l,p(n));u=q(r,x(c));u=y(k,e,h,u);return d(u)}}function m(){}function D(c,a,d){var l="";a/=8;var b,g;for(b=0;b<a;b+=1)g=c[b>>>2]>>>8*(3+b%4*-1),l+="0123456789abcdef".charAt(g>>>4&15)+"0123456789abcdef".charAt(g&15);return d.outputUpper?l.toUpperCase():l}function E(c,a,d){var l="",b=a/8,g,f,n;for(g=0;g<b;g+=3)for(f=g+1<b?c[g+1>>>2]:0,n=g+2<b?c[g+2>>>2]:0,n=(c[g>>>2]>>>8*(3+g%4*-1)&255)<<16|(f>>>8*(3+(g+1)%4*-1)&255)<<8|n>>>8*(3+(g+2)%4*-1)&255,f=0;4>f;f+=1)8*g+6*f<=a?l+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(n>>>
-6*(3-f)&63):l+=d.b64Pad;return l}function F(c,a){var d="",l=a/8,b,g;for(b=0;b<l;b+=1)g=c[b>>>2]>>>8*(3+b%4*-1)&255,d+=String.fromCharCode(g);return d}function G(c,a){var d=a/8,l,b=new ArrayBuffer(d),g;g=new Uint8Array(b);for(l=0;l<d;l+=1)g[l]=c[l>>>2]>>>8*(3+l%4*-1)&255;return b}function C(c){var a={outputUpper:!1,b64Pad:"=",shakeLen:-1};c=c||{};a.outputUpper=c.outputUpper||!1;!0===c.hasOwnProperty("b64Pad")&&(a.b64Pad=c.b64Pad);if("boolean"!==typeof a.outputUpper)throw Error("Invalid outputUpper formatting option");
-if("string"!==typeof a.b64Pad)throw Error("Invalid b64Pad formatting option");return a}function B(c,a){var d;switch(a){case "UTF8":case "UTF16BE":case "UTF16LE":break;default:throw Error("encoding must be UTF8, UTF16BE, or UTF16LE");}switch(c){case "HEX":d=function(a,b,c){var f=a.length,d,k,e,h,q;if(0!==f%2)throw Error("String of HEX type must be in byte increments");b=b||[0];c=c||0;q=c>>>3;for(d=0;d<f;d+=2){k=parseInt(a.substr(d,2),16);if(isNaN(k))throw Error("String of HEX type contains invalid characters");
-h=(d>>>1)+q;for(e=h>>>2;b.length<=e;)b.push(0);b[e]|=k<<8*(3+h%4*-1)}return{value:b,binLen:4*f+c}};break;case "TEXT":d=function(c,b,d){var f,n,k=0,e,h,q,m,p,r;b=b||[0];d=d||0;q=d>>>3;if("UTF8"===a)for(r=3,e=0;e<c.length;e+=1)for(f=c.charCodeAt(e),n=[],128>f?n.push(f):2048>f?(n.push(192|f>>>6),n.push(128|f&63)):55296>f||57344<=f?n.push(224|f>>>12,128|f>>>6&63,128|f&63):(e+=1,f=65536+((f&1023)<<10|c.charCodeAt(e)&1023),n.push(240|f>>>18,128|f>>>12&63,128|f>>>6&63,128|f&63)),h=0;h<n.length;h+=1){p=k+
-q;for(m=p>>>2;b.length<=m;)b.push(0);b[m]|=n[h]<<8*(r+p%4*-1);k+=1}else if("UTF16BE"===a||"UTF16LE"===a)for(r=2,n="UTF16LE"===a&&!0||"UTF16LE"!==a&&!1,e=0;e<c.length;e+=1){f=c.charCodeAt(e);!0===n&&(h=f&255,f=h<<8|f>>>8);p=k+q;for(m=p>>>2;b.length<=m;)b.push(0);b[m]|=f<<8*(r+p%4*-1);k+=2}return{value:b,binLen:8*k+d}};break;case "B64":d=function(a,b,c){var f=0,d,k,e,h,q,m,p;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");k=a.indexOf("=");a=a.replace(/\=/g,
-"");if(-1!==k&&k<a.length)throw Error("Invalid '=' found in base-64 string");b=b||[0];c=c||0;m=c>>>3;for(k=0;k<a.length;k+=4){q=a.substr(k,4);for(e=h=0;e<q.length;e+=1)d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(q[e]),h|=d<<18-6*e;for(e=0;e<q.length-1;e+=1){p=f+m;for(d=p>>>2;b.length<=d;)b.push(0);b[d]|=(h>>>16-8*e&255)<<8*(3+p%4*-1);f+=1}}return{value:b,binLen:8*f+c}};break;case "BYTES":d=function(a,b,c){var d,n,k,e,h;b=b||[0];c=c||0;k=c>>>3;for(n=0;n<a.length;n+=
-1)d=a.charCodeAt(n),h=n+k,e=h>>>2,b.length<=e&&b.push(0),b[e]|=d<<8*(3+h%4*-1);return{value:b,binLen:8*a.length+c}};break;case "ARRAYBUFFER":try{d=new ArrayBuffer(0)}catch(l){throw Error("ARRAYBUFFER not supported by this environment");}d=function(a,b,c){var d,n,k,e,h;b=b||[0];c=c||0;n=c>>>3;h=new Uint8Array(a);for(d=0;d<a.byteLength;d+=1)e=d+n,k=e>>>2,b.length<=k&&b.push(0),b[k]|=h[d]<<8*(3+e%4*-1);return{value:b,binLen:8*a.byteLength+c}};break;default:throw Error("format must be HEX, TEXT, B64, BYTES, or ARRAYBUFFER");
-}return d}function r(c,a){return c>>>a|c<<32-a}function J(c,a,d){return c&a^~c&d}function K(c,a,d){return c&a^c&d^a&d}function L(c){return r(c,2)^r(c,13)^r(c,22)}function M(c){return r(c,6)^r(c,11)^r(c,25)}function N(c){return r(c,7)^r(c,18)^c>>>3}function O(c){return r(c,17)^r(c,19)^c>>>10}function P(c,a){var d=(c&65535)+(a&65535);return((c>>>16)+(a>>>16)+(d>>>16)&65535)<<16|d&65535}function Q(c,a,d,l){var b=(c&65535)+(a&65535)+(d&65535)+(l&65535);return((c>>>16)+(a>>>16)+(d>>>16)+(l>>>16)+(b>>>
-16)&65535)<<16|b&65535}function R(c,a,d,l,b){var g=(c&65535)+(a&65535)+(d&65535)+(l&65535)+(b&65535);return((c>>>16)+(a>>>16)+(d>>>16)+(l>>>16)+(b>>>16)+(g>>>16)&65535)<<16|g&65535}function x(c){var a=[],d;if(0===c.lastIndexOf("SHA-",0))switch(a=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],d=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],c){case "SHA-224":break;case "SHA-256":a=d;break;case "SHA-384":a=[new m,new m,
-new m,new m,new m,new m,new m,new m];break;case "SHA-512":a=[new m,new m,new m,new m,new m,new m,new m,new m];break;default:throw Error("Unknown SHA variant");}else throw Error("No SHA variants supported");return a}function A(c,a,d){var l,b,g,f,n,k,e,h,m,r,p,w,t,x,u,z,A,B,C,D,E,F,v=[],G;if("SHA-224"===d||"SHA-256"===d)r=64,w=1,F=Number,t=P,x=Q,u=R,z=N,A=O,B=L,C=M,E=K,D=J,G=H;else throw Error("Unexpected error in SHA-2 implementation");d=a[0];l=a[1];b=a[2];g=a[3];f=a[4];n=a[5];k=a[6];e=a[7];for(p=
-0;p<r;p+=1)16>p?(m=p*w,h=c.length<=m?0:c[m],m=c.length<=m+1?0:c[m+1],v[p]=new F(h,m)):v[p]=x(A(v[p-2]),v[p-7],z(v[p-15]),v[p-16]),h=u(e,C(f),D(f,n,k),G[p],v[p]),m=t(B(d),E(d,l,b)),e=k,k=n,n=f,f=t(g,h),g=b,b=l,l=d,d=t(h,m);a[0]=t(d,a[0]);a[1]=t(l,a[1]);a[2]=t(b,a[2]);a[3]=t(g,a[3]);a[4]=t(f,a[4]);a[5]=t(n,a[5]);a[6]=t(k,a[6]);a[7]=t(e,a[7]);return a}var H;H=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,
-2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,
-2756734187,3204031479,3329325298];"function"===typeof define&&define.amd?define(function(){return w}):"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(module.exports=w),exports=w):I.jsSHA=w})(this);
-
-console.debug("main_background.js");
+console.log("main_background.js");
/**
* Wrapper around crypto lib
*
*/
function hash(source){
- var shaObj = new jsSHA("SHA-256", "TEXT");
+ var shaObj = new jssha("SHA-256","TEXT")
shaObj.update(source);
return shaObj.getHash("HEX");
}
@@ -747,8 +719,22 @@ function blocked_status(hash){
});
}
/* *********************************************************************************************** */
-// (This is part of eval_test.js with a few console.logs/comments removed)
-
+/**
+* Rigorously determines if code is trivial or not based on the official triviality criterion
+*/
+function full_evaluate(script){
+ try{
+ var ast = window.parse(script);
+ }catch(e){
+ console.log("%cError parsing","color:red;");
+ return false;
+ }
+ console.log(ast);
+ return true;
+}
+/**
+* Performs the initial pass on code to see if it needs to be completely parsed
+*/
function evaluate(script,name){
function reserved_object_regex(object){
var arith_operators = "\\+\\-\\*\\/\\%\\=";
@@ -771,7 +757,7 @@ function evaluate(script,name){
var reason = ""
// This is where individual "passes" are made over the code
for(var i = 0; i < reserved_objects.length; i++){
- var res = reserved_object_regex(reserved_objects[i]).exec(script);
+ var res = reserved_object_regex(reserved_objects[i]).exec(temp);
if(res != null){
console.log("%c fail","color:red;");
flag = false;
@@ -780,7 +766,13 @@ function evaluate(script,name){
}
if(flag){
console.log("%c pass","color:green;");
+ } else{
+ return [flag,reason+"<br>"];
}
+
+ flag = full_evaluate(temp);
+
+
// If flag is set true at this point, the script is trivial
if(flag){
reason = "Script was determined to be trivial.";
@@ -845,7 +837,6 @@ function license_read(script_src,name){
return [true,edited_src,reason_text];
}
-onsole.log("Found a license tag");
var before = unedited_src.substr(0,matches["index"]);
nontrivial_status = evaluate(before,name);
if(nontrivial_status[0] == true){
@@ -1003,71 +994,19 @@ function read_script(a){
}
/**
-* Changes the DOM
-*
-*/
-function DOM_replace(element,newtext){
-
-
-}
-/**
-* Changes the source
-*
-*/
-function source_replace(html,replace_this,with_this){
- // This is absolutely neccessary. Not sure if it can cause bugs.
- html = html.replace(/\r\n|\r|\n/g,"\n");
- replace_this = replace_this.replace(/\r\n|\r|\n/g,"\n");
-
- // Get all match indices
- var match_indices = [];
-
- var lower_index = 0;
-
- while(true){
- var match_index = html.indexOf(replace_this,lower_index);
- if(match_index == -1){
- break;
- } else{
- match_indices.push(lower_index + match_index);
- lower_index += match_index + 1;
- }
- }
-
- if(match_indices.length == 0){
- console.log("%c No matches","color:red;");
- // TODO: handle this
- }
-
- if(match_indices.length == 1){
- console.log("%c Matched","color:green;");
- html = html.replace(replace_this,with_this);
- }
-
- if(match_indices.length > 1){
- console.log("%c Multiple matches","color:orange;");
- // TODO: handle this
- }
-
- return html;
-
-}
-//source_replace("ababababasdasdasbabababaabababdab","ab","xx");
-
-/**
* Removes noscript tags with name "librejs-path" leaving the inner content to load.
*/
-function remove_noscripts(html,doc){
- for(var i = 0; i < doc.getElementsByName("librejs-path").length; i++){
- if(doc.getElementsByName("librejs-path")[i].tagName == "NOSCRIPT"){
+function remove_noscripts(html_doc){
+ for(var i = 0; i < html_doc.getElementsByName("librejs-path").length; i++){
+ if(html_doc.getElementsByName("librejs-path")[i].tagName == "NOSCRIPT"){
debugger;
}
}
- return doc.documentElement.innerHTML;
+ return html_doc.documentElement.innerHTML;
}
/**
-* Changes the HTML of a page and the scripts within it.
+* Reads/changes the HTML of a page and the scripts within it.
*
*/
function edit_html(html,url,tabid,wl){
@@ -1084,6 +1023,34 @@ function edit_html(html,url,tabid,wl){
var amt_scripts = 0;
var total_scripts = 0;
var scripts = html_doc.scripts;
+
+ // Deal with intrinsic events
+
+ var has_intrinsic_events = [];
+ for(var i = 0; i < html_doc.all.length; i++){
+ for(var j = 0; j < intrinsic_events.length; j++){
+ if(intrinsic_events[j] in html_doc.all[i].attributes){
+ has_intrinsic_events.push([i,j]);
+ }
+ }
+ }
+
+ // "i" is an index in html_doc.all
+ // "j" is an index in intrinsicEvents
+ function edit_event(src,i,j,name){
+ var edited = get_script(src,name);
+ edited.then(function(){
+ html_doc.all[i].attributes[intrinsicEvents[j]].value = edited[0];
+ });
+ }
+
+ // Find all the document's elements with intrinsic events
+ for(var i = 0; i < has_intrinsic_events.length; i++){
+ var s_name = "Intrinsic event ["+has_intrinsic_events[i][0]+"]";
+ edit_event(html_doc.all[has_intrinsic_events[i][0]].attributes[intrinsicEvents[has_intrinsic_events[i][1]]].value,has_intrinsic_events[i][0],has_intrinsic_events[i][1],s_name);
+ }
+
+ // Deal with inline scripts
for(var i = 0; i < scripts.length; i++){
if(scripts[i].src == ""){
@@ -1093,32 +1060,19 @@ function edit_html(html,url,tabid,wl){
console.log("Analyzing "+total_scripts+" inline scripts...");
- var temphtml = html;
-
for(var i = 0; i < scripts.length; i++){
if(scripts[i].src == ""){
var edit_script = get_script(scripts[i].innerHTML,url,tabid,wl,i);
edit_script.then(function(edited){
- console.log("%c ------ not remote (document.scripts["+edited[1]+"]) ------","color:white");
-
var edited_source = edited[0];
var unedited_source = html_doc.scripts[edited[1]].innerHTML.trim();
- /* Source based */
- //temphtml = source_replace(temphtml,unedited_source,edited_source);
- /* DOM based */
html_doc.scripts[edited[1]].innerHTML = edited_source;
amt_scripts++;
if(amt_scripts >= total_scripts){
- //console.log(html);
- //console.log(temphtml);
-
- /* Source based */
- //resolve(remove_noscripts(temphtml,html_doc));
- /* DOM based */
- resolve(remove_noscripts(temphtml,html_doc));
+ resolve(remove_noscripts(html_doc));
}
});
@@ -1127,7 +1081,7 @@ function edit_html(html,url,tabid,wl){
if(total_scripts == 0){
console.log("Nothing to analyze.");
- resolve(remove_noscripts(temphtml,html_doc));
+ resolve(remove_noscripts(html_doc));
}
});
@@ -1142,13 +1096,16 @@ function read_document(a){
delete unused_data[a["tabId"]];
console.log("Page Changed!!!");
}
-
+ var str = "";
var filter = webex.webRequest.filterResponseData(a.requestId);
var decoder = new TextDecoder("utf-8");
var encoder = new TextEncoder(); // TODO: make sure this doesn't cause undeclared decoding
+ filter.onerror = event => {
+ console.log("%c Error in getting document","color:red");
+ }
+ filter.onstop = event => {
+ var test = new ArrayBuffer();
- filter.ondata = event => {
- var str = decoder.decode(event.data, {stream: true});
var res = test_url_whitelisted(a.url);
res.then(function(whitelisted){
var edit_page;
@@ -1167,6 +1124,10 @@ function read_document(a){
}
});
}
+ filter.ondata = event => {
+ str += decoder.decode(event.data, {stream: true});
+ return;
+ }
return {};
}
@@ -1182,8 +1143,6 @@ function init_addon(){
webex.storage.onChanged.addListener(options_listener);
webex.tabs.onRemoved.addListener(delete_removed_tab_info);
- var targetPage = "https://developer.mozilla.org/en-US/Firefox/Developer_Edition";
-
// Analyzes remote scripts
webex.webRequest.onBeforeRequest.addListener(
read_script,
@@ -1291,4 +1250,3 @@ function remove_csv_whitelist(domain){
}
init_addon();
-