arnaucube
arnaucube/raspberryGPIOhtmlserverPublic Self-hosted repository
raspberryGPIOhtmlserver/node_modules/connect/lib/middleware/basicAuth.js
node_modules/connect/lib/middleware/basicAuth.jsRaw
  1
  2/*!
  3 * Connect - basicAuth
  4 * Copyright(c) 2010 Sencha Inc.
  5 * Copyright(c) 2011 TJ Holowaychuk
  6 * MIT Licensed
  7 */
  8
  9/**
 10 * Module dependencies.
 11 */
 12
 13var utils = require('../utils')
 14  , unauthorized = utils.unauthorized;
 15
 16/**
 17 * Basic Auth:
 18 *
 19 * Enfore basic authentication by providing a `callback(user, pass)`,
 20 * which must return `true` in order to gain access. Alternatively an async
 21 * method is provided as well, invoking `callback(user, pass, callback)`. Populates
 22 * `req.user`. The final alternative is simply passing username / password
 23 * strings.
 24 *
 25 *  Simple username and password
 26 *
 27 *     connect(connect.basicAuth('username', 'password'));
 28 *
 29 *  Callback verification
 30 *
 31 *     connect()
 32 *       .use(connect.basicAuth(function(user, pass){
 33 *         return 'tj' == user & 'wahoo' == pass;
 34 *       }))
 35 *
 36 *  Async callback verification, accepting `fn(err, user)`.
 37 *
 38 *     connect()
 39 *       .use(connect.basicAuth(function(user, pass, fn){
 40 *         User.authenticate({ user: user, pass: pass }, fn);
 41 *       }))
 42 *
 43 * @param {Function|String} callback or username
 44 * @param {String} realm
 45 * @api public
 46 */
 47
 48module.exports = function basicAuth(callback, realm) {
 49  var username, password;
 50
 51  // user / pass strings
 52  if ('string' == typeof callback) {
 53    username = callback;
 54    password = realm;
 55    if ('string' != typeof password) throw new Error('password argument required');
 56    realm = arguments[2];
 57    callback = function(user, pass){
 58      return user == username && pass == password;
 59    }
 60  }
 61
 62  realm = realm || 'Authorization Required';
 63
 64  return function(req, res, next) {
 65    var authorization = req.headers.authorization;
 66
 67    if (req.user) return next();
 68    if (!authorization) return unauthorized(res, realm);
 69
 70    var parts = authorization.split(' ');
 71
 72    if (parts.length !== 2) return next(utils.error(400));
 73
 74    var scheme = parts[0]
 75      , credentials = new Buffer(parts[1], 'base64').toString()
 76      , index = credentials.indexOf(':');
 77
 78    if ('Basic' != scheme || index < 0) return next(utils.error(400));
 79    
 80    var user = credentials.slice(0, index)
 81      , pass = credentials.slice(index + 1);
 82
 83    // async
 84    if (callback.length >= 3) {
 85      var pause = utils.pause(req);
 86      callback(user, pass, function(err, user){
 87        if (err || !user)  return unauthorized(res, realm);
 88        req.user = req.remoteUser = user;
 89        next();
 90        pause.resume();
 91      });
 92    // sync
 93    } else {
 94      if (callback(user, pass)) {
 95        req.user = req.remoteUser = user;
 96        next();
 97      } else {
 98        unauthorized(res, realm);
 99      }
100    }
101  }
102};
103