ionic
Version:
A tool for creating and developing Ionic Framework mobile apps.
284 lines (231 loc) • 7.05 kB
JavaScript
var request = require('request');
var argv = require('optimist').argv;
var prompt = require('prompt');
var IonicStore = require('./store').IonicStore;
var Q = require('q');
var settings = require('./settings');
var Utils = require('./utils');
var log = require('./logging').logger;
var Login = module.exports;
Login.jar = null;
// Here we want to look up an existing cookie jar for login if it exists.
// If not, resolve false
Login.retrieveLogin = function retrieveLogin() {
var q = Q.defer();
try {
var cookieData = new IonicStore('cookies');
if (Login.jar) {
// already in memory
q.resolve(Login.jar);
return q.promise;
}
// this.email = argv.email || argv.e || process.env.IONIC_EMAIL;
// this.password = argv.password || argv.p || process.env.IONIC_PASSWORD;
// if(!email && password) {
// return Utils.fail('--email or -e command line flag, or IONIC_EMAIL environment variable required');
// }
// if(email && !password) {
// return Utils.fail('--password or -p command line flag, or IONIC_PASSWORD environment variable required');
// }
// if(!email && !password) {
// // did not include cmd line flags, check for existing cookies
var jar = cookieData.get(settings.IONIC_DASH);
if (jar && jar.length) {
for (var i in jar) {
if (jar.hasOwnProperty(i)) {
var cookie = jar[i];
if (cookie.key === 'sessionid' && new Date(cookie.expires) > new Date()) {
Login.jar = jar;
q.resolve(Login.jar);
return q.promise;
}
}
}
}
q.resolve(false);
} catch (ex) {
q.reject(ex);
}
return q.promise;
};
Login.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])?$/, // eslint-disable-line max-len
description: 'Email:'.yellow.bold,
required: true
}, {
name: 'password',
description: 'Password:'.yellow.bold,
hidden: true,
required: true
}];
// prompt for log
log.info('\nTo continue, please login to your Ionic account.');
log.info('Don\'t have one? Create a one at: '.bold + (settings.IONIC_DASH + '/signup').bold + '\n');
prompt.override = argv;
prompt.message = '';
prompt.delimiter = '';
prompt.start();
prompt.get(schema, function(err, result) {
if (err) {
return Utils.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);
}
};
Login.requestLogIn = function requestLogin(email, password, saveCookies) {
var q = Q.defer();
var transformedCookies = null;
var url = [settings.IONIC_DASH_API, 'user/login'].join('');
var jar = request.jar();
request({
method: 'POST',
url: url,
jar: jar,
form: {
username: email.toString(),
password: password
},
proxy: Utils.getProxy()
}, function(err, response) {
if (err) {
return q.reject('Error logging in: ' + err);
}
if (parseInt(response.statusCode, 10) !== 200) {
return q.reject('Email or Password incorrect. Please visit ' + settings.IONIC_DASH.white + ' for help.'.red);
}
if (saveCookies) {
transformedCookies = Login.saveCookies(jar);
} else {
try {
var jsonString = JSON.stringify(jar.getCookies(settings.IONIC_DASH, null, 2));
transformedCookies = JSON.parse(jsonString);
} catch (ex) {
log.error('Invalid cookies from jar.getCookies');
}
}
q.resolve(transformedCookies);
});
return q.promise;
};
Login.saveCookies = function saveCookies(jar) {
var cookies = jar.getCookies(settings.IONIC_DASH);
var cookieData;
var transformedCookies;
try {
if (saveCookies) {
// save cookies
if (!cookieData) {
cookieData = new IonicStore('cookies');
}
cookieData.set(settings.IONIC_DASH, cookies);
cookieData.save();
transformedCookies = cookieData.get(settings.IONIC_DASH);
} else {
var jsonString = JSON.stringify(jar.getCookies(settings.IONIC_DASH, null, 2));
transformedCookies = JSON.parse(jsonString);
}
// save in memory
Login.jar = transformedCookies;
} catch (ex) {
log.error('Invalid cookies from jar.getCookies');
}
return transformedCookies;
};
Login.getUserInfo = function getUserInfo(jar) {
var q = Q.defer();
var url = [settings.IONIC_DASH_API, 'user?format=json'].join('');
request({
method: 'GET',
url: url,
headers: {
cookie: jar.map(function(c) {
return c.key + '=' + encodeURIComponent(c.value);
}).join('; ')
},
proxy: Utils.getProxy()
}, function(err, response, body) {
if (err) {
return q.reject('Error logging in: ' + err);
}
if (parseInt(response.statusCode, 10) !== 200) {
return q.reject('Could not get user info: ' + response);
}
try {
// Got results
var data = JSON.parse(body);
q.resolve(data);
} catch (ex) {
log.error('Error: ', ex);
q.reject(ex);
}
});
return q.promise;
};
Login.getUserApps = function getUserApps(jar) {
var q = Q.defer();
var url = [settings.IONIC_DASH_API, 'apps?format=json'].join('');
request({
method: 'GET',
url: url,
headers: {
cookie: jar.map(function(c) {
return c.key + '=' + encodeURIComponent(c.value);
}).join('; ')
},
proxy: Utils.getProxy()
}, function(err, response, body) {
if (err) {
return q.reject('Error logging in: ' + err);
}
if (parseInt(response.statusCode, 10) !== 200) {
return q.reject('Could not get user info: ' + response);
}
try {
var data = JSON.parse(body);
q.resolve(data);
} catch (ex) {
log.error('Error: ', ex);
q.reject(ex);
}
});
return q.promise;
};
Login.getDownloadLink = function getDownloadLink(jar, appId) {
var q = Q.defer();
var url = [settings.IONIC_DASH_API, 'app/', appId, '/updates/download'].join('');
request({
method: 'GET',
url: url,
headers: {
cookie: jar.map(function(c) {
return c.key + '=' + encodeURIComponent(c.value);
}).join('; ')
},
proxy: Utils.getProxy()
}, function(err, response, body) {
if (err) {
return q.reject('Error logging in: ' + err);
}
if (parseInt(response.statusCode, 10) !== 200) {
return q.reject('Could not get user info: ' + response);
}
try {
var data = JSON.parse(body);
q.resolve(data.download_url);
} catch (ex) {
log.error('Error: ', ex);
q.reject(ex);
}
});
return q.promise;
};