Skip to content
This repository was archived by the owner on Jan 9, 2023. It is now read-only.

Commit 60a8fd8

Browse files
committed
added web worker
1 parent 95effb5 commit 60a8fd8

File tree

4 files changed

+207
-110
lines changed

4 files changed

+207
-110
lines changed

audit.js

+28-109
Original file line numberDiff line numberDiff line change
@@ -1,113 +1,32 @@
1-
/**
2-
* Audit Security Tool for Encrypt.to
3-
* The script compares js files from github and the deployed version at Encrypt.to.
4-
*
5-
*/
6-
7-
// define audit class
8-
function Audit(url, isJson) {
9-
var self = this;
10-
self.isJson = isJson;
11-
self.url = url;
12-
13-
self.startAudit();
14-
}
15-
16-
// start processing
17-
Audit.prototype.startAudit = function() {
18-
var self = this;
19-
self.loadData();
20-
self.encodeData();
21-
22-
if (self.isJson) {
23-
self.parseJson();
24-
self.cleanupString();
25-
}
26-
};
27-
28-
// fetch data from remote source
29-
Audit.prototype.loadData = function() {
30-
var self = this;
31-
self.sourceData = $.ajax({
32-
url: self.url + "?" + new Date().getTime(),
33-
async: false
34-
}).responseText;
35-
};
36-
37-
// encode sourceData to base64
38-
Audit.prototype.encodeData = function() {
39-
var self = this;
40-
self.encodedData = window.btoa(self.sourceData);
41-
};
42-
43-
// load encoded data from obj
44-
Audit.prototype.parseJson = function() {
45-
var self = this;
46-
var obj = JSON.parse(self.sourceData);
47-
self.encodedData = obj.content;
48-
};
49-
50-
// remove newlines
51-
Audit.prototype.cleanupString = function() {
52-
var self = this;
53-
self.encodedData = self.encodedData.replace(/\n/g,'');
54-
};
55-
56-
// define ObjLoader class
57-
function ObjLoader(url) {
58-
var self = this;
59-
self.url = url;
60-
self.objects = [];
61-
self.loadData();
62-
}
63-
64-
// fetch data from remote source
65-
ObjLoader.prototype.loadData = function() {
66-
var self = this;
67-
self.sourceData = $.ajax({
68-
url: self.url + "?" + new Date().getTime(),
69-
async: false
70-
}).responseText;
71-
self.objects = JSON.parse(self.sourceData);
72-
};
73-
741
// start audit after page load
752
$(document).ready(function () {
76-
setTimeout(function(){
77-
78-
// load js file list
79-
var fileLoader = new ObjLoader("https://api.github.com/repos/encrypt-to/encrypt.to/contents/public/assets");
80-
81-
// load commits
82-
var commitLoader = new ObjLoader("https://api.github.com/repos/encrypt-to/encrypt.to/commits");
83-
var lastCommit = commitLoader.objects[0];
84-
$('#commit').append("<a href='https://github.com/encrypt-to/encrypt.to/commit/" + lastCommit.sha + "'>" + "Last commit from " + lastCommit.commit.author.date + ", " + lastCommit.commit.message + "</a>");
3+
var worker = new Worker('worker.js');
854

86-
// start file audit
87-
for (var i in fileLoader.objects) {
88-
var name = fileLoader.objects[i].name;
89-
var size = fileLoader.objects[i].size;
90-
if (name.indexOf(".js") !== -1) {
91-
92-
// build links
93-
var deployedLink = 'https://encrypt.to/assets/' + name;
94-
var githubLink = 'https://api.github.com/repos/encrypt-to/encrypt.to/contents/public/assets/' + name;
95-
96-
// load files
97-
var deployed = new Audit(deployedLink, false);
98-
var github = new Audit(githubLink, true);
99-
100-
// compare base64 string
101-
var result = deployed.encodedData === github.encodedData;
102-
103-
// write result
104-
if (result) {
105-
$('#resultTable > tbody:last').append('<tr><td>' + name + '</td><td style="background-color:green;color:white;">=</td><td>' + name + '</td><td>' + size / 1000 + ' kb</td></tr>');
106-
} else {
107-
$('#resultTable > tbody:last').append('<tr style="background-color:red;color:white;"><td>' + name + '</td><td>!=</td><td>' + name + '</td></tr>');
108-
}
109-
}
110-
}
111-
$('#running').text("Test finished.");
112-
}, 500);
5+
worker.addEventListener('message', function(e) {
6+
var data = e.data;
7+
switch (data.cmd) {
8+
case 'audit':
9+
if (data.valid === 'true') {
10+
$('#resultTable > tbody:last').append('<tr><td>' + data.name + '</td><td style="background-color:green;color:white;">=</td><td>' + data.name + '</td><td>' + data.size / 1000 + ' kb</td></tr>');
11+
} else {
12+
$('#resultTable > tbody:last').append('<tr style="background-color:red;color:white;"><td>' + data.name + '</td><td>!=</td><td>' + data.name + '</td></tr>');
13+
}
14+
break;
15+
case 'commit':
16+
$('#commit').append("<a href='https://github.com/encrypt-to/encrypt.to/commit/" + data.lastCommit.sha + "'>" + "Last commit from " + data.lastCommit.commit.author.date + ", " + data.lastCommit.commit.message + "</a>");
17+
break;
18+
case 'done':
19+
$('#running').text("Test finished.");
20+
worker.terminate();
21+
break
22+
case 'error':
23+
$('#running').text(data.msg);
24+
break
25+
default:
26+
$('#resultTable > tbody:last').append('<tr style="background-color:blue;color:white;"><td>' + data.name + ' unavailable</td><td>!=</td><td>' + data.name + ' unavailable</td></tr>');
27+
};
28+
}, false);
29+
30+
// start worker
31+
worker.postMessage({'cmd': 'start'});
11332
});

