From 16a3b24a91a4a5151b8998ecd8698adb69c7ea9a Mon Sep 17 00:00:00 2001 From: hogelog Date: Wed, 4 Feb 2009 20:57:25 +0000 Subject: add loginManger.js * enable login/logout on vimperator commandline * require Tombloo Addon git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@29554 d0d07461-0603-4401-acd4-de1884942a52 --- loginManager.js | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 loginManager.js diff --git a/loginManager.js b/loginManager.js new file mode 100644 index 0000000..2713b34 --- /dev/null +++ b/loginManager.js @@ -0,0 +1,198 @@ +// PLUGIN_INFO//{{{ +var PLUGIN_INFO = + + {NAME} + login manager + hogelog + 0.0.1 + 2.0pre + 2.0pre + http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/loginManger.js + public domain + +; +//}}} + +(function(){ + +var loginManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager); +var Tombloo = Cc["@brasil.to/tombloo-service;1"].getService().wrappedJSObject; + +var services = { + pixiv: { + HOST: "http://www.pixiv.net", + LOGIN: "/index.php", + LOGOUT: "/logout.php", + usernameField: "pixiv_id", + passwordField: "pass", + extraField: { + mode: function() "login", + skip: function() "1", + }, + }, + mixi: { + HOST: "https://mixi.jp", + LOGIN: "/login.pl", + LOGOUT: "/logout.pl", + usernameField: "email", + passwordField: "password", + extraField: { + next_url: function() "/home.pl", + }, + }, + hatena: { + HOST: "https://www.hatena.ne.jp", + LOGIN: "/login", + LOGOUT: "/logout", + usernameField: "name", + passwordField: "password", + }, + hatelabo: { + HOST: "https://www.hatelabo.jp", + LOGIN: "/login", + LOGOUT: "/logout", + usernameField: "name", + passwordField: "password", + }, + tumblr: { + HOST: "http://www.tumblr.com", + LOGIN: "/login", + LOGOUT: "/logout", + usernameField: "email", + passwordField: "password", + }, + twitter: { + HOST: "https://twitter.com", + LOGIN: "/sessions", + LOGOUT: "/sessions/destroy", + usernameField: "session[username_or_email]", + passwordField: "session[password]", + extraField: { + authenticity_token: tokenGetter(/authenticity_token.+value="(.+?)"/), + }, + }, + "wassr.com": { + HOST: "https://wassr.com", + LOGIN: "/account/login", + LOGOUT: "/account/logout", + usernameField: "login_id", + passwordField: "login_pw", + extraField: { + CSRFPROTECT: tokenGetter(/CSRFPROTECT.+value="(.+?)"/), + }, + }, + "wassr.jp": { + HOST: "https://wassr.jp", + LOGIN: "/account/login", + LOGOUT: "/account/logout", + usernameField: "login_id", + passwordField: "login_pw", + extraField: { + CSRFPROTECT: tokenGetter(/CSRFPROTECT.+value="(.+?)"/), + }, + }, +}; +for (name in services){ + services[name] = new Service(services[name]); +} + +commands.addUserCommand(["login"], "Login", + function(args){ + let [servicename, username] = args; + let service = services[servicename]; + if (!service) return false; + service.login(username); + }, { + completer: function(context, args){ + if (args.completeArg == 0){ + context.title = ["service"]; + context.completions = [[s,""] for(s in services)]; + } else if (args.completeArg == 1){ + let service = services[args[0]]; + if (!service) return false; + context.title = ["username"]; + context.completions = [[u,""] for each(u in service.usernames())]; + } + }, + literal: 1, + }); +commands.addUserCommand(["logout"], "Logout", + function(args){ + let [servicename, username] = args; + let service = services[servicename]; + if (!service) return false; + service.logout(username); + }, { + completer: function(context, args){ + context.title = ["service"]; + context.completions = [[s,""] for(s in services)]; + }, + }); + +function Service(service) +{ + let self = this; + self.login = function(username){ + let logins = loginManager.findLogins({}, service.HOST, service.HOST, null) + .filter(function(x) x.username==username); + if(logins.length==0) return; + let password = logins[0].password; + let page = service.HOST+service.LOGIN; + let content = {}; + content[service.usernameField] = username; + content[service.passwordField] = password; + if (service.extraField){ + for (field in service.extraField){ + content[field] = service.extraField[field](service); + if (!content[field]){ + liberator.echoerr("failed get "+field); + } + } + } + return Tombloo + .request(page, {sendContent: content}) + .addCallback(function() + liberator.echo('login "'+service.HOST+'" as '+username)); + }; + self.logout = function(){ + let content = {}; + if (service.extraField){ + for (field in service.extraField){ + content[field] = service.extraField[field](service); + } + } + return Tombloo + .request(service.HOST+service.LOGOUT, {sendContent: content}) + .addCallback(function() + liberator.echo('logout "'+service.HOST+'"')); + }; + self.usernames = function(){ + let logins = loginManager.findLogins({}, service.HOST, service.HOST, null); + return [x.username for each(x in logins) if(x.username)]; + }; + for (prop in service){ + if (self[prop]) self["_"+prop] = self[prop]; + self[prop] = service[prop]; + } +} +function tokenGetter(pattern) +{ + return function(service){ + let res = util.httpGet(service.HOST); + if (pattern.test(res.responseText)){ + return RegExp.$1; + } + }; +} + +})(); +// vim: fdm=marker sw=4 ts=4 et: -- cgit v1.2.3