var MasterPasswordUI = { _dialog: null, _tokenName: "", get _secModuleDB() { delete this._secModuleDB; return this._secModuleDB = Cc["@mozilla.org/security/pkcs11moduledb;1"].getService(Ci.nsIPKCS11ModuleDB); }, get _pk11DB() { delete this._pk11DB; return this._pk11DB = Cc["@mozilla.org/security/pk11tokendb;1"].getService(Ci.nsIPK11TokenDB); }, _setPassword: function _setPassword(password) { try { let status; let slot = this._secModuleDB.findSlotByName(this._tokenName); if (slot) status = slot.status; else return false; let token = this._pk11DB.findTokenByName(this._tokenName); if (status == Ci.nsIPKCS11Slot.SLOT_UNINITIALIZED) { token.initPassword(password); } else if (status == Ci.nsIPKCS11Slot.SLOT_READY) { token.changePassword("", password); } return true; } catch(e) { dump("--- MasterPasswordUI._setPassword exception: " + e + "\n"); return false; } }, _removePassword: function _removePassword(password) { try { let token = this._pk11DB.getInternalKeyToken(); if (token.checkPassword(password)) { token.changePassword(password, ""); return true; } } catch(e) { dump("--- MasterPasswordUI._removePassword exception: " + e + "\n"); } return false; }, show: function mp_show(aSet) { let dialogId = aSet ? "masterpassword-change" : "masterpassword-remove"; if (document.getElementById(dialogId)) return; let dialog = aSet ? "chrome://browser/content/masterPassword.xul" : "chrome://browser/content/removeMasterPassword.xul"; this._dialog = importDialog(window, dialog, null); BrowserUI.pushPopup(this, this._dialog); if (aSet) { this.checkPassword(); document.getElementById("masterpassword-newpassword1").focus(); } else { document.getElementById("masterpassword-oldpassword").focus(); } }, hide: function mp_hide(aValue) { this.updatePreference(); this._dialog.close(); this._dialog = null; BrowserUI.popPopup(this); }, setPassword: function mp_setPassword() { if (!this.checkPassword()) return; let newPasswordValue = document.getElementById("masterpassword-newpassword1").value; if (this._setPassword(newPasswordValue)) { this.hide(); } }, removePassword: function mp_removePassword() { let oldPassword = document.getElementById("masterpassword-oldpassword").value; if (this._removePassword(oldPassword)) { this.hide(); } }, checkPassword: function mp_checkPassword() { let newPasswordValue1 = document.getElementById("masterpassword-newpassword1").value; let newPasswordValue2 = document.getElementById("masterpassword-newpassword2").value; let buttonOk = this._dialog.getElementsByAttribute("class", "prompt-buttons")[0].firstChild; let isPasswordValid = this._secModuleDB.isFIPSEnabled ? (newPasswordValue1 != "" && newPasswordValue1 == newPasswordValue2) : (newPasswordValue1 == newPasswordValue2); buttonOk.setAttribute("disabled", !isPasswordValid); return isPasswordValid; }, checkOldPassword: function mp_checkOldPassword() { let oldPassword = document.getElementById("masterpassword-oldpassword"); let buttonOk = this._dialog.getElementsByAttribute("class", "prompt-buttons")[0].firstChild; let isPasswordValid = this._pk11DB.getInternalKeyToken().checkPassword(oldPassword.value); buttonOk.setAttribute("disabled", !isPasswordValid); }, hasMasterPassword: function mp_hasMasterPassword() { let slot = this._secModuleDB.findSlotByName(this._tokenName); if (slot) { let status = slot.status; return status != Ci.nsIPKCS11Slot.SLOT_UNINITIALIZED && status != Ci.nsIPKCS11Slot.SLOT_READY; } return false; }, updatePreference: function mp_updatePreference() { document.getElementById("prefs-master-password").value = this.hasMasterPassword(); } };