1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-02-08 17:15:45 +01:00

Add :sanitize, 'sanitizetimespan' and 'sanitizeitems'.

This commit is contained in:
Doug Kearns
2009-09-02 23:43:50 +10:00
parent 75f2481523
commit 11b54186d5
7 changed files with 384 additions and 23 deletions

298
common/content/sanitizer.js Normal file
View File

@@ -0,0 +1,298 @@
/***** BEGIN LICENSE BLOCK ***** {{{
Version: MPL 1.1/GPL 2.0/LGPL 2.1
The contents of this file are subject to the Mozilla Public License Version
1.1 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the
License.
Copyright (c) 2006-2009 by Martin Stubenschrott <stubenschrott@vimperator.org>
Alternatively, the contents of this file may be used under the terms of
either the GNU General Public License Version 2 or later (the "GPL"), or
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
in which case the provisions of the GPL or the LGPL are applicable instead
of those above. If you wish to allow use of your version of this file only
under the terms of either the GPL or the LGPL, and not to allow others to
use your version of this file under the terms of the MPL, indicate your
decision by deleting the provisions above and replace them with the notice
and other provisions required by the GPL or the LGPL. If you do not delete
the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.
}}} ***** END LICENSE BLOCK *****/
// TODO:
// - should all storage items with the privateData flag be sanitizeable? i.e.
// local-marks, url-marks, quick-marks, macros. Bookmarks et al aren't
// sanitizeable in FF.
// - timestamp the command-line history?
// - add warning for TIMESPAN_EVERYTHING?
// - respect privacy.clearOnShutdown et al or recommend VimperatorLeave autocommand?
// - add support for :set sanitizeitems=all like 'eventignore'?
// - integrate with the Clear Private Data dialog?
// FIXME:
// - finish FF 3.0 support if we're going to support that in Vimperator 2.2
function Sanitizer() //{{{
{
////////////////////////////////////////////////////////////////////////////////
////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
const local = {}; // XXX: is there some reason liberator.loadModule doesn't create modules with new?
services.get("subscriptLoader").loadSubScript("chrome://browser/content/sanitize.js", local);
const Sanitizer = local.Sanitizer;
var prefToArgMap = {
cache: "cache",
cookies: "cookies",
offlineApps: "offlineapps",
history: "history",
formdata: "formdata",
downloads: "downloads",
passwords: "passwords",
sessions: "sessions",
siteSettings: "sitesettings",
commandLine: "commandline"
};
function prefToArg(pref) prefToArgMap[pref.replace(/.*\./, "")]
function argToPref(arg) [p for ([p, a] in Iterator(prefToArgMap)) if (a == arg)][0]
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// OPTIONS /////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
options.add(["sanitizeitems", "si"],
"The default list of private items to sanitize",
"stringlist", "history,formdata,cookies,cache,sessions,commandline",
{
setter: function (values)
{
for (let [, pref] in Iterator(sanitizer.prefNames))
{
options.setPref(pref, false);
for (let [, value] in Iterator(values.split(",")))
{
if (prefToArg(pref) == value)
{
options.setPref(pref, true);
break;
}
}
}
return values;
},
getter: function () sanitizer.prefNames.filter(function (pref) options.getPref(pref)).map(prefToArg).join(","),
completer: function (value) [
["cache", "Cache"],
["cookies", "Cookies"],
["offlineapps", "Offline website data"],
["history", "Browsing history"],
["formdata", "Saved form and search history"],
["downloads", "Download history"],
["passwords", "Saved passwords"],
["sessions", "Authenticated sessions"],
["sitesettings", "Site preferences"],
["commandline", "Command-line history"]
],
validator: Option.validateCompleter
});
options.add(["sanitizetimespan", "sts"],
"The default sanitizer time span",
"number", 1,
{
setter: function (value)
{
options.setPref("privacy.sanitize.timeSpan", value);
return value;
},
getter: function () options.getPref("privacy.sanitize.timeSpan"),
completer: function (value) [
["0", "Everything"],
["1", "Last hour"],
["2", "Last two hours"],
["3", "Last four hours"],
["4", "Today"]
],
validator: Option.validateCompleter
});
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// COMMANDS ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
commands.add(["sa[nitize]"],
"Clear private data",
function (args)
{
if (options['private'])
return void liberator.echomsg("Cannot sanitize items in private mode");
let timespan = args["-timespan"] || options["sanitizetimespan"];
sanitizer.range = Sanitizer.getClearRange(timespan);
sanitizer.ignoreTimespan = !sanitizer.range;
if (args.bang)
{
if (args.length > 0)
return void liberator.echoerr("E488: Trailing characters");
liberator.log("Sanitizing all items in 'sanitizeitems'...");
let errors = sanitizer.sanitize();
if (errors)
{
for (let item in errors)
liberator.echoerr("Error sanitizing " + item + ": " + errors[item]);
}
}
else
{
if (args.length == 0)
return void liberator.echoerr("E471: Argument required");
for (let [, item] in Iterator(args.map(argToPref)))
{
liberator.log("Sanitizing " + item + " items...");
if (sanitizer.canClearItem(item))
{
try
{
sanitizer.clearItem(item);
}
catch (e)
{
liberator.echoerr("Error sanitizing " + item + ": " + e);
}
}
else
liberator.echomsg("Cannot sanitize " + item);
}
}
},
{
argCount: "*", // FIXME: should be + and 0
bang: true,
completer: function (context) {
context.title = ["Privacy Item", "Description"];
context.completions = options.get("sanitizeitems").completer();
},
options: [
[["-timespan"],
commands.OPTION_INT,
function (arg) /^[0-4]$/.test(arg),
function () options.get("sanitizetimespan").completer()]
]
});
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// PUBLIC SECTION //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var self = new Sanitizer();
// TODO: remove this version test
if (/^1.9.1/.test(services.get("xulAppInfo").platformVersion))
self.prefDomain = "privacy.cpd.";
else
self.prefDomain = "privacy.item.";
self.prefDomain2 = "extensions.liberator.privacy.cpd.";
self.items.commandLine = {
canClear: true,
clear: function ()
{
storage["history-command"].truncate(0);
storage["history-search"].truncate(0);
}
};
// FIXME
// create liberator-specific sanitize prefs
if (options.getPref(self.prefDomain2 + "commandLine") == null)
options.setPref(self.prefDomain2 + "commandLine", false)
// Largely ripped from from browser/base/content/sanitize.js so we can override
// the pref strategy without stepping on the global prefs namespace.
self.sanitize = function () {
const prefService = services.get("pref");
let branch = prefService.getBranch(this.prefDomain);
let branch2 = prefService.getBranch(this.prefDomain2);
let errors = null;
function prefSet(name)
{
try
{
return branch.getBoolPref(name);
}
catch (e)
{
return branch2.getBoolPref(name);
}
}
// Cache the range of times to clear
if (this.ignoreTimespan)
var range = null; // If we ignore timespan, clear everything
else
range = this.range || Sanitizer.getClearRange();
for (let itemName in this.items)
{
let item = this.items[itemName];
item.range = range;
if ("clear" in item && item.canClear && prefSet(itemName))
{
liberator.log("Sanitizing " + itemName + " items...");
// Some of these clear() may raise exceptions (see bug #265028)
// to sanitize as much as possible, we catch and store them,
// rather than fail fast.
// Callers should check returned errors and give user feedback
// about items that could not be sanitized
try
{
item.clear();
}
catch (e)
{
if (!errors)
errors = {};
errors[itemName] = e;
dump("Error sanitizing " + itemName + ": " + e + "\n");
}
}
}
return errors;
};
self.__defineGetter__("prefNames", function () {
let ret = [];
[self.prefDomain, self.prefDomain2].forEach(function (branch) {
ret = ret.concat(services.get("pref").getBranch(branch).getChildList("", {}).map(function (pref) branch + pref));
});
return ret;
});
//}}}
return self;
} //}}}
// vim: set fdm=marker sw=4 ts=4 et:

View File

@@ -89,27 +89,28 @@ function Services()
create: function (name) classes[name]()
};
self.add("appStartup", "@mozilla.org/toolkit/app-startup;1", Ci.nsIAppStartup);
self.add("autoCompleteSearch", "@mozilla.org/autocomplete/search;1?name=history", Ci.nsIAutoCompleteSearch);
self.add("browserSearch", "@mozilla.org/browser/search-service;1", Ci.nsIBrowserSearchService);
self.add("cache", "@mozilla.org/network/cache-service;1", Ci.nsICacheService);
self.add("console", "@mozilla.org/consoleservice;1", Ci.nsIConsoleService);
self.add("directory", "@mozilla.org/file/directory_service;1", Ci.nsIProperties);
self.add("environment", "@mozilla.org/process/environment;1", Ci.nsIEnvironment);
self.add("extensionManager", "@mozilla.org/extensions/manager;1", Ci.nsIExtensionManager);
self.add("favicon", "@mozilla.org/browser/favicon-service;1", Ci.nsIFaviconService);
self.add("json", "@mozilla.org/dom/json;1", Ci.nsIJSON, "createInstance");
self.add("observer", "@mozilla.org/observer-service;1", Ci.nsIObserverService);
self.add("io", "@mozilla.org/network/io-service;1", Ci.nsIIOService);
self.add("pref", "@mozilla.org/preferences-service;1", [Ci.nsIPrefService, Ci.nsIPrefBranch, Ci.nsIPrefBranch2]);
self.add("profile", "@mozilla.org/toolkit/profile-service;1", Ci.nsIToolkitProfileService);
self.add("rdf", "@mozilla.org/rdf/rdf-service;1", Ci.nsIRDFService);
self.add("sessionStore", "@mozilla.org/browser/sessionstore;1", Ci.nsISessionStore);
self.add("subscriptLoader", "@mozilla.org/moz/jssubscript-loader;1", Ci.mozIJSSubScriptLoader);
self.add("threadManager", "@mozilla.org/thread-manager;1", Ci.nsIThreadManager);
self.add("windowMediator", "@mozilla.org/appshell/window-mediator;1", Ci.nsIWindowMediator);
self.add("windowWatcher", "@mozilla.org/embedcomp/window-watcher;1", Ci.nsIWindowWatcher);
self.add("bookmarks", "@mozilla.org/browser/nav-bookmarks-service;1", Ci.nsINavBookmarksService);
self.add("appStartup", "@mozilla.org/toolkit/app-startup;1", Ci.nsIAppStartup);
self.add("autoCompleteSearch", "@mozilla.org/autocomplete/search;1?name=history", Ci.nsIAutoCompleteSearch);
self.add("bookmarks", "@mozilla.org/browser/nav-bookmarks-service;1", Ci.nsINavBookmarksService);
self.add("browserSearch", "@mozilla.org/browser/search-service;1", Ci.nsIBrowserSearchService);
self.add("cache", "@mozilla.org/network/cache-service;1", Ci.nsICacheService);
self.add("console", "@mozilla.org/consoleservice;1", Ci.nsIConsoleService);
self.add("directory", "@mozilla.org/file/directory_service;1", Ci.nsIProperties);
self.add("environment", "@mozilla.org/process/environment;1", Ci.nsIEnvironment);
self.add("extensionManager", "@mozilla.org/extensions/manager;1", Ci.nsIExtensionManager);
self.add("favicon", "@mozilla.org/browser/favicon-service;1", Ci.nsIFaviconService);
self.add("json", "@mozilla.org/dom/json;1", Ci.nsIJSON, "createInstance");
self.add("observer", "@mozilla.org/observer-service;1", Ci.nsIObserverService);
self.add("io", "@mozilla.org/network/io-service;1", Ci.nsIIOService);
self.add("pref", "@mozilla.org/preferences-service;1", [Ci.nsIPrefService, Ci.nsIPrefBranch, Ci.nsIPrefBranch2]);
self.add("profile", "@mozilla.org/toolkit/profile-service;1", Ci.nsIToolkitProfileService);
self.add("rdf", "@mozilla.org/rdf/rdf-service;1", Ci.nsIRDFService);
self.add("sessionStore", "@mozilla.org/browser/sessionstore;1", Ci.nsISessionStore);
self.add("subscriptLoader", "@mozilla.org/moz/jssubscript-loader;1", Ci.mozIJSSubScriptLoader);
self.add("threadManager", "@mozilla.org/thread-manager;1", Ci.nsIThreadManager);
self.add("windowMediator", "@mozilla.org/appshell/window-mediator;1", Ci.nsIWindowMediator);
self.add("windowWatcher", "@mozilla.org/embedcomp/window-watcher;1", Ci.nsIWindowWatcher);
self.add("xulAppInfo", "@mozilla.org/xre/app-info;1", Ci.nsIXULAppInfo);
self.addClass("file", "@mozilla.org/file/local;1", Ci.nsILocalFile);
self.addClass("find", "@mozilla.org/embedcomp/rangefind;1", Ci.nsIFind);

View File

@@ -19,6 +19,7 @@
(this might change again, as this is REALLY inconsistent, and i don't
know if I like copying bugs)
* add [c]:sanitize[c], 'sanitizetimespan' and 'sanitizeitems'
* add [c]:verbose[c]
* add [c]:window[c] to run a command in a new window
* add ! version of :delbmarks to delete all bookmarks.

View File

@@ -32,7 +32,7 @@ const config = { //{{{
hostApplication: "Firefox",
/*** optional options, there are checked for existence and a fallback provided ***/
features: ["bookmarks", "hints", "history", "marks", "quickmarks", "session", "tabs", "tabs_undo", "windows"],
features: ["bookmarks", "hints", "history", "marks", "quickmarks", "sanitizer", "session", "tabs", "tabs_undo", "windows"],
defaults: {
complete: "stlf",
guioptions: "rb",
@@ -141,6 +141,7 @@ const config = { //{{{
scripts: [
"browser.js",
"bookmarks.js",
"sanitizer.js",
"tabs.js"
],
@@ -179,6 +180,7 @@ const config = { //{{{
liberator.loadModule("marks", Marks);
liberator.loadModule("quickmarks", QuickMarks);
liberator.loadModule("hints", Hints);
liberator.loadModule("sanitizer", Sanitizer);
////////////////////////////////////////////////////////////////////////////////
////////////////////// STYLES //////////////////////////////////////////////////

View File

@@ -319,6 +319,8 @@ section::Options[option-index]
||'previouspattern'|| Patterns to use when guessing the \'previous' page in a document sequence +
||'private'|| Set the 'private browsing' option +
||'runtimepath'|| List of directories searched for runtime files +
||'sanitizeitems'|| The default list of private items to sanitize +
||'sanitizetimespan'|| The default sanitizer time span +
||'scroll'|| Number of lines to scroll with [m]<C-u>[m] and [m]<C-d>[m] commands +
||'shell'|| Shell to use for executing [c]:![c] and [c]:run[c] commands +
||'shellcmdflag'|| Flag passed to shell when executing [c]:![c] and [c]:run[c] commands +

View File

@@ -664,6 +664,48 @@ exist, Vimperator will set it to match this value.
____
|\'si'| |\'sanitizeitems'|
||'sanitizeitems' 'si'|| stringlist
____
(default: "history,formdata,cookies,cache,sessions,commandline")
The default list of private items to sanitize.
[frame="topbot",grid="none",cols="1,4"]
|===============================================================================
|*cache* |Cache
|*commandline* |Command-line history
|*cookies* |Cookies
|*downloads* |Download history
|*formdata* |Saved form and search history
|*history* |Browsing history
|*offlineapps* |Offline website data
|*passwords* |Saved passwords
|*sessions* |Authenticated sessions
|*sitesettings* |Site preferences
|===============================================================================
____
|\'sts'| |\'sanitizetimespan'|
||'sanitizetimespan' 'sts'|| number (default: 1)
____
The default sanitizer time span. Only items created within this timespan are
deleted.
Note: This only applies to *cookies*, *history*, *formdata*, and *downloads*.
[frame="topbot",grid="none",cols="1,10"]
|===============================================================================
|*0*|Everything
|*1*|Last hour
|*2*|Last two hours
|*3*|Last four hours
|*4*|Today
|===============================================================================
____
|\'scr'| |\'scroll'|
||'scroll' 'scr'|| number (default: 0)
____

View File

@@ -47,6 +47,21 @@ Repeat last [c]:!{cmd}[c].
________________________________________________________________________________
|:sa| |:sanitize| +
||:sa[nitize] [-timespan={timespan}] {item} ...|| +
||:sa[nitize]! [-timespan={timespan}]|| +
________________________________________________________________________________
Clear private data items. Where {item} ... is a list of private items to
delete. These may be any of the items valid for 'sanitizeitems'.
If [!] is specified then 'sanitizeitems' is used for the list of items to
delete.
If {timespan} is specified then only items within that timespan are deleted,
otherwise the value of 'sanitizetimespan' is used.
________________________________________________________________________________
|:sil| |:silent| +
||:sil[ent] {command}||
________________________________________________________________________________
@@ -56,7 +71,7 @@ history.
________________________________________________________________________________
|:verb| |:verbose +
|:verb| |:verbose| +
||:[count]verb[ose] {command}||
________________________________________________________________________________
Execute a command with 'verbose' set to [count]. If [count] is not specified