-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclean.js
127 lines (116 loc) · 4.18 KB
/
clean.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//load
window.addEventListener('load', function() {
//Hier irgendwo auftrag für scan bei? oder doch in background?
//eher settings an background weitergeben
sendMessage('enabled?', null, function(response) {
document.querySelector("input[type=checkbox]#enabled").checked = response.enabled;
});
//settings von html objekten holen
document.querySelector("input[type=checkbox]#enabled").addEventListener('click', function() {
console.log(this.checked);
chrome.browserAction.setIcon({ path: this.checked ? "icons/icon48.png" : "icons/icon_bw48.png" });
sendMessage('enable', this.checked, null);
}, false);
document.querySelector("input[type=checkbox]#unknown").addEventListener('click', function() {
console.log(this.checked);
document.getElementById("results").className = this.checked ? "" : "hideunknown";
}, false);
//results abrufen
queryForResults();//trigger
setInterval(queryForResults, 5000);
}, false);
function queryForResults() {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
//get detected sagt nur dass Ergebnisse zurück gesendet sollen
//Ergebnisse werden nur geholt, nicht erzeugt?
chrome.tabs.sendMessage(tabs[0].id, { getDetected: 1 }, function(response) {
//woher?
show(response); //total results
});
});
}
//display results in pop up (build table)
function show(totalResults) {
if (totalResults != null) {
document.getElementById("results").innerHTML="";
//console.log(totalResults);
var merged = {};
totalResults.forEach(rs => {
merged[rs.url] = merged[rs.url] || { url: rs.url, results: [] };
merged[rs.url].results = merged[rs.url].results.concat(rs.results);
});
var results = Object.keys(merged).map(k => merged[k]);
results.forEach(function(rs) { //results wird zu rs für each
rs.results.forEach(function(r) { //rs wird zu r für each
r.url = rs.url;
r.vulnerable = r.vulnerabilities && r.vulnerabilities.length > 0;
});
if (rs.results.length == 0) {
rs.results = [{ url: rs.url, unknown: true, component: "unknown" }]
}
});
var res = results.reduce(function(x, y) { return x.concat(y.results); }, []);
res.sort(function(x, y) {
if (x.unknown != y.unknown) { return x.unknown ? 1 : -1 }
if (x.vulnerable != y.vulnerable) { return x.vulnerable ? -1 : 1 }
return (x.component + x.version + x.url).localeCompare(y.component + y.version + y.url);
});
res.forEach(function(r) {
var tr = document.createElement("tr");
document.getElementById("results").appendChild(tr);
if (r.unknown) {
tr.className = "unknown";
td(tr).innerText = "-";
td(tr).innerText = "-";
td(tr).innerHTML = "Did not recognize " + r.url;
} else {
td(tr).innerText = r.component;
td(tr).innerText = r.version;
var vulns = td(tr);
vulns.innerHTML = "Found in " + r.url;
}
if (r.vulnerabilities && r.vulnerabilities.length > 0) {
tr.className = "vulnerable";
vulns.innerHTML += "<br>Vulnerability info: ";
var table = document.createElement("table");
vulns.appendChild(table);
r.vulnerabilities.forEach(function(v) {
var tr = document.createElement("tr");
table.appendChild(tr);
td(tr).innerText = v.severity || " ";
td(tr).innerText = v.identifiers ? v.identifiers.mapOwnProperty(function(val) { return val }).flatten().join(" ") : " ";
var info = td(tr);
v.info.forEach(function(u, i) {
var a = document.createElement("a");
a.innerText = i + 1;
a.href = u;
a.title = u;
a.target = "_blank";
info.appendChild(a);
});
})
}
})
}
}
//was macht der jetzt?
function td(tr) {
var cell = document.createElement("td");
tr.appendChild(cell);
return cell;
}
Object.prototype.forEachOwnProperty = function(f) {
mapOwnProperty(f);
};
Object.prototype.mapOwnProperty = function(f) {
var results = [];
for(var i in this) {
if (this.hasOwnProperty(i)) results.push(f(this[i], i));
}
return results;
};
Array.prototype.flatten = function() { return this.reduce((a,b) => a.concat(b), []) }
//hierher?
function sendMessage(message, data, callback) {
chrome.extension.sendRequest({ to: 'background', message: message, data: data }, function(response) { callback && callback(response) });
}