Tizen 2.1 base
[platform/framework/web/web-ui-fw.git] / libs / js / jquery-mobile-1.2.0 / node_modules / grunt / node_modules / connect / lib / middleware / basicAuth.js
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
13 var 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
48 module.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().split(':')
76       , user = credentials[0]
77       , pass = credentials[1];
78
79     if ('Basic' != scheme) return next(utils.error(400));
80
81     // async
82     if (callback.length >= 3) {
83       var pause = utils.pause(req);
84       callback(user, pass, function(err, user){
85         if (err || !user)  return unauthorized(res, realm);
86         req.user = req.remoteUser = user;
87         next();
88         pause.resume();
89       });
90     // sync
91     } else {
92       if (callback(user, pass)) {
93         req.user = req.remoteUser = user;
94         next();
95       } else {
96         unauthorized(res, realm);
97       }
98     }
99   }
100 };
101