aboutsummaryrefslogtreecommitdiffstats
path: root/loginManager.js
diff options
context:
space:
mode:
Diffstat (limited to 'loginManager.js')
-rw-r--r--loginManager.js177
1 files changed, 157 insertions, 20 deletions
diff --git a/loginManager.js b/loginManager.js
index 106f690..3e8a80d 100644
--- a/loginManager.js
+++ b/loginManager.js
@@ -4,12 +4,15 @@ 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.4</version>
+ <version>0.2.0</version>
<minVersion>2.0pre</minVersion>
- <maxVersion>2.2pre</maxVersion>
<updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/loginManger.js</updateURL>
<license>public domain</license>
<detail><![CDATA[
+ Default login user setting:
+ >||
+ let g:login_manager_default_user='nicovideo=mymail@addre.ss, slashdotjp=hogelogger'
+ ||<
=== TODO ===
@@ -54,6 +57,8 @@ var services = {
},
},
hatena: {
+ NAME: "はてな",
+ URL: /^https?:\/\/\w+\.hatena\.ne.\jp/,
HOST: ["https://www.hatena.ne.jp", "http://www.hatena.ne.jp"],
LOGIN: "/login",
LOGOUT: "/logout",
@@ -62,6 +67,7 @@ var services = {
logoutBeforeLogin: true,
},
hatelabo: {
+ NAME: "はてラボ",
HOST: ["https://www.hatelabo.jp", "http://www.hatelabo.jp"],
LOGIN: "/login",
LOGOUT: "/logout",
@@ -109,17 +115,119 @@ var services = {
CSRFPROTECT: tokenGetter(/CSRFPROTECT.+value="(.+?)"/),
},
},
+ delicious: {
+ HOST: ["https://secure.delicious.com"],
+ LOGIN: "/login",
+ LOGOUT: "/logout",
+ usernameField: "username",
+ passwordField: "password",
+ extraField: {
+ rememberme: "1",
+ },
+ },
+ evernote: {
+ HOST: ["https://www.evernote.com"],
+ LOGIN: "/Login.action",
+ LOGOUT: "/Logout.action",
+ usernameField: "username",
+ passwordField: "password",
+ extraField: {
+ rememberMe: "true",
+ _sourcePage: tokenGetterLoginURL(/_sourcePage.+value="(.+?)"/),
+ __fp: tokenGetterLoginURL(/__fp.+value="(.+?)"/),
+ login: "Sign In",
+ },
+ },
+ readitlater: {
+ HOST: ["http://readitlaterlist.com"],
+ LOGIN: "/login_process/",
+ LOGOUT: "/lo",
+ usernameField: "feed_id",
+ passwordField: "password",
+ },
+ nicovideo: {
+ URL: /^https?:\/\/\w+\.nicovideo.\jp/,
+ NAME: "ニコニコ動画",
+ HOST: ["https://secure.nicovideo.jp"],
+ LOGIN: "/secure/login",
+ usernameField: "mail",
+ passwordField: "password",
+ extraField: {
+ site: "niconico"
+ }
+ },
+ slashdotjp: {
+ NAME: "スラッシュドットジャパン",
+ HOST: ["http://slashdot.jp"],
+ LOGIN: "/login.pl",
+ usernameField: "unickname",
+ passwordField: "upasswd",
+ extraField: {
+ op: "userlogin",
+ }
+ },
+ tumblr: {
+ NAME: "tumblr",
+ HOST: ["https://www.tumblr.com"],
+ URL: /^https?:\/\/(?:\w+\.)?tumblr\.com\//,
+ LOGIN: "/login",
+ LOGOUT: "/logout",
+ usernameField: "email",
+ passwordField: "password",
+ },
};
-for (name in services){
- services[name] = new Service(services[name]);
+for (let [name, service] in Iterator(services)){
+ if (!service.NAME)
+ service.NAME = name;
+ services[name] = new Service(service);
+}
+let (gv = liberator.globalVariables.userLoginServices || liberator.globalVariables.login_manager_services) {
+ if (gv) {
+ let userServices = gv;
+ for (name in userServices){
+ services[name] = new Service(userServices[name]);
+ }
+ }
}
-if (liberator.globalVariables.userLoginServices) {
- let userServices = liberator.globalVariables.userLoginServices;
- for (name in userServices){
- services[name] = new Service(userServices[name]);
+for (let [name, service] in Iterator(services)){
+ if (!service.NAME)
+ service.NAME = name;
+}
+let (gv = liberator.globalVariables.userLoginDefaults || liberator.globalVariables.login_manager_default_user) {
+ if (typeof gv === 'string') {
+ for (let [, sn] in Iterator(gv.split(','))) {
+ let [s, v] = sn.split('=');
+ services[s.trim()].DEFAULT_USER = v.trim();
+ }
+ } else if (typeof gv === 'object') {
+ for (let [n, v] in Iterator(gv))
+ services[n].DEFAULT_USER = v;
}
}
+Object.defineProperty(
+ services,
+ "auto",
+ {
+ enumerable: true,
+ get: function(){
+ let currentURI = makeURI(buffer.URL);
+ for (let n in Iterator(this, true)){
+ if (n === "auto") continue;
+ let s = this[n];
+ if (s.URL && s.URL.test(buffer.URL))
+ return s;
+ for (let [, h] in Iterator(s.HOST)){
+ let sURI = makeURI(h);
+ if (sURI.host === currentURI.host) return s;
+ }
+ }
+ // XXX (補完に|エラーを)出さないためのダミー
+ return {getUsernames: function() ([])};
+ }
+ }
+)
+
// Library
function Service(service) //{{{
{
@@ -145,7 +253,7 @@ function Service(service) //{{{
login();
};
- self.logout = function(){
+ self.logout = function(username){
let content = {};
let host = service.HOST[0];
if (service.extraField && !self.setExtraField(content)) return false;
@@ -217,42 +325,71 @@ function tokenGetter(pattern) //{{{
return RegExp.$1;
}
};
+}
+function tokenGetterLoginURL(pattern) //{{{
+{
+ return function(service){
+ let res = util.httpGet(service.HOST[0]+service.LOGIN);
+ if (pattern.test(res.responseText)){
+ return RegExp.$1;
+ }
+ };
+}
+function getServiceAndUsernameFromArgs(args, logout)
+{
+ let [servicename, username] = args;
+ let service = services[servicename];
+ if (!service)
+ service = services.auto;
+ if (!service)
+ return;
+ if (!username) {
+ let names = service.getUsernames();
+ if (names.length === 1) {
+ username = names[0];
+ } else {
+ username = service.DEFAULT_USER;
+ }
+ }
+ return [service, username];
} //}}}
// Commands
// {{{
commands.addUserCommand(["login"], "Login",
function(args){
- let [servicename, username] = args;
- let service = services[servicename];
- if (!service) return false;
+ let [service, username] = getServiceAndUsernameFromArgs(args);
+ if (!service)
+ return liberator.echoerr("Argument required. Please supply service name.");
+ if (!username)
+ return liberator.echoerr("Argument required. Please supply user name.");
service.login(username);
}, {
completer: function(context, args){
if (args.completeArg == 0){
context.title = ["service"];
- context.completions = [[s,""] for(s in services)];
+ context.completions = [[n,s.NAME] for([n,s] in Iterator(services)) if (s.getUsernames().length)];
} 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())];
+ context.completions = [[u,] for each(u in service.getUsernames())];
}
},
literal: 1,
- });
+ }, true);
commands.addUserCommand(["logout"], "Logout",
function(args){
- let [servicename, username] = args;
- let service = services[servicename];
- if (!service) return false;
+ let [service, username] = getServiceAndUsernameFromArgs(args);
+ if (!service)
+ return liberator.echoerr("Argument required. Please supply service name.");
service.logout(username);
}, {
completer: function(context, args){
context.title = ["service"];
- context.completions = [[s,""] for(s in services)];
+ context.completions = [[n,s.NAME] for([n,s] in Iterator(services)) if (s.getUsernames().length)];
},
- });
+ }, true);
// }}}
})();