mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-19 14:57:32 +09:00
406 lines
16 KiB
JavaScript
406 lines
16 KiB
JavaScript
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
* 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:///modules/iteratorUtils.jsm");
|
|
Components.utils.import("resource:///modules/MailUtils.js");
|
|
Components.utils.import("resource://gre/modules/Services.jsm");
|
|
|
|
var gServer;
|
|
|
|
function onSave()
|
|
{
|
|
let storeContractID = document.getElementById("server.storeTypeMenulist")
|
|
.selectedItem
|
|
.value;
|
|
document.getElementById("server.storeContractID")
|
|
.setAttribute("value", storeContractID);
|
|
}
|
|
|
|
function onInit(aPageId, aServerId)
|
|
{
|
|
initServerType();
|
|
|
|
onCheckItem("server.biffMinutes", ["server.doBiff"]);
|
|
onCheckItem("nntp.maxArticles", ["nntp.notifyOn"]);
|
|
setupMailOnServerUI();
|
|
setupFixedUI();
|
|
let serverType = document.getElementById("server.type").getAttribute("value");
|
|
if (serverType == "imap")
|
|
setupImapDeleteUI(aServerId);
|
|
|
|
#ifdef MOZ_MAILNEWS_OAUTH2
|
|
// OAuth2 are only supported on IMAP and POP.
|
|
document.getElementById("authMethod-oauth2").hidden =
|
|
serverType != "imap" && serverType != "pop3";
|
|
#endif
|
|
// TLS Cert (External) and OAuth2 are only supported on IMAP.
|
|
document.getElementById("authMethod-external").hidden = (serverType != "imap");
|
|
|
|
// "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"));
|
|
|
|
// UI for account store type.
|
|
let storeTypeElement = document.getElementById("server.storeTypeMenulist");
|
|
// set the menuitem to match the account
|
|
let currentStoreID = document.getElementById("server.storeContractID")
|
|
.getAttribute("value");
|
|
let targetItem = storeTypeElement.getElementsByAttribute("value", currentStoreID);
|
|
storeTypeElement.selectedItem = targetItem[0];
|
|
// disable store type change if store has already been used
|
|
storeTypeElement.setAttribute("disabled",
|
|
gServer.getBoolValue("canChangeStoreType") ? "false" : "true");
|
|
}
|
|
|
|
function onPreInit(account, accountValues)
|
|
{
|
|
var type = parent.getAccountValue(account, accountValues, "server", "type", null, false);
|
|
hideShowControls(type);
|
|
|
|
Services.obs.notifyObservers(null, "charsetmenu-selected", "other");
|
|
|
|
gServer = account.incomingServer;
|
|
|
|
if(!account.incomingServer.canEmptyTrashOnExit)
|
|
{
|
|
document.getElementById("server.emptyTrashOnExit").setAttribute("hidden", "true");
|
|
document.getElementById("imap.deleteModel.box").setAttribute("hidden", "true");
|
|
}
|
|
}
|
|
|
|
function initServerType()
|
|
{
|
|
var serverType = document.getElementById("server.type").getAttribute("value");
|
|
var propertyName = "serverType-" + serverType;
|
|
|
|
var messengerBundle = document.getElementById("bundle_messenger");
|
|
var verboseName = messengerBundle.getString(propertyName);
|
|
setDivText("servertype.verbose", verboseName);
|
|
|
|
secureSelect(true);
|
|
|
|
setLabelFromStringBundle("authMethod-no", "authNo");
|
|
setLabelFromStringBundle("authMethod-old", "authOld");
|
|
setLabelFromStringBundle("authMethod-kerberos", "authKerberos");
|
|
setLabelFromStringBundle("authMethod-external", "authExternal");
|
|
setLabelFromStringBundle("authMethod-ntlm", "authNTLM");
|
|
#ifdef MOZ_MAILNEWS_OAUTH2
|
|
setLabelFromStringBundle("authMethod-oauth2", "authOAuth2");
|
|
#endif
|
|
setLabelFromStringBundle("authMethod-anysecure", "authAnySecure");
|
|
setLabelFromStringBundle("authMethod-any", "authAny");
|
|
setLabelFromStringBundle("authMethod-password-encrypted",
|
|
"authPasswordEncrypted");
|
|
//authMethod-password-cleartext already set in selectSelect()
|
|
|
|
// Hide deprecated/hidden auth options, unless selected
|
|
hideUnlessSelected(document.getElementById("authMethod-no"));
|
|
hideUnlessSelected(document.getElementById("authMethod-old"));
|
|
hideUnlessSelected(document.getElementById("authMethod-anysecure"));
|
|
hideUnlessSelected(document.getElementById("authMethod-any"));
|
|
}
|
|
|
|
function hideUnlessSelected(element)
|
|
{
|
|
element.hidden = !element.selected;
|
|
}
|
|
|
|
function setLabelFromStringBundle(elementID, stringName)
|
|
{
|
|
document.getElementById(elementID).label =
|
|
document.getElementById("bundle_messenger").getString(stringName);
|
|
}
|
|
|
|
function setDivText(divname, value)
|
|
{
|
|
var div = document.getElementById(divname);
|
|
if (!div)
|
|
return;
|
|
div.setAttribute("value", value);
|
|
}
|
|
|
|
|
|
function onAdvanced()
|
|
{
|
|
// Store the server type and, if an IMAP or POP3 server,
|
|
// the settings needed for the IMAP/POP3 tab into the array
|
|
var serverSettings = {};
|
|
var serverType = document.getElementById("server.type").getAttribute("value");
|
|
serverSettings.serverType = serverType;
|
|
|
|
serverSettings.serverPrettyName = gServer.prettyName;
|
|
serverSettings.account = top.getCurrentAccount();
|
|
|
|
if (serverType == "imap")
|
|
{
|
|
serverSettings.dualUseFolders = document.getElementById("imap.dualUseFolders").checked;
|
|
serverSettings.usingSubscription = document.getElementById("imap.usingSubscription").checked;
|
|
serverSettings.maximumConnectionsNumber = document.getElementById("imap.maximumConnectionsNumber").getAttribute("value");
|
|
// string prefs
|
|
serverSettings.personalNamespace = document.getElementById("imap.personalNamespace").getAttribute("value");
|
|
serverSettings.publicNamespace = document.getElementById("imap.publicNamespace").getAttribute("value");
|
|
serverSettings.serverDirectory = document.getElementById("imap.serverDirectory").getAttribute("value");
|
|
serverSettings.otherUsersNamespace = document.getElementById("imap.otherUsersNamespace").getAttribute("value");
|
|
serverSettings.overrideNamespaces = document.getElementById("imap.overrideNamespaces").checked;
|
|
}
|
|
else if (serverType == "pop3")
|
|
{
|
|
serverSettings.deferGetNewMail = document.getElementById("pop3.deferGetNewMail").checked;
|
|
serverSettings.deferredToAccount = document.getElementById("pop3.deferredToAccount").getAttribute("value");
|
|
}
|
|
|
|
window.openDialog("chrome://messenger/content/am-server-advanced.xul",
|
|
"_blank", "chrome,modal,titlebar", serverSettings);
|
|
|
|
if (serverType == "imap")
|
|
{
|
|
document.getElementById("imap.dualUseFolders").checked = serverSettings.dualUseFolders;
|
|
document.getElementById("imap.usingSubscription").checked = serverSettings.usingSubscription;
|
|
document.getElementById("imap.maximumConnectionsNumber").setAttribute("value", serverSettings.maximumConnectionsNumber);
|
|
// string prefs
|
|
document.getElementById("imap.personalNamespace").setAttribute("value", serverSettings.personalNamespace);
|
|
document.getElementById("imap.publicNamespace").setAttribute("value", serverSettings.publicNamespace);
|
|
document.getElementById("imap.serverDirectory").setAttribute("value", serverSettings.serverDirectory);
|
|
document.getElementById("imap.otherUsersNamespace").setAttribute("value", serverSettings.otherUsersNamespace);
|
|
document.getElementById("imap.overrideNamespaces").checked = serverSettings.overrideNamespaces;
|
|
}
|
|
else if (serverType == "pop3")
|
|
{
|
|
document.getElementById("pop3.deferGetNewMail").checked = serverSettings.deferGetNewMail;
|
|
document.getElementById("pop3.deferredToAccount").setAttribute("value", serverSettings.deferredToAccount);
|
|
let pop3Server = gServer.QueryInterface(Components.interfaces.nsIPop3IncomingServer);
|
|
// we're explicitly setting this so we'll go through the SetDeferredToAccount method
|
|
pop3Server.deferredToAccount = serverSettings.deferredToAccount;
|
|
// Setting the server to be deferred causes a rebuild of the account tree,
|
|
// losing the current selection. Reselect the current server again as it
|
|
// didn't really disappear.
|
|
parent.selectServer(parent.getCurrentAccount().incomingServer, parent.currentPageId);
|
|
|
|
// Iterate over all accounts to see if any of their junk targets are now
|
|
// invalid (pointed to the account that is now deferred).
|
|
// If any such target is found it is reset to a new safe folder
|
|
// (the deferred to account or Local Folders). If junk was really moved
|
|
// to that folder (moveOnSpam = true) then moving junk is disabled
|
|
// (so that the user notices it and checks the settings).
|
|
// This is the same sanitization as in am-junk.js, just applied to all POP accounts.
|
|
let deferredURI = serverSettings.deferredToAccount &&
|
|
MailServices.accounts.getAccount(serverSettings.deferredToAccount)
|
|
.incomingServer.serverURI;
|
|
|
|
for (let account in fixIterator(MailServices.accounts.accounts,
|
|
Components.interfaces.nsIMsgAccount)) {
|
|
let accountValues = parent.getValueArrayFor(account);
|
|
let type = parent.getAccountValue(account, accountValues, "server", "type",
|
|
null, false);
|
|
// Try to keep this list of account types not having Junk settings
|
|
// synchronized with the list in AccountManager.js.
|
|
if (type != "nntp" && type != "rss" && type != "im") {
|
|
let spamActionTargetAccount = parent.getAccountValue(account, accountValues,
|
|
"server", "spamActionTargetAccount", "string", true);
|
|
let spamActionTargetFolder = parent.getAccountValue(account, accountValues,
|
|
"server", "spamActionTargetFolder", "string", true);
|
|
let moveOnSpam = parent.getAccountValue(account, accountValues,
|
|
"server", "moveOnSpam", "bool", true);
|
|
|
|
// Check if there are any invalid junk targets and fix them.
|
|
[ spamActionTargetAccount, spamActionTargetFolder, moveOnSpam ] =
|
|
sanitizeJunkTargets(spamActionTargetAccount,
|
|
spamActionTargetFolder,
|
|
deferredURI || account.incomingServer.serverURI,
|
|
parent.getAccountValue(account, accountValues, "server", "moveTargetMode", "int", true),
|
|
account.incomingServer.spamSettings,
|
|
moveOnSpam);
|
|
|
|
parent.setAccountValue(accountValues, "server", "moveOnSpam", moveOnSpam);
|
|
parent.setAccountValue(accountValues, "server", "spamActionTargetAccount",
|
|
spamActionTargetAccount);
|
|
parent.setAccountValue(accountValues, "server", "spamActionTargetFolder",
|
|
spamActionTargetFolder);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function secureSelect(aLoading)
|
|
{
|
|
var socketType = document.getElementById("server.socketType").value;
|
|
var serverType = document.getElementById("server.type").value;
|
|
var defaultPort = gServer.protocolInfo.getDefaultServerPort(false);
|
|
var defaultPortSecure = gServer.protocolInfo.getDefaultServerPort(true);
|
|
var port = document.getElementById("server.port");
|
|
var portDefault = document.getElementById("defaultPort");
|
|
var prevDefaultPort = portDefault.value;
|
|
|
|
const Ci = Components.interfaces;
|
|
if (socketType == Ci.nsMsgSocketType.SSL) {
|
|
portDefault.value = defaultPortSecure;
|
|
if (port.value == "" || (!aLoading && port.value == defaultPort && prevDefaultPort != portDefault.value))
|
|
port.value = defaultPortSecure;
|
|
} else {
|
|
portDefault.value = defaultPort;
|
|
if (port.value == "" || (!aLoading && port.value == defaultPortSecure && prevDefaultPort != portDefault.value))
|
|
port.value = defaultPort;
|
|
}
|
|
|
|
// switch "insecure password" label
|
|
setLabelFromStringBundle("authMethod-password-cleartext",
|
|
socketType == Ci.nsMsgSocketType.SSL ||
|
|
socketType == Ci.nsMsgSocketType.alwaysSTARTTLS ?
|
|
"authPasswordCleartextViaSSL" : "authPasswordCleartextInsecurely");
|
|
}
|
|
|
|
function setupMailOnServerUI()
|
|
{
|
|
onCheckItem("pop3.deleteMailLeftOnServer", ["pop3.leaveMessagesOnServer"]);
|
|
setupAgeMsgOnServerUI();
|
|
}
|
|
|
|
function setupAgeMsgOnServerUI()
|
|
{
|
|
const kLeaveMsgsId = "pop3.leaveMessagesOnServer";
|
|
const kDeleteByAgeId = "pop3.deleteByAgeFromServer";
|
|
onCheckItem(kDeleteByAgeId, [kLeaveMsgsId]);
|
|
onCheckItem("daysEnd", [kLeaveMsgsId]);
|
|
onCheckItem("pop3.numDaysToLeaveOnServer", [kLeaveMsgsId, kDeleteByAgeId]);
|
|
}
|
|
|
|
function setupFixedUI()
|
|
{
|
|
var controls = [document.getElementById("fixedServerName"),
|
|
document.getElementById("fixedUserName"),
|
|
document.getElementById("fixedServerPort")];
|
|
|
|
var len = controls.length;
|
|
for (var i=0; i<len; i++) {
|
|
var fixedElement = controls[i];
|
|
var otherElement = document.getElementById(fixedElement.getAttribute("use"));
|
|
|
|
fixedElement.setAttribute("collapsed", "true");
|
|
otherElement.removeAttribute("collapsed");
|
|
}
|
|
}
|
|
|
|
function BrowseForNewsrc()
|
|
{
|
|
const nsIFilePicker = Components.interfaces.nsIFilePicker;
|
|
const nsIFile = Components.interfaces.nsIFile;
|
|
|
|
var newsrcTextBox = document.getElementById("nntp.newsrcFilePath");
|
|
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
|
|
fp.init(window,
|
|
document.getElementById("browseForNewsrc").getAttribute("filepickertitle"),
|
|
nsIFilePicker.modeSave);
|
|
|
|
var currentNewsrcFile;
|
|
try {
|
|
currentNewsrcFile = Components.classes["@mozilla.org/file/local;1"]
|
|
.createInstance(nsIFile);
|
|
currentNewsrcFile.initWithPath(newsrcTextBox.value);
|
|
} catch (e) {
|
|
dump("Failed to create nsIFile instance for the current newsrc file.\n");
|
|
}
|
|
|
|
if (currentNewsrcFile) {
|
|
fp.displayDirectory = currentNewsrcFile.parent;
|
|
fp.defaultString = currentNewsrcFile.leafName;
|
|
}
|
|
|
|
fp.appendFilters(nsIFilePicker.filterAll);
|
|
|
|
if (fp.show() != nsIFilePicker.returnCancel)
|
|
newsrcTextBox.value = fp.file.path;
|
|
}
|
|
|
|
function setupImapDeleteUI(aServerId)
|
|
{
|
|
// read delete_model preference
|
|
var deleteModel = document.getElementById("imap.deleteModel").getAttribute("value");
|
|
selectImapDeleteModel(deleteModel);
|
|
|
|
// read trash_folder_name preference
|
|
var trashFolderName = getTrashFolderName();
|
|
|
|
// set folderPicker menulist
|
|
var trashPopup = document.getElementById("msgTrashFolderPopup");
|
|
trashPopup._teardown();
|
|
trashPopup._parentFolder = MailUtils.getFolderForURI(aServerId);
|
|
trashPopup._ensureInitialized();
|
|
|
|
// TODO: There is something wrong here, selectFolder() fails even if the
|
|
// folder does exist. Try to fix in bug 802609.
|
|
let trashFolder = MailUtils.getFolderForURI(aServerId + "/" + trashFolderName, false);
|
|
try {
|
|
trashPopup.selectFolder(trashFolder);
|
|
} catch(ex) {
|
|
trashPopup.parentNode.setAttribute("label", trashFolder.prettyName);
|
|
}
|
|
trashPopup.parentNode.folder = trashFolder;
|
|
}
|
|
|
|
function selectImapDeleteModel(choice)
|
|
{
|
|
// set deleteModel to selected mode
|
|
document.getElementById("imap.deleteModel").setAttribute("value", choice);
|
|
|
|
switch (choice)
|
|
{
|
|
case "0" : // markDeleted
|
|
// disable folderPicker
|
|
document.getElementById("msgTrashFolderPicker").setAttribute("disabled", "true");
|
|
break;
|
|
case "1" : // moveToTrashFolder
|
|
// enable folderPicker
|
|
document.getElementById("msgTrashFolderPicker").removeAttribute("disabled");
|
|
break;
|
|
case "2" : // deleteImmediately
|
|
// disable folderPicker
|
|
document.getElementById("msgTrashFolderPicker").setAttribute("disabled", "true");
|
|
break;
|
|
default :
|
|
dump("Error in enabling/disabling server.TrashFolderPicker\n");
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Capture any menulist changes from folderPicker
|
|
function folderPickerChange(aEvent)
|
|
{
|
|
var folder = aEvent.target._folder;
|
|
var folderPath = getFolderPathFromRoot(folder);
|
|
|
|
// Set the value to be persisted.
|
|
document.getElementById("imap.trashFolderName")
|
|
.setAttribute("value", folderPath);
|
|
|
|
// Update the widget to show/do correct things even for subfolders.
|
|
var trashFolderPicker = document.getElementById("msgTrashFolderPicker");
|
|
trashFolderPicker.menupopup.selectFolder(folder);
|
|
}
|
|
|
|
/** Generate the relative folder path from the root. */
|
|
function getFolderPathFromRoot(folder)
|
|
{
|
|
var path = folder.name;
|
|
var parentFolder = folder.parent;
|
|
while (parentFolder && parentFolder != folder.rootFolder) {
|
|
path = parentFolder.name + "/" + path;
|
|
parentFolder = parentFolder.parent;
|
|
}
|
|
// IMAP Inbox URI's start with INBOX, not Inbox.
|
|
return path.replace(/^Inbox/, "INBOX");
|
|
}
|
|
|
|
// Get trash_folder_name from prefs
|
|
function getTrashFolderName()
|
|
{
|
|
var trashFolderName = document.getElementById("imap.trashFolderName").getAttribute("value");
|
|
// if the preference hasn't been set, set it to a sane default
|
|
if (!trashFolderName) {
|
|
trashFolderName = "Trash";
|
|
document.getElementById("imap.trashFolderName").setAttribute("value",trashFolderName);
|
|
}
|
|
return trashFolderName;
|
|
}
|