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