c9-core/plugins/c9.cli/auth.bootstrap.js

120 wiersze
3.8 KiB
JavaScript

define(function(require, exports, module) {
main.consumes = ["Plugin", "http"];
main.provides = ["auth.bootstrap"];
return main;
function main(options, imports, register) {
var Plugin = imports.Plugin;
var http = imports.http;
var fs = require("fs");
var _read = require("read");
/***** Initialization *****/
var plugin = new Plugin("Ajax.org", main.consumes);
// TODO read from options
var AUTHURL = options.authUrl;
var AUTHPATH = process.env.HOME + "/.c9/.auth";
var lastToken;
/***** Methods *****/
function read(options, cb) {
_read(options, function(err, result) {
if (err && err.message == 'canceled') {
console.log("\n");
if (options.retry)
return process.exit(1);
else {
options.retry = 1;
console.log("(^C again to quit)");
return read(options, cb);
}
}
cb(err, result);
});
}
function readCredentials(callback) {
read({
prompt: "Cloud9 Username:"
}, function(error, username) {
if (error) return callback(error);
if (!username) {
console.error("username is required");
return process.exit(1);
}
read({
prompt: "Password:",
silent: true,
replace: "*"
}, function(error, password) {
if (error) return callback(error);
callback(null, { username: username, password: password });
});
});
}
function login(callback) {
fs.readFile(AUTHPATH, { encoding: "utf8" }, function(err, data) {
if (err || !data || lastToken == data) {
_login(callback);
}
else {
lastToken = data;
callback(null, data);
}
});
}
function _login(callback) {
readCredentials(function(err, credentials) {
if (err) return callback(err);
// Retrieve token
http.request(AUTHURL + "/api/nc/auth", {
method: "POST",
contentType: "application/json",
body: {
username: credentials.username,
password: credentials.password,
client_id: "cli"
}
}, function(err, token) {
if (err) {
var message = /id="error_header">([^<]*)</.exec(err.message);
console.error(message ? message[1] : err.message || err, "\n");
return callback(err);
}
fs.writeFile(AUTHPATH, token, function(err) {
if (err) return callback(err);
callback(null, lastToken = token);
});
});
});
}
/***** Register and define API *****/
/**
* Finds or lists files and/or lines based on their filename or contents
**/
plugin.freezePublicAPI({
/**
*
*/
login: login
});
register(null, {
"auth.bootstrap": plugin
});
}
});
//require("node-optimist");