aboutsummaryrefslogtreecommitdiffstats
path: root/autoproxychanger.js
AgeCommit message (Collapse)Author
2009-08-27Follow HEADanekos
for http://vimperator.org/trac/gitweb/?p=liberator.git;a=commit;h=f20c2b315bb05c2e88d0c672f07dc229cc9267d2 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@35099 d0d07461-0603-4401-acd4-de1884942a52
2009-02-04PLUGIN_INFO 修正anekos
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@29543 d0d07461-0603-4401-acd4-de1884942a52
2008-12-24add updateURL for pluginManager.jssuVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27364 d0d07461-0603-4401-acd4-de1884942a52
2008-12-14pluginManager対応pekepeke
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26698 d0d07461-0603-4401-acd4-de1884942a52
2008-12-08io.runじゃなくて自前で実行するようにしてみた。pekepeke
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26147 d0d07461-0603-4401-acd4-de1884942a52
2008-11-28 * 正規表現を修正しました。drry
* ほか。 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25226 d0d07461-0603-4401-acd4-de1884942a52
2008-11-26消し忘れのコード発見したため、修正。。。pekepeke
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@24980 d0d07461-0603-4401-acd4-de1884942a52
2008-11-262.0pre対応pekepeke
refcontrol, autoproxychanger 追加 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@24976 d0d07461-0603-4401-acd4-de1884942a52
153'>153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
// PLUGIN_INFO//{{{
var PLUGIN_INFO =
<VimperatorPlugin>
    <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>
    <minVersion>2.0pre</minVersion>
    <maxVersion>2.0pre</maxVersion>
    <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/loginManger.js</updateURL>
    <license>public domain</license>
    <detail><![CDATA[
This plugin use Tombloo library,
so require install Tombloo Addon.
http://wiki.github.com/to/tombloo

=== TODO ===
- solve depends Tombloo
- all

]]></detail>
</VimperatorPlugin>;
//}}}

(function(){

var loginManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
var Tombloo = Cc["@brasil.to/tombloo-service;1"].getService().wrappedJSObject;

var services = {
    pixiv: {
        HOST: "http://www.pixiv.net",
        LOGIN: "/index.php",
        LOGOUT: "/logout.php",
        usernameField: "pixiv_id",
        passwordField: "pass",
        extraField: {
            mode: function() "login",
            skip: function() "1",
        },
    },
    mixi: {
        HOST: "https://mixi.jp",
        LOGIN: "/login.pl",
        LOGOUT: "/logout.pl",
        usernameField: "email",
        passwordField: "password",
        extraField: {
            next_url: function() "/home.pl",
        },
    },
    hatena: {
        HOST: "https://www.hatena.ne.jp",
        LOGIN: "/login",
        LOGOUT: "/logout",
        usernameField: "name",
        passwordField: "password",
    },
    hatelabo: {
        HOST: "https://www.hatelabo.jp",
        LOGIN: "/login",
        LOGOUT: "/logout",
        usernameField: "name",
        passwordField: "password",
    },
    tumblr: {
        HOST: "http://www.tumblr.com",
        LOGIN: "/login",
        LOGOUT: "/logout",
        usernameField: "email",
        passwordField: "password",
    },
    twitter: {
        HOST: "https://twitter.com",
        LOGIN: "/sessions",
        LOGOUT: "/sessions/destroy",
        usernameField: "session[username_or_email]",
        passwordField: "session[password]",
        extraField: {
            authenticity_token: tokenGetter(/authenticity_token.+value="(.+?)"/),
        },
    },
    "wassr.com": {
        HOST: "https://wassr.com",
        LOGIN: "/account/login",
        LOGOUT: "/account/logout",
        usernameField: "login_id",
        passwordField: "login_pw",
        extraField: {
            CSRFPROTECT: tokenGetter(/CSRFPROTECT.+value="(.+?)"/),
        },
    },
    "wassr.jp": {
        HOST: "https://wassr.jp",
        LOGIN: "/account/login",
        LOGOUT: "/account/logout",
        usernameField: "login_id",
        passwordField: "login_pw",
        extraField: {
            CSRFPROTECT: tokenGetter(/CSRFPROTECT.+value="(.+?)"/),
        },
    },
};
for (name in services){
    services[name] = new Service(services[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)
{
    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 = {};
        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);
                }
            }
        }
        return Tombloo
            .request(page, {sendContent: content})
            .addCallback(function()
                liberator.echo('login "'+service.HOST+'" as '+username));
    };
    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})
            .addCallback(function()
                liberator.echo('logout "'+service.HOST+'"'));
    };
    self.usernames = function(){
        let logins = loginManager.findLogins({}, service.HOST, service.HOST, null);
        return [x.username for each(x in logins) if(x.username)];
    };
    for (prop in service){
        if (self[prop]) self["_"+prop] = self[prop];
        self[prop] = service[prop];
    }
}
function tokenGetter(pattern)
{
    return function(service){
        let res = util.httpGet(service.HOST);
        if (pattern.test(res.responseText)){
            return RegExp.$1;
        }
    };
}

})();
// vim: fdm=marker sw=4 ts=4 et: