Blame view

node_modules/bower/lib/commands/login.js 3.56 KB
2dda2e10   Administrator   generator ignore
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  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;