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