Skip to content

Commit 664aabf

Browse files
committed
Further UI control of the observatory:
- Add about:config variables for priv_dns, alt_roots, and ASN submission - Control these from the UI - alt_roots is implemented; ASN control mostly implemented
1 parent e7baaa3 commit 664aabf

4 files changed

Lines changed: 111 additions & 70 deletions

File tree

src/chrome/content/observatory-preferences.js

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,33 @@ const pref_prefix = "extensions.ssl_observatory.";
1414

1515
function observatory_prefs_init(doc) {
1616
// Is the Observatory on?
17-
var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory_prefs.enabled");
17+
var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory.enabled");
1818
document.getElementById("use-observatory").checked = enabled;
1919
set_observatory_configurability(enabled);
20+
// Other settings
21+
document.getElementById("alt-roots").checked =
22+
obsprefs.getBoolPref("extensions.https_everywhere._observatory.alt_roots");
23+
document.getElementById("priv-dns").checked =
24+
obsprefs.getBoolPref("extensions.https_everywhere._observatory.priv_dns");
25+
document.getElementById("asn").checked =
26+
obsprefs.getBoolPref("extensions.https_everywhere._observatory.asn");
2027

2128
// More complicated: is it anonymised by Tor?
2229
var obs_how = doc.getElementById("ssl-obs-how");
2330
var anon_radio = document.getElementById("ssl-obs-anon");
2431
var nonanon_radio = document.getElementById("ssl-obs-nonanon");
2532
var anon = !obsprefs.getBoolPref(
26-
"extensions.https_everywhere._observatory_prefs.use_custom_proxy");
33+
"extensions.https_everywhere._observatory.use_custom_proxy");
2734

2835
// first set the radios to match the current settings variables
2936
obs_how.selectedItem = (anon) ? anon_radio : nonanon_radio;
3037

