var PLUGIN_INFO =
{NAME}
Manage Cookies (list, remove, add/remove permission)
teramako
1.1
MPL 1.1/GPL 2.0/LGPL 2.1
2.0pre
2.0
http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/cookieManager.js
;
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($_) $_[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:
#n233'>233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
|