mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-24 17:37:30 +09:00
296 lines
9.9 KiB
JavaScript
296 lines
9.9 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/mailServices.js");
|
|
Components.utils.import("resource:///modules/iteratorUtils.jsm");
|
|
Components.utils.import("resource:///modules/MailUtils.js");
|
|
|
|
var gDeferredToAccount = "";
|
|
|
|
function onInit(aPageId, aServerId)
|
|
{
|
|
// manually adjust several pref UI elements
|
|
document.getElementById('server.spamLevel.visible').setAttribute("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.getFolderForURI(aServerId, false).server.spamSettings,
|
|
moveOnSpamValue);
|
|
|
|
spamActionTargetAccountElement.value = spamActionTargetAccount;
|
|
spamActionTargetFolderElement.value = spamActionTargetFolder;
|
|
moveOnSpamCheckbox.checked = moveOnSpamValue;
|
|
|
|
let server = MailUtils.getFolderForURI(spamActionTargetAccount, false);
|
|
document.getElementById("actionAccountPopup").selectFolder(server);
|
|
|
|
let folder = MailUtils.getFolderForURI(spamActionTargetFolder, true);
|
|
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
|
|
for (let i = wList.itemCount - 1; i >= 0; i--) {
|
|
wList.removeItemAt(i);
|
|
}
|
|
|
|
// Populate the listbox with address books
|
|
let abItems = [];
|
|
for (let ab in fixIterator(MailServices.ab.directories,
|
|
Components.interfaces.nsIAbDirectory)) {
|
|
// 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 item = wList.appendItem(abItem.label, abItem.URI);
|
|
item.setAttribute("type", "checkbox");
|
|
item.setAttribute("class", "listitem-iconic");
|
|
|
|
// Due to bug 448582, we have to use setAttribute to set the
|
|
// checked value of the listitem.
|
|
item.setAttribute("checked", currentArray.includes(abItem.URI));
|
|
}
|
|
|
|
// 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 (getAccountValue(account, accountValues, "server", "type", null, false) == "pop3")
|
|
gDeferredToAccount = 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++) {
|
|
wList.getItemAtIndex(i).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 (var 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.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,
|
|
Components.interfaces.nsISimpleEnumerator);
|
|
|
|
let menuEntries = [];
|
|
while (ispDirectories.hasMoreElements())
|
|
{
|
|
let ispDirectory = ispDirectories.getNext()
|
|
.QueryInterface(Components.interfaces.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";
|
|
let entries = aDir.directoryEntries
|
|
.QueryInterface(Components.interfaces.nsIDirectoryEnumerator);
|
|
|
|
while (entries.hasMoreElements()) {
|
|
let entry = entries.nextFile;
|
|
// 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.indexOf(fileName) == -1)
|
|
newEntries.push(fileName);
|
|
}
|
|
}
|
|
return newEntries;
|
|
}
|
|
|
|
/**
|
|
* Open the Preferences dialog on the Junk settings tab.
|
|
*/
|
|
function showGlobalJunkPrefs()
|
|
{
|
|
openPrefsFromAccountManager("paneSecurity", "junkTab", null, "junk_pane");
|
|
}
|