3138
// But if the user hasn't turned the observatory on,
32-
// the default should be something maximally sensible
33-
var torbutton = ssl_observatory.torbutton_installed;
39+
// the default should be the maximally sensible one
40+
var torbutton_avail = ssl_observatory.torbutton_installed;
3441
if (!enabled) {
35-
set_obs_anon(torbutton);
36-
obs_how.selectedItem = (torbutton) ? anon_radio : nonanon_radio;
42+
set_obs_anon(torbutton_avail);
43+
obs_how.selectedItem = (torbutton_avail) ? anon_radio : nonanon_radio;
3744
}
3845
//scale_title_logo();
3946
}
@@ -73,7 +80,7 @@ function set_observatory_configurability(enabled) {
7380

7481
// show/hide advanced options in the preferences dialog
7582
function show_advanced() {
76-
var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory_prefs.enabled");
83+
var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory.enabled");
7784
if (enabled) {
7885
var adv_opts_box = document.getElementById("observatory-advanced-opts");
7986
recursive_set(adv_opts_box, "hidden", "false");
@@ -98,19 +105,33 @@ function recursive_set(node, attrib, value) {
98105
// called from the popup
99106

100107
function set_obs_anon(val) {
101-
obsprefs.setBoolPref( "extensions.https_everywhere._observatory_prefs.use_custom_proxy", !val);
108+
obsprefs.setBoolPref( "extensions.https_everywhere._observatory.use_custom_proxy", !val);
102109
}
103110
function enable_observatory() {
104-
obsprefs.setBoolPref("extensions.https_everywhere._observatory_prefs.enabled", true);
111+
obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", true);
105112
}
106113

107114
// called from within the prefs window, we have more work to do:
108115
function toggle_enabled() {
109-
var checkbox = document.getElementById("use-observatory");
110-
var use_obs = checkbox.checked;
116+
var use_obs = document.getElementById("use-observatory").checked;
117+
obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", use_obs);
118+
set_observatory_configurability(use_obs);
119+
}
111120

112-
obsprefs.setBoolPref("extensions.https_everywhere._observatory_prefs.enabled",
113-
use_obs);
121+
function toggle_send_asn() {
122+
var send_asn = document.getElementById("send-asn").checked;
123+
obsprefs.setBoolPref("extensions.https_everywhere._observatory.alt_roots", send_asn);
124+
if (send_asn) ssl_observatory.setupASNWatcher()
125+
else ssl_observatory.stopASNWatcher();
126+
}
114127

115-
set_observatory_configurability(use_obs);
128+
function toggle_alt_roots() {
129+
var alt_roots = document.getElementById("alt-roots").checked;
130+
obsprefs.setBoolPref("extensions.https_everywhere._observatory.alt_roots", alt_roots);
116131
}
132+
133+
function toggle_priv_dns() {
134+
var priv_dns = document.getElementById("priv-dns").checked;
135+
obsprefs.setBoolPref("extensions.https_everywhere._observatory.alt_roots", priv_dns);
136+
}
137+

src/chrome/content/observatory-preferences.xul

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
<command id="toggle-enabled" oncommand="toggle_enabled()" />
3131
<command id="use-obs-anon" oncommand="set_obs_anon(true)" />
3232
<command id="use-obs-nonanon" oncommand="set_obs_anon(false)" />
33+
<command id="toggle-alt-roots" oncommand="toggle_alt_roots()" />
34+
<command id="toggle-send-asn" oncommand="toggle_send_asn()" />
35+
<command id="toggle-priv-dns" oncommand="toggle_priv_dns()" />
3336
</commandset>
3437
<checkbox label="&ssl-observatory.prefs.use;" id="use-observatory"
3538
command="toggle-enabled" style="font-size:1.5em;"/>
@@ -49,8 +52,9 @@
4952
<tooltip id="asn-tip" noautohide="true">
5053
<label>&ssl-observatory.prefs.asn_tooltip;</label>
5154
</tooltip>
52-
<checkbox label="&ssl-observatory.prefs.asn;" checked="true"
53-
tooltip="asn-tip" class="ssl-obs-conf"/>
55+
<checkbox label="&ssl-observatory.prefs.asn;" id="send-asn"
56+
tooltip="asn-tip" class="ssl-obs-conf"
57+
command="toggle-send-asn)"/>
5458
<spacer flex="2" />
5559
<hbox>
5660
<spacer flex="1" />
@@ -71,15 +75,16 @@
7175
<vbox id="observatory-advanced-opts" hidden="true">
7276

7377
<groupbox hidden="true" tooltip="alt-roots-tip" >
74-
<caption hidden="true" label="&ssl-observatory.prefs.adv_priv_opts1;" />
75-
<checkbox label="&ssl-observatory.prefs.alt_roots;" checked="false"
76-
class="ssl-obs-conf" />
78+
<caption hidden="true" label="&ssl-observatory.prefs.adv_priv_opts1;"/>
79+
<checkbox label="&ssl-observatory.prefs.alt_roots;"
80+
command="toggle-alt-roots" class="ssl-obs-conf"
81+
id="alt-roots" />
7782
</groupbox>
78-
<groupbox hidden="true" tooltip="priv-dns-tip" >
79-
<caption hidden="true" label="&ssl-observatory.prefs.adv_priv_opts2;"
80-
/>
81-
<checkbox label="&ssl-observatory.prefs.priv_dns;" checked="false"
82-
class="ssl-obs-conf" />
83+
<groupbox hidden="true" tooltip="priv-dns-tip">
84+
<caption hidden="true" label="&ssl-observatory.prefs.adv_priv_opts2;"/>
85+
<checkbox label="&ssl-observatory.prefs.priv_dns;"
86+
class="ssl-obs-conf" id="priv-dns"
87+
command="toggle-priv-dns"/>
8388
</groupbox>
8489
</vbox>
8590
</vbox>

src/components/ssl-observatory.js

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ INFO=3;
1313
NOTE=4;
1414
WARN=5;
1515

16-
// XXX: We should make the _observatory_prefs tree relative.
16+
// XXX: We should make the _observatory tree relative.
1717
LLVAR="extensions.https_everywhere.LogLevel";
1818

1919
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
@@ -84,23 +84,8 @@ function SSLObservatory() {
8484
this.wrappedJSObject = this;
8585

8686
this.client_asn = -1;
87-
this.getClientASN();
88-
89-
this.max_ap = null;
90-
91-
// Observe network changes to get new ASNs
92-
OS.addObserver(this, "network:offline-status-changed", false);
93-
var pref_service = Cc["@mozilla.org/preferences-service;1"]
94-
.getService(Ci.nsIPrefBranchInternal);
95-
proxy_branch = pref_service.QueryInterface(Ci.nsIPrefBranchInternal);
96-
proxy_branch.addObserver("network.proxy", this, false);
97-
98-
try {
99-
var wifi_service = Cc["@mozilla.org/wifi/monitor;1"].getService(Ci.nsIWifiMonitor);
100-
wifi_service.startWatching(this);
101-
} catch(e) {
102-
this.log(INFO, "Failed to register ASN change monitor: "+e);
103-
}
87+
if (this.prefs.getBoolPref("extensions.https_everywhere._observatory.send_asn"))
88+
this.setupASNWatcher();
10489

10590
this.log(DBUG, "Loaded observatory component!");
10691
}
@@ -145,6 +130,31 @@ SSLObservatory.prototype = {
145130
}
146131
},
147132

133+
setupASNWatcher: function() {
134+
this.getClientASN();
135+
136+
this.max_ap = null;
137+
138+
// Observe network changes to get new ASNs
139+
OS.addObserver(this, "network:offline-status-changed", false);
140+
var pref_service = Cc["@mozilla.org/preferences-service;1"]
141+
.getService(Ci.nsIPrefBranchInternal);
142+
proxy_branch = pref_service.QueryInterface(Ci.nsIPrefBranchInternal);
143+
proxy_branch.addObserver("network.proxy", this, false);
144+
145+
try {
146+
var wifi_service = Cc["@mozilla.org/wifi/monitor;1"].getService(Ci.nsIWifiMonitor);
147+
wifi_service.startWatching(this);
148+
} catch(e) {
149+
this.log(INFO, "Failed to register ASN change monitor: "+e);
150+
}
151+
},
152+
153+
stopASNWatcher: function() {
154+
// XXX FIXME need to unhook the observers above, or do something more crude...
155+
this.client_asn = -1;
156+
},
157+
148158
getClientASN: function() {
149159
// XXX: Fetch a new client ASN..
150160
return;
@@ -210,15 +220,15 @@ SSLObservatory.prototype = {
210220
if (this.torbutton_installed) {
211221
// Allow Tor users to choose if they want to submit
212222
// during tor and/or non-tor
213-
if (!this.prefs.getBoolPref("extensions.https_everywhere._observatory_prefs.submit_during_tor")
223+
if (!this.prefs.getBoolPref("extensions.https_everywhere._observatory.submit_during_tor")
214224
&& this.prefs.getBoolPref("extensions.torbutton.tor_enabled")) {
215225
return;
216226
}
217-
if (!this.prefs.getBoolPref("extensions.https_everywhere._observatory_prefs.submit_during_nontor")
227+
if (!this.prefs.getBoolPref("extensions.https_everywhere._observatory.submit_during_nontor")
218228
&& !this.prefs.getBoolPref("extensions.torbutton.tor_enabled")) {
219229
return;
220230
}
221-
} else if (!this.prefs.getBoolPref("extensions.https_everywhere._observatory_prefs.use_custom_proxy")) {
231+
} else if (!this.prefs.getBoolPref("extensions.https_everywhere._observatory.use_custom_proxy")) {
222232
this.log(WARN, "No torbutton installed, but no custom proxies either. Not submitting certs");
223233
return;
224234
}
@@ -256,14 +266,15 @@ SSLObservatory.prototype = {
256266
}
257267
}
258268

259-
if (rootidx == -1 || (fps.length > 1 && !(fps[rootidx] in this.public_roots))) {
260-
if (rootidx == -1) {
261-
rootidx = fps.length-1;
269+
if (!this.prefs.getBoolPref("extensions.https_everywhere._observatory.alt_roots"))
270+
if (rootidx == -1 || (fps.length > 1 && !(fps[rootidx] in this.public_roots))) {
271+
if (rootidx == -1) {
272+
rootidx = fps.length-1;
273+
}
274+
this.log(INFO, "Got a private root cert. Ignoring domain "
275+
+domain+" with root "+fps[rootidx]);
276+
return;
262277
}
263-
this.log(INFO, "Got a private root cert. Ignoring domain "
264-
+domain+" with root "+fps[rootidx]);
265-
return;
266-
}
267278

268279
if (fps[0] in this.already_submitted) {
269280
this.log(INFO, "Already submitted cert for "+domain+". Ignoring");
@@ -289,7 +300,7 @@ SSLObservatory.prototype = {
289300
var reqParams = [];
290301
reqParams.push("domain="+domain);
291302
reqParams.push("server_ip=-1");
292-
if (this.prefs.getBoolPref("extensions.https_everywhere._observatory_prefs.testing")) {
303+
if (this.prefs.getBoolPref("extensions.https_everywhere._observatory.testing")) {
293304
// The server can compute these, but they're a nice test suite item!
294305
reqParams.push("fplist="+this.compatJSON.encode(fps));
295306
}
@@ -339,7 +350,7 @@ SSLObservatory.prototype = {
339350
// XXX: Handle errors properly?
340351
if (req.status == 200) {
341352
that.log(INFO, "Successful cert submission");
342-
if (!that.prefs.getBoolPref("extensions.https_everywhere._observatory_prefs.cache_submitted")) {
353+
if (!that.prefs.getBoolPref("extensions.https_everywhere._observatory.cache_submitted")) {
343354
if (fps[0] in that.already_submitted)
344355
delete that.already_submitted[fps[0]];
345356
}
@@ -363,7 +374,7 @@ SSLObservatory.prototype = {
363374
getProxySettings: function() {
364375
var proxy_settings = ["direct", "", 0];
365376
if (this.torbutton_installed &&
366-
this.prefs.getBoolPref("extensions.https_everywhere._observatory_prefs.use_tor_proxy")) {
377+
this.prefs.getBoolPref("extensions.https_everywhere._observatory.use_tor_proxy")) {
367378
// extract torbutton proxy settings
368379
proxy_settings[0] = "http";
369380
proxy_settings[1] = this.prefs.getCharPref("extensions.torbutton.https_proxy");
@@ -374,10 +385,10 @@ SSLObservatory.prototype = {
374385
proxy_settings[1] = this.prefs.getCharPref("extensions.torbutton.socks_host");
375386
proxy_settings[2] = this.prefs.getIntPref("extensions.torbutton.socks_port");
376387
}
377-
} else if (this.prefs.getBoolPref("extensions.https_everywhere._observatory_prefs.use_custom_proxy")) {
378-
proxy_settings[0] = this.prefs.getCharPref("extensions.https_everywhere._observatory_prefs.proxy_type");
379-
proxy_settings[1] = this.prefs.getCharPref("extensions.https_everywhere._observatory_prefs.proxy_host");
380-
proxy_settings[2] = this.prefs.getIntPref("extensions.https_everywhere._observatory_prefs.proxy_port");
388+
} else if (this.prefs.getBoolPref("extensions.https_everywhere._observatory.use_custom_proxy")) {
389+
proxy_settings[0] = this.prefs.getCharPref("extensions.https_everywhere._observatory.proxy_type");
390+
proxy_settings[1] = this.prefs.getCharPref("extensions.https_everywhere._observatory.proxy_host");
391+
proxy_settings[2] = this.prefs.getIntPref("extensions.https_everywhere._observatory.proxy_port");
381392
} else {
382393
this.log(WARN, "Proxy settings are strange: No Torbutton found, but no proxy specified. Using direct.");
383394
}
Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
// SSl Observatory preferences
2-
pref("extensions.https_everywhere._observatory_prefs.enabled",false);
2+
3+
pref("extensions.https_everywhere._observatory.enabled",false);
34

45
// "testing" currently means send unecessary fingerprints and other test-suite
56
// type stuff
6-
pref("extensions.https_everywhere._observatory_prefs.testing",false);
7-
8-
pref("extensions.https_everywhere._observatory_prefs.use_tor_proxy",true);
9-
pref("extensions.https_everywhere._observatory_prefs.submit_during_tor",true);
10-
pref("extensions.https_everywhere._observatory_prefs.submit_during_nontor",true);
7+
pref("extensions.https_everywhere._observatory.testing",false);
118

12-
pref("extensions.https_everywhere._observatory_prefs.cache_submitted",true);
9+
pref("extensions.https_everywhere._observatory.use_tor_proxy",true);
10+
pref("extensions.https_everywhere._observatory.submit_during_tor",true);
11+
pref("extensions.https_everywhere._observatory.submit_during_nontor",true);
1312

14-
pref("extensions.https_everywhere._observatory_prefs.use_custom_proxy",false);
15-
pref("extensions.https_everywhere._observatory_prefs.proxy_host","");
16-
pref("extensions.https_everywhere._observatory_prefs.proxy_port",0);
17-
pref("extensions.https_everywhere._observatory_prefs.proxy_type","direct");
13+
pref("extensions.https_everywhere._observatory.cache_submitted",true);
1814

15+
pref("extensions.https_everywhere._observatory.use_custom_proxy",false);
16+
pref("extensions.https_everywhere._observatory.proxy_host","");
17+
pref("extensions.https_everywhere._observatory.proxy_port",0);
18+
pref("extensions.https_everywhere._observatory.proxy_type","direct");
19+
pref("extensions.https_everywhere._observatory.use_tor_proxy",true);
20+
pref("extensions.https_everywhere._observatory.alt_roots",false);
21+
pref("extensions.https_everywhere._observatory.priv_dns",false);
22+
pref("extensions.https_everywhere._observatory.send_asn",true);

0 commit comments

Comments
 (0)