/* 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/. */ /* import-globals-from am-prefs.js */ /* import-globals-from amUtils.js */ var { MailServices } = ChromeUtils.import( "resource:///modules/MailServices.jsm" ); var { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.jsm"); var gDeferredToAccount = ""; function onInit(aPageId, aServerId) { // manually adjust several pref UI elements document.getElementById("server.spamLevel.visible").checked = document.getElementById("server.spamLevel").value > 0; let deferredToURI = null; if (gDeferredToAccount) { deferredToURI = MailServices.accounts.getAccount(gDeferredToAccount).incomingServer .serverURI; } let spamActionTargetAccountElement = document.getElementById( "server.spamActionTargetAccount" ); let spamActionTargetFolderElement = document.getElementById( "server.spamActionTargetFolder" ); let spamActionTargetAccount = spamActionTargetAccountElement.value; let spamActionTargetFolder = spamActionTargetFolderElement.value; let moveOnSpamCheckbox = document.getElementById("server.moveOnSpam"); let moveOnSpamValue = moveOnSpamCheckbox.checked; // Check if there are any invalid junk targets and fix them. [spamActionTargetAccount, spamActionTargetFolder, moveOnSpamValue] = sanitizeJunkTargets( spamActionTargetAccount, spamActionTargetFolder, deferredToURI || aServerId, document.getElementById("server.moveTargetMode").value, MailUtils.getOrCreateFolder(aServerId).server.spamSettings, moveOnSpamValue ); spamActionTargetAccountElement.value = spamActionTargetAccount; spamActionTargetFolderElement.value = spamActionTargetFolder; moveOnSpamCheckbox.checked = moveOnSpamValue; let server = MailUtils.getOrCreateFolder(spamActionTargetAccount); document.getElementById("actionAccountPopup").selectFolder(server); let folder = MailUtils.getExistingFolder(spamActionTargetFolder); document.getElementById("actionFolderPopup").selectFolder(folder); var currentArray = []; if (document.getElementById("server.useWhiteList").checked) { currentArray = document .getElementById("server.whiteListAbURI") .value.split(" "); } // set up the whitelist UI var wList = document.getElementById("whiteListAbURI"); // Ensure the whitelist is empty while (wList.hasChildNodes()) { wList.lastChild.remove(); } // Populate the listbox with address books let abItems = []; for (let ab of MailServices.ab.directories) { // We skip mailing lists and remote address books. if (ab.isMailList || ab.isRemote) { continue; } abItems.push({ label: ab.dirName, URI: ab.URI }); } // Sort the list function sortFunc(a, b) { return a.label.localeCompare(b.label); } abItems.sort(sortFunc); // And then append each item to the listbox for (let abItem of abItems) { let checkbox = document.createXULElement("checkbox"); checkbox.setAttribute("label", abItem.label); checkbox.checked = currentArray.includes(abItem.URI); let item = document.createXULElement("richlistitem"); item.appendChild(checkbox); item.setAttribute("value", abItem.URI); wList.appendChild(item); } wList.addEventListener("keypress", event => { if ([" ", "Enter"].includes(event.key)) { let checkbox = wList.currentItem.firstElementChild; checkbox.checked = !checkbox.checked; wList.dispatchEvent(new CustomEvent("command")); } }); // enable or disable the whitelist onAdaptiveJunkToggle(); // set up trusted IP headers var serverFilterList = document.getElementById("useServerFilterList"); serverFilterList.value = document.getElementById( "server.serverFilterName" ).value; if (!serverFilterList.selectedItem) { serverFilterList.selectedIndex = 0; } // enable or disable the useServerFilter checkbox onCheckItem("useServerFilterList", ["server.useServerFilter"]); updateJunkTargetsAndRetention(); } function onPreInit(account, accountValues) { if ( top.getAccountValue( account, accountValues, "server", "type", null, false ) == "pop3" ) { gDeferredToAccount = top.getAccountValue( account, accountValues, "pop3", "deferredToAccount", null, false ); } buildServerFilterMenuList(); } /** * Called when someone checks or unchecks the adaptive junk mail checkbox. * set the value of the hidden element accordingly * * @param {boolean} aValue - The boolean value of the checkbox. */ function updateSpamLevel(aValue) { document.getElementById("server.spamLevel").value = aValue ? 100 : 0; onAdaptiveJunkToggle(); } /** * Propagate changes to the server filter menu list back to * our hidden wsm element. */ function onServerFilterListChange() { document.getElementById("server.serverFilterName").value = document.getElementById("useServerFilterList").value; } /** * Called when someone checks or unchecks the adaptive junk mail checkbox. * We need to enable or disable the whitelist accordingly. */ function onAdaptiveJunkToggle() { onCheckItem("whiteListAbURI", ["server.spamLevel.visible"]); onCheckItem("whiteListLabel", ["server.spamLevel.visible"]); // Enable/disable individual listbox rows. // Setting enable/disable on the parent listbox does not seem to work. let wList = document.getElementById("whiteListAbURI"); let wListDisabled = wList.disabled; for (let i = 0; i < wList.getRowCount(); i++) { let item = wList.getItemAtIndex(i); item.setAttribute("disabled", wListDisabled); item.firstElementChild.setAttribute("disabled", wListDisabled); } } /** * Called when someone checks or unchecks the "move new junk messages to" * Enable/disable the radio group accordingly. */ function updateJunkTargetsAndRetention() { onCheckItem("server.moveTargetMode", ["server.moveOnSpam"]); updateJunkTargets(); onCheckItem("server.purgeSpam", ["server.moveOnSpam"]); document.getElementById("purgeLabel").disabled = document.getElementById("server.purgeSpam").disabled; updateJunkRetention(); } /** * Enable/disable the folder pickers depending on which radio item is selected. */ function updateJunkTargets() { onCheckItem("actionTargetAccount", ["server.moveOnSpam", "moveTargetMode0"]); onCheckItem("actionTargetFolder", ["server.moveOnSpam", "moveTargetMode1"]); } /** * Enable/disable the junk deletion interval depending on the state * of the controlling checkbox. */ function updateJunkRetention() { onCheckItem("server.purgeSpamInterval", [ "server.purgeSpam", "server.moveOnSpam", ]); } function onSave() { onSaveWhiteList(); } /** * Propagate changes to the whitelist menu list back to * our hidden wsm element. */ function onSaveWhiteList() { var wList = document.getElementById("whiteListAbURI"); var wlArray = []; for (let i = 0; i < wList.getRowCount(); i++) { // Due to bug 448582, do not trust any properties of the listitems // as they may not return the right value or may even not exist. // Always get the attributes only. var wlNode = wList.getItemAtIndex(i); if (wlNode.firstElementChild.getAttribute("checked") == "true") { let abURI = wlNode.getAttribute("value"); wlArray.push(abURI); } } var wlValue = wlArray.join(" "); document .getElementById("server.whiteListAbURI") .setAttribute("value", wlValue); document.getElementById("server.useWhiteList").checked = wlValue != ""; } /** * Called when a new value is chosen in one of the junk target folder pickers. * Sets the menu label according to the folder name. */ function onActionTargetChange(aEvent, aWSMElementId) { let folder = aEvent.target._folder; document.getElementById(aWSMElementId).value = folder.URI; document.getElementById("actionFolderPopup").selectFolder(folder); } /** * Enumerates over the "ISPDL" directories, calling buildServerFilterListFromDir * for each one. */ function buildServerFilterMenuList() { const KEY_ISP_DIRECTORY_LIST = "ISPDL"; let ispHeaderList = document.getElementById("useServerFilterList"); // Ensure the menulist is empty. ispHeaderList.removeAllItems(); // Now walk through the isp directories looking for sfd files. let ispDirectories = Services.dirsvc.get( KEY_ISP_DIRECTORY_LIST, Ci.nsISimpleEnumerator ); let menuEntries = []; while (ispDirectories.hasMoreElements()) { let ispDirectory = ispDirectories.getNext().QueryInterface(Ci.nsIFile); if (ispDirectory) { menuEntries.push.apply( menuEntries, buildServerFilterListFromDir(ispDirectory, menuEntries) ); } } menuEntries.sort((a, b) => a.localeCompare(b)); for (let entry of menuEntries) { ispHeaderList.appendItem(entry, entry); } } /** * Helper function called by buildServerFilterMenuList. Enumerates over the * passed in directory looking for .sfd files. For each entry found, it gets * appended to the menu list. * * @param {nsIFile} aDir - Directory to look for .sfd files * @param {string[]} aExistingEntries - Filter names already found. */ function buildServerFilterListFromDir(aDir, aExistingEntries) { let newEntries = []; // Now iterate over each file in the directory looking for .sfd files. const kSuffix = ".sfd"; for (let entry of aDir.directoryEntries) { // we only care about files that end in .sfd if (entry.isFile() && entry.leafName.endsWith(kSuffix)) { let fileName = entry.leafName.slice(0, -kSuffix.length); // If we've already added an item with this name, then don't add it again. if (!aExistingEntries.includes(fileName)) { newEntries.push(fileName); } } } return newEntries; } /** * Open the Preferences dialog on the Junk settings tab. */ function showGlobalJunkPrefs() { openPrefsFromAccountManager( "panePrivacy", "privacyJunkCategory", null, "junk_pane" ); }