diff options
author | hogelog | 2009-05-16 18:07:24 +0000 |
---|---|---|
committer | hogelog | 2009-05-16 18:07:24 +0000 |
commit | c0fd1eca6de949aa64d8845586ce19e3f4b7d076 (patch) | |
tree | beefdc23f91e8223b7e010708b370ada153140f0 | |
parent | 14aff66312333513f75a30f50ed0eb66a40726ed (diff) | |
download | vimperator-plugins-c0fd1eca6de949aa64d8845586ce19e3f4b7d076.tar.bz2 |
* add drawr
* enable get name&password from multiple host information
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@33362 d0d07461-0603-4401-acd4-de1884942a52
-rw-r--r-- | loginManager.js | 227 |
1 files changed, 148 insertions, 79 deletions
diff --git a/loginManager.js b/loginManager.js index 2713b34..c027925 100644 --- a/loginManager.js +++ b/loginManager.js @@ -4,7 +4,7 @@ var PLUGIN_INFO = <name>{NAME}</name> <description>login manager</description> <author mail="konbu.komuro@gmail.com" homepage="http://d.hatena.ne.jp/hogelog/">hogelog</author> - <version>0.0.1</version> + <version>0.0.2</version> <minVersion>2.0pre</minVersion> <maxVersion>2.0pre</maxVersion> <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/loginManger.js</updateURL> @@ -16,7 +16,6 @@ http://wiki.github.com/to/tombloo === TODO === - solve depends Tombloo -- all ]]></detail> </VimperatorPlugin>; @@ -29,49 +28,64 @@ var Tombloo = Cc["@brasil.to/tombloo-service;1"].getService().wrappedJSObject; var services = { pixiv: { - HOST: "http://www.pixiv.net", + HOST: ["http://www.pixiv.net"], LOGIN: "/index.php", LOGOUT: "/logout.php", usernameField: "pixiv_id", passwordField: "pass", extraField: { - mode: function() "login", - skip: function() "1", + mode: "login", + skip: "1", + }, + }, + drawr: { + HOST: ["http://drawr.net"], + LOGIN: "/login.php", + LOGOUT: "/logout.php", + usernameField: "user_uid", + passwordField: "user_upw", + extraField: { + mode: "autologin", }, }, mixi: { - HOST: "https://mixi.jp", + HOST: ["https://mixi.jp", "http://mixi.jp"], LOGIN: "/login.pl", LOGOUT: "/logout.pl", usernameField: "email", passwordField: "password", extraField: { - next_url: function() "/home.pl", + next_url: "/home.pl", }, }, hatena: { - HOST: "https://www.hatena.ne.jp", + HOST: ["https://www.hatena.ne.jp", "http://www.hatena.ne.jp"], LOGIN: "/login", LOGOUT: "/logout", usernameField: "name", passwordField: "password", + logoutBeforeLogin: true, }, hatelabo: { - HOST: "https://www.hatelabo.jp", + HOST: ["https://www.hatelabo.jp", "http://www.hatelabo.jp"], LOGIN: "/login", LOGOUT: "/logout", - usernameField: "name", + usernameField: "key", passwordField: "password", + logoutBeforeLogin: true, + extraField: { + mode: "enter", + }, }, tumblr: { - HOST: "http://www.tumblr.com", + HOST: ["http://www.tumblr.com"], LOGIN: "/login", LOGOUT: "/logout", usernameField: "email", passwordField: "password", }, twitter: { - HOST: "https://twitter.com", + HOST: ["https://twitter.com", "http://twitter.com"], LOGIN: "/sessions", LOGOUT: "/sessions/destroy", usernameField: "session[username_or_email]", @@ -81,7 +95,7 @@ var services = { }, }, "wassr.com": { - HOST: "https://wassr.com", + HOST: ["https://wassr.com", "http://wassr.com", "https://wassr.jp", "http://wassr.jp"], LOGIN: "/account/login", LOGOUT: "/account/logout", usernameField: "login_id", @@ -91,7 +105,7 @@ var services = { }, }, "wassr.jp": { - HOST: "https://wassr.jp", + HOST: ["https://wassr.jp", "http://wassr.jp", "https://wassr.com", "http://wassr.com"], LOGIN: "/account/login", LOGOUT: "/account/logout", usernameField: "login_id", @@ -104,95 +118,150 @@ var services = { for (name in services){ services[name] = new Service(services[name]); } +if (liberator.globalVariables.userLoginServices) { + let userServices = liberator.globalVariables.userLoginServices; + for (name in userServices){ + services[name] = new Service(userServices[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) +// Library +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 = {}; + let host = service.HOST[0]; 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); - } - } + if (!self.setPassword(content, username)) { + liberator.echoerr('failed get password "'+host+'" as '+username); + return false; } - return Tombloo - .request(page, {sendContent: content}) - .addCallback(function() - liberator.echo('login "'+service.HOST+'" as '+username)); + if (service.extraField && !self.setExtraField(content)) return false; + + let loginURL = host+service.LOGIN; + if (service.logoutBeforeLogin) { + let logoutURL = host+service.LOGOUT; + if (request(logoutURL, content).addCallback(function() + request(loginURL, content) + .addCallback(function() + liberator.echo('login "'+host+'" as '+username)))) return true; + } + + if (request(loginURL, content).addCallback(function() + liberator.echo('login "'+host+'" as '+username))) return true; + + liberator.echoerr('login failed "'+host+'" as '+username); + return false; }; 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}) + let host = service.HOST[0]; + if (service.extraField && !self.setExtraField(content)) return false; + let logoutURL = host+service.LOGOUT; + if (request(loginURL, content).addCallback(function() + liberator.echo('logout "'+host+'"'))) return true; + + liberator.echoerr('logout failed "'+host+'"'); + return false; + return request(logoutURL, content) .addCallback(function() - liberator.echo('logout "'+service.HOST+'"')); + liberator.echo('logout "'+host+'"')); + }; + self.getLogins = function() { + return [loginManager.findLogins({}, host, host, null) for each(host in service.HOST)] + .reduce(function(sum, logins){ + return sum.concat(logins.filter(function(login) + sum.length==0 || sum.filter(function(x) + x.username==login.username).length==0)) + }, []); }; - self.usernames = function(){ - let logins = loginManager.findLogins({}, service.HOST, service.HOST, null); - return [x.username for each(x in logins) if(x.username)]; + self.getUsernames = function(){ + return [x.username for each(x in self.getLogins()) if(x.username)]; + }; + self.setPassword = function(content, username){ + let logins = self.getLogins() + .filter(function(x) x.username==username); + + if(logins.length==0) return false; + content[service.passwordField] = logins[0].password; + return content; + }; + self.setExtraField = function(content){ + if (!service.extraField) return false; + for (field in service.extraField){ + value = service.extraField[field]; + switch(typeof value) { + case "function": + content[field] = value(service); + break; + case "string": + content[field] = value; + break; + } + if (!content[field]){ + liberator.echoerr("failed get "+field); + return false; + } + } + return content; }; for (prop in service){ if (self[prop]) self["_"+prop] = self[prop]; self[prop] = service[prop]; } +} //}}} + +function request(url, content) +{ + return Tombloo.request(url, {sendContent: content}); } -function tokenGetter(pattern) +function tokenGetter(pattern) //{{{ { return function(service){ - let res = util.httpGet(service.HOST); + let res = util.httpGet(service.HOST[0]); if (pattern.test(res.responseText)){ return RegExp.$1; } }; -} +} //}}} + +// Commands +// {{{ +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.getUsernames())]; + } + }, + 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)]; + }, + }); +// }}} + })(); // vim: fdm=marker sw=4 ts=4 et: |