Dactyloidae/mailnews/base/prefs/content/am-smtp.js
2025-09-28 08:06:24 +08:00

276 lines
8.1 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");
#ifdef MOZ_MAILNEWS_OAUTH2
Components.utils.import("resource://gre/modules/OAuth2Providers.jsm");
#endif
var gSmtpServerListWindow =
{
mBundle: null,
mServerList: null,
mAddButton: null,
mEditButton: null,
mDeleteButton: null,
mSetDefaultServerButton: null,
onLoad: function()
{
parent.onPanelLoaded('am-smtp.xul');
this.mBundle = document.getElementById("bundle_messenger");
this.mServerList = document.getElementById("smtpList");
this.mAddButton = document.getElementById("addButton");
this.mEditButton = document.getElementById("editButton");
this.mDeleteButton = document.getElementById("deleteButton");
this.mSetDefaultServerButton = document.getElementById("setDefaultButton");
this.refreshServerList("", false);
this.updateButtons(this.getSelectedServer());
},
onSelectionChanged: function(aEvent)
{
if (this.mServerList.selectedItems.length <= 0)
return;
var server = this.getSelectedServer();
this.updateButtons(server);
this.updateServerInfoBox(server);
},
onDeleteServer: function (aEvent)
{
var server = this.getSelectedServer();
if (server)
{
// confirm deletion
let cancel = Services.prompt.confirmEx(window,
this.mBundle.getString('smtpServers-confirmServerDeletionTitle'),
this.mBundle.getFormattedString('smtpServers-confirmServerDeletion', [server.hostname], 1),
Services.prompt.STD_YES_NO_BUTTONS, null, null, null, null, { });
if (!cancel)
{
// Remove password information first.
try {
server.forgetPassword();
} catch (e) { /* It is OK if this fails. */ }
// Remove the server.
MailServices.smtp.deleteServer(server);
parent.replaceWithDefaultSmtpServer(server.key);
this.refreshServerList("", true);
}
}
},
onAddServer: function (aEvent)
{
this.openServerEditor(null);
},
onEditServer: function (aEvent)
{
if (this.mServerList.selectedItems.length <= 0)
return;
this.openServerEditor(this.getSelectedServer());
},
onSetDefaultServer: function(aEvent)
{
if (this.mServerList.selectedItems.length <= 0)
return;
MailServices.smtp.defaultServer = this.getSelectedServer();
this.refreshServerList(MailServices.smtp.defaultServer.key, true);
},
updateButtons: function(aServer)
{
// can't delete default server
if (MailServices.smtp.defaultServer == aServer)
{
this.mSetDefaultServerButton.setAttribute("disabled", "true");
this.mDeleteButton.setAttribute("disabled", "true");
}
else
{
this.mSetDefaultServerButton.removeAttribute("disabled");
this.mDeleteButton.removeAttribute("disabled");
}
if (this.mServerList.selectedItems.length == 0)
this.mEditButton.setAttribute("disabled", "true");
else
this.mEditButton.removeAttribute("disabled");
},
updateServerInfoBox: function(aServer)
{
var noneSelected = this.mBundle.getString("smtpServerList-NotSpecified");
document.getElementById('nameValue').value = aServer.hostname;
document.getElementById('descriptionValue').value = aServer.description || noneSelected;
document.getElementById('portValue').value = aServer.port;
document.getElementById('userNameValue').value = aServer.username || noneSelected;
document.getElementById('useSecureConnectionValue').value =
this.mBundle.getString("smtpServer-ConnectionSecurityType-" +
aServer.socketType);
const AuthMethod = Components.interfaces.nsMsgAuthMethod;
const SocketType = Components.interfaces.nsMsgSocketType;
var authStr = "";
switch (aServer.authMethod)
{
case AuthMethod.none:
authStr = "authNo";
break;
case AuthMethod.passwordEncrypted:
authStr = "authPasswordEncrypted";
break;
case AuthMethod.GSSAPI:
authStr = "authKerberos";
break;
case AuthMethod.NTLM:
authStr = "authNTLM";
break;
case AuthMethod.secure:
authStr = "authAnySecure";
break;
case AuthMethod.passwordCleartext:
authStr = (aServer.socketType == SocketType.SSL ||
aServer.socketType == SocketType.alwaysSTARTTLS)
? "authPasswordCleartextViaSSL"
: "authPasswordCleartextInsecurely";
break;
#ifdef MOZ_MAILNEWS_OAUTH2
case AuthMethod.OAuth2:
authStr = "authOAuth2";
break;
#endif
default:
// leave empty
Components.utils.reportError("Warning: unknown value for smtpserver... authMethod: " +
aServer.authMethod);
}
if (authStr) {
#ifdef MOZ_MAILNEWS_OAUTH2
let details = OAuth2Providers.getHostnameDetails(aServer.hostname);
if (!details) {
document
.getElementById("authMethod-oauth2")
.toggleAttribute("disabled", true);
}
#endif
document.getElementById("authMethodValue").value =
this.mBundle.getString(authStr);
}
},
refreshServerList: function(aServerKeyToSelect, aFocusList)
{
// remove all children
while (this.mServerList.hasChildNodes())
this.mServerList.lastChild.remove();
this.fillSmtpServers(this.mServerList,
MailServices.smtp.servers,
MailServices.smtp.defaultServer);
if (aServerKeyToSelect)
this.setSelectedServer(this.mServerList.querySelector('[key="' + aServerKeyToSelect + '"]'));
else // select the default server
this.setSelectedServer(this.mServerList.querySelector('[default="true"]'));
if (aFocusList)
this.mServerList.focus();
},
fillSmtpServers: function(aListBox, aServers, aDefaultServer)
{
if (!aListBox || !aServers)
return;
while (aServers.hasMoreElements())
{
var server = aServers.getNext();
if (server instanceof Components.interfaces.nsISmtpServer)
{
var isDefault = (aDefaultServer.key == server.key);
var listitem = this.createSmtpListItem(server, isDefault);
aListBox.appendChild(listitem);
}
}
},
createSmtpListItem: function(aServer, aIsDefault)
{
var listitem = document.createElement("listitem");
var serverName = "";
if (aServer.description)
serverName = aServer.description + ' - ';
else if (aServer.username)
serverName = aServer.username + ' - ';
serverName += aServer.hostname;
if (aIsDefault)
{
serverName += " " + this.mBundle.getString("defaultServerTag");
listitem.setAttribute("default", "true");
}
listitem.setAttribute("label", serverName);
listitem.setAttribute("key", aServer.key);
listitem.setAttribute("class", "smtpServerListItem");
// give it some unique id
listitem.id = "smtpServer." + aServer.key;
return listitem;
},
openServerEditor: function(aServer)
{
var args = {server: aServer,
result: false,
addSmtpServer: ""};
window.openDialog("chrome://messenger/content/SmtpServerEdit.xul",
"smtpEdit", "chrome,titlebar,modal,centerscreen", args);
// now re-select the server which was just added
if (args.result)
this.refreshServerList(aServer ? aServer.key : args.addSmtpServer, true);
return args.result;
},
setSelectedServer: function(aServer)
{
if (!aServer)
return;
setTimeout(function(aServerList) {
aServerList.ensureElementIsVisible(aServer);
aServerList.selectItem(aServer);
}, 0, this.mServerList);
},
getSelectedServer: function()
{
if (this.mServerList.selectedItems.length == 0)
return null;
let serverKey = this.mServerList.selectedItems[0].getAttribute("key");
return MailServices.smtp.getServerByKey(serverKey);
}
};