aws-sdk 2.0.1 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/.eslintrc +20 -0
  2. package/.gitignore +10 -0
  3. package/.travis.yml +20 -0
  4. package/.yardopts +20 -0
  5. package/.yardopts_guide +21 -0
  6. package/Gemfile +16 -0
  7. package/Gemfile.lock +34 -0
  8. package/README.md +5 -6
  9. package/Rakefile +14 -0
  10. package/UPGRADING.md +9 -4
  11. package/configuration.sample +5 -0
  12. package/dist/BUNDLE_LICENSE.txt +96 -0
  13. package/dist/aws-sdk.js +9594 -0
  14. package/dist/aws-sdk.min.js +21 -0
  15. package/dist-tools/.eslintrc +10 -0
  16. package/dist-tools/browser-builder.js +142 -0
  17. package/dist-tools/strategies/cache.js +68 -0
  18. package/dist-tools/strategies/default.js +165 -0
  19. package/dist-tools/test/browser-builder.mocha.spec.coffee +182 -0
  20. package/dist-tools/test/helpers.coffee +16 -0
  21. package/doc-src/guide/browser-building.md +93 -0
  22. package/doc-src/guide/browser-configuring-wif.md +287 -0
  23. package/doc-src/guide/browser-configuring.md +218 -0
  24. package/doc-src/guide/browser-examples.md +220 -0
  25. package/doc-src/guide/browser-intro.md +46 -0
  26. package/doc-src/guide/browser-making-requests.md +279 -0
  27. package/doc-src/guide/browser-services.md +75 -0
  28. package/doc-src/guide/index.md +41 -0
  29. package/doc-src/guide/node-configuring.md +272 -0
  30. package/doc-src/guide/node-examples.md +341 -0
  31. package/doc-src/guide/node-intro.md +32 -0
  32. package/doc-src/guide/node-making-requests.md +309 -0
  33. package/doc-src/guide/node-services.md +159 -0
  34. package/doc-src/templates/api-versions/model_documentor.rb +366 -0
  35. package/doc-src/templates/api-versions/plugin.rb +230 -0
  36. package/doc-src/templates/api-versions/templates/default/class/html/setup.rb +9 -0
  37. package/doc-src/templates/api-versions/templates/default/class/html/waiter_details_list.erb +7 -0
  38. package/doc-src/templates/api-versions/templates/default/class/html/waiter_summary.erb +7 -0
  39. package/doc-src/templates/api-versions/templates/default/docstring/html/experimental.erb +4 -0
  40. package/doc-src/templates/api-versions/templates/default/docstring/setup.rb +9 -0
  41. package/doc-src/templates/api-versions/templates/default/fulldoc/html/css/common.css +6 -0
  42. package/doc-src/templates/api-versions/templates/default/fulldoc/html/setup.rb +62 -0
  43. package/doc-src/templates/api-versions/templates/default/layout/html/services.erb +10 -0
  44. package/doc-src/templates/api-versions/templates/default/layout/html/setup.rb +28 -0
  45. package/doc-src/templates/api-versions/templates/default/module/html/box_info.erb +45 -0
  46. package/doc-src/templates/api-versions/templates/default/module/html/children.erb +8 -0
  47. package/doc-src/templates/api-versions/templates/default/tags/setup.rb +3 -0
  48. package/doc-src/templates/api-versions/templates/default/waiter_details/html/method_signature.erb +3 -0
  49. package/doc-src/templates/api-versions/templates/default/waiter_details/html/setup.rb +5 -0
  50. package/doc-src/templates/default/layout/html/footer.erb +31 -0
  51. package/doc-src/templates/default/layout/html/layout.erb +23 -0
  52. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/css/highlight.github.css +127 -0
  53. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/css/style.css +1192 -0
  54. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/img/logo.png +0 -0
  55. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/js/app.js +33 -0
  56. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/js/highlight.pack.js +27 -0
  57. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/js/sphinx/AUTHORS +55 -0
  58. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/js/sphinx/LICENSE +25 -0
  59. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/js/sphinx/doctools.js +247 -0
  60. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/js/sphinx/file.png +0 -0
  61. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/js/sphinx/searchtools.js +568 -0
  62. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/js/underscore.js +23 -0
  63. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/search.erb +29 -0
  64. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/search_index.erb +1 -0
  65. package/doc-src/templates/flasky_sphinx_guide/fulldoc/html/setup.rb +75 -0
  66. package/doc-src/templates/flasky_sphinx_guide/layout/html/layout.erb +93 -0
  67. package/doc-src/templates/flasky_sphinx_guide/layout/html/setup.rb +9 -0
  68. package/doc-src/templates/flasky_sphinx_guide/layout/html/sidebar.erb +45 -0
  69. package/doc-src/templates/flasky_sphinx_guide/onefile/html/layout.erb +51 -0
  70. package/doc-src/templates/flasky_sphinx_guide/onefile/html/setup.rb +1 -0
  71. package/eslint-rules/no-require-in-service.js +10 -0
  72. package/features/autoscaling/autoscaling.feature +21 -0
  73. package/features/autoscaling/step_definitions/autoscaling.js +49 -0
  74. package/features/cloudformation/cloudformation.feature +22 -0
  75. package/features/cloudformation/step_definitions/cloudformation.js +26 -0
  76. package/features/cloudfront/cloudfront.feature +28 -0
  77. package/features/cloudfront/step_definitions/cloudfront-latest.js +54 -0
  78. package/features/cloudfront/step_definitions/cloudfront.js +21 -0
  79. package/features/cloudsearch/cloudsearch.feature +34 -0
  80. package/features/cloudsearch/step_definitions/cloudsearch.js +42 -0
  81. package/features/cloudtrail/cloudtrail.feature +17 -0
  82. package/features/cloudtrail/step_definitions/cloudtrail.js +14 -0
  83. package/features/cloudwatch/cloudwatch.feature +15 -0
  84. package/features/cloudwatch/step_definitions/cloudwatch.js +48 -0
  85. package/features/datapipeline/datapipeline.feature +23 -0
  86. package/features/datapipeline/step_definitions/datapipeline.js +79 -0
  87. package/features/directconnect/directconnect.feature +20 -0
  88. package/features/directconnect/step_definitions/directconnect.js +44 -0
  89. package/features/dynamodb/crc32.feature +18 -0
  90. package/features/dynamodb/step_definitions/dynamodb.js +154 -0
  91. package/features/dynamodb/tables.feature +50 -0
  92. package/features/ec2/ec2.feature +28 -0
  93. package/features/ec2/step_definitions/ec2.js +65 -0
  94. package/features/elasticache/elasticache.feature +20 -0
  95. package/features/elasticache/step_definitions/elasticache.js +34 -0
  96. package/features/elasticbeanstalk/elasticbeanstalk.feature +22 -0
  97. package/features/elasticbeanstalk/step_definitions/elasticbeanstalk.js +38 -0
  98. package/features/elastictranscoder/elastictranscoder.feature +24 -0
  99. package/features/elastictranscoder/step_definitions/elastictranscoder.js +56 -0
  100. package/features/elb/elb.feature +19 -0
  101. package/features/elb/step_definitions/elb.js +37 -0
  102. package/features/emr/emr.feature +16 -0
  103. package/features/emr/step_definitions/emr.js +45 -0
  104. package/features/extra/assertions.js +29 -0
  105. package/features/extra/dummy.feature +0 -0
  106. package/features/extra/fixtures/testfile.txt +1 -0
  107. package/features/extra/helpers.js +113 -0
  108. package/features/extra/hooks.js +107 -0
  109. package/features/extra/world.js +12 -0
  110. package/features/glacier/glacier.feature +47 -0
  111. package/features/glacier/step_definitions/glacier.js +112 -0
  112. package/features/iam/iam.feature +24 -0
  113. package/features/iam/step_definitions/iam.js +66 -0
  114. package/features/importexport/importexport.feature +53 -0
  115. package/features/importexport/step_definitions/importexport.js +42 -0
  116. package/features/kinesis/kinesis.feature +9 -0
  117. package/features/kinesis/step_definitions/kinesis.js +10 -0
  118. package/features/opsworks/opsworks.feature +26 -0
  119. package/features/opsworks/step_definitions/opsworks.js +42 -0
  120. package/features/rds/rds.feature +32 -0
  121. package/features/rds/step_definitions/rds.js +72 -0
  122. package/features/redshift/redshift.feature +20 -0
  123. package/features/redshift/step_definitions/redshift.js +33 -0
  124. package/features/route53/route53.feature +41 -0
  125. package/features/route53/step_definitions/route53.js +97 -0
  126. package/features/s3/buckets.feature +40 -0
  127. package/features/s3/objects.feature +122 -0
  128. package/features/s3/step_definitions/buckets.js +136 -0
  129. package/features/s3/step_definitions/hooks.js +39 -0
  130. package/features/s3/step_definitions/objects.js +204 -0
  131. package/features/s3/step_definitions/proxy.js +44 -0
  132. package/features/ses/ses.feature +20 -0
  133. package/features/ses/step_definitions/ses.js +22 -0
  134. package/features/simpledb/simpledb.feature +29 -0
  135. package/features/simpledb/step_definitions/simpledb.js +46 -0
  136. package/features/sns/sns.feature +15 -0
  137. package/features/sns/step_definitions/sns.js +33 -0
  138. package/features/sqs/messages.feature +21 -0
  139. package/features/sqs/queues.feature +18 -0
  140. package/features/sqs/step_definitions/messages.js +46 -0
  141. package/features/sqs/step_definitions/queues.js +33 -0
  142. package/features/sqs/step_definitions/sqs.js +7 -0
  143. package/features/storagegateway/step_definitions/storagegateway.js +16 -0
  144. package/features/storagegateway/storagegateway.feature +13 -0
  145. package/features/sts/step_definitions/sts.js +35 -0
  146. package/features/sts/sts.feature +29 -0
  147. package/features/support/step_definitions/support.js +35 -0
  148. package/features/support/support.feature +18 -0
  149. package/features/swf/step_definitions/swf.js +38 -0
  150. package/features/swf/swf.feature +15 -0
  151. package/index.js +2 -0
  152. package/lib/core.js +2 -2
  153. package/lib/credentials/shared_ini_file_credentials.js +0 -1
  154. package/lib/event_listeners.js +13 -1
  155. package/lib/http/node.js +19 -30
  156. package/lib/model/resource_waiter.js +0 -4
  157. package/lib/model/shape.js +2 -1
  158. package/lib/protocol/rest_xml.js +1 -1
  159. package/lib/region_config.js +31 -0
  160. package/lib/region_config.json +56 -0
  161. package/lib/request.js +37 -45
  162. package/lib/sequential_executor.js +17 -34
  163. package/lib/service.js +17 -44
  164. package/lib/services/cloudsearchdomain.js +69 -0
  165. package/lib/services/route53.js +0 -12
  166. package/lib/services/s3.js +3 -19
  167. package/lib/signers/v4.js +2 -1
  168. package/lib/util.js +28 -3
  169. package/package.json +3 -3
  170. package/scripts/console +11 -3
  171. package/scripts/coverage +126 -0
  172. package/tasks/apis.rake +122 -0
  173. package/tasks/browser.rake +89 -0
  174. package/tasks/docs.rake +36 -0
  175. package/tasks/lib/cucumber_generator.rb +40 -0
  176. package/tasks/util.rake +33 -0
  177. package/test/browser/js/jasmine-1.3.1.js +2600 -0
  178. package/test/browser/js/jasmine-html.js +681 -0
  179. package/test/browser/runner.html +109 -0
  180. package/test/browser/runner.js +92 -0
  181. package/test/browser/sample/appinfo.sample.js +15 -0
  182. package/test/browser/sample/console.html +429 -0
  183. package/test/browser/sample/css/smoothness/images/animated-overlay.gif +0 -0
  184. package/test/browser/sample/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  185. package/test/browser/sample/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  186. package/test/browser/sample/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  187. package/test/browser/sample/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  188. package/test/browser/sample/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  189. package/test/browser/sample/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  190. package/test/browser/sample/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  191. package/test/browser/sample/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  192. package/test/browser/sample/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  193. package/test/browser/sample/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  194. package/test/browser/sample/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  195. package/test/browser/sample/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  196. package/test/browser/sample/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  197. package/test/browser/sample/css/smoothness/jquery-ui-1.10.1.custom.css +1175 -0
  198. package/test/browser/sample/css/smoothness/jquery-ui-1.10.1.custom.min.css +5 -0
  199. package/test/browser/sample/img/loading.gif +0 -0
  200. package/test/browser/sample/js/jquery-1.9.1.js +9597 -0
  201. package/test/browser/sample/js/jquery-ui-1.10.1.custom.js +14903 -0
  202. package/test/browser/sample/js/jquery-ui-1.10.1.custom.min.js +6 -0
  203. package/test/browser/sample/s3upload.html +111 -0
  204. package/test/browser.spec.coffee +207 -0
  205. package/test/config.spec.coffee +202 -0
  206. package/test/credential_provider_chain.spec.coffee +90 -0
  207. package/test/credentials.spec.coffee +452 -0
  208. package/test/endpoint.spec.coffee +80 -0
  209. package/test/event_listeners.spec.coffee +493 -0
  210. package/test/helpers.coffee +150 -0
  211. package/test/http_request.spec.coffee +55 -0
  212. package/test/json/builder.spec.coffee +129 -0
  213. package/test/json/parser.spec.coffee +108 -0
  214. package/test/metadata_service.spec.coffee +54 -0
  215. package/test/model/api.spec.coffee +67 -0
  216. package/test/model/shape.spec.coffee +23 -0
  217. package/test/node_http_client.spec.coffee +40 -0
  218. package/test/param_validator.spec.coffee +456 -0
  219. package/test/protocol/json.spec.coffee +167 -0
  220. package/test/protocol/query.spec.coffee +191 -0
  221. package/test/protocol/rest.spec.coffee +237 -0
  222. package/test/protocol/rest_json.spec.coffee +255 -0
  223. package/test/protocol/rest_xml.spec.coffee +329 -0
  224. package/test/query/query_param_serializer.spec.coffee +327 -0
  225. package/test/region_config.spec.coffee +50 -0
  226. package/test/request.spec.coffee +316 -0
  227. package/test/resource_waiter.spec.coffee +89 -0
  228. package/test/response.spec.coffee +81 -0
  229. package/test/sequential_executor.spec.coffee +118 -0
  230. package/test/service.spec.coffee +230 -0
  231. package/test/services/cloudfront.spec.coffee +44 -0
  232. package/test/services/cloudsearchdomain.spec.coffee +23 -0
  233. package/test/services/dynamodb.spec.coffee +32 -0
  234. package/test/services/ec2.spec.coffee +78 -0
  235. package/test/services/elastictranscoder.spec.coffee +43 -0
  236. package/test/services/glacier.spec.coffee +61 -0
  237. package/test/services/rds.spec.coffee +38 -0
  238. package/test/services/route53.spec.coffee +77 -0
  239. package/test/services/s3.spec.coffee +538 -0
  240. package/test/services/simpledb.spec.coffee +12 -0
  241. package/test/services/sqs.spec.coffee +130 -0
  242. package/test/services/sts.spec.coffee +72 -0
  243. package/test/services/swf.spec.coffee +6 -0
  244. package/test/signers/presign.spec.coffee +36 -0
  245. package/test/signers/s3.spec.coffee +297 -0
  246. package/test/signers/v2.spec.coffee +68 -0
  247. package/test/signers/v4.spec.coffee +135 -0
  248. package/test/util.spec.coffee +510 -0
  249. package/test/xml/builder.spec.coffee +529 -0
  250. package/test/xml/parser.spec.coffee +587 -0
  251. package/lib/services/simpledb.js +0 -15
