156 lines
4.3 KiB
JavaScript
156 lines
4.3 KiB
JavaScript
var Configstore = require('configstore');
|
|
var GitHub = require('github');
|
|
var Q = require('q');
|
|
|
|
var createError = require('../util/createError');
|
|
var defaultConfig = require('../config');
|
|
|
|
function login(logger, options, config) {
|
|
var configstore = new Configstore('bower-github');
|
|
|
|
config = defaultConfig(config);
|
|
|
|
var promise;
|
|
|
|
options = options || {};
|
|
|
|
if (options.token) {
|
|
promise = Q.resolve({ token: options.token });
|
|
} else {
|
|
// This command requires interactive to be enabled
|
|
if (!config.interactive) {
|
|
logger.emit(
|
|
'error',
|
|
createError('Login requires an interactive shell', 'ENOINT', {
|
|
details:
|
|
'Note that you can manually force an interactive shell with --config.interactive'
|
|
})
|
|
);
|
|
|
|
return;
|
|
}
|
|
|
|
var questions = [
|
|
{
|
|
name: 'username',
|
|
message: 'Username',
|
|
type: 'input',
|
|
default: configstore.get('username')
|
|
},
|
|
{
|
|
name: 'password',
|
|
message: 'Password',
|
|
type: 'password'
|
|
}
|
|
];
|
|
|
|
var github = new GitHub({
|
|
version: '3.0.0'
|
|
});
|
|
|
|
promise = Q.nfcall(logger.prompt.bind(logger), questions).then(function(
|
|
answers
|
|
) {
|
|
configstore.set('username', answers.username);
|
|
|
|
github.authenticate({
|
|
type: 'basic',
|
|
username: answers.username,
|
|
password: answers.password
|
|
});
|
|
|
|
return Q.ninvoke(github.authorization, 'create', {
|
|
scopes: ['user', 'repo'],
|
|
note:
|
|
'Bower command line client (' +
|
|
new Date().toISOString() +
|
|
')'
|
|
});
|
|
});
|
|
}
|
|
|
|
return promise.then(
|
|
function(result) {
|
|
configstore.set('accessToken', result.token);
|
|
logger.info(
|
|
'EAUTH',
|
|
'Logged in as ' + configstore.get('username'),
|
|
{}
|
|
);
|
|
|
|
return result;
|
|
},
|
|
function(error) {
|
|
var message;
|
|
|
|
try {
|
|
message = JSON.parse(error.message).message;
|
|
} catch (e) {
|
|
message = 'Authorization failed';
|
|
}
|
|
|
|
var questions = [
|
|
{
|
|
name: 'otpcode',
|
|
message: 'Two-Factor Auth Code',
|
|
type: 'input'
|
|
}
|
|
];
|
|
|
|
if (
|
|
message === 'Must specify two-factor authentication OTP code.'
|
|
) {
|
|
return Q.nfcall(logger.prompt.bind(logger), questions)
|
|
.then(function(answers) {
|
|
return Q.ninvoke(github.authorization, 'create', {
|
|
scopes: ['user', 'repo'],
|
|
note:
|
|
'Bower command line client (' +
|
|
new Date().toISOString() +
|
|
')',
|
|
headers: {
|
|
'X-GitHub-OTP': answers.otpcode
|
|
}
|
|
});
|
|
})
|
|
.then(
|
|
function(result) {
|
|
configstore.set('accessToken', result.token);
|
|
logger.info(
|
|
'EAUTH',
|
|
'Logged in as ' + configstore.get('username'),
|
|
{}
|
|
);
|
|
|
|
return result;
|
|
},
|
|
function() {
|
|
logger.emit('error', createError(message, 'EAUTH'));
|
|
}
|
|
);
|
|
} else {
|
|
logger.emit('error', createError(message, 'EAUTH'));
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
// -------------------
|
|
|
|
login.readOptions = function(argv) {
|
|
var cli = require('../util/cli');
|
|
|
|
var options = cli.readOptions(
|
|
{
|
|
token: { type: String, shorthand: 't' }
|
|
},
|
|
argv
|
|
);
|
|
|
|
delete options.argv;
|
|
|
|
return [options];
|
|
};
|
|
|
|
module.exports = login;
|