diff options
Diffstat (limited to 'mailnews/base/prefs/content/smtpEditOverlay.js')
-rw-r--r-- | mailnews/base/prefs/content/smtpEditOverlay.js | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/mailnews/base/prefs/content/smtpEditOverlay.js b/mailnews/base/prefs/content/smtpEditOverlay.js new file mode 100644 index 000000000..54590e1b2 --- /dev/null +++ b/mailnews/base/prefs/content/smtpEditOverlay.js @@ -0,0 +1,182 @@ +/* -*- 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"); +Components.utils.import("resource:///modules/mailServices.js"); + +// be real hacky with document.getElementById until document.controls works +// with the new XUL widgets + +var gSmtpUsername; +var gSmtpDescription; +var gSmtpUsernameLabel; +var gSmtpHostname; +var gSmtpPort; +var gSmtpAuthMethod; +var gSmtpSocketType; +var gPort; +var gDefaultPort; +var Ci = Components.interfaces; + +function initSmtpSettings(server) { + gSmtpUsername = document.getElementById("smtp.username"); + gSmtpDescription = document.getElementById("smtp.description"); + gSmtpUsernameLabel = document.getElementById("smtp.username.label"); + gSmtpHostname = document.getElementById("smtp.hostname"); + gSmtpPort = document.getElementById("smtp.port"); + gSmtpAuthMethod = document.getElementById("smtp.authMethod"); + gSmtpSocketType = document.getElementById("smtp.socketType"); + gDefaultPort = document.getElementById("smtp.defaultPort"); + gPort = document.getElementById("smtp.port"); + + if (server) { + gSmtpHostname.value = server.hostname; + gSmtpDescription.value = server.description; + gSmtpPort.value = server.port; + gSmtpUsername.value = server.username; + gSmtpAuthMethod.value = server.authMethod; + gSmtpSocketType.value = (server.socketType < 4) ? server.socketType : 1; + } else { + // New server, load default values. + gSmtpAuthMethod.value = Services.prefs.getIntPref("mail.smtpserver.default.authMethod"); + gSmtpSocketType.value = Services.prefs.getIntPref("mail.smtpserver.default.try_ssl"); + } + + // Although sslChanged will set a label for cleartext password, + // we need to use the long label so that we can size the dialog. + setLabelFromStringBundle("authMethod-no", "authNo"); + setLabelFromStringBundle("authMethod-password-encrypted", + "authPasswordEncrypted"); + setLabelFromStringBundle("authMethod-password-cleartext", + "authPasswordCleartextInsecurely"); + setLabelFromStringBundle("authMethod-kerberos", "authKerberos"); + setLabelFromStringBundle("authMethod-ntlm", "authNTLM"); + setLabelFromStringBundle("authMethod-oauth2", "authOAuth2"); + setLabelFromStringBundle("authMethod-anysecure", "authAnySecure"); + setLabelFromStringBundle("authMethod-any", "authAny"); + + sizeToContent(); + + sslChanged(false); + authMethodChanged(false); + + if (MailServices.smtp.defaultServer) + onLockPreference(); + + // Hide deprecated/hidden auth options, unless selected + hideUnlessSelected(document.getElementById("authMethod-anysecure")); + hideUnlessSelected(document.getElementById("authMethod-any")); + + // "STARTTLS, if available" is vulnerable to MITM attacks so we shouldn't + // allow users to choose it anymore. Hide the option unless the user already + // has it set. + hideUnlessSelected(document.getElementById("connectionSecurityType-1")); +} + +function hideUnlessSelected(element) +{ + element.hidden = !element.selected; +} + +function setLabelFromStringBundle(elementID, stringName) +{ + document.getElementById(elementID).label = + document.getElementById("bundle_messenger").getString(stringName); +} + +// Disables xul elements that have associated preferences locked. +function onLockPreference() +{ + try { + let allPrefElements = { + hostname: gSmtpHostname, + description: gSmtpDescription, + port: gSmtpPort, + authMethod: gSmtpAuthMethod, + try_ssl: gSmtpSocketType + }; + disableIfLocked(allPrefElements); + } catch (e) { // non-fatal + Components.utils.reportError("Error while getting locked prefs: " + e); + } +} + +/** + * Does the work of disabling an element given the array which contains xul id/prefstring pairs. + * + * @param prefstrArray array of XUL elements to check + * + * TODO: try to merge this with disableIfLocked function in am-offline.js (bug 755885) + */ +function disableIfLocked(prefstrArray) +{ + let finalPrefString = "mail.smtpserver." + + MailServices.smtp.defaultServer.key + "."; + let smtpPrefBranch = Services.prefs.getBranch(finalPrefString); + + for (let prefstring in prefstrArray) + if (smtpPrefBranch.prefIsLocked(prefstring)) + prefstrArray[prefstring].disabled = true; +} + +function saveSmtpSettings(server) +{ + //dump("Saving to " + server + "\n"); + if (server) { + server.hostname = cleanUpHostName(gSmtpHostname.value); + server.description = gSmtpDescription.value; + server.port = gSmtpPort.value; + server.authMethod = gSmtpAuthMethod.value; + server.username = gSmtpUsername.value; + server.socketType = gSmtpSocketType.value; + } +} + +function authMethodChanged(userAction) +{ + var noUsername = gSmtpAuthMethod.value == Ci.nsMsgAuthMethod.none; + gSmtpUsername.disabled = noUsername; + gSmtpUsernameLabel.disabled = noUsername; +} + +/** + * Resets the default port to SMTP or SMTPS, dependending on + * the |gSmtpSocketType| value, and sets the port to use to this default, + * if that's appropriate. + * + * @param userAction false for dialog initialization, + * true for user action. + */ +function sslChanged(userAction) +{ + const DEFAULT_SMTP_PORT = "587"; + const DEFAULT_SMTPS_PORT = "465"; + var socketType = gSmtpSocketType.value; + var otherDefaultPort; + var prevDefaultPort = gDefaultPort.value; + + if (socketType == Ci.nsMsgSocketType.SSL) { + gDefaultPort.value = DEFAULT_SMTPS_PORT; + otherDefaultPort = DEFAULT_SMTP_PORT; + } else { + gDefaultPort.value = DEFAULT_SMTP_PORT; + otherDefaultPort = DEFAULT_SMTPS_PORT; + } + + // If the port is not set, + // or the user is causing the default port to change, + // and the port is set to the default for the other protocol, + // then set the port to the default for the new protocol. + if ((gPort.value == 0) || + (userAction && (gDefaultPort.value != prevDefaultPort) && + (gPort.value == otherDefaultPort))) + gPort.value = gDefaultPort.value; + + // switch "insecure password" label + setLabelFromStringBundle("authMethod-password-cleartext", + socketType == Ci.nsMsgSocketType.SSL || + socketType == Ci.nsMsgSocketType.alwaysSTARTTLS ? + "authPasswordCleartextViaSSL" : "authPasswordCleartextInsecurely"); +} |