@@ -0,0 +1,452 @@
1
+ helpers = require('./helpers')
2
+ AWS = helpers.AWS
3
+
4
+ validateCredentials = (creds, key, secret, session) ->
5
+ expect(creds.accessKeyId).toEqual(key || 'akid')
6
+ expect(creds.secretAccessKey).toEqual(secret || 'secret')
7
+ expect(creds.sessionToken).toEqual(session || 'session')
8
+
9
+ describe 'AWS.Credentials', ->
10
+ describe 'constructor', ->
11
+ it 'should allow setting of credentials with keys', ->
12
+ config = new AWS.Config(
13
+ accessKeyId: 'akid'
14
+ secretAccessKey: 'secret'
15
+ sessionToken: 'session'
16
+ )
17
+ validateCredentials(config.credentials)
18
+
19
+ it 'should allow setting of credentials as object', ->
20
+ creds =
21
+ accessKeyId: 'akid'
22
+ secretAccessKey: 'secret'
23
+ sessionToken: 'session'
24
+ validateCredentials(new AWS.Credentials(creds))
25
+
26
+ it 'defaults credentials to undefined when not passed', ->
27
+ creds = new AWS.Credentials()
28
+ expect(creds.accessKeyId).toBe(undefined)
29
+ expect(creds.secretAccessKey).toBe(undefined)
30
+ expect(creds.sessionToken).toBe(undefined)
31
+
32
+ describe 'needsRefresh', ->
33
+ it 'needs refresh if credentials are not set', ->
34
+ creds = new AWS.Credentials()
35
+ expect(creds.needsRefresh()).toEqual(true)
36
+ creds = new AWS.Credentials('akid')
37
+ expect(creds.needsRefresh()).toEqual(true)
38
+
39
+ it 'does not need refresh if credentials are set', ->
40
+ creds = new AWS.Credentials('akid', 'secret')
41
+ expect(creds.needsRefresh()).toEqual(false)
42
+
43
+ it 'needs refresh if creds are expired', ->
44
+ creds = new AWS.Credentials('akid', 'secret')
45
+ creds.expired = true
46
+ expect(creds.needsRefresh()).toEqual(true)
47
+
48
+ it 'can be expired based on expireTime', ->
49
+ creds = new AWS.Credentials('akid', 'secret')
50
+ creds.expired = false
51
+ creds.expireTime = new Date(0)
52
+ expect(creds.needsRefresh()).toEqual(true)
53
+
54
+ it 'needs refresh if expireTime is within expiryWindow secs from now', ->
55
+ creds = new AWS.Credentials('akid', 'secret')
56
+ creds.expired = false
57
+ creds.expireTime = new Date(AWS.util.date.getDate().getTime() + 1000)
58
+ expect(creds.needsRefresh()).toEqual(true)
59
+
60
+ it 'does not need refresh if expireTime outside expiryWindow', ->
61
+ creds = new AWS.Credentials('akid', 'secret')
62
+ creds.expired = false
63
+ ms = AWS.util.date.getDate().getTime() + (creds.expiryWindow + 5) * 1000
64
+ creds.expireTime = new Date(ms)
65
+ expect(creds.needsRefresh()).toEqual(false)
66
+
67
+ describe 'get', ->
68
+ it 'does not call refresh if not needsRefresh', ->
69
+ spy = jasmine.createSpy('done callback')
70
+ creds = new AWS.Credentials('akid', 'secret')
71
+ refresh = spyOn(creds, 'refresh')
72
+ creds.get(spy)
73
+ expect(refresh).not.toHaveBeenCalled()
74
+ expect(spy).toHaveBeenCalled()
75
+ expect(spy.argsForCall[0][0]).toEqual(null)
76
+ expect(creds.expired).toEqual(false)
77
+
78
+ it 'calls refresh only if needsRefresh', ->
79
+ spy = jasmine.createSpy('done callback')
80
+ creds = new AWS.Credentials('akid', 'secret')
81
+ creds.expired = true
82
+ refresh = spyOn(creds, 'refresh').andCallThrough()
83
+ creds.get(spy)
84
+ expect(refresh).toHaveBeenCalled()
85
+ expect(spy).toHaveBeenCalled()
86
+ expect(spy.argsForCall[0][0]).toEqual(null)
87
+ expect(creds.expired).toEqual(false)
88
+
89
+ if AWS.util.isNode()
90
+ describe 'AWS.EnvironmentCredentials', ->
91
+ beforeEach ->
92
+ process.env = {}
93
+
94
+ describe 'constructor', ->
95
+ it 'should be able to read credentials from env with a prefix', ->
96
+ process.env.AWS_ACCESS_KEY_ID = 'akid'
97
+ process.env.AWS_SECRET_ACCESS_KEY = 'secret'
98
+ process.env.AWS_SESSION_TOKEN = 'session'
99
+ creds = new AWS.EnvironmentCredentials('AWS')
100
+ validateCredentials(creds)
101
+
102
+ it 'should be able to read credentials from env without a prefix', ->
103
+ process.env.ACCESS_KEY_ID = 'akid'
104
+ process.env.SECRET_ACCESS_KEY = 'secret'
105
+ process.env.SESSION_TOKEN = 'session'
106
+ creds = new AWS.EnvironmentCredentials()
107
+ validateCredentials(creds)
108
+
109
+ describe 'refresh', ->
110
+ it 'can refresh credentials', ->
111
+ process.env.AWS_ACCESS_KEY_ID = 'akid'
112
+ process.env.AWS_SECRET_ACCESS_KEY = 'secret'
113
+ creds = new AWS.EnvironmentCredentials('AWS')
114
+ expect(creds.accessKeyId).toEqual('akid')
115
+ creds.accessKeyId = 'not_akid'
116
+ expect(creds.accessKeyId).not.toEqual('akid')
117
+ creds.refresh()
118
+ expect(creds.accessKeyId).toEqual('akid')
119
+
120
+ describe 'AWS.FileSystemCredentials', ->
121
+ describe 'constructor', ->
122
+ it 'should accept filename and load credentials from root doc', ->
123
+ mock = '{"accessKeyId":"akid", "secretAccessKey":"secret","sessionToken":"session"}'
124
+ spyOn(AWS.util, 'readFileSync').andReturn(mock)
125
+
126
+ creds = new AWS.FileSystemCredentials('foo')
127
+ validateCredentials(creds)
128
+
129
+ it 'should accept filename and load credentials from credentials block', ->
130
+ mock = '{"credentials":{"accessKeyId":"akid", "secretAccessKey":"secret","sessionToken":"session"}}'
131
+ spy = spyOn(AWS.util, 'readFileSync').andReturn(mock)
132
+
133
+ creds = new AWS.FileSystemCredentials('foo')
134
+ validateCredentials(creds)
135
+
136
+ describe 'refresh', ->
137
+ it 'should refresh from given filename', ->
138
+ mock = '{"credentials":{"accessKeyId":"RELOADED", "secretAccessKey":"RELOADED","sessionToken":"RELOADED"}}'
139
+ spyOn(AWS.util, 'readFileSync').andReturn(mock)
140
+
141
+ creds = new AWS.FileSystemCredentials('foo')
142
+ validateCredentials(creds, 'RELOADED', 'RELOADED', 'RELOADED')
143
+
144
+ it 'fails if credentials are not in the file', ->
145
+ mock = '{"credentials":{}}'
146
+ spyOn(AWS.util, 'readFileSync').andReturn(mock)
147
+
148
+ new AWS.FileSystemCredentials('foo').refresh (err) ->
149
+ expect(err.message).toEqual('Credentials not set in foo')
150
+
151
+ expect(-> new AWS.FileSystemCredentials('foo').refresh()).
152
+ toThrow('Credentials not set in foo')
153
+
154
+ describe 'AWS.SharedIniFileCredentials', ->
155
+ beforeEach ->
156
+ delete process.env.AWS_PROFILE
157
+ delete process.env.HOME
158
+ delete process.env.HOMEPATH
159
+ delete process.env.USERPROFILE
160
+
161
+ describe 'constructor', ->
162
+ it 'throws an error if HOME/HOMEPATH/USERPROFILE are not set', ->
163
+ expect(-> new AWS.SharedIniFileCredentials().refresh()).
164
+ toThrow('Cannot load credentials, HOME path not set')
165
+
166
+ it 'uses HOMEPATH if HOME is not set', ->
167
+ process.env.HOMEPATH = '/homepath'
168
+ creds = new AWS.SharedIniFileCredentials()
169
+ expect(creds.filename).toEqual('/homepath/.aws/credentials')
170
+
171
+ it 'uses USERPROFILE if HOME and HOMEPATH are not set', ->
172
+ process.env.USERPROFILE = '/userprofile'
173
+ creds = new AWS.SharedIniFileCredentials()
174
+ expect(creds.filename).toEqual('/userprofile/.aws/credentials')
175
+
176
+ it 'can override filename as a constructor argument', ->
177
+ creds = new AWS.SharedIniFileCredentials(filename: '/etc/creds')
178
+ expect(creds.filename).toEqual('/etc/creds')
179
+
180
+ describe 'loading', ->
181
+ beforeEach -> process.env.HOME = '/home/user'
182
+
183
+ it 'loads credentials from ~/.aws/credentials using default profile', ->
184
+ mock = '''
185
+ [default]
186
+ aws_access_key_id = akid
187
+ aws_secret_access_key = secret
188
+ aws_session_token = session
189
+ '''
190
+ spyOn(AWS.util, 'readFileSync').andReturn(mock)
191
+
192
+ creds = new AWS.SharedIniFileCredentials()
193
+ validateCredentials(creds)
194
+ expect(AWS.util.readFileSync.calls[0].args[0]).toEqual('/home/user/.aws/credentials')
195
+
196
+ it 'loads the default profile if AWS_PROFILE is empty', ->
197
+ process.env.AWS_PROFILE = ''
198
+ mock = '''
199
+ [default]
200
+ aws_access_key_id = akid
201
+ aws_secret_access_key = secret
202
+ aws_session_token = session
203
+ '''
204
+ spyOn(AWS.util, 'readFileSync').andReturn(mock)
205
+
206
+ creds = new AWS.SharedIniFileCredentials()
207
+ validateCredentials(creds)
208
+
209
+ it 'accepts a profile name parameter', ->
210
+ mock = '''
211
+ [foo]
212
+ aws_access_key_id = akid
213
+ aws_secret_access_key = secret
214
+ aws_session_token = session
215
+ '''
216
+ spy = spyOn(AWS.util, 'readFileSync').andReturn(mock)
217
+
218
+ creds = new AWS.SharedIniFileCredentials(profile: 'foo')
219
+ validateCredentials(creds)
220
+
221
+ it 'sets profile based on ENV', ->
222
+ process.env.AWS_PROFILE = 'foo'
223
+ mock = '''
224
+ [foo]
225
+ aws_access_key_id = akid
226
+ aws_secret_access_key = secret
227
+ aws_session_token = session
228
+ '''
229
+ spy = spyOn(AWS.util, 'readFileSync').andReturn(mock)
230
+
231
+ creds = new AWS.SharedIniFileCredentials()
232
+ validateCredentials(creds)
233
+
234
+ describe 'refresh', ->
235
+ beforeEach -> process.env.HOME = '/home/user'
236
+
237
+ it 'should refresh from disk', ->
238
+ mock = '''
239
+ [default]
240
+ aws_access_key_id = RELOADED
241
+ aws_secret_access_key = RELOADED
242
+ aws_session_token = RELOADED
243
+ '''
244
+ spyOn(AWS.util, 'readFileSync').andReturn(mock)
245
+
246
+ creds = new AWS.SharedIniFileCredentials()
247
+ validateCredentials(creds, 'RELOADED', 'RELOADED', 'RELOADED')
248
+
249
+ it 'fails if credentials are not in the file', ->
250
+ mock = ''
251
+ spyOn(AWS.util, 'readFileSync').andReturn(mock)
252
+
253
+ new AWS.SharedIniFileCredentials().refresh (err) ->
254
+ expect(err.message).toEqual('Credentials not set in /home/user/.aws/credentials using profile default')
255
+
256
+ expect(-> new AWS.SharedIniFileCredentials().refresh()).
257
+ toThrow('Credentials not set in /home/user/.aws/credentials using profile default')
258
+
259
+ describe 'AWS.EC2MetadataCredentials', ->
260
+ creds = null
261
+
262
+ beforeEach ->
263
+ creds = new AWS.EC2MetadataCredentials(host: 'host')
264
+
265
+ mockMetadataService = (expireTime) ->
266
+ spyOn(creds.metadataService, 'loadCredentials').andCallFake (cb) ->
267
+ cb null,
268
+ Code: 'Success'
269
+ AccessKeyId: 'KEY'
270
+ SecretAccessKey: 'SECRET'
271
+ Token: 'TOKEN'
272
+ Expiration: expireTime.toISOString()
273
+
274
+ describe 'constructor', ->
275
+ it 'allows passing of AWS.MetadataService options', ->
276
+ expect(creds.metadataService.host).toEqual('host')
277
+
278
+ describe 'needsRefresh', ->
279
+ it 'can be expired based on expire time from EC2 Metadata service', ->
280
+ mockMetadataService(new Date(0))
281
+ creds.refresh(->)
282
+ expect(creds.needsRefresh()).toEqual(true)
283
+
284
+ describe 'refresh', ->
285
+ it 'loads credentials from EC2 Metadata service', ->
286
+ mockMetadataService(new Date(AWS.util.date.getDate().getTime() + 100000))
287
+ creds.refresh(->)
288
+ expect(creds.metadata.Code).toEqual('Success')
289
+ expect(creds.accessKeyId).toEqual('KEY')
290
+ expect(creds.secretAccessKey).toEqual('SECRET')
291
+ expect(creds.sessionToken).toEqual('TOKEN')
292
+ expect(creds.needsRefresh()).toEqual(false)
293
+
294
+ it 'does try to load creds second time if Metadata service failed', ->
295
+ spy = spyOn(creds.metadataService, 'loadCredentials').andCallFake (cb) ->
296
+ cb(new Error('INVALID SERVICE'))
297
+
298
+ creds.refresh (err) ->
299
+ expect(err.message).toEqual('INVALID SERVICE')
300
+ creds.refresh ->
301
+ creds.refresh ->
302
+ creds.refresh ->
303
+ expect(spy.calls.length).toEqual(4)
304
+
305
+ describe 'AWS.TemporaryCredentials', ->
306
+ creds = null
307
+
308
+ beforeEach ->
309
+ creds = new AWS.TemporaryCredentials(DurationSeconds: 1200)
310
+
311
+ mockSTS = (expireTime, inParams) ->
312
+ if !inParams
313
+ inParams = DurationSeconds: 1200
314
+ if inParams.RoleArn
315
+ operation = 'assumeRole'
316
+ else
317
+ operation = 'getSessionToken'
318
+ spyOn(creds.service, operation).andCallFake (params, cb) ->
319
+ expect(params).toEqual(inParams)
320
+ cb null, Credentials:
321
+ AccessKeyId: 'KEY'
322
+ SecretAccessKey: 'SECRET'
323
+ SessionToken: 'TOKEN'
324
+ Expiration: expireTime
325
+
326
+ describe 'masterCredentials', ->
327
+ it 'seeds masterCredentials from global credentials', ->
328
+ origCreds = AWS.config.credentials
329
+ AWS.config.credentials = new AWS.Credentials('AKID', 'SECRET')
330
+ creds = new AWS.TemporaryCredentials()
331
+ expect(creds.masterCredentials.accessKeyId).toEqual('AKID')
332
+ expect(creds.masterCredentials.secretAccessKey).toEqual('SECRET')
333
+ AWS.config.credentials = origCreds
334
+
335
+ it 'seeds masterCredentials from temporary credentials', ->
336
+ origCreds = AWS.config.credentials
337
+ AWS.config.credentials = new AWS.Credentials('AKID', 'SECRET')
338
+ for i in [0..3]
339
+ creds = new AWS.TemporaryCredentials()
340
+ expect(creds.masterCredentials.accessKeyId).toEqual('AKID')
341
+ expect(creds.masterCredentials.secretAccessKey).toEqual('SECRET')
342
+ AWS.config.credentials = origCreds
343
+
344
+
345
+ describe 'needsRefresh', ->
346
+ it 'can be expired based on expire time from STS response', ->
347
+ mockSTS(new Date(0))
348
+ creds.refresh(->)
349
+ expect(creds.needsRefresh()).toEqual(true)
350
+
351
+ describe 'refresh', ->
352
+ it 'loads temporary credentials from STS using getSessionToken', ->
353
+ mockSTS(new Date(AWS.util.date.getDate().getTime() + 100000))
354
+ creds.refresh(->)
355
+ expect(creds.accessKeyId).toEqual('KEY')
356
+ expect(creds.secretAccessKey).toEqual('SECRET')
357
+ expect(creds.sessionToken).toEqual('TOKEN')
358
+ expect(creds.needsRefresh()).toEqual(false)
359
+
360
+ it 'loads temporary credentials from STS using assumeRole if RoleArn is provided', ->
361
+ creds = new AWS.TemporaryCredentials(RoleArn: 'ARN')
362
+ mockSTS(new Date(AWS.util.date.getDate().getTime() + 100000),
363
+ RoleArn: 'ARN', RoleSessionName: 'temporary-credentials')
364
+ creds.refresh(->)
365
+ expect(creds.accessKeyId).toEqual('KEY')
366
+ expect(creds.secretAccessKey).toEqual('SECRET')
367
+ expect(creds.sessionToken).toEqual('TOKEN')
368
+ expect(creds.needsRefresh()).toEqual(false)
369
+
370
+ it 'does try to load creds second time if service request failed', ->
371
+ spy = spyOn(creds.service, 'getSessionToken').andCallFake (params, cb) ->
372
+ cb(new Error('INVALID SERVICE'))
373
+
374
+ creds.refresh (err) ->
375
+ expect(err.message).toEqual('INVALID SERVICE')
376
+ creds.refresh ->
377
+ creds.refresh ->
378
+ creds.refresh ->
379
+ expect(spy.calls.length).toEqual(4)
380
+
381
+ describe 'AWS.WebIdentityCredentials', ->
382
+ creds = null
383
+
384
+ beforeEach ->
385
+ creds = new AWS.WebIdentityCredentials(WebIdentityToken: 'token', RoleArn: 'arn')
386
+
387
+ mockSTS = (expireTime) ->
388
+ spyOn(creds.service, 'assumeRoleWithWebIdentity').andCallFake (params, cb) ->
389
+ expect(params).toEqual(RoleArn: 'arn', WebIdentityToken: 'token', RoleSessionName: 'web-identity')
390
+ cb null,
391
+ Credentials:
392
+ AccessKeyId: 'KEY'
393
+ SecretAccessKey: 'SECRET'
394
+ SessionToken: 'TOKEN'
395
+ Expiration: expireTime
396
+ OtherProperty: true
397
+
398
+ describe 'refresh', ->
399
+ it 'loads federated credentials from STS', ->
400
+ mockSTS(new Date(AWS.util.date.getDate().getTime() + 100000))
401
+ creds.refresh(->)
402
+ expect(creds.accessKeyId).toEqual('KEY')
403
+ expect(creds.secretAccessKey).toEqual('SECRET')
404
+ expect(creds.sessionToken).toEqual('TOKEN')
405
+ expect(creds.needsRefresh()).toEqual(false)
406
+ expect(creds.data.OtherProperty).toEqual(true)
407
+
408
+ it 'does try to load creds second time if service request failed', ->
409
+ spy = spyOn(creds.service, 'assumeRoleWithWebIdentity').andCallFake (params, cb) ->
410
+ cb(new Error('INVALID SERVICE'))
411
+
412
+ creds.refresh (err) ->
413
+ expect(err.message).toEqual('INVALID SERVICE')
414
+ creds.refresh ->
415
+ creds.refresh ->
416
+ creds.refresh ->
417
+ expect(spy.calls.length).toEqual(4)
418
+
419
+ describe 'AWS.SAMLCredentials', ->
420
+ creds = null
421
+
422
+ beforeEach ->
423
+ creds = new AWS.SAMLCredentials(SAMLAssertion: 'token', RoleArn: 'arn', PrincipalArn: 'arn')
424
+
425
+ mockSTS = (expireTime) ->
426
+ spyOn(creds.service, 'assumeRoleWithSAML').andCallFake (params, cb) ->
427
+ expect(params).toEqual(SAMLAssertion: 'token', RoleArn: 'arn', PrincipalArn: 'arn')
428
+ cb null, Credentials:
429
+ AccessKeyId: 'KEY'
430
+ SecretAccessKey: 'SECRET'
431
+ SessionToken: 'TOKEN'
432
+ Expiration: expireTime
433
+
434
+ describe 'refresh', ->
435
+ it 'loads federated credentials from STS', ->
436
+ mockSTS(new Date(AWS.util.date.getDate().getTime() + 100000))
437
+ creds.refresh(->)
438
+ expect(creds.accessKeyId).toEqual('KEY')
439
+ expect(creds.secretAccessKey).toEqual('SECRET')
440
+ expect(creds.sessionToken).toEqual('TOKEN')
441
+ expect(creds.needsRefresh()).toEqual(false)
442
+
443
+ it 'does try to load creds second time if service request failed', ->
444
+ spy = spyOn(creds.service, 'assumeRoleWithSAML').andCallFake (params, cb) ->
445
+ cb(new Error('INVALID SERVICE'))
446
+
447
+ creds.refresh (err) ->
448
+ expect(err.message).toEqual('INVALID SERVICE')
449
+ creds.refresh ->
450
+ creds.refresh ->
451
+ creds.refresh ->
452
+ expect(spy.calls.length).toEqual(4)
@@ -0,0 +1,80 @@
1
+ AWS = require('./helpers').AWS
2
+
3
+ describe 'AWS.Endpoint', ->
4
+ it 'throws error if parameter is null/undefined', ->
5
+ expect(-> new AWS.Endpoint(null)).toThrow('Invalid endpoint: null')
6
+ expect(-> new AWS.Endpoint(undefined)).toThrow('Invalid endpoint: undefined')
7
+
8
+ it 'copy constructs Endpoint', ->
9
+ origEndpoint = new AWS.Endpoint('http://domain.com')
10
+ endpoint = new AWS.Endpoint(origEndpoint)
11
+ expect(endpoint).not.toBe(origEndpoint)
12
+ expect(endpoint.host).toEqual('domain.com')
13
+
14
+ it 'retains the entire endpoint as the endpoint href', ->
15
+ href = 'http://domain.com/'
16
+ endpoint = new AWS.Endpoint(href)
17
+ expect(endpoint.href).toEqual(href)
18
+
19
+ it 'populates the endpoint properites from the endpoint href', ->
20
+ href = 'http://domain.com/'
21
+ endpoint = new AWS.Endpoint(href)
22
+ expect(endpoint.href).toEqual(href)
23
+ expect(endpoint.protocol).toEqual('http:')
24
+ expect(endpoint.host).toEqual('domain.com')
25
+ expect(endpoint.hostname).toEqual('domain.com')
26
+ expect(endpoint.port).toEqual(80)
27
+
28
+ it 'keeps port in host when non-standard', ->
29
+ href = 'http://domain.com:123/'
30
+ endpoint = new AWS.Endpoint(href)
31
+ expect(endpoint.href).toEqual(href)
32
+ expect(endpoint.protocol).toEqual('http:')
33
+ expect(endpoint.host).toEqual('domain.com:123')
34
+ expect(endpoint.hostname).toEqual('domain.com')
35
+ expect(endpoint.port).toEqual(123)
36
+
37
+ it 'works with https endpoints', ->
38
+ href = 'https://secure.domain.com/'
39
+ endpoint = new AWS.Endpoint(href)
40
+ expect(endpoint.href).toEqual(href)
41
+ expect(endpoint.protocol).toEqual('https:')
42
+ expect(endpoint.host).toEqual('secure.domain.com')
43
+ expect(endpoint.hostname).toEqual('secure.domain.com')
44
+ expect(endpoint.port).toEqual(443)
45
+
46
+ it 'keeps port in host when non-standard for SSL', ->
47
+ href = 'https://secure.domain.com:123/'
48
+ endpoint = new AWS.Endpoint(href)
49
+ expect(endpoint.href).toEqual(href)
50
+ expect(endpoint.protocol).toEqual('https:')
51
+ expect(endpoint.host).toEqual('secure.domain.com:123')
52
+ expect(endpoint.hostname).toEqual('secure.domain.com')
53
+ expect(endpoint.port).toEqual(123)
54
+
55
+ it 'defaults the protocol to the current AWS.config.sslEnabled mode', ->
56
+ AWS.config.sslEnabled = false
57
+ endpoint = new AWS.Endpoint('domain.com')
58
+ expect(endpoint.href).toEqual('http://domain.com/')
59
+ expect(endpoint.protocol).toEqual('http:')
60
+ expect(endpoint.host).toEqual('domain.com')
61
+ expect(endpoint.hostname).toEqual('domain.com')
62
+ expect(endpoint.port).toEqual(80)
63
+
64
+ it 'defaults the protocol to the current AWS.config.sslEnabled mode', ->
65
+ AWS.config.sslEnabled = true
66
+ endpoint = new AWS.Endpoint('domain.com')
67
+ expect(endpoint.href).toEqual('https://domain.com/')
68
+ expect(endpoint.protocol).toEqual('https:')
69
+ expect(endpoint.host).toEqual('domain.com')
70
+ expect(endpoint.hostname).toEqual('domain.com')
71
+ expect(endpoint.port).toEqual(443)
72
+
73
+ it 'accepts a configuration object that specifies the mode', ->
74
+ expect(AWS.config.sslEnabled).toEqual(true)
75
+ endpoint = new AWS.Endpoint('domain.com', { sslEnabled: false })
76
+ expect(endpoint.href).toEqual('http://domain.com/')
77
+ expect(endpoint.protocol).toEqual('http:')
78
+ expect(endpoint.host).toEqual('domain.com')
79
+ expect(endpoint.hostname).toEqual('domain.com')
80
+ expect(endpoint.port).toEqual(80)