mirror of
				https://github.com/1disk/edp445.git
				synced 2024-08-14 22:47:02 +00:00 
			
		
		
		
	Changed alot of things.
This commit is contained in:
		
							parent
							
								
									a5a0523e5a
								
							
						
					
					
						commit
						3513d5390c
					
				
					 2016 changed files with 336930 additions and 9 deletions
				
			
		
							
								
								
									
										3
									
								
								node_modules/aws4/.github/FUNDING.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								node_modules/aws4/.github/FUNDING.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| # These are supported funding model platforms | ||||
| 
 | ||||
| github: mhart | ||||
							
								
								
									
										9
									
								
								node_modules/aws4/.travis.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								node_modules/aws4/.travis.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| language: node_js | ||||
| node_js: | ||||
|   - "0.10" | ||||
|   - "0.12" | ||||
|   - "4" | ||||
|   - "6" | ||||
|   - "8" | ||||
|   - "10" | ||||
|   - "12" | ||||
							
								
								
									
										19
									
								
								node_modules/aws4/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								node_modules/aws4/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| Copyright 2013 Michael Hart (michael.hart.au@gmail.com) | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
| this software and associated documentation files (the "Software"), to deal in | ||||
| the Software without restriction, including without limitation the rights to | ||||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | ||||
| of the Software, and to permit persons to whom the Software is furnished to do | ||||
| so, subject to the following conditions: | ||||
| 
 | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
							
								
								
									
										183
									
								
								node_modules/aws4/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								node_modules/aws4/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,183 @@ | |||
| aws4 | ||||
| ---- | ||||
| 
 | ||||
| [](https://travis-ci.org/github/mhart/aws4) | ||||
| 
 | ||||
| A small utility to sign vanilla Node.js http(s) request options using Amazon's | ||||
| [AWS Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html). | ||||
| 
 | ||||
| If you want to sign and send AWS requests in a modern browser, or an environment like [Cloudflare Workers](https://developers.cloudflare.com/workers/), then check out [aws4fetch](https://github.com/mhart/aws4fetch) – otherwise you can also bundle this library for use [in older browsers](./browser). | ||||
| 
 | ||||
| The only AWS service that *doesn't* support v4 as of 2020-05-22 is | ||||
| [SimpleDB](https://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/SDB_API.html) | ||||
| (it only supports [AWS Signature Version 2](https://github.com/mhart/aws2)). | ||||
| 
 | ||||
| It also provides defaults for a number of core AWS headers and | ||||
| request parameters, making it very easy to query AWS services, or | ||||
| build out a fully-featured AWS library. | ||||
| 
 | ||||
| Example | ||||
| ------- | ||||
| 
 | ||||
| ```javascript | ||||
| var https = require('https') | ||||
| var aws4  = require('aws4') | ||||
| 
 | ||||
| // to illustrate usage, we'll create a utility function to request and pipe to stdout | ||||
| function request(opts) { https.request(opts, function(res) { res.pipe(process.stdout) }).end(opts.body || '') } | ||||
| 
 | ||||
| // aws4 will sign an options object as you'd pass to http.request, with an AWS service and region | ||||
| var opts = { host: 'my-bucket.s3.us-west-1.amazonaws.com', path: '/my-object', service: 's3', region: 'us-west-1' } | ||||
| 
 | ||||
| // aws4.sign() will sign and modify these options, ready to pass to http.request | ||||
| aws4.sign(opts, { accessKeyId: '', secretAccessKey: '' }) | ||||
| 
 | ||||
| // or it can get credentials from process.env.AWS_ACCESS_KEY_ID, etc | ||||
| aws4.sign(opts) | ||||
| 
 | ||||
| // for most AWS services, aws4 can figure out the service and region if you pass a host | ||||
| opts = { host: 'my-bucket.s3.us-west-1.amazonaws.com', path: '/my-object' } | ||||
| 
 | ||||
| // usually it will add/modify request headers, but you can also sign the query: | ||||
| opts = { host: 'my-bucket.s3.amazonaws.com', path: '/?X-Amz-Expires=12345', signQuery: true } | ||||
| 
 | ||||
| // and for services with simple hosts, aws4 can infer the host from service and region: | ||||
| opts = { service: 'sqs', region: 'us-east-1', path: '/?Action=ListQueues' } | ||||
| 
 | ||||
| // and if you're using us-east-1, it's the default: | ||||
| opts = { service: 'sqs', path: '/?Action=ListQueues' } | ||||
| 
 | ||||
| aws4.sign(opts) | ||||
| console.log(opts) | ||||
| /* | ||||
| { | ||||
|   host: 'sqs.us-east-1.amazonaws.com', | ||||
|   path: '/?Action=ListQueues', | ||||
|   headers: { | ||||
|     Host: 'sqs.us-east-1.amazonaws.com', | ||||
|     'X-Amz-Date': '20121226T061030Z', | ||||
|     Authorization: 'AWS4-HMAC-SHA256 Credential=ABCDEF/20121226/us-east-1/sqs/aws4_request, ...' | ||||
|   } | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| // we can now use this to query AWS | ||||
| request(opts) | ||||
| /* | ||||
| <?xml version="1.0"?> | ||||
| <ListQueuesResponse xmlns="https://queue.amazonaws.com/doc/2012-11-05/"> | ||||
| ... | ||||
| */ | ||||
| 
 | ||||
| // aws4 can infer the HTTP method if a body is passed in | ||||
| // method will be POST and Content-Type: 'application/x-www-form-urlencoded; charset=utf-8' | ||||
| request(aws4.sign({ service: 'iam', body: 'Action=ListGroups&Version=2010-05-08' })) | ||||
| /* | ||||
| <ListGroupsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/"> | ||||
| ... | ||||
| */ | ||||
| 
 | ||||
| // you can specify any custom option or header as per usual | ||||
| request(aws4.sign({ | ||||
|   service: 'dynamodb', | ||||
|   region: 'ap-southeast-2', | ||||
|   method: 'POST', | ||||
|   path: '/', | ||||
|   headers: { | ||||
|     'Content-Type': 'application/x-amz-json-1.0', | ||||
|     'X-Amz-Target': 'DynamoDB_20120810.ListTables' | ||||
|   }, | ||||
|   body: '{}' | ||||
| })) | ||||
| /* | ||||
| {"TableNames":[]} | ||||
| ... | ||||
| */ | ||||
| 
 | ||||
| // The raw RequestSigner can be used to generate CodeCommit Git passwords | ||||
| var signer = new aws4.RequestSigner({ | ||||
|   service: 'codecommit', | ||||
|   host: 'git-codecommit.us-east-1.amazonaws.com', | ||||
|   method: 'GIT', | ||||
|   path: '/v1/repos/MyAwesomeRepo', | ||||
| }) | ||||
| var password = signer.getDateTime() + 'Z' + signer.signature() | ||||
| 
 | ||||
| // see example.js for examples with other services | ||||
| ``` | ||||
| 
 | ||||
| API | ||||
| --- | ||||
| 
 | ||||
| ### aws4.sign(requestOptions, [credentials]) | ||||
| 
 | ||||
| Calculates and populates any necessary AWS headers and/or request | ||||
| options on `requestOptions`. Returns `requestOptions` as a convenience for chaining. | ||||
| 
 | ||||
| `requestOptions` is an object holding the same options that the Node.js | ||||
| [http.request](https://nodejs.org/docs/latest/api/http.html#http_http_request_options_callback) | ||||
| function takes. | ||||
| 
 | ||||
| The following properties of `requestOptions` are used in the signing or | ||||
| populated if they don't already exist: | ||||
| 
 | ||||
| - `hostname` or `host` (will try to be determined from `service` and `region` if not given) | ||||
| - `method` (will use `'GET'` if not given or `'POST'` if there is a `body`) | ||||
| - `path` (will use `'/'` if not given) | ||||
| - `body` (will use `''` if not given) | ||||
| - `service` (will try to be calculated from `hostname` or `host` if not given) | ||||
| - `region` (will try to be calculated from `hostname` or `host` or use `'us-east-1'` if not given) | ||||
| - `signQuery` (to sign the query instead of adding an `Authorization` header, defaults to false) | ||||
| - `headers['Host']` (will use `hostname` or `host` or be calculated if not given) | ||||
| - `headers['Content-Type']` (will use `'application/x-www-form-urlencoded; charset=utf-8'` | ||||
|   if not given and there is a `body`) | ||||
| - `headers['Date']` (used to calculate the signature date if given, otherwise `new Date` is used) | ||||
| 
 | ||||
| Your AWS credentials (which can be found in your | ||||
| [AWS console](https://portal.aws.amazon.com/gp/aws/securityCredentials)) | ||||
| can be specified in one of two ways: | ||||
| 
 | ||||
| - As the second argument, like this: | ||||
| 
 | ||||
| ```javascript | ||||
| aws4.sign(requestOptions, { | ||||
|   secretAccessKey: "<your-secret-access-key>", | ||||
|   accessKeyId: "<your-access-key-id>", | ||||
|   sessionToken: "<your-session-token>" | ||||
| }) | ||||
| ``` | ||||
| 
 | ||||
| - From `process.env`, such as this: | ||||
| 
 | ||||
| ``` | ||||
| export AWS_ACCESS_KEY_ID="<your-access-key-id>" | ||||
| export AWS_SECRET_ACCESS_KEY="<your-secret-access-key>" | ||||
| export AWS_SESSION_TOKEN="<your-session-token>" | ||||
| ``` | ||||
| 
 | ||||
| (will also use `AWS_ACCESS_KEY` and `AWS_SECRET_KEY` if available) | ||||
| 
 | ||||
| The `sessionToken` property and `AWS_SESSION_TOKEN` environment variable are optional for signing | ||||
| with [IAM STS temporary credentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html). | ||||
| 
 | ||||
| Installation | ||||
| ------------ | ||||
| 
 | ||||
| With [npm](https://www.npmjs.com/) do: | ||||
| 
 | ||||
| ``` | ||||
| npm install aws4 | ||||
| ``` | ||||
| 
 | ||||
| Can also be used [in the browser](./browser). | ||||
| 
 | ||||
| Thanks | ||||
| ------ | ||||
| 
 | ||||
| Thanks to [@jed](https://github.com/jed) for his | ||||
| [dynamo-client](https://github.com/jed/dynamo-client) lib where I first | ||||
| committed and subsequently extracted this code. | ||||
| 
 | ||||
| Also thanks to the | ||||
| [official Node.js AWS SDK](https://github.com/aws/aws-sdk-js) for giving | ||||
| me a start on implementing the v4 signature. | ||||
							
								
								
									
										373
									
								
								node_modules/aws4/aws4.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										373
									
								
								node_modules/aws4/aws4.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,373 @@ | |||
| var aws4 = exports, | ||||
|     url = require('url'), | ||||
|     querystring = require('querystring'), | ||||
|     crypto = require('crypto'), | ||||
|     lru = require('./lru'), | ||||
|     credentialsCache = lru(1000) | ||||
| 
 | ||||
| // http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html
 | ||||
| 
 | ||||
| function hmac(key, string, encoding) { | ||||
|   return crypto.createHmac('sha256', key).update(string, 'utf8').digest(encoding) | ||||
| } | ||||
| 
 | ||||
| function hash(string, encoding) { | ||||
|   return crypto.createHash('sha256').update(string, 'utf8').digest(encoding) | ||||
| } | ||||
| 
 | ||||
| // This function assumes the string has already been percent encoded
 | ||||
| function encodeRfc3986(urlEncodedString) { | ||||
|   return urlEncodedString.replace(/[!'()*]/g, function(c) { | ||||
|     return '%' + c.charCodeAt(0).toString(16).toUpperCase() | ||||
|   }) | ||||
| } | ||||
| 
 | ||||
| function encodeRfc3986Full(str) { | ||||
|   return encodeRfc3986(encodeURIComponent(str)) | ||||
| } | ||||
| 
 | ||||
| // A bit of a combination of:
 | ||||
| // https://github.com/aws/aws-sdk-java-v2/blob/dc695de6ab49ad03934e1b02e7263abbd2354be0/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/AbstractAws4Signer.java#L59
 | ||||
| // https://github.com/aws/aws-sdk-js/blob/18cb7e5b463b46239f9fdd4a65e2ff8c81831e8f/lib/signers/v4.js#L191-L199
 | ||||
| // https://github.com/mhart/aws4fetch/blob/b3aed16b6f17384cf36ea33bcba3c1e9f3bdfefd/src/main.js#L25-L34
 | ||||
| var HEADERS_TO_IGNORE = { | ||||
|   'authorization': true, | ||||
|   'connection': true, | ||||
|   'x-amzn-trace-id': true, | ||||
|   'user-agent': true, | ||||
|   'expect': true, | ||||
|   'presigned-expires': true, | ||||
|   'range': true, | ||||
| } | ||||
| 
 | ||||
| // request: { path | body, [host], [method], [headers], [service], [region] }
 | ||||
| // credentials: { accessKeyId, secretAccessKey, [sessionToken] }
 | ||||
| function RequestSigner(request, credentials) { | ||||
| 
 | ||||
|   if (typeof request === 'string') request = url.parse(request) | ||||
| 
 | ||||
|   var headers = request.headers = (request.headers || {}), | ||||
|       hostParts = (!this.service || !this.region) && this.matchHost(request.hostname || request.host || headers.Host || headers.host) | ||||
| 
 | ||||
|   this.request = request | ||||
|   this.credentials = credentials || this.defaultCredentials() | ||||
| 
 | ||||
|   this.service = request.service || hostParts[0] || '' | ||||
|   this.region = request.region || hostParts[1] || 'us-east-1' | ||||
| 
 | ||||
|   // SES uses a different domain from the service name
 | ||||
|   if (this.service === 'email') this.service = 'ses' | ||||
| 
 | ||||
|   if (!request.method && request.body) | ||||
|     request.method = 'POST' | ||||
| 
 | ||||
|   if (!headers.Host && !headers.host) { | ||||
|     headers.Host = request.hostname || request.host || this.createHost() | ||||
| 
 | ||||
|     // If a port is specified explicitly, use it as is
 | ||||
|     if (request.port) | ||||
|       headers.Host += ':' + request.port | ||||
|   } | ||||
|   if (!request.hostname && !request.host) | ||||
|     request.hostname = headers.Host || headers.host | ||||
| 
 | ||||
|   this.isCodeCommitGit = this.service === 'codecommit' && request.method === 'GIT' | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.matchHost = function(host) { | ||||
|   var match = (host || '').match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com(\.cn)?$/) | ||||
|   var hostParts = (match || []).slice(1, 3) | ||||
| 
 | ||||
|   // ES's hostParts are sometimes the other way round, if the value that is expected
 | ||||
|   // to be region equals ‘es’ switch them back
 | ||||
|   // e.g. search-cluster-name-aaaa00aaaa0aaa0aaaaaaa0aaa.us-east-1.es.amazonaws.com
 | ||||
|   if (hostParts[1] === 'es') | ||||
|     hostParts = hostParts.reverse() | ||||
| 
 | ||||
|   if (hostParts[1] == 's3') { | ||||
|     hostParts[0] = 's3' | ||||
|     hostParts[1] = 'us-east-1' | ||||
|   } else { | ||||
|     for (var i = 0; i < 2; i++) { | ||||
|       if (/^s3-/.test(hostParts[i])) { | ||||
|         hostParts[1] = hostParts[i].slice(3) | ||||
|         hostParts[0] = 's3' | ||||
|         break | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return hostParts | ||||
| } | ||||
| 
 | ||||
| // http://docs.aws.amazon.com/general/latest/gr/rande.html
 | ||||
| RequestSigner.prototype.isSingleRegion = function() { | ||||
|   // Special case for S3 and SimpleDB in us-east-1
 | ||||
|   if (['s3', 'sdb'].indexOf(this.service) >= 0 && this.region === 'us-east-1') return true | ||||
| 
 | ||||
|   return ['cloudfront', 'ls', 'route53', 'iam', 'importexport', 'sts'] | ||||
|     .indexOf(this.service) >= 0 | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.createHost = function() { | ||||
|   var region = this.isSingleRegion() ? '' : '.' + this.region, | ||||
|       subdomain = this.service === 'ses' ? 'email' : this.service | ||||
|   return subdomain + region + '.amazonaws.com' | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.prepareRequest = function() { | ||||
|   this.parsePath() | ||||
| 
 | ||||
|   var request = this.request, headers = request.headers, query | ||||
| 
 | ||||
|   if (request.signQuery) { | ||||
| 
 | ||||
|     this.parsedPath.query = query = this.parsedPath.query || {} | ||||
| 
 | ||||
|     if (this.credentials.sessionToken) | ||||
|       query['X-Amz-Security-Token'] = this.credentials.sessionToken | ||||
| 
 | ||||
|     if (this.service === 's3' && !query['X-Amz-Expires']) | ||||
|       query['X-Amz-Expires'] = 86400 | ||||
| 
 | ||||
|     if (query['X-Amz-Date']) | ||||
|       this.datetime = query['X-Amz-Date'] | ||||
|     else | ||||
|       query['X-Amz-Date'] = this.getDateTime() | ||||
| 
 | ||||
|     query['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256' | ||||
|     query['X-Amz-Credential'] = this.credentials.accessKeyId + '/' + this.credentialString() | ||||
|     query['X-Amz-SignedHeaders'] = this.signedHeaders() | ||||
| 
 | ||||
|   } else { | ||||
| 
 | ||||
|     if (!request.doNotModifyHeaders && !this.isCodeCommitGit) { | ||||
|       if (request.body && !headers['Content-Type'] && !headers['content-type']) | ||||
|         headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' | ||||
| 
 | ||||
|       if (request.body && !headers['Content-Length'] && !headers['content-length']) | ||||
|         headers['Content-Length'] = Buffer.byteLength(request.body) | ||||
| 
 | ||||
|       if (this.credentials.sessionToken && !headers['X-Amz-Security-Token'] && !headers['x-amz-security-token']) | ||||
|         headers['X-Amz-Security-Token'] = this.credentials.sessionToken | ||||
| 
 | ||||
|       if (this.service === 's3' && !headers['X-Amz-Content-Sha256'] && !headers['x-amz-content-sha256']) | ||||
|         headers['X-Amz-Content-Sha256'] = hash(this.request.body || '', 'hex') | ||||
| 
 | ||||
|       if (headers['X-Amz-Date'] || headers['x-amz-date']) | ||||
|         this.datetime = headers['X-Amz-Date'] || headers['x-amz-date'] | ||||
|       else | ||||
|         headers['X-Amz-Date'] = this.getDateTime() | ||||
|     } | ||||
| 
 | ||||
|     delete headers.Authorization | ||||
|     delete headers.authorization | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.sign = function() { | ||||
|   if (!this.parsedPath) this.prepareRequest() | ||||
| 
 | ||||
|   if (this.request.signQuery) { | ||||
|     this.parsedPath.query['X-Amz-Signature'] = this.signature() | ||||
|   } else { | ||||
|     this.request.headers.Authorization = this.authHeader() | ||||
|   } | ||||
| 
 | ||||
|   this.request.path = this.formatPath() | ||||
| 
 | ||||
|   return this.request | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.getDateTime = function() { | ||||
|   if (!this.datetime) { | ||||
|     var headers = this.request.headers, | ||||
|       date = new Date(headers.Date || headers.date || new Date) | ||||
| 
 | ||||
|     this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, '') | ||||
| 
 | ||||
|     // Remove the trailing 'Z' on the timestamp string for CodeCommit git access
 | ||||
|     if (this.isCodeCommitGit) this.datetime = this.datetime.slice(0, -1) | ||||
|   } | ||||
|   return this.datetime | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.getDate = function() { | ||||
|   return this.getDateTime().substr(0, 8) | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.authHeader = function() { | ||||
|   return [ | ||||
|     'AWS4-HMAC-SHA256 Credential=' + this.credentials.accessKeyId + '/' + this.credentialString(), | ||||
|     'SignedHeaders=' + this.signedHeaders(), | ||||
|     'Signature=' + this.signature(), | ||||
|   ].join(', ') | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.signature = function() { | ||||
|   var date = this.getDate(), | ||||
|       cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(), | ||||
|       kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey) | ||||
|   if (!kCredentials) { | ||||
|     kDate = hmac('AWS4' + this.credentials.secretAccessKey, date) | ||||
|     kRegion = hmac(kDate, this.region) | ||||
|     kService = hmac(kRegion, this.service) | ||||
|     kCredentials = hmac(kService, 'aws4_request') | ||||
|     credentialsCache.set(cacheKey, kCredentials) | ||||
|   } | ||||
|   return hmac(kCredentials, this.stringToSign(), 'hex') | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.stringToSign = function() { | ||||
|   return [ | ||||
|     'AWS4-HMAC-SHA256', | ||||
|     this.getDateTime(), | ||||
|     this.credentialString(), | ||||
|     hash(this.canonicalString(), 'hex'), | ||||
|   ].join('\n') | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.canonicalString = function() { | ||||
|   if (!this.parsedPath) this.prepareRequest() | ||||
| 
 | ||||
|   var pathStr = this.parsedPath.path, | ||||
|       query = this.parsedPath.query, | ||||
|       headers = this.request.headers, | ||||
|       queryStr = '', | ||||
|       normalizePath = this.service !== 's3', | ||||
|       decodePath = this.service === 's3' || this.request.doNotEncodePath, | ||||
|       decodeSlashesInPath = this.service === 's3', | ||||
|       firstValOnly = this.service === 's3', | ||||
|       bodyHash | ||||
| 
 | ||||
|   if (this.service === 's3' && this.request.signQuery) { | ||||
|     bodyHash = 'UNSIGNED-PAYLOAD' | ||||
|   } else if (this.isCodeCommitGit) { | ||||
|     bodyHash = '' | ||||
|   } else { | ||||
|     bodyHash = headers['X-Amz-Content-Sha256'] || headers['x-amz-content-sha256'] || | ||||
|       hash(this.request.body || '', 'hex') | ||||
|   } | ||||
| 
 | ||||
|   if (query) { | ||||
|     var reducedQuery = Object.keys(query).reduce(function(obj, key) { | ||||
|       if (!key) return obj | ||||
|       obj[encodeRfc3986Full(key)] = !Array.isArray(query[key]) ? query[key] : | ||||
|         (firstValOnly ? query[key][0] : query[key]) | ||||
|       return obj | ||||
|     }, {}) | ||||
|     var encodedQueryPieces = [] | ||||
|     Object.keys(reducedQuery).sort().forEach(function(key) { | ||||
|       if (!Array.isArray(reducedQuery[key])) { | ||||
|         encodedQueryPieces.push(key + '=' + encodeRfc3986Full(reducedQuery[key])) | ||||
|       } else { | ||||
|         reducedQuery[key].map(encodeRfc3986Full).sort() | ||||
|           .forEach(function(val) { encodedQueryPieces.push(key + '=' + val) }) | ||||
|       } | ||||
|     }) | ||||
|     queryStr = encodedQueryPieces.join('&') | ||||
|   } | ||||
|   if (pathStr !== '/') { | ||||
|     if (normalizePath) pathStr = pathStr.replace(/\/{2,}/g, '/') | ||||
|     pathStr = pathStr.split('/').reduce(function(path, piece) { | ||||
|       if (normalizePath && piece === '..') { | ||||
|         path.pop() | ||||
|       } else if (!normalizePath || piece !== '.') { | ||||
|         if (decodePath) piece = decodeURIComponent(piece.replace(/\+/g, ' ')) | ||||
|         path.push(encodeRfc3986Full(piece)) | ||||
|       } | ||||
|       return path | ||||
|     }, []).join('/') | ||||
|     if (pathStr[0] !== '/') pathStr = '/' + pathStr | ||||
|     if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, '/') | ||||
|   } | ||||
| 
 | ||||
|   return [ | ||||
|     this.request.method || 'GET', | ||||
|     pathStr, | ||||
|     queryStr, | ||||
|     this.canonicalHeaders() + '\n', | ||||
|     this.signedHeaders(), | ||||
|     bodyHash, | ||||
|   ].join('\n') | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.canonicalHeaders = function() { | ||||
|   var headers = this.request.headers | ||||
|   function trimAll(header) { | ||||
|     return header.toString().trim().replace(/\s+/g, ' ') | ||||
|   } | ||||
|   return Object.keys(headers) | ||||
|     .filter(function(key) { return HEADERS_TO_IGNORE[key.toLowerCase()] == null }) | ||||
|     .sort(function(a, b) { return a.toLowerCase() < b.toLowerCase() ? -1 : 1 }) | ||||
|     .map(function(key) { return key.toLowerCase() + ':' + trimAll(headers[key]) }) | ||||
|     .join('\n') | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.signedHeaders = function() { | ||||
|   return Object.keys(this.request.headers) | ||||
|     .map(function(key) { return key.toLowerCase() }) | ||||
|     .filter(function(key) { return HEADERS_TO_IGNORE[key] == null }) | ||||
|     .sort() | ||||
|     .join(';') | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.credentialString = function() { | ||||
|   return [ | ||||
|     this.getDate(), | ||||
|     this.region, | ||||
|     this.service, | ||||
|     'aws4_request', | ||||
|   ].join('/') | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.defaultCredentials = function() { | ||||
|   var env = process.env | ||||
|   return { | ||||
|     accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY, | ||||
|     secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY, | ||||
|     sessionToken: env.AWS_SESSION_TOKEN, | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.parsePath = function() { | ||||
|   var path = this.request.path || '/' | ||||
| 
 | ||||
|   // S3 doesn't always encode characters > 127 correctly and
 | ||||
|   // all services don't encode characters > 255 correctly
 | ||||
|   // So if there are non-reserved chars (and it's not already all % encoded), just encode them all
 | ||||
|   if (/[^0-9A-Za-z;,/?:@&=+$\-_.!~*'()#%]/.test(path)) { | ||||
|     path = encodeURI(decodeURI(path)) | ||||
|   } | ||||
| 
 | ||||
|   var queryIx = path.indexOf('?'), | ||||
|       query = null | ||||
| 
 | ||||
|   if (queryIx >= 0) { | ||||
|     query = querystring.parse(path.slice(queryIx + 1)) | ||||
|     path = path.slice(0, queryIx) | ||||
|   } | ||||
| 
 | ||||
|   this.parsedPath = { | ||||
|     path: path, | ||||
|     query: query, | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| RequestSigner.prototype.formatPath = function() { | ||||
|   var path = this.parsedPath.path, | ||||
|       query = this.parsedPath.query | ||||
| 
 | ||||
|   if (!query) return path | ||||
| 
 | ||||
|   // Services don't support empty query string keys
 | ||||
|   if (query[''] != null) delete query[''] | ||||
| 
 | ||||
|   return path + '?' + encodeRfc3986(querystring.stringify(query)) | ||||
| } | ||||
| 
 | ||||
| aws4.RequestSigner = RequestSigner | ||||
| 
 | ||||
| aws4.sign = function(request, credentials) { | ||||
|   return new RequestSigner(request, credentials).sign() | ||||
| } | ||||
							
								
								
									
										96
									
								
								node_modules/aws4/lru.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								node_modules/aws4/lru.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,96 @@ | |||
| module.exports = function(size) { | ||||
|   return new LruCache(size) | ||||
| } | ||||
| 
 | ||||
| function LruCache(size) { | ||||
|   this.capacity = size | 0 | ||||
|   this.map = Object.create(null) | ||||
|   this.list = new DoublyLinkedList() | ||||
| } | ||||
| 
 | ||||
| LruCache.prototype.get = function(key) { | ||||
|   var node = this.map[key] | ||||
|   if (node == null) return undefined | ||||
|   this.used(node) | ||||
|   return node.val | ||||
| } | ||||
| 
 | ||||
| LruCache.prototype.set = function(key, val) { | ||||
|   var node = this.map[key] | ||||
|   if (node != null) { | ||||
|     node.val = val | ||||
|   } else { | ||||
|     if (!this.capacity) this.prune() | ||||
|     if (!this.capacity) return false | ||||
|     node = new DoublyLinkedNode(key, val) | ||||
|     this.map[key] = node | ||||
|     this.capacity-- | ||||
|   } | ||||
|   this.used(node) | ||||
|   return true | ||||
| } | ||||
| 
 | ||||
| LruCache.prototype.used = function(node) { | ||||
|   this.list.moveToFront(node) | ||||
| } | ||||
| 
 | ||||
| LruCache.prototype.prune = function() { | ||||
|   var node = this.list.pop() | ||||
|   if (node != null) { | ||||
|     delete this.map[node.key] | ||||
|     this.capacity++ | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| function DoublyLinkedList() { | ||||
|   this.firstNode = null | ||||
|   this.lastNode = null | ||||
| } | ||||
| 
 | ||||
| DoublyLinkedList.prototype.moveToFront = function(node) { | ||||
|   if (this.firstNode == node) return | ||||
| 
 | ||||
|   this.remove(node) | ||||
| 
 | ||||
|   if (this.firstNode == null) { | ||||
|     this.firstNode = node | ||||
|     this.lastNode = node | ||||
|     node.prev = null | ||||
|     node.next = null | ||||
|   } else { | ||||
|     node.prev = null | ||||
|     node.next = this.firstNode | ||||
|     node.next.prev = node | ||||
|     this.firstNode = node | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| DoublyLinkedList.prototype.pop = function() { | ||||
|   var lastNode = this.lastNode | ||||
|   if (lastNode != null) { | ||||
|     this.remove(lastNode) | ||||
|   } | ||||
|   return lastNode | ||||
| } | ||||
| 
 | ||||
| DoublyLinkedList.prototype.remove = function(node) { | ||||
|   if (this.firstNode == node) { | ||||
|     this.firstNode = node.next | ||||
|   } else if (node.prev != null) { | ||||
|     node.prev.next = node.next | ||||
|   } | ||||
|   if (this.lastNode == node) { | ||||
|     this.lastNode = node.prev | ||||
|   } else if (node.next != null) { | ||||
|     node.next.prev = node.prev | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| function DoublyLinkedNode(key, val) { | ||||
|   this.key = key | ||||
|   this.val = val | ||||
|   this.prev = null | ||||
|   this.next = null | ||||
| } | ||||
							
								
								
									
										17
									
								
								node_modules/aws4/package.json
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								node_modules/aws4/package.json
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| { | ||||
|   "name": "aws4", | ||||
|   "version": "1.11.0", | ||||
|   "description": "Signs and prepares requests using AWS Signature Version 4", | ||||
|   "author": "Michael Hart <michael.hart.au@gmail.com> (https://github.com/mhart)", | ||||
|   "license": "MIT", | ||||
|   "repository": "github:mhart/aws4", | ||||
|   "main": "aws4.js", | ||||
|   "scripts": { | ||||
|     "test": "mocha ./test/fast.js -R list", | ||||
|     "integration": "node ./test/slow.js" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "mocha": "^2.5.3", | ||||
|     "should": "^8.4.0" | ||||
|   } | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue