ionic
Version:
A tool for creating and developing Ionic Framework mobile apps.
150 lines (121 loc) • 4.11 kB
JavaScript
var fs = require('fs'),
request = require('request'),
argv = require('optimist').argv,
prompt = require('prompt'),
IonicProject = require('./project'),
IonicStore = require('./store').IonicStore,
Task = require('./task').Task;
var IonicTask = function() {};
IonicTask.prototype = new Task();
IonicTask.prototype.get = function(ionic, callback) {
this.cookieData = new IonicStore('cookies');
if(ionic.jar) {
// already in memory
callback(ionic.jar);
return;
}
this.email = argv.email || argv.e || process.env.IONIC_EMAIL;
this.password = argv.password || argv.p || process.env.IONIC_PASSWORD;
if(!this.email && this.password) {
return ionic.fail('--email or -e command line flag, or IONIC_EMAIL environment variable required');
}
if(this.email && !this.password) {
return ionic.fail('--password or -p command line flag, or IONIC_PASSWORD environment variable required');
}
if(!this.email && !this.password) {
// did not include cmd line flags, check for existing cookies
var jar = this.cookieData.get(ionic.IONIC_DASH);
if(jar && jar.length) {
for(var i in jar) {
var cookie = jar[i];
if(cookie.key == "sessionid" && new Date(cookie.expires) > new Date()) {
ionic.jar = jar;
callback(jar);
return;
}
}
}
}
this.run(ionic, callback);
};
IonicTask.prototype.run = function(ionic, callback) {
var self = this;
if(!this.email && !this.password) {
var schema = [{
name: 'email',
pattern: /^[A-z0-9!#$%&'*+\/=?\^_{|}~\-]+(?:\.[A-z0-9!#$%&'*+\/=?\^_{|}~\-]+)*@(?:[A-z0-9](?:[A-z0-9\-]*[A-z0-9])?\.)+[A-z0-9](?:[A-z0-9\-]*[A-z0-9])?$/,
description: 'Email:'.yellow.bold,
required: true
}, {
name: 'password',
description: 'Password:'.yellow.bold,
hidden: true,
required: true
}];
// prompt for log
console.log('\nTo continue, please login to your Ionic account.'.bold.green);
console.log('Don\'t have one? Create a one at: '.bold + (ionic.IONIC_DASH + '/signup').bold + '\n');
prompt.override = argv;
prompt.message = '';
prompt.delimiter = '';
prompt.start();
prompt.get(schema, function (err, result) {
if(err) {
return ionic.fail('Error logging in: ' + err);
}
self.email = result.email;
self.password = result.password;
self.requestLogIn(ionic, callback, true);
});
} else {
// cmd line flag were added, use those instead of a prompt
self.requestLogIn(ionic, callback, false);
}
};
IonicTask.prototype.requestLogIn = function(ionic, callback, saveCookies) {
var self = this;
var transformedCookies = null;
var jar = request.jar();
request({
method: 'POST',
url: ionic.IONIC_DASH + ionic.IONIC_API + 'user/login',
jar: jar,
form: {
username: self.email.toString(),
password: self.password
},
proxy: process.env.PROXY || process.env.http_proxy || null
},
function (err, response, body) {
if(err) {
return ionic.fail('Error logging in: ' + err);
}
// Should be a 302 redirect status code if correct
if(response.statusCode != 200) {
return ionic.fail('Email or Password incorrect. Please visit '+ ionic.IONIC_DASH.white +' for help.'.red);
}
if(saveCookies) {
// save cookies
if(!self.cookieData) {
self.cookieData = new IonicStore('cookies');
}
self.cookieData.set(ionic.IONIC_DASH, jar.getCookies(ionic.IONIC_DASH));
self.cookieData.save();
transformedCookies = self.cookieData.get(ionic.IONIC_DASH);
} else {
try {
var jsonString = JSON.stringify(jar.getCookies(ionic.IONIC_DASH, null, 2));
transformedCookies = JSON.parse(jsonString);
} catch(ex) {
console.log('Invalid cookies from jar.getCookies'.red.bold);
}
}
// save in memory
ionic.jar = transformedCookies;
console.log('Logged in! :)'.green);
if(callback) {
callback(transformedCookies);
}
});
};
exports.IonicTask = IonicTask;