341 строка
10 KiB
JavaScript
341 строка
10 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/. */
|
|
|
|
/* 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 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 aDir directory to look for .sfd files
|
|
* @param 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"
|
|
);
|
|
}
|