root/lang/javascript/vimperator-plugins/branches/2.2/account_switcher.js

Revision 35701, 10.8 kB (checked in by masa138, 11 months ago)

add 'id' to tooltiptext

Line 
1var PLUGIN_INFO =
2<VimperatorPlugin>
3<name>{NAME}</name>
4<description>Switch account easily.</description>
5<description lang="ja">複数のアカウントを切り替えることができます.</description>
6<minVersion>2.1a1pre</minVersion>
7<maxVersion>2.1a1pre</maxVersion>
8<updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/account_switcher.js</updateURL>
9<author mail="masa138@gmail.com" homepage="http://www.hatena.ne.jp/masa138/">Masayuki KIMURA</author>
10<version>0.07</version>
11<detail><![CDATA[
12
13== Commands ==
14:account {username}@{servicename}
15    {servicename} に {username} でログインします.
16    このとき,ログインマネージャーの値を使用するので,
17    ログインマネージャーにパスワードを保存しておく必要があります.
18
19:loginmultiaccounts
20    .vimperatorrc であらかじめ設定しておいたアカウントすべてにログインします.
21    日常的に使うサーヴィスのメインアカウントを登録しておくことで,コマンド一つで
22    すべてにログインできます.
23
24
25== Global variables ==
26accountSwitcherServices
27    Google, Hatena, Hatelabo 以外のアカウントにも対応することが出来ます.
28
29accountSwitcherLoginServices
30    :loginmultiaccounts でログインするアカウントの配列
31
32== .vimperatorrc ==
33以下の様に記述しておけば,:loginmultiaccounts を実行したときに
34すべてのアカウントにログインできます.
35>||
36js <<EOM
37liberator.globalVariables.accountSwitcherLoginServices = [
38    'bar@hatena',
39    'buz@hatelabo',
40    'foo@google',
41];
42||<
43
44accountSwitcherOpenNewTab
45    ログイン後に jump 先を新しいタブで開くかどうか指定することが出来ます.
46>||
47js <<EOM
48// タブで開く
49liberator.accountSwitcherOpenNewTab = 1;
50||<
51
52]]></detail>
53</VimperatorPlugin>;
54(function(){
55    var services = [];
56    var accounts = [];
57    var nowLogin = [];
58    var isFirst  = true;
59
60    var manager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
61
62    var ns         = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
63    var statusBar  = document.getElementById('status-bar');
64    var targetElem = document.getElementById('page-report-button');
65    var afterSLine = targetElem.nextSibling;
66    var sbPannel   = document.createElementNS(ns, 'statusbarpannel');
67    var img        = sbPannel.appendChild(document.createElementNS(ns, 'image'));
68    sbPannel.id    = 'account-switcher-pannel';
69
70    var loginServices;
71
72    var _services = {
73        google: {
74            host   : 'https://www.google.com',
75            login  : '/accounts/LoginAuth',
76            id     : 'Email',
77            pw     : 'Passwd',
78            ex     : ['GALX'],
79            logout : 'http://mail.google.com/mail/?logout',
80        },
81        hatena: {
82            host   : 'https://www.hatena.ne.jp',
83            login  : '/login',
84            id     : 'name',
85            pw     : 'password',
86            logout : '/logout',
87        },
88        hatelabo: {
89            host   : 'https://www.hatelabo.jp',
90            login  : '/login',
91            id     : 'key',
92            pw     : 'password',
93            ex     : ['mode=enter'],
94            logout : '/logout',
95        },
96        twitter: {
97            host   : 'https://twitter.com',
98            login  : '/sessions',
99            id     : 'session[username_or_email]',
100            pw     : 'session[password]',
101            ex     : ['authenticity_token'],
102            exhost : 'https://twitter.com',
103            logout : '/sessions/destroy',
104            jump   : '/',
105        },
106        tumblr : {
107            host   : 'http://www.tumblr.com',
108            login  : '/login',
109            id     : 'email',
110            pw     : 'password',
111            logout : '/logout',
112            jump   : '/dashboard',
113        },
114    };
115
116    function init() {
117        var rcServices = liberator.globalVariables.accountSwitcherServices;
118        rcServices = !rcServices ? [] : rcServices;
119
120        // loginmultiaccounts でログインするアカウントの読み込み
121        loginServices = liberator.globalVariables.accountSwitcherLoginServices;
122        loginServices = !loginServices ? [] : loginServices;
123
124        for (var key in _services)  if (_services.hasOwnProperty(key)) services[key] = _services[key];
125        for (var key in rcServices) if (rcServices.hasOwnProperty(key)) {
126            var s = rcServices[key];
127            if (services[key] == null) services[key] = s;
128            else {
129                for (var k in s) if (s.hasOwnProperty(k)) {
130                    services[key][k] = s[k];
131                }
132            }
133        }
134
135        var hosts = [key for (key in services)];
136        for (var i in hosts) {
137            var host = hosts[i];
138            if (isFirst) nowLogin[host] = '';
139            var logins = manager.findLogins({}, services[host].host, "", null);
140            var ignoreAccounts = liberator.globalVariables.accountSwitcherIngnoreAccounts;
141            for (var i = 0; i < logins.length; i++) {
142                var login = logins[i];
143                var usernameAndService = [login.username, host].join('@');
144                if (!!ignoreAccounts && ignoreAccounts.indexOf(usernameAndService) != -1) continue;
145                accounts[usernameAndService] = {};
146                var a = accounts[usernameAndService];
147                a.username = login.username;
148                a.password = login.password;
149                a.host     = host;
150            }
151        }
152
153        isFirst = false;
154    }
155
156    function changeAccount(user) {
157        var username = accounts[user].username;
158        var password = accounts[user].password;
159        var params   = [];
160
161        var service = services[accounts[user].host];
162        if (service.host == null || service.logout == null) return;
163        if (!!service.params) params = service.params;
164
165        var req = new XMLHttpRequest();
166        var url = (service.logout.indexOf('http') != 0) ? service.host + service.logout : service.logout;
167        req.open("POST", url, true);
168        req.onload = function(e) {
169            var url = (service.login.indexOf('http') != 0) ? service.host + service.login : service.login;
170            var ex  = service.ex;
171            if (!!ex) {
172                var res;
173                if (!!service.exhost) {
174                    res = util.httpGet(service.exhost);
175                } else {
176                    res = util.httpGet(url);
177                }
178                for (var i = 0, length = ex.length; i < length; i++) {
179                    var value = ex[i];
180                    if (value.indexOf('=') > 0) {
181                        params.push(value);
182                    } else {
183                        res.responseText.match(new RegExp('(<[\\S\\s]*?name=\"' + value + '\"[\\S\\s]*?>)'));
184                        RegExp.$1.match(/value=\"([a-zA-Z0-9-_]+)\"/);
185                        params.push(value + '=' + encodeURIComponent(RegExp.$1));
186                    }
187                }
188            }
189            if (service.login == null || service.id == null || service.pw == null) return;
190            var req = new XMLHttpRequest();
191            req.open("POST", url, true);
192            req.onload = function(e) {
193                if (service.jump != null) {
194                    var url = (service.jump.indexOf('http') == -1) ? service.host + service.jump : service.jump;
195                    if (!!liberator.globalVariables.accountSwitcherOpenNewTab && window.content.location.href != 'about:blank') {
196                        liberator.open(url, liberator.NEW_BACKGROUND_TAB);
197                    } else {
198                        window.content.location.href = url;
199                    }
200                } else if(content.location.href != 'about:blank') {
201                    window.content.location.reload();
202                }
203                var needle = '.hatena.ne.jp';
204                if (service.host.toLowerCase().lastIndexOf(needle) == service.host.length - needle.length) {
205                    img.setAttribute('src', 'http://www.hatena.ne.jp/users/' + username.substr(0, 2) + '/' + username + '/profile_s.gif');
206                    img.setAttribute('tooltiptext', 'id:' + username);
207                    if (!document.getElementById('account_switcher_pannel')) {
208                        if (afterSLine != null) {
209                            statusBar.insertBefore(sbPannel, afterSLine);
210                        } else {
211                            statusBar.appendChild(sbPannel);
212                        }
213                    }
214                }
215            };
216            req.onerror = function(e) { liberator.echoerr('Login error in account_switcher.js'); };
217            req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
218            params.push(service.id + '=' + encodeURIComponent(username));
219            params.push(service.pw + '=' + encodeURIComponent(password));
220            req.send(params.join('&'));
221            nowLogin[user.substr(user.lastIndexOf('@') + 1)] = user;
222        };
223        req.onerror = function(e) { liberator.echoerr('Logout error in account_switcher.js'); };
224        req.send(null);
225    }
226
227    function loginMultiAccounts() {
228        for (var i = 0, length = loginServices.length; i < length; i++) {
229            for (var key in accounts) if (accounts.hasOwnProperty(key)) {
230                if (key == loginServices[i]) {
231                    changeAccount(key);
232                    continue;
233                }
234            }
235        }
236    }
237
238    commands.addUserCommand(["loginmultiaccounts"], "Login multi accounts",
239        function() {
240            init();
241            loginMultiAccounts();
242        }
243    );
244
245    commands.addUserCommand(["account"], "Change Account",
246        function(args) {
247            if (!args) {
248                liberator.echo("Usage: account {username}@{servicename}");
249            } else {
250                var user = args[args.length - 1];
251                if (!user) return;
252                changeAccount(user);
253            }
254        }, {
255            completer: function(context, args) {
256                init();
257                context.title = ["Account", "Service"];
258                for (var service in nowLogin) if (nowLogin.hasOwnProperty(service)) {
259                    var username = nowLogin[service];
260                    if (username != '') delete(accounts[username]);
261                }
262                var compls = [[key, accounts[key].host] for (key in accounts) if (accounts.hasOwnProperty(key))];
263                if (args.length > 0) {
264                    for (var i = 0; i < args.length; i++) {
265                        var user = args[i];
266                        if (user != '') {
267                            compls = compls.filter(function(c) c[0].indexOf(user) != -1);
268                        }
269                    }
270                }
271                return [0, compls];
272            }
273        }
274    );
275})();
276// vim:sw=4 ts=4 et:
Note: See TracBrowser for help on using the browser.