base64.js

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
var base64 = {};
2+
base64.PADCHAR = '=';
3+
base64.ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
4+
5+
base64.getbyte = function(s,i) {
6+
var x = s.charCodeAt(i) & 0xFF;
7+
return x;
8+
}
9+
10+
base64.encode = function(s) {
11+
var padchar = base64.PADCHAR;
12+
var alpha = base64.ALPHA;
13+
var getbyte = base64.getbyte;
14+
15+
var i, b10;
16+
var x = [];
17+
18+
// convert to string
19+
s = '' + s;
20+
21+
var imax = s.length - s.length % 3;
22+
23+
if (s.length === 0) {
24+
return s;
25+
}
26+
for (i = 0; i < imax; i += 3) {
27+
b10 = (getbyte(s,i) << 16) | (getbyte(s,i+1) << 8) | getbyte(s,i+2);
28+
x.push(alpha.charAt(b10 >> 18));
29+
x.push(alpha.charAt((b10 >> 12) & 0x3F));
30+
x.push(alpha.charAt((b10 >> 6) & 0x3f));
31+
x.push(alpha.charAt(b10 & 0x3f));
32+
}
33+
switch (s.length - imax) {
34+
case 1:
35+
b10 = getbyte(s,i) << 16;
36+
x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) +
37+
padchar + padchar);
38+
break;
39+
case 2:
40+
b10 = (getbyte(s,i) << 16) | (getbyte(s,i+1) << 8);
41+
x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) +
42+
alpha.charAt((b10 >> 6) & 0x3f) + padchar);
43+
break;
44+
}
45+
return x.join('');
46+
}

index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
</head>
88
<body>
99
<p><b>Security Audit for <a href="https://encrypt.to/">Encrypt.to</a></b></p>
10-
<p id="running">Test running <img src="indicator.gif"></p>
10+
<div style="background-color:yellow;width:200px;" id="running">Test running <img src="indicator.gif"></div>
1111
<table id="resultTable" border="0" cellspacing="3" cellpadding="3">
1212
<tbody>
1313
<tr><th>Github</th><th>equals?</th><th>Encrypt.to</th><th>Size</th></tr>

worker.js

