aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--loginManager.js227
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: