diff options
Diffstat (limited to 'loginManager.js')
-rw-r--r-- | loginManager.js | 177 |
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); // }}} })(); |