+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
function startAudit() {
2+
// load js file list
3+
var fileLoader = new ObjLoader("https://api.github.com/repos/encrypt-to/encrypt.to/contents/public/assets");
4+
5+
// load commits
6+
var commitLoader = new ObjLoader("https://api.github.com/repos/encrypt-to/encrypt.to/commits");
7+
var lastCommit = commitLoader.objects[0];
8+
9+
if (lastCommit) {
10+
self.postMessage({'cmd':'commit','lastCommit':lastCommit});
11+
} else {
12+
self.postMessage({'cmd':'error','msg':'Can not load files from Github.'});
13+
//self.close();
14+
}
15+
16+
// start file audit
17+
for (var i in fileLoader.objects) {
18+
var name = fileLoader.objects[i].name;
19+
var size = fileLoader.objects[i].size;
20+
if (name.indexOf(".js") !== -1) {
21+
22+
// build links
23+
var deployedLink = 'https://encrypt.to/assets/' + name;
24+
var githubLink = 'https://api.github.com/repos/encrypt-to/encrypt.to/contents/public/assets/' + name;
25+
26+
// load files
27+
var deployed = new Audit(deployedLink, false);
28+
var github = new Audit(githubLink, true);
29+
30+
// compare base64 string
31+
var result = deployed.encodedData === github.encodedData;
32+
33+
// write result
34+
if (result) {
35+
self.postMessage({'cmd':'audit','valid':'true','name':name,'size':size});
36+
} else {
37+
self.postMessage({'cmd':'audit','valid':'false','name':name,'size':size});
38+
}
39+
}
40+
}
41+
42+
// worker done
43+
self.postMessage({'cmd':'done'});
44+
45+
}
46+
47+
/**
48+
* Audit Security Tool for Encrypt.to
49+
* The script compares js files from github and the deployed version at Encrypt.to.
50+
*
51+
*/
52+
53+
// define audit class
54+
function Audit(url, isJson) {
55+
var self = this;
56+
self.isJson = isJson;
57+
self.url = url;
58+
59+
self.startAudit();
60+
}
61+
62+
// start processing
63+
Audit.prototype.startAudit = function() {
64+
var self = this;
65+
self.loadData();
66+
self.encodeData();
67+
68+
if (self.isJson) {
69+
self.parseJson();
70+
self.cleanupString();
71+
}
72+
};
73+
74+
// fetch data from remote source
75+
Audit.prototype.loadData = function() {
76+
var self = this;
77+
var req = new XMLHttpRequest();
78+
req.open('GET', self.url + "?" + new Date().getTime(), false);
79+
req.send(null);
80+
if(req.status == 200) {
81+
self.sourceData = req.responseText;
82+
} else {
83+
//self.postMessage({'cmd':'error','req':req});
84+
}
85+
};
86+
87+
// encode sourceData to base64
88+
Audit.prototype.encodeData = function() {
89+
var self = this;
90+
importScripts("base64.js");
91+
self.encodedData = base64.encode(self.sourceData);
92+
};
93+
94+
// load encoded data from obj
95+
Audit.prototype.parseJson = function() {
96+
var self = this;
97+
var obj = JSON.parse(self.sourceData);
98+
self.encodedData = obj.content;
99+
};
100+
101+
// remove newlines
102+
Audit.prototype.cleanupString = function() {
103+
var self = this;
104+
self.encodedData = self.encodedData.replace(/\n/g,'');
105+
};
106+
107+
// define ObjLoader class
108+
function ObjLoader(url) {
109+
var self = this;
110+
self.url = url;
111+
self.objects = [];
112+
self.loadData();
113+
}
114+
115+
// fetch data from remote source
116+
ObjLoader.prototype.loadData = function() {
117+
var self = this;
118+
var req = new XMLHttpRequest();
119+
req.open('GET', self.url + "?" + new Date().getTime(), false);
120+
req.send(null);
121+
if(req.status == 200) {
122+
self.sourceData = req.responseText;
123+
self.objects = JSON.parse(self.sourceData);
124+
} else {
125+
//self.postMessage({'cmd':'error','req':req});
126+
}
127+
};
128+
129+
// web worker
130+
self.addEventListener('message', function(e) {
131+
startAudit();
132+
}, false);

0 commit comments

Comments
 (0)