react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / aws-sign2 / index.js
81145 views1/*!2* knox - auth3* Copyright(c) 2010 LearnBoost <[email protected]>4* MIT Licensed5*/67/**8* Module dependencies.9*/1011var crypto = require('crypto')12, parse = require('url').parse13;1415/**16* Valid keys.17*/1819var 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]3536/**37* Return an "Authorization" header value with the given `options`38* in the form of "AWS <key>:<signature>"39*40* @param {Object} options41* @return {String}42* @api private43*/4445function authorization (options) {46return 'AWS ' + options.key + ':' + sign(options)47}4849module.exports = authorization50module.exports.authorization = authorization5152/**53* Simple HMAC-SHA1 Wrapper54*55* @param {Object} options56* @return {String}57* @api private58*/5960function hmacSha1 (options) {61return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64')62}6364module.exports.hmacSha1 = hmacSha16566/**67* Create a base64 sha1 HMAC for `options`.68*69* @param {Object} options70* @return {String}71* @api private72*/7374function sign (options) {75options.message = stringToSign(options)76return hmacSha1(options)77}78module.exports.sign = sign7980/**81* Create a base64 sha1 HMAC for `options`.82*83* Specifically to be used with S3 presigned URLs84*85* @param {Object} options86* @return {String}87* @api private88*/8990function signQuery (options) {91options.message = queryStringToSign(options)92return hmacSha1(options)93}94module.exports.signQuery= signQuery9596/**97* Return a string for sign() with the given `options`.98*99* Spec:100*101* <verb>\n102* <md5>\n103* <content-type>\n104* <date>\n105* [headers\n]106* <resource>107*108* @param {Object} options109* @return {String}110* @api private111*/112113function stringToSign (options) {114var headers = options.amazonHeaders || ''115if (headers) headers += '\n'116var r =117[ options.verb118, options.md5119, options.contentType120, options.date ? options.date.toUTCString() : ''121, headers + options.resource122]123return r.join('\n')124}125module.exports.queryStringToSign = stringToSign126127/**128* Return a string for sign() with the given `options`, but is meant exclusively129* for S3 presigned URLs130*131* Spec:132*133* <date>\n134* <resource>135*136* @param {Object} options137* @return {String}138* @api private139*/140141function queryStringToSign (options){142return 'GET\n\n\n' + options.date + '\n' + options.resource143}144module.exports.queryStringToSign = queryStringToSign145146/**147* Perform the following:148*149* - ignore non-amazon headers150* - lowercase fields151* - sort lexicographically152* - trim whitespace between ":"153* - join with newline154*155* @param {Object} headers156* @return {String}157* @api private158*/159160function canonicalizeHeaders (headers) {161var buf = []162, fields = Object.keys(headers)163;164for (var i = 0, len = fields.length; i < len; ++i) {165var field = fields[i]166, val = headers[field]167, field = field.toLowerCase()168;169if (0 !== field.indexOf('x-amz')) continue170buf.push(field + ':' + val)171}172return buf.sort().join('\n')173}174module.exports.canonicalizeHeaders = canonicalizeHeaders175176/**177* Perform the following:178*179* - ignore non sub-resources180* - sort lexicographically181*182* @param {String} resource183* @return {String}184* @api private185*/186187function canonicalizeResource (resource) {188var url = parse(resource, true)189, path = url.pathname190, buf = []191;192193Object.keys(url.query).forEach(function(key){194if (!~keys.indexOf(key)) return195var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key])196buf.push(key + val)197})198199return path + (buf.length ? '?' + buf.sort().join('&') : '')200}201module.exports.canonicalizeResource = canonicalizeResource202203204