diff options
Diffstat (limited to 'components/preferences/content/changemp.js')
-rw-r--r-- | components/preferences/content/changemp.js | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/components/preferences/content/changemp.js b/components/preferences/content/changemp.js new file mode 100644 index 000000000..71664b3e1 --- /dev/null +++ b/components/preferences/content/changemp.js @@ -0,0 +1,243 @@ +// -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const nsPK11TokenDB = "@mozilla.org/security/pk11tokendb;1"; +const nsIPK11TokenDB = Components.interfaces.nsIPK11TokenDB; +const nsIDialogParamBlock = Components.interfaces.nsIDialogParamBlock; +const nsPKCS11ModuleDB = "@mozilla.org/security/pkcs11moduledb;1"; +const nsIPKCS11ModuleDB = Components.interfaces.nsIPKCS11ModuleDB; +const nsIPKCS11Slot = Components.interfaces.nsIPKCS11Slot; +const nsIPK11Token = Components.interfaces.nsIPK11Token; + + +var params; +var tokenName=""; +var pw1; + +function init() +{ + pw1 = document.getElementById("pw1"); + + process(); +} + + +function process() +{ + var secmoddb = Components.classes[nsPKCS11ModuleDB].getService(nsIPKCS11ModuleDB); + var bundle = document.getElementById("bundlePreferences"); + + // If the token is unitialized, don't use the old password box. + // Otherwise, do. + + var slot = secmoddb.findSlotByName(tokenName); + if (slot) { + var oldpwbox = document.getElementById("oldpw"); + var msgBox = document.getElementById("message"); + var status = slot.status; + if (status == nsIPKCS11Slot.SLOT_UNINITIALIZED + || status == nsIPKCS11Slot.SLOT_READY) { + + oldpwbox.setAttribute("hidden", "true"); + msgBox.setAttribute("value", bundle.getString("password_not_set")); + msgBox.setAttribute("hidden", "false"); + + if (status == nsIPKCS11Slot.SLOT_READY) { + oldpwbox.setAttribute("inited", "empty"); + } else { + oldpwbox.setAttribute("inited", "true"); + } + + // Select first password field + document.getElementById('pw1').focus(); + + } else { + // Select old password field + oldpwbox.setAttribute("hidden", "false"); + msgBox.setAttribute("hidden", "true"); + oldpwbox.setAttribute("inited", "false"); + oldpwbox.focus(); + } + } + + if (params) { + // Return value 0 means "canceled" + params.SetInt(1, 0); + } + + checkPasswords(); +} + +function setPassword() +{ + var pk11db = Components.classes[nsPK11TokenDB].getService(nsIPK11TokenDB); + var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] + .getService(Components.interfaces.nsIPromptService); + var token = pk11db.findTokenByName(tokenName); + dump("*** TOKEN!!!! (name = |" + token + "|\n"); + + var oldpwbox = document.getElementById("oldpw"); + var initpw = oldpwbox.getAttribute("inited"); + var bundle = document.getElementById("bundlePreferences"); + + var success = false; + + if (initpw == "false" || initpw == "empty") { + try { + var oldpw = ""; + var passok = 0; + + if (initpw == "empty") { + passok = 1; + } else { + oldpw = oldpwbox.value; + passok = token.checkPassword(oldpw); + } + + if (passok) { + if (initpw == "empty" && pw1.value == "") { + // This makes no sense that we arrive here, + // we reached a case that should have been prevented by checkPasswords. + } else { + if (pw1.value == "") { + var secmoddb = Components.classes[nsPKCS11ModuleDB].getService(nsIPKCS11ModuleDB); + if (secmoddb.isFIPSEnabled) { + // empty passwords are not allowed in FIPS mode + promptService.alert(window, + bundle.getString("pw_change_failed_title"), + bundle.getString("pw_change2empty_in_fips_mode")); + passok = 0; + } + } + if (passok) { + token.changePassword(oldpw, pw1.value); + if (pw1.value == "") { + promptService.alert(window, + bundle.getString("pw_change_success_title"), + bundle.getString("pw_erased_ok") + + " " + bundle.getString("pw_empty_warning")); + } else { + promptService.alert(window, + bundle.getString("pw_change_success_title"), + bundle.getString("pw_change_ok")); + } + success = true; + } + } + } else { + oldpwbox.focus(); + oldpwbox.setAttribute("value", ""); + promptService.alert(window, + bundle.getString("pw_change_failed_title"), + bundle.getString("incorrect_pw")); + } + } catch (e) { + promptService.alert(window, + bundle.getString("pw_change_failed_title"), + bundle.getString("failed_pw_change")); + } + } else { + token.initPassword(pw1.value); + if (pw1.value == "") { + promptService.alert(window, + bundle.getString("pw_change_success_title"), + bundle.getString("pw_not_wanted") + + " " + bundle.getString("pw_empty_warning")); + } + success = true; + } + + // Terminate dialog + if (success) + window.close(); +} + +function setPasswordStrength() +{ +// Here is how we weigh the quality of the password +// number of characters +// numbers +// non-alpha-numeric chars +// upper and lower case characters + + var pw=document.getElementById('pw1').value; + +// length of the password + var pwlength=(pw.length); + if (pwlength>10) + pwlength=10; + + +// use of numbers in the password + var numnumeric = pw.replace (/[0-9]/g, ""); + var numeric=(pw.length - numnumeric.length); + if (numeric>3) + numeric=3; + +// use of symbols in the password + var symbols = pw.replace (/\W/g, ""); + var numsymbols=(pw.length - symbols.length); + if (numsymbols>3) + numsymbols=3; + +// use of uppercase in the password + var numupper = pw.replace (/[A-Z]/g, ""); + var upper=(pw.length - numupper.length); + if (upper>3) + upper=3; + + + var pwstrength=((pwlength*5)-20) + (numeric*10) + (numsymbols*15) + (upper*10); + + // make sure we're give a value between 0 and 100 + if ( pwstrength < 0 ) { + pwstrength = 0; + } + + if ( pwstrength > 100 ) { + pwstrength = 100; + } + + var mymeter=document.getElementById('pwmeter'); + mymeter.value = pwstrength; + + return; +} + +function checkPasswords() +{ + var pw1=document.getElementById('pw1').value; + var pw2=document.getElementById('pw2').value; + var ok=document.documentElement.getButton("accept"); + + var oldpwbox = document.getElementById("oldpw"); + if (oldpwbox) { + var initpw = oldpwbox.getAttribute("inited"); + + if (initpw == "empty" && pw1 == "") { + // The token has already been initialized, therefore this dialog + // was called with the intention to change the password. + // The token currently uses an empty password. + // We will not allow changing the password from empty to empty. + ok.setAttribute("disabled", "true"); + return; + } + } + + // Never accept short passwords < 8 chars + if (pw1.length < 8) { + ok.setAttribute("disabled", "true"); + return; + } + + if (pw1 == pw2) { + ok.setAttribute("disabled", "false"); + } else + { + ok.setAttribute("disabled", "true"); + } + +} |