/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * 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/. */ Components.utils.import("resource://gre/modules/Services.jsm"); var nsIX509CertDB = Components.interfaces.nsIX509CertDB; var nsX509CertDBContractID = "@mozilla.org/security/x509certdb;1"; var nsIX509Cert = Components.interfaces.nsIX509Cert; var email_recipient_cert_usage = 5; var email_signing_cert_usage = 4; var gIdentity; var gPref = null; var gEncryptionCertName = null; var gHiddenEncryptionPolicy = null; var gEncryptionChoices = null; var gSignCertName = null; var gSignMessages = null; var gEncryptAlways = null; var gNeverEncrypt = null; var gBundle = null; var gBrandBundle; var gSmimePrefbranch; var gEncryptionChoicesLocked; var gSigningChoicesLocked; var kEncryptionCertPref = "identity.encryption_cert_name"; var kSigningCertPref = "identity.signing_cert_name"; function onInit() { smimeInitializeFields(); } function smimeInitializeFields() { // initialize all of our elements based on the current identity values.... gEncryptionCertName = document.getElementById(kEncryptionCertPref); gHiddenEncryptionPolicy = document.getElementById("identity.encryptionpolicy"); gEncryptionChoices = document.getElementById("encryptionChoices"); gSignCertName = document.getElementById(kSigningCertPref); gSignMessages = document.getElementById("identity.sign_mail"); gEncryptAlways = document.getElementById("encrypt_mail_always"); gNeverEncrypt = document.getElementById("encrypt_mail_never"); gBundle = document.getElementById("bundle_smime"); gBrandBundle = document.getElementById("bundle_brand"); gEncryptionChoicesLocked = false; gSigningChoicesLocked = false; if (!gIdentity) { // The user is going to create a new identity. // Set everything to default values. // Do not take over the values from gAccount.defaultIdentity // as the new identity is going to have a different mail address. gEncryptionCertName.value = ""; gEncryptionCertName.nickname = ""; gEncryptionCertName.dbKey = ""; gSignCertName.value = ""; gSignCertName.nickname = ""; gSignCertName.dbKey = ""; gEncryptAlways.setAttribute("disabled", true); gNeverEncrypt.setAttribute("disabled", true); gSignMessages.setAttribute("disabled", true); gSignMessages.checked = false; gEncryptionChoices.value = 0; } else { var certdb = Components.classes[nsX509CertDBContractID].getService(nsIX509CertDB); var x509cert = null; gEncryptionCertName.value = gIdentity.getUnicharAttribute("encryption_cert_name"); gEncryptionCertName.dbKey = gIdentity.getCharAttribute("encryption_cert_dbkey"); // If we succeed in looking up the certificate by the dbkey pref, then // append the serial number " [...]" to the display value, and remember the // nickname in a separate property. try { if (certdb && gEncryptionCertName.dbKey && (x509cert = certdb.findCertByDBKey(gEncryptionCertName.dbKey))) { gEncryptionCertName.value = x509cert.nickname + " [" + x509cert.serialNumber + "]"; gEncryptionCertName.nickname = x509cert.nickname; } } catch(e) {} gEncryptionChoices.value = gIdentity.getIntAttribute("encryptionpolicy"); if (!gEncryptionCertName.value) { gEncryptAlways.setAttribute("disabled", true); gNeverEncrypt.setAttribute("disabled", true); } else { enableEncryptionControls(true); } gSignCertName.value = gIdentity.getUnicharAttribute("signing_cert_name"); gSignCertName.dbKey = gIdentity.getCharAttribute("signing_cert_dbkey"); x509cert = null; // same procedure as with gEncryptionCertName (see above) try { if (certdb && gSignCertName.dbKey && (x509cert = certdb.findCertByDBKey(gSignCertName.dbKey))) { gSignCertName.value = x509cert.nickname + " [" + x509cert.serialNumber + "]"; gSignCertName.nickname = x509cert.nickname; } } catch(e) {} gSignMessages.checked = gIdentity.getBoolAttribute("sign_mail"); if (!gSignCertName.value) { gSignMessages.setAttribute("disabled", true); } else { enableSigningControls(true); } } // Always start with enabling signing and encryption cert select buttons. // This will keep the visibility of buttons in a sane state as user // jumps from security panel of one account to another. enableCertSelectButtons(); // Disable all locked elements on the panel if (gIdentity) onLockPreference(); } function onPreInit(account, accountValues) { gIdentity = account.defaultIdentity; } function onSave() { smimeSave(); } function smimeSave() { // find out which radio for the encryption radio group is selected and set that on our hidden encryptionChoice pref.... var newValue = gEncryptionChoices.value; gHiddenEncryptionPolicy.setAttribute('value', newValue); gIdentity.setIntAttribute("encryptionpolicy", newValue); gIdentity.setUnicharAttribute("encryption_cert_name", gEncryptionCertName.nickname || gEncryptionCertName.value); gIdentity.setCharAttribute("encryption_cert_dbkey", gEncryptionCertName.dbKey); gIdentity.setBoolAttribute("sign_mail", gSignMessages.checked); gIdentity.setUnicharAttribute("signing_cert_name", gSignCertName.nickname || gSignCertName.value); gIdentity.setCharAttribute("signing_cert_dbkey", gSignCertName.dbKey); } function smimeOnAcceptEditor() { try { if (!onOk()) return false; } catch (ex) {} smimeSave(); return true; } function onLockPreference() { var initPrefString = "mail.identity"; var finalPrefString; var allPrefElements = [ { prefstring:"signingCertSelectButton", id:"signingCertSelectButton"}, { prefstring:"encryptionCertSelectButton", id:"encryptionCertSelectButton"}, { prefstring:"sign_mail", id:"identity.sign_mail"}, { prefstring:"encryptionpolicy", id:"encryptionChoices"} ]; finalPrefString = initPrefString + "." + gIdentity.key + "."; gSmimePrefbranch = Services.prefs.getBranch(finalPrefString); disableIfLocked( allPrefElements ); } // Does the work of disabling an element given the array which contains xul id/prefstring pairs. // Also saves the id/locked state in an array so that other areas of the code can avoid // stomping on the disabled state indiscriminately. function disableIfLocked( prefstrArray ) { var i; for (i=0; i