aboutsummaryrefslogtreecommitdiffstats
path: root/cookieManager.js
diff options
context:
space:
mode:
Diffstat (limited to 'cookieManager.js')
-rw-r--r--cookieManager.js304
1 files changed, 304 insertions, 0 deletions
diff --git a/cookieManager.js b/cookieManager.js
new file mode 100644
index 0000000..fd9b898
--- /dev/null
+++ b/cookieManager.js
@@ -0,0 +1,304 @@
+var PLUGIN_INFO =
+<VimperatorPlugin>
+<name>{NAME}</name>
+<description>Manage Cookies (list, remove, add/remove permission)</description>
+<author mail="teramako@gmail.com">teramako</author>
+<version>1.0</version>
+<minVersion>2.0pre</minVersion>
+<maxVersion>2.0</maxVersion>
+<detail lang="ja"><![CDATA[
+Cookie の管理をするプラグイン
+
+== Command ==
+-permオプションの有無で2種類に分かれる
+
+=== Cookieのパーミッション ===
+
+:cookiem[anager] list {hostname and path}:
+ {hostname and path}のCookieを表示
+
+:cookiem[anager] remove {hostname and path}:
+ {hostname and path}のCookieを削除
+
+=== 現在保存されているCookie ===
+
+:cookiem[anager] -p[erm] list {hostname}:
+ {hostname}のCookieのパーミッションを表示
+
+:cookiem[anager] -p[erm] add {hostname} {capability}:
+ {hostname}のCookieのパーミッションを設定
+
+:cookiem[anager] -p[erm] list {hostname}:
+ {hostname}のCookieのパーミッションを削除
+
+== pageinfo ==
+:pageinfo c で現在開いているホストのCookieを表示
+
+== どうでも良いこと ==
+補完機能を存分にお楽しみください :)
+
+]]></detail>
+</VimperatorPlugin>;
+
+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;
+ }
+ let 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){
+ let 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){
+ let uri = util.newURI("http://" + hostname);
+ let 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 {
+ var 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){
+ var host = getHost();
+ if (host){
+ var 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"];
+ var 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: