-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
144 lines (100 loc) · 3.83 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
* index.js
*
* (C) 2012 Crosstalk Systems Inc.
*/
"use strict";
var crypto = require( 'crypto' ),
dateformat = require( 'dateformat' ),
logger = require( 'logger' );
var DEFAULT_HTTP_VERB = "GET";
//
// * not supported:
// - multiple headers with the same name
// - long, multi-line spanning headers
//
var createCanonicalAmzHeaders = function createCanonicalAmzHeaders ( headers ) {
var canonicalAmzHeaders = [];
Object.keys( headers ).forEach( function ( header ) {
// drop non x-amz- headers
if ( header.indexOf( "x-amz-" ) !== 0 ) return;
canonicalAmzHeaders.push( header + ":" + headers[ header ].trim() + "\n" );
}); // Object.keys( headers ).forEach
canonicalAmzHeaders.sort();
return canonicalAmzHeaders.join( '' );
}; // createCanonicalAmzHeaders
//
// not supporting sub-resources at this time
//
var createCanonicalResource = function createCanonicalResource ( bucketName,
objectName, subResources ) {
subResources = subResources || [];
return "/" + bucketName + "/" + objectName +
( ( subResources.length > 0 ) ? "?" + subResources.join( '&' ) : '' );
}; // createCanonicalResource
var createStringToSign = function createStringToSign ( httpVerb, contentMD5,
contentType, date, canonicalAmzHeaders, canonicalResource ) {
return httpVerb.toUpperCase() + "\n"
+ contentMD5 + "\n"
+ contentType + "\n"
+ date + "\n"
+ canonicalAmzHeaders
+ canonicalResource;
}; // createStringToSign
var hmac = function hmac ( key, stringToSign, format ) {
return crypto.createHmac( 'sha1', key ).update( stringToSign )
.digest( format );
}; // hmac
var s3 = function s3 ( params, callback ) {
if ( ! callback ) return; // nothing to do
//
// required params
//
var awsAccessKeyId = params.awsAccessKeyId,
bucketName = params.bucketName,
objectName = params.objectName,
secretAccessKey = params.secretAccessKey;
if ( ! awsAccessKeyId ) return callback( { message : "missing awsAccessKeyId" } );
if ( ! bucketName ) return callback( { message : "missing bucketName" } );
if ( typeof( objectName ) === 'undefined' ) {
return callback( { message : "missing objectName" } );
}
if ( ! secretAccessKey ) return callback( { message : "missing secretAccessKey" } );
//
// optional params
//
var headers = params.headers || {},
httpVerb = params.httpVerb || DEFAULT_HTTP_VERB,
subResources = params.subResources;
var lowercaseHeaders = {};
Object.keys( headers ).forEach( function ( header ) {
lowercaseHeaders[ header.toLowerCase() ] = headers[ header ];
});
//
// optional params that could also be headers
//
var contentMD5 = params.contentMD5 || lowercaseHeaders[ 'content-md5' ] || "",
contentType = params.contentType || lowercaseHeaders[ 'content-type' ]
|| "";
var date = "";
if ( ! lowercaseHeaders[ 'x-amz-date' ] ) {
date = params.date || lowercaseHeaders[ 'date' ]
|| dateformat( new Date(), "UTC:ddd, dd mmm yyyy HH:MM:ss +0000" );
} // if ( ! lowercaseHeaders[ 'x-amz-date' ] )
var canonicalResource = createCanonicalResource( bucketName, objectName,
subResources );
logger.debug( "canonicalResource: " + canonicalResource );
var canonicalAmzHeaders = createCanonicalAmzHeaders( lowercaseHeaders );
logger.debug( "canonicalAmzHeaders: " + canonicalAmzHeaders );
var stringToSign = createStringToSign( httpVerb, contentMD5, contentType,
date, canonicalAmzHeaders, canonicalResource );
logger.debug( "stringToSign: " + stringToSign );
var signature = hmac( secretAccessKey, stringToSign, 'base64' );
var authorizationHeader = "AWS " + awsAccessKeyId + ":" + signature;
return callback( null, {
authorization : authorizationHeader,
date : date,
signature : signature
});
}; // s3
crosstalk.on( 'api.aws.signature.s3', 'public', s3 );