summaryrefslogtreecommitdiff
path: root/browser/base/content/padlock.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/padlock.js')
-rw-r--r--browser/base/content/padlock.js282
1 files changed, 282 insertions, 0 deletions
diff --git a/browser/base/content/padlock.js b/browser/base/content/padlock.js
new file mode 100644
index 000000000..f57f5075e
--- /dev/null
+++ b/browser/base/content/padlock.js
@@ -0,0 +1,282 @@
+var Cc = Components.classes;
+var Ci = Components.interfaces;
+var Cu = Components.utils;
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+var padlock_PadLock =
+{
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
+ Ci.nsISupportsWeakReference]),
+ onButtonClick: function(event) {
+ event.stopPropagation();
+ gIdentityHandler.handleMoreInfoClick(event);
+ },
+ onStateChange: function() {},
+ onProgressChange: function() {},
+ onLocationChange: function() {},
+ onStatusChange: function() {},
+ onSecurityChange: function(aCallerWebProgress, aRequestWithState, aState) {
+ const wpl = Ci.nsIWebProgressListener;
+ var level;
+ var highlight_urlbar = false;
+ var secUI = gBrowser.securityUI;
+ var secState = secUI.QueryInterface(Ci.nsISSLStatusProvider).SSLStatus;
+ if (secState == null) {
+ level = null;
+ } else {
+ highlight_urlbar = true;
+ secState.QueryInterface(Ci.nsISSLStatus);
+ // Step 1: Check EV
+ if (secState.isExtendedValidation) {
+ // Step 1 TRUE: Extended Validation
+ // Normal "ev"
+ // Mixed Content "broken"
+ if ((aState & wpl.STATE_LOADED_MIXED_ACTIVE_CONTENT) ||
+ (aState & wpl.STATE_LOADED_MIXED_DISPLAY_CONTENT))
+ level = "broken";
+ else
+ level = "ev";
+ } else {
+ // Step 1 FALSE: Domain Validation
+ // Normal "high"
+ // Mixed Passive Content "mixed"
+ // Mixed Active Content "broken"
+ if (aState & wpl.STATE_LOADED_MIXED_ACTIVE_CONTENT)
+ level = "broken";
+ else if (aState & wpl.STATE_LOADED_MIXED_DISPLAY_CONTENT)
+ level = "mixed";
+ else
+ level = "high";
+ }
+ // Step 2: Check Protocol
+ if (level != "broken") {
+ // SSL 3 "broken"
+ // TLS 1.0 "low"
+ // TLS 1.1 "low"
+ var proto = secState.protocolVersion;
+ if (proto == Ci.nsISSLStatus.SSL_VERSION_3)
+ level = "broken";
+ else if (proto == Ci.nsISSLStatus.TLS_VERSION_1 ||
+ proto == Ci.nsISSLStatus.TLS_VERSION_1_1) {
+ level = "low";
+ }
+ }
+ // Step 3: Check Bad Ciphers
+ if (level != "broken") {
+ // EXPORT "broken"
+ // RC2 "broken"
+ // RC4 + MD5 "broken"
+ // RC4 + SHA1 "low"
+ // 3DES "low"
+ var aCipher = secState.cipherSuite;
+ if (aCipher.indexOf("_EXPORT") > -1) {
+ level = "broken";
+ } else if (aCipher.indexOf("_RC2_") > -1) {
+ level = "broken";
+ } else if (aCipher.indexOf("_RC4_") > -1) {
+ if (aCipher.indexOf("_MD5") > -1) {
+ level = "broken";
+ } else if (aCipher.indexOf("_SHA") > -1) {
+ level = "low";
+ }
+ } else if (aCipher.indexOf("_3DES_") > -1) {
+ level = "low";
+ }
+ }
+ // Step 4: Check Boolean Problems
+ if (level != "broken") {
+ // Untrusted "broken"
+ // Domain Mismatch "broken"
+ // Expired (or too new) "broken"
+ if (secState.isUntrusted || secState.isDomainMismatch ||
+ secState.isNotValidAtThisTime)
+ level = "broken";
+ }
+ }
+
+ let ub = document.getElementById("urlbar");
+ if (ub) {
+ // Only call if URL bar is present.
+ if (highlight_urlbar) {
+ ub.setAttribute("security_level", level);
+ } else {
+ ub.removeAttribute("security_level");
+ }
+ }
+
+ try { // URL bar may be hidden
+ padlock_PadLock.setPadlockLevel("padlock-ib", level);
+ padlock_PadLock.setPadlockLevel("padlock-ib-left", level);
+ padlock_PadLock.setPadlockLevel("padlock-ub-right", level);
+ } catch(e) {}
+
+ padlock_PadLock.setPadlockLevel("padlock-sb", level);
+ padlock_PadLock.setPadlockLevel("padlock-tab", level);
+ },
+
+ setPadlockLevel: function(item, level) {
+ let secbut = document.getElementById(item);
+ var sectooltip = "";
+
+ if (level) {
+ secbut.setAttribute("level", level);
+ secbut.hidden = false;
+ } else {
+ secbut.hidden = true;
+ secbut.removeAttribute("level");
+ }
+
+ let s_ev = "Extended Validated";
+ let s_hi = "Secure";
+ let s_mx = "Mixed content";
+ let s_lo = "Weak security";
+ let s_no = "Not secure";
+ let gLocale = document.getElementById("bundle_browser");
+ if(!!gLocale) {
+ let n_ev = gLocale.getString("identity.padlock.ev");
+ if(n_ev != null)
+ s_ev = n_ev;
+ let n_hi = gLocale.getString("identity.padlock.high");
+ if(n_hi != null)
+ s_hi = n_hi;
+ let n_mx = gLocale.getString("identity.padlock.mixed");
+ if(n_mx != null)
+ s_mx = n_mx;
+ let n_lo = gLocale.getString("identity.padlock.low");
+ if(n_lo != null)
+ s_lo = n_lo;
+ let n_no = gLocale.getString("identity.padlock.broken");
+ if(n_no != null)
+ s_no = n_no;
+ }
+ switch (level) {
+ case "ev":
+ sectooltip = s_ev;
+ break;
+ case "high":
+ sectooltip = s_hi;
+ break;
+ case "low":
+ sectooltip = s_lo;
+ break;
+ case "mixed":
+ sectooltip = s_mx;
+ break;
+ case "broken":
+ sectooltip = s_no;
+ break;
+ default:
+ sectooltip = "";
+ }
+ secbut.setAttribute("tooltiptext", sectooltip);
+ },
+
+ prefbranch : null,
+
+ onLoad: function() {
+ gBrowser.addProgressListener(padlock_PadLock);
+
+ var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
+ padlock_PadLock.prefbranch = prefService.getBranch("browser.padlock.");
+ padlock_PadLock.prefbranch.QueryInterface(Components.interfaces.nsIPrefBranch2);
+ padlock_PadLock.usePrefs();
+ padlock_PadLock.prefbranch.addObserver("", padlock_PadLock, false);
+ },
+ onUnLoad: function() {
+ padlock_PadLock.prefbranch.removeObserver("", padlock_PadLock);
+ },
+ observe: function(subject, topic, data)
+ {
+ if (topic != "nsPref:changed")
+ return;
+ if (data != "style" && data != "urlbar_background" && data != "shown")
+ return;
+ padlock_PadLock.usePrefs();
+ },
+ usePrefs: function() {
+ var prefval = padlock_PadLock.prefbranch.getIntPref("style");
+ var position;
+ var padstyle;
+ if (prefval == 2) {
+ position = "ib-left";
+ padstyle = "modern";
+ } else if (prefval == 3) {
+ position = "ub-right";
+ padstyle = "modern";
+ } else if (prefval == 4) {
+ position = "statbar";
+ padstyle = "modern";
+ } else if (prefval == 5) {
+ position = "tabs-bar";
+ padstyle = "modern";
+ } else if (prefval == 6) {
+ position = "ib-trans-bg";
+ padstyle = "classic";
+ } else if (prefval == 7) {
+ position = "ib-left";
+ padstyle = "classic";
+ } else if (prefval == 8) {
+ position = "ub-right";
+ padstyle = "classic";
+ } else if (prefval == 9) {
+ position = "statbar";
+ padstyle = "classic";
+ } else if (prefval == 10) {
+ position = "tabs-bar";
+ padstyle = "classic";
+ } else {
+ // 1 or anything else_ default
+ position = "ib-trans-bg";
+ padstyle = "modern";
+ }
+
+ var colshow;
+ var colprefval = padlock_PadLock.prefbranch.getIntPref("urlbar_background");
+ switch (colprefval) {
+ case 3:
+ colshow = "all";
+ break;
+ case 2:
+ colshow = "secure-mixed";
+ break;
+ case 1:
+ colshow = "secure-only";
+ break;
+ default:
+ // 0 or anything else: no shading
+ colshow = "";
+ }
+ try {
+ // XXX should probably be done automatically
+ document.getElementById("urlbar").setAttribute("https_color", colshow);
+ } catch(e) {}
+
+ var lockenabled = padlock_PadLock.prefbranch.getBoolPref("shown");
+ var padshow = "";
+ if (lockenabled) {
+ padshow = position;
+ }
+
+ try { // URL bar may be hidden
+ document.getElementById("padlock-ib").setAttribute("padshow", padshow);
+ document.getElementById("padlock-ib-left").setAttribute("padshow", padshow);
+ document.getElementById("padlock-ub-right").setAttribute("padshow", padshow);
+ } catch(e) {}
+
+ document.getElementById("padlock-sb").setAttribute("padshow", padshow);
+ document.getElementById("padlock-tab").setAttribute("padshow", padshow);
+
+ try { // URL bar may be hidden
+ document.getElementById("padlock-ib").setAttribute("padstyle", padstyle);
+ document.getElementById("padlock-ib-left").setAttribute("padstyle", padstyle);
+ document.getElementById("padlock-ub-right").setAttribute("padstyle", padstyle);
+ } catch(e) {}
+
+ document.getElementById("padlock-sb").setAttribute("padstyle", padstyle);
+ document.getElementById("padlock-tab").setAttribute("padstyle", padstyle);
+
+ }
+};
+
+window.addEventListener("load", padlock_PadLock.onLoad, false );
+window.addEventListener("unload", padlock_PadLock.onUnLoad, false );