Dactyloidae/mailnews/base/prefs/content/smtpEditOverlay.js
Matt A. Tobin 1531d6498d Issue #1258 - Part 8: Ifdef MailNews OAuth2 Support
Use --disable-mailnews-oauth2 to exclude it. Confvars won't be respected.
2019-11-17 00:09:28 +08:00

184 lines
6.4 KiB
JavaScript

/* -*- 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");
#ifdef MOZ_MAILNEWS_OAUTH2
setLabelFromStringBundle("authMethod-oauth2", "authOAuth2");
#endif
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");
}