-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathhsts_cookie.js
111 lines (90 loc) · 2.45 KB
/
hsts_cookie.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
var HSTS_Cookie = function(domains){
// TODO: should we clone the domains array here ? How js clojures are working ?
var fields = [];
var remaining = 0;
var working = false;
function create_request(i, src, callback){
var img = document.createElement('img');
img.src = src + '#' + parseInt(Math.random()*32000); // prevent caching
img.onload = function(){
//console.log('true for', i);
fields[i] = true;
remaining -= 1;
if(remaining <= 0){
working = false;
callback(fields);
}
};
img.onerror = function(){
//console.log('error for', i);
fields[i] = false;
remaining -= 1;
if(remaining <= 0){
working = false;
callback(fields);
}
};
return img;
}
function pad(value, length) {
return (value.toString().length < length) ? pad("0"+value, length):value;
}
function bools_to_int(bools){
var n = 0; l = bools.length;
for (var i = 0; i < l; ++i) {
n = (n << 1) + (bools[i] ? 1 : 0);
}
return n;
}
function int_to_bools(value, bit_count){
var bools = [];
var bits = parseInt(value, 10).toString(2);
bits = pad(bits, 32);
for(var i=32-bit_count; i < 32; ++i){
bools.push(bits[i]=='1' ? true : false);
}
return bools;
}
return {
'bools_to_int': bools_to_int,
'is_working': function(){ return working },
'get_hsts_value': function (callback){
if(working) return false;
working = true;
fields = [];
remaining = domains.length;
for(var i = 0; i < domains.length; ++i){
fields.push(undefined);
//console.log('ask for ', i, domains[i]);
var img = create_request(i, domains[i], callback);
}
return true;
},
'set_hsts_value': function (values, callback){
if(working) return false;
working = true;
fields = [];
remaining = domains.length;
for(var i = 0; i < domains.length; ++i){
fields.push(undefined);
if(values[i])
create_request(i, domains[i]+'?SET=1', callback);
else
create_request(i, domains[i]+'?DEL=1', callback);
}
return true;
},
'set_hsts_as_int': function (value, callback){
var value = int_to_bools(value, domains.length);
return this.set_hsts_value(value, callback);
},
'get_hsts_as_int': function ( callback){
return this.get_hsts_value(function(fields){
callback(bools_to_int(fields));
});
}
};
}
// -----------------------------------------------------
// Utils stuff
// -----------------------------------------------------