var PLUGIN_INFO =
{NAME}
Manage Cookies (list, remove, add/remove permission)
teramako
1.0
2.0pre
2.0
;
liberator.plugins.cookieManager = (function(){
const CM = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
const PM = Cc["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager);
const I_CPM = Ci.nsICookiePermission;
const PERM_TYPE = "cookie";
function getIterator(enum, interface){
while (enum.hasMoreElements()){
let obj = enum.getNext().QueryInterface(interface);
yield obj;
}
}
function cookieIterator() getIterator(CM.enumerator, Ci.nsICookie2);
function cookiePermissionIterator(){
for (let perm in getIterator(PM.enumerator, Ci.nsIPermission)){
if (perm.type = PERM_TYPE)
yield perm;
}
}
function capabilityToString(capability){
switch (capability){
case I_CPM.ACCESS_ALLOW: // 1
return "ALLOW";
case I_CPM.ACCESS_DENY: // 2
return "DENY";
case I_CPM.ACCESS_SESSION: // 8
return "ONLY_SESSION";
default:
return "DEFAULT";
}
}
function stringToCapability(str){
switch (str){
case "ALLOW":
return I_CPM.ACCESS_ALLOW;
case "DENY":
return I_CPM.ACCESS_DENY;
case "ONLY_SESSION":
return I_CPM.ACCESS_SESSION;
default:
return I_CPM.ACCESS_DEFAULT;
}
}
function getHost(){
var host;
try {
host = content.document.location.host;
} catch (e){}
return host;
}
// --------------------------------------------------------
// PageInfo
// --------------------------------------------------------
buffer.addPageInfoSection("c", "Cookies", function(verbose){
var hostname;
try {
hostname = content.window.location.host;
} catch (e){ return []; }
return [[c.rawHost + c.path, c.name + " = " + c.value] for (c in cManager.stored.getByHostAndPath(hostname))];
});
// --------------------------------------------------------
// Command
// -----------------------------------------------------{{{
commands.addUserCommand(["cookiem[anager]"], "Cookie Management",
function(args){
if (args["-perm"]){
switch (args[0]){
case "list":
let list = cManager.permission.list(args[1]);
liberator.echo(template.table("Cookie Permission", list));
break;
case "remove":
if (cManager.permission.remove(args[1])){
liberator.echo("Removed permission: `" + args[1] + "'");
} else {
liberator.echo("Failed to removed permission: `" + args[1] + "'");
}
break;
case "add":
cManager.permission.add(args[1], args[2]);
break;
default:
liberator.echoerr("Invalid sub-command.");
}
return;
}
var host = args[1] || getHost();
if (!host) return;
switch (args[0]){
case "list":
let xml = <>>;
let tree = cManager.stored.getTree(host);
for (let name in tree){
xml += template.table(name, [[c.name, c.value] for each(c in tree[name])]);
}
liberator.echo(xml, true);
break;
case "remove":
cManager.stored.remove(host);
break;
default:
liberator.echoerr("Invalid sub-command.");
}
}, {
options: [
[["-perm", "-p"], commands.OPTION_NOARG]
],
completer: function(context, args){
if (args["-perm"]){
plugins.cookieManager.permission.completer(context, args);
} else {
plugins.cookieManager.stored.completer(context, args);
}
},
}, true);
// Command End }}}
var cManager = {
stored: { // {{{
getByHostAndPath: function(hostAndPath){
for (let cookie in cookieIterator()){
if (!hostAndPath || (cookie.rawHost + cookie.path).indexOf(hostAndPath) == 0)
yield cookie;
}
},
remove: function(hostAndPath){
if (!hostAndPath) return false;
for (let cookie in this.getByHostAndPath(hostAndPath)){
CM.remove(cookie.host, cookie.name, cookie.path, false);
}
return true;
},
getTree: function(hostAndPath){
var tree = {};
function getTree(name){
if (name in tree) return tree[name];
tree[name] = [];
return tree[name];
}
for (let cookie in this.getByHostAndPath(hostAndPath)){
getTree(cookie.rawHost + cookie.path).push(cookie);
}
return tree;
},
subcommands: [
["list", "list cookie permission"],
["remove", "remove cookie premission"]
],
completer: function(context, args){
if (args.length == 1){
context.title = ["SubCommand", "Description"];
context.completions = context.filter ?
this.subcommands.filter(function(c) c[0].indexOf(context.filter) >= 0) :
this.subcommands;
} else if (args.length == 2){
let list = util.Array.uniq([c.rawHost + c.path for (c in this.getByHostAndPath())]).map(function(host) [host, "-"]);
context.title = ["Host and Path"];
context.completions = context.filter ?
list.filter(function(c) c[0].indexOf(context.filter) >= 0) :
list;
}
},
}, // }}}
permission: { // {{{
getByHost: function(hostname){
for (let permission in cookiePermissionIterator()){
if (permission.host == hostname)
return permission;
}
return null;
},
add: function(hostname, capability, force){
var uri = util.newURI("http://" + hostname);
var perm = this.getByHost(hostname);
switch (typeof capability){
case "string":
capability = stringToCapability(capability);
break;
case "number":
break;
default:
throw "Invalid capability";
}
if (perm && force){
this.remove(hostname);
}
PM.add(uri, PERM_TYPE, capability);
},
remove: function(hostname){
if (this.getByHost(hostname)){
PM.remove(hostname, PERM_TYPE);
return true;
}
return false;
},
list: function(filterReg){
if (filterReg && !(filterReg instanceof RegExp)){
filterReg = new RegExp(filterReg.toString());
} else if (!filterReg){
filterReg = new RegExp("");
}
return [[p.host, capabilityToString(p.capability)] for (p in cookiePermissionIterator())].filter(function($_) filterReg.test($_[0]));
},
subcommands: [
["list", "list cookie permission"],
["add", "add cookie permission"],
["remove", "remove cookie premission"]
],
capabilityList: [
["ALLOW", "-"],
["DENY", "-"],
["ONLY_SESSION", "-"]
],
completer: function(context, args){
if (args.length == 1){
context.title = ["SubCommand", "Description"];
context.completions = context.filter ?
this.subcommands.filter(function(c) c[0].indexOf(context.filter) >= 0) :
this.subcommands;
} else {
let suggestion = [];
switch (args[0]){
case "add":
if (args.length == 3){
context.title = ["Capability"];
context.completions = context.filter ?
this.capabilityList.filter(function($_) c[0].toLowerCase().indexOf(context.filter.toLowerCase()) == 0) :
this.capabilityList;
} else if (args.length == 2){
let host = getHost();
if (host){
let hosts = [];
host.split(".").reduceRight(function(p, c){
let domain = c + "." + p;
hosts.push([domain, "-"]);
return domain;
});
suggestion = hosts.reverse();
context.title = ["Current Host"];
context.completions = context.filter ?
suggestion.filter(function($_) $_[0].indexOf(context.filter) >= 0) : suggestion;
return;
}
}
case "list":
case "remove":
if (args.length > 2) return;
context.title = ["Host", "Capability"];
let list = this.list();
context.completions = context.filter ?
list.filter(function($_) $_[0].indexOf(context.filter) >= 0) : list;
}
}
},
}, // }}}
};
return cManager;
})();
// vim: sw=4 ts=4 et fdm=marker:
ref='#n226'>226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|