Tizen 2.0 Release
[platform/framework/web/web-ui-fw.git] / libs / js / jquery-mobile-1.2.0 / node_modules / grunt / node_modules / prompt / node_modules / winston / node_modules / loggly / node_modules / request / aws.js
1
2 /*!
3  * knox - auth
4  * Copyright(c) 2010 LearnBoost <dev@learnboost.com>
5  * MIT Licensed
6  */
7
8 /**
9  * Module dependencies.
10  */
11
12 var crypto = require('crypto')
13   , parse = require('url').parse;
14
15 /**
16  * Valid keys.
17  */
18
19 var keys = [
20     'acl'
21   , 'location'
22   , 'logging'
23   , 'notification'
24   , 'partNumber'
25   , 'policy'
26   , 'requestPayment'
27   , 'torrent'
28   , 'uploadId'
29   , 'uploads'
30   , 'versionId'
31   , 'versioning'
32   , 'versions'
33   , 'website'
34 ];
35
36 /**
37  * Return an "Authorization" header value with the given `options`
38  * in the form of "AWS <key>:<signature>"
39  *
40  * @param {Object} options
41  * @return {String}
42  * @api private
43  */
44
45 exports.authorization = function(options){
46   return 'AWS ' + options.key + ':' + exports.sign(options);
47 };
48
49 /**
50  * Simple HMAC-SHA1 Wrapper
51  *
52  * @param {Object} options
53  * @return {String}
54  * @api private
55  */ 
56
57 exports.hmacSha1 = function(options){
58   return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64');
59 };
60
61 /**
62  * Create a base64 sha1 HMAC for `options`. 
63  * 
64  * @param {Object} options
65  * @return {String}
66  * @api private
67  */
68
69 exports.sign = function(options){
70   options.message = exports.stringToSign(options);
71   return exports.hmacSha1(options);
72 };
73
74 /**
75  * Create a base64 sha1 HMAC for `options`. 
76  *
77  * Specifically to be used with S3 presigned URLs
78  * 
79  * @param {Object} options
80  * @return {String}
81  * @api private
82  */
83
84 exports.signQuery = function(options){
85   options.message = exports.queryStringToSign(options);
86   return exports.hmacSha1(options);
87 };
88
89 /**
90  * Return a string for sign() with the given `options`.
91  *
92  * Spec:
93  * 
94  *    <verb>\n
95  *    <md5>\n
96  *    <content-type>\n
97  *    <date>\n
98  *    [headers\n]
99  *    <resource>
100  *
101  * @param {Object} options
102  * @return {String}
103  * @api private
104  */
105
106 exports.stringToSign = function(options){
107   var headers = options.amazonHeaders || '';
108   if (headers) headers += '\n';
109   return [
110       options.verb
111     , options.md5
112     , options.contentType
113     , options.date.toUTCString()
114     , headers + options.resource
115   ].join('\n');
116 };
117
118 /**
119  * Return a string for sign() with the given `options`, but is meant exclusively
120  * for S3 presigned URLs
121  *
122  * Spec:
123  * 
124  *    <date>\n
125  *    <resource>
126  *
127  * @param {Object} options
128  * @return {String}
129  * @api private
130  */
131
132 exports.queryStringToSign = function(options){
133   return 'GET\n\n\n' +
134     options.date + '\n' +
135     options.resource;
136 };
137
138 /**
139  * Perform the following:
140  *
141  *  - ignore non-amazon headers
142  *  - lowercase fields
143  *  - sort lexicographically
144  *  - trim whitespace between ":"
145  *  - join with newline
146  *
147  * @param {Object} headers
148  * @return {String}
149  * @api private
150  */
151
152 exports.canonicalizeHeaders = function(headers){
153   var buf = []
154     , fields = Object.keys(headers);
155   for (var i = 0, len = fields.length; i < len; ++i) {
156     var field = fields[i]
157       , val = headers[field]
158       , field = field.toLowerCase();
159     if (0 !== field.indexOf('x-amz')) continue;
160     buf.push(field + ':' + val);
161   }
162   return buf.sort().join('\n');
163 };
164
165 /**
166  * Perform the following:
167  *
168  *  - ignore non sub-resources
169  *  - sort lexicographically
170  *
171  * @param {String} resource
172  * @return {String}
173  * @api private
174  */
175
176 exports.canonicalizeResource = function(resource){
177   var url = parse(resource, true)
178     , path = url.pathname
179     , buf = [];
180
181   Object.keys(url.query).forEach(function(key){
182     if (!~keys.indexOf(key)) return;
183     var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]);
184     buf.push(key + val);
185   });
186
187   return path + (buf.length
188     ? '?' + buf.sort().join('&')
189     : '');
190 };