grape_api_signature 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. checksums.yaml +7 -0
  2. data/.consolerc +3 -0
  3. data/.gitignore +23 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +21 -0
  6. data/.rubocop_todo.yml +0 -0
  7. data/.travis.yml +6 -0
  8. data/.versions.conf +4 -0
  9. data/Gemfile +13 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +146 -0
  12. data/Rakefile +14 -0
  13. data/app/assets/javascripts/aws-signature.js.coffee +177 -0
  14. data/grape_api_signature.gemspec +54 -0
  15. data/lib/grape_api_signature/authorization.rb +79 -0
  16. data/lib/grape_api_signature/aws_auth_parser.rb +57 -0
  17. data/lib/grape_api_signature/aws_authorization.rb +40 -0
  18. data/lib/grape_api_signature/aws_digester.rb +27 -0
  19. data/lib/grape_api_signature/aws_request.rb +63 -0
  20. data/lib/grape_api_signature/aws_signer.rb +76 -0
  21. data/lib/grape_api_signature/middleware/auth.rb +105 -0
  22. data/lib/grape_api_signature/middleware/grape_auth.rb +44 -0
  23. data/lib/grape_api_signature/rails/engine.rb +6 -0
  24. data/lib/grape_api_signature/rspec.rb +49 -0
  25. data/lib/grape_api_signature/version.rb +3 -0
  26. data/lib/grape_api_signature.rb +21 -0
  27. data/spec/acceptance/.gitkeep +0 -0
  28. data/spec/acceptance/lib/grape_api_signature/aws_request_spec.rb +39 -0
  29. data/spec/acceptance/lib/grape_api_signature/aws_signer_spec.rb +54 -0
  30. data/spec/acceptance/lib/grape_api_signature/middleware/auth_spec.rb +60 -0
  31. data/spec/acceptance/lib/grape_api_signature/middleware/grape_auth_spec.rb +83 -0
  32. data/spec/acceptance/support/.keep +0 -0
  33. data/spec/acceptance/support/api.rb +5 -0
  34. data/spec/acceptance/support/aws_helper.rb +30 -0
  35. data/spec/acceptance/support/feature.rb +31 -0
  36. data/spec/acceptance_spec_helper.rb +3 -0
  37. data/spec/fixtures/aws4_test_suite/fail/get-header-key-duplicate.authz +1 -0
  38. data/spec/fixtures/aws4_test_suite/fail/get-header-key-duplicate.creq +9 -0
  39. data/spec/fixtures/aws4_test_suite/fail/get-header-key-duplicate.req +7 -0
  40. data/spec/fixtures/aws4_test_suite/fail/get-header-key-duplicate.sreq +8 -0
  41. data/spec/fixtures/aws4_test_suite/fail/get-header-key-duplicate.sts +4 -0
  42. data/spec/fixtures/aws4_test_suite/fail/get-header-value-multiline.req +7 -0
  43. data/spec/fixtures/aws4_test_suite/fail/get-header-value-order.authz +1 -0
  44. data/spec/fixtures/aws4_test_suite/fail/get-header-value-order.creq +9 -0
  45. data/spec/fixtures/aws4_test_suite/fail/get-header-value-order.req +8 -0
  46. data/spec/fixtures/aws4_test_suite/fail/get-header-value-order.sreq +9 -0
  47. data/spec/fixtures/aws4_test_suite/fail/get-header-value-order.sts +4 -0
  48. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-nonunreserved.authz +1 -0
  49. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-nonunreserved.creq +8 -0
  50. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-nonunreserved.req +4 -0
  51. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-nonunreserved.sreq +5 -0
  52. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-nonunreserved.sts +4 -0
  53. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-space.authz +1 -0
  54. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-space.creq +8 -0
  55. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-space.req +4 -0
  56. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-space.sreq +5 -0
  57. data/spec/fixtures/aws4_test_suite/fail/post-vanilla-query-space.sts +4 -0
  58. data/spec/fixtures/aws4_test_suite/pass/get-header-value-trim.authz +1 -0
  59. data/spec/fixtures/aws4_test_suite/pass/get-header-value-trim.creq +9 -0
  60. data/spec/fixtures/aws4_test_suite/pass/get-header-value-trim.req +5 -0
  61. data/spec/fixtures/aws4_test_suite/pass/get-header-value-trim.sreq +6 -0
  62. data/spec/fixtures/aws4_test_suite/pass/get-header-value-trim.sts +4 -0
  63. data/spec/fixtures/aws4_test_suite/pass/get-relative-relative.authz +1 -0
  64. data/spec/fixtures/aws4_test_suite/pass/get-relative-relative.creq +8 -0
  65. data/spec/fixtures/aws4_test_suite/pass/get-relative-relative.req +4 -0
  66. data/spec/fixtures/aws4_test_suite/pass/get-relative-relative.sreq +5 -0
  67. data/spec/fixtures/aws4_test_suite/pass/get-relative-relative.sts +4 -0
  68. data/spec/fixtures/aws4_test_suite/pass/get-relative.authz +1 -0
  69. data/spec/fixtures/aws4_test_suite/pass/get-relative.creq +8 -0
  70. data/spec/fixtures/aws4_test_suite/pass/get-relative.req +4 -0
  71. data/spec/fixtures/aws4_test_suite/pass/get-relative.sreq +5 -0
  72. data/spec/fixtures/aws4_test_suite/pass/get-relative.sts +4 -0
  73. data/spec/fixtures/aws4_test_suite/pass/get-slash-dot-slash.authz +1 -0
  74. data/spec/fixtures/aws4_test_suite/pass/get-slash-dot-slash.creq +8 -0
  75. data/spec/fixtures/aws4_test_suite/pass/get-slash-dot-slash.req +4 -0
  76. data/spec/fixtures/aws4_test_suite/pass/get-slash-dot-slash.sreq +5 -0
  77. data/spec/fixtures/aws4_test_suite/pass/get-slash-dot-slash.sts +4 -0
  78. data/spec/fixtures/aws4_test_suite/pass/get-slash-pointless-dot.authz +1 -0
  79. data/spec/fixtures/aws4_test_suite/pass/get-slash-pointless-dot.creq +8 -0
  80. data/spec/fixtures/aws4_test_suite/pass/get-slash-pointless-dot.req +4 -0
  81. data/spec/fixtures/aws4_test_suite/pass/get-slash-pointless-dot.sreq +5 -0
  82. data/spec/fixtures/aws4_test_suite/pass/get-slash-pointless-dot.sts +4 -0
  83. data/spec/fixtures/aws4_test_suite/pass/get-slash.authz +1 -0
  84. data/spec/fixtures/aws4_test_suite/pass/get-slash.creq +8 -0
  85. data/spec/fixtures/aws4_test_suite/pass/get-slash.req +4 -0
  86. data/spec/fixtures/aws4_test_suite/pass/get-slash.sreq +5 -0
  87. data/spec/fixtures/aws4_test_suite/pass/get-slash.sts +4 -0
  88. data/spec/fixtures/aws4_test_suite/pass/get-slashes.authz +1 -0
  89. data/spec/fixtures/aws4_test_suite/pass/get-slashes.creq +8 -0
  90. data/spec/fixtures/aws4_test_suite/pass/get-slashes.req +4 -0
  91. data/spec/fixtures/aws4_test_suite/pass/get-slashes.sreq +5 -0
  92. data/spec/fixtures/aws4_test_suite/pass/get-slashes.sts +4 -0
  93. data/spec/fixtures/aws4_test_suite/pass/get-space.authz +1 -0
  94. data/spec/fixtures/aws4_test_suite/pass/get-space.creq +8 -0
  95. data/spec/fixtures/aws4_test_suite/pass/get-space.req +4 -0
  96. data/spec/fixtures/aws4_test_suite/pass/get-space.sreq +5 -0
  97. data/spec/fixtures/aws4_test_suite/pass/get-space.sts +4 -0
  98. data/spec/fixtures/aws4_test_suite/pass/get-unreserved.authz +1 -0
  99. data/spec/fixtures/aws4_test_suite/pass/get-unreserved.creq +8 -0
  100. data/spec/fixtures/aws4_test_suite/pass/get-unreserved.req +4 -0
  101. data/spec/fixtures/aws4_test_suite/pass/get-unreserved.sreq +5 -0
  102. data/spec/fixtures/aws4_test_suite/pass/get-unreserved.sts +4 -0
  103. data/spec/fixtures/aws4_test_suite/pass/get-utf8.authz +1 -0
  104. data/spec/fixtures/aws4_test_suite/pass/get-utf8.creq +8 -0
  105. data/spec/fixtures/aws4_test_suite/pass/get-utf8.req +4 -0
  106. data/spec/fixtures/aws4_test_suite/pass/get-utf8.sreq +5 -0
  107. data/spec/fixtures/aws4_test_suite/pass/get-utf8.sts +4 -0
  108. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-empty-query-key.authz +1 -0
  109. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-empty-query-key.creq +8 -0
  110. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-empty-query-key.req +4 -0
  111. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-empty-query-key.sreq +5 -0
  112. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-empty-query-key.sts +4 -0
  113. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key-case.authz +1 -0
  114. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key-case.creq +8 -0
  115. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key-case.req +4 -0
  116. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key-case.sreq +5 -0
  117. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key-case.sts +4 -0
  118. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key.authz +1 -0
  119. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key.creq +8 -0
  120. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key.req +4 -0
  121. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key.sreq +5 -0
  122. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-key.sts +4 -0
  123. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-value.authz +1 -0
  124. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-value.creq +8 -0
  125. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-value.req +4 -0
  126. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-value.sreq +5 -0
  127. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-order-value.sts +4 -0
  128. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-unreserved.authz +1 -0
  129. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-unreserved.creq +8 -0
  130. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-unreserved.req +4 -0
  131. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-unreserved.sreq +5 -0
  132. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query-unreserved.sts +4 -0
  133. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query.authz +1 -0
  134. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query.creq +8 -0
  135. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query.req +4 -0
  136. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query.sreq +5 -0
  137. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-query.sts +4 -0
  138. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-ut8-query.authz +1 -0
  139. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-ut8-query.creq +8 -0
  140. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-ut8-query.req +4 -0
  141. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-ut8-query.sreq +5 -0
  142. data/spec/fixtures/aws4_test_suite/pass/get-vanilla-ut8-query.sts +4 -0
  143. data/spec/fixtures/aws4_test_suite/pass/get-vanilla.authz +1 -0
  144. data/spec/fixtures/aws4_test_suite/pass/get-vanilla.creq +8 -0
  145. data/spec/fixtures/aws4_test_suite/pass/get-vanilla.req +4 -0
  146. data/spec/fixtures/aws4_test_suite/pass/get-vanilla.sreq +5 -0
  147. data/spec/fixtures/aws4_test_suite/pass/get-vanilla.sts +4 -0
  148. data/spec/fixtures/aws4_test_suite/pass/post-header-key-case.authz +1 -0
  149. data/spec/fixtures/aws4_test_suite/pass/post-header-key-case.creq +8 -0
  150. data/spec/fixtures/aws4_test_suite/pass/post-header-key-case.req +4 -0
  151. data/spec/fixtures/aws4_test_suite/pass/post-header-key-case.sreq +5 -0
  152. data/spec/fixtures/aws4_test_suite/pass/post-header-key-case.sts +4 -0
  153. data/spec/fixtures/aws4_test_suite/pass/post-header-key-sort.authz +1 -0
  154. data/spec/fixtures/aws4_test_suite/pass/post-header-key-sort.creq +9 -0
  155. data/spec/fixtures/aws4_test_suite/pass/post-header-key-sort.req +5 -0
  156. data/spec/fixtures/aws4_test_suite/pass/post-header-key-sort.sreq +6 -0
  157. data/spec/fixtures/aws4_test_suite/pass/post-header-key-sort.sts +4 -0
  158. data/spec/fixtures/aws4_test_suite/pass/post-header-value-case.authz +1 -0
  159. data/spec/fixtures/aws4_test_suite/pass/post-header-value-case.creq +9 -0
  160. data/spec/fixtures/aws4_test_suite/pass/post-header-value-case.req +5 -0
  161. data/spec/fixtures/aws4_test_suite/pass/post-header-value-case.sreq +6 -0
  162. data/spec/fixtures/aws4_test_suite/pass/post-header-value-case.sts +4 -0
  163. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-empty-query-value.authz +1 -0
  164. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-empty-query-value.creq +8 -0
  165. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-empty-query-value.req +4 -0
  166. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-empty-query-value.sreq +5 -0
  167. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-empty-query-value.sts +4 -0
  168. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-query.authz +1 -0
  169. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-query.creq +8 -0
  170. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-query.req +4 -0
  171. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-query.sreq +5 -0
  172. data/spec/fixtures/aws4_test_suite/pass/post-vanilla-query.sts +4 -0
  173. data/spec/fixtures/aws4_test_suite/pass/post-vanilla.authz +1 -0
  174. data/spec/fixtures/aws4_test_suite/pass/post-vanilla.creq +8 -0
  175. data/spec/fixtures/aws4_test_suite/pass/post-vanilla.req +4 -0
  176. data/spec/fixtures/aws4_test_suite/pass/post-vanilla.sreq +5 -0
  177. data/spec/fixtures/aws4_test_suite/pass/post-vanilla.sts +4 -0
  178. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded-parameters.authz +1 -0
  179. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded-parameters.creq +9 -0
  180. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded-parameters.req +6 -0
  181. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded-parameters.sreq +7 -0
  182. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded-parameters.sts +4 -0
  183. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded.authz +1 -0
  184. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded.creq +9 -0
  185. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded.req +6 -0
  186. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded.sreq +7 -0
  187. data/spec/fixtures/aws4_test_suite/pass/post-x-www-form-urlencoded.sts +4 -0
  188. data/spec/integration/.gitkeep +0 -0
  189. data/spec/integration/support/.keep +0 -0
  190. data/spec/integration_spec_helper.rb +3 -0
  191. data/spec/spec_helper.rb +45 -0
  192. data/spec/support/.gitkeep +0 -0
  193. data/spec/unit/.gitkeep +0 -0
  194. data/spec/unit/lib/grape_api_signature/authorization_spec.rb +79 -0
  195. data/spec/unit/lib/grape_api_signature/aws_auth_parser_spec.rb +25 -0
  196. data/spec/unit/support/.keep +0 -0
  197. data/spec/unit_spec_helper.rb +3 -0
  198. data/vendor/assets/javascripts/hmac-sha256.js +18 -0
  199. metadata +692 -0
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=feb926e49e382bec75c9d7dcb2a1b6dc8aa50ca43c25d2bc51143768c0875acc
@@ -0,0 +1,8 @@
1
+ GET
2
+ /
3
+ foo=a&foo=b
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+
7
+ date;host
8
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,4 @@
1
+ GET /?foo=b&foo=a http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+
@@ -0,0 +1,5 @@
1
+ GET /?foo=b&foo=a http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=feb926e49e382bec75c9d7dcb2a1b6dc8aa50ca43c25d2bc51143768c0875acc
5
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ 33dffc220e89131f8f6157a35c40903daa658608d9129ff9489e5cf5bbd9b11b
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=f1498ddb4d6dae767d97c466fb92f1b59a2c71ca29ac954692663f9db03426fb
@@ -0,0 +1,8 @@
1
+ GET
2
+ /
3
+ -._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+
7
+ date;host
8
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,4 @@
1
+ GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+
@@ -0,0 +1,5 @@
1
+ GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=f1498ddb4d6dae767d97c466fb92f1b59a2c71ca29ac954692663f9db03426fb
5
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ d2578f3156d4c9d180713d1ff20601d8a3eed0dd35447d24603d7d67414bd6b5
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470
@@ -0,0 +1,8 @@
1
+ GET
2
+ /
3
+
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+
7
+ date;host
8
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,4 @@
1
+ GET / http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+
@@ -0,0 +1,5 @@
1
+ GET / http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470
5
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ 366b91fb121d72a00f46bbe8d395f53a102b06dfb7e79636515208ed3fa606b1
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=6fb359e9a05394cc7074e0feb42573a2601abc0c869a953e8c5c12e4e01f1a8c
@@ -0,0 +1,8 @@
1
+ GET
2
+ /
3
+ %E1%88%B4=bar
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+
7
+ date;host
8
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,4 @@
1
+ GET /?ሴ=bar http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+
@@ -0,0 +1,5 @@
1
+ GET /?ሴ=bar http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=6fb359e9a05394cc7074e0feb42573a2601abc0c869a953e8c5c12e4e01f1a8c
5
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ de5065ff39c131e6c2e2bd19cd9345a794bf3b561eab20b8d97b2093fc2a979e
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470
@@ -0,0 +1,8 @@
1
+ GET
2
+ /
3
+
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+
7
+ date;host
8
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,4 @@
1
+ GET / http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+
@@ -0,0 +1,5 @@
1
+ GET / http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470
5
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ 366b91fb121d72a00f46bbe8d395f53a102b06dfb7e79636515208ed3fa606b1
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=22902d79e148b64e7571c3565769328423fe276eae4b26f83afceda9e767f726
@@ -0,0 +1,8 @@
1
+ POST
2
+ /
3
+
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+
7
+ date;host
8
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,4 @@
1
+ POST / http/1.1
2
+ DATE:Mon, 09 Sep 2011 23:36:00 GMT
3
+ host:host.foo.com
4
+
@@ -0,0 +1,5 @@
1
+ POST / http/1.1
2
+ DATE:Mon, 09 Sep 2011 23:36:00 GMT
3
+ host:host.foo.com
4
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=22902d79e148b64e7571c3565769328423fe276eae4b26f83afceda9e767f726
5
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ 05da62cee468d24ae84faff3c39f1b85540de60243c1bcaace39c0a2acc7b2c4
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host;zoo, Signature=b7a95a52518abbca0964a999a880429ab734f35ebbf1235bd79a5de87756dc4a
@@ -0,0 +1,9 @@
1
+ POST
2
+ /
3
+
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+ zoo:zoobar
7
+
8
+ date;host;zoo
9
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,5 @@
1
+ POST / http/1.1
2
+ DATE:Mon, 09 Sep 2011 23:36:00 GMT
3
+ host:host.foo.com
4
+ ZOO:zoobar
5
+
@@ -0,0 +1,6 @@
1
+ POST / http/1.1
2
+ DATE:Mon, 09 Sep 2011 23:36:00 GMT
3
+ host:host.foo.com
4
+ ZOO:zoobar
5
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host;zoo, Signature=b7a95a52518abbca0964a999a880429ab734f35ebbf1235bd79a5de87756dc4a
6
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ 34e1bddeb99e76ee01d63b5e28656111e210529efeec6cdfd46a48e4c734545d
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host;zoo, Signature=273313af9d0c265c531e11db70bbd653f3ba074c1009239e8559d3987039cad7
@@ -0,0 +1,9 @@
1
+ POST
2
+ /
3
+
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+ zoo:ZOOBAR
7
+
8
+ date;host;zoo
9
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,5 @@
1
+ POST / http/1.1
2
+ DATE:Mon, 09 Sep 2011 23:36:00 GMT
3
+ host:host.foo.com
4
+ zoo:ZOOBAR
5
+
@@ -0,0 +1,6 @@
1
+ POST / http/1.1
2
+ DATE:Mon, 09 Sep 2011 23:36:00 GMT
3
+ host:host.foo.com
4
+ zoo:ZOOBAR
5
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host;zoo, Signature=273313af9d0c265c531e11db70bbd653f3ba074c1009239e8559d3987039cad7
6
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ 3aae6d8274b8c03e2cc96fc7d6bda4b9bd7a0a184309344470b2c96953e124aa
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=b6e3b79003ce0743a491606ba1035a804593b0efb1e20a11cba83f8c25a57a92
@@ -0,0 +1,8 @@
1
+ POST
2
+ /
3
+ foo=bar
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+
7
+ date;host
8
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,4 @@
1
+ POST /?foo=bar http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+
@@ -0,0 +1,5 @@
1
+ POST /?foo=bar http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=b6e3b79003ce0743a491606ba1035a804593b0efb1e20a11cba83f8c25a57a92
5
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ cd4f39132d8e60bb388831d734230460872b564871c47f5de62e62d1a68dbe1e
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=b6e3b79003ce0743a491606ba1035a804593b0efb1e20a11cba83f8c25a57a92
@@ -0,0 +1,8 @@
1
+ POST
2
+ /
3
+ foo=bar
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+
7
+ date;host
8
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,4 @@
1
+ POST /?foo=bar http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+
@@ -0,0 +1,5 @@
1
+ POST /?foo=bar http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=b6e3b79003ce0743a491606ba1035a804593b0efb1e20a11cba83f8c25a57a92
5
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ cd4f39132d8e60bb388831d734230460872b564871c47f5de62e62d1a68dbe1e
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=22902d79e148b64e7571c3565769328423fe276eae4b26f83afceda9e767f726
@@ -0,0 +1,8 @@
1
+ POST
2
+ /
3
+
4
+ date:Mon, 09 Sep 2011 23:36:00 GMT
5
+ host:host.foo.com
6
+
7
+ date;host
8
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
@@ -0,0 +1,4 @@
1
+ POST / http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+
@@ -0,0 +1,5 @@
1
+ POST / http/1.1
2
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
3
+ Host:host.foo.com
4
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=22902d79e148b64e7571c3565769328423fe276eae4b26f83afceda9e767f726
5
+
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ 05da62cee468d24ae84faff3c39f1b85540de60243c1bcaace39c0a2acc7b2c4
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=content-type;date;host, Signature=b105eb10c6d318d2294de9d49dd8b031b55e3c3fe139f2e637da70511e9e7b71
@@ -0,0 +1,9 @@
1
+ POST
2
+ /
3
+
4
+ content-type:application/x-www-form-urlencoded; charset=utf8
5
+ date:Mon, 09 Sep 2011 23:36:00 GMT
6
+ host:host.foo.com
7
+
8
+ content-type;date;host
9
+ 3ba8907e7a252327488df390ed517c45b96dead033600219bdca7107d1d3f88a
@@ -0,0 +1,6 @@
1
+ POST / http/1.1
2
+ Content-Type:application/x-www-form-urlencoded; charset=utf8
3
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
4
+ Host:host.foo.com
5
+
6
+ foo=bar
@@ -0,0 +1,7 @@
1
+ POST / http/1.1
2
+ Content-Type:application/x-www-form-urlencoded; charset=utf8
3
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
4
+ Host:host.foo.com
5
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=content-type;date;host, Signature=b105eb10c6d318d2294de9d49dd8b031b55e3c3fe139f2e637da70511e9e7b71
6
+
7
+ foo=bar
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ c4115f9e54b5cecf192b1eaa23b8e88ed8dc5391bd4fde7b3fff3d9c9fe0af1f
@@ -0,0 +1 @@
1
+ AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=content-type;date;host, Signature=5a15b22cf462f047318703b92e6f4f38884e4a7ab7b1d6426ca46a8bd1c26cbc
@@ -0,0 +1,9 @@
1
+ POST
2
+ /
3
+
4
+ content-type:application/x-www-form-urlencoded
5
+ date:Mon, 09 Sep 2011 23:36:00 GMT
6
+ host:host.foo.com
7
+
8
+ content-type;date;host
9
+ 3ba8907e7a252327488df390ed517c45b96dead033600219bdca7107d1d3f88a
@@ -0,0 +1,6 @@
1
+ POST / http/1.1
2
+ Content-Type:application/x-www-form-urlencoded
3
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
4
+ Host:host.foo.com
5
+
6
+ foo=bar
@@ -0,0 +1,7 @@
1
+ POST / http/1.1
2
+ Content-Type:application/x-www-form-urlencoded
3
+ Date:Mon, 09 Sep 2011 23:36:00 GMT
4
+ Host:host.foo.com
5
+ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=content-type;date;host, Signature=5a15b22cf462f047318703b92e6f4f38884e4a7ab7b1d6426ca46a8bd1c26cbc
6
+
7
+ foo=bar
@@ -0,0 +1,4 @@
1
+ AWS4-HMAC-SHA256
2
+ 20110909T233600Z
3
+ 20110909/us-east-1/host/aws4_request
4
+ 4c5c6e4b52fb5fb947a8733982a8a5a61b14f04345cbfe6e739236c76dd48f74
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ require 'spec_helper'
2
+
3
+ Dir[File.join(File.expand_path(__dir__), 'integration/support/**/*.rb')].each { |f| require f }
@@ -0,0 +1,45 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'bundler/setup'
4
+ Bundler.require(:development)
5
+
6
+ require 'coveralls'
7
+ Coveralls.wear! unless ENV['SIMPLE_COVERAGE']
8
+
9
+ begin
10
+ if ENV['SIMPLE_COVERAGE']
11
+ require 'simplecov'
12
+ SimpleCov.start do
13
+ add_group 'Lib', 'lib'
14
+
15
+ add_filter '/spec/'
16
+ end
17
+ end
18
+ rescue LoadError
19
+ warn '=' * 80
20
+ warn 'simplecov not installed. No coverage report'
21
+ warn '=' * 80
22
+ end
23
+
24
+ #########################################
25
+ require 'grape_api_signature'
26
+ #########################################
27
+
28
+ Dir[File.join(File.expand_path(__dir__), 'support/**/*.rb')].each { |f| require f }
29
+
30
+ # This file was generated by the `rspec --init` command. Conventionally, all
31
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
32
+ # Require this file using `require "spec_helper"` to ensure that it is only
33
+ # loaded once.
34
+ #
35
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
36
+ RSpec.configure do |config|
37
+ config.run_all_when_everything_filtered = true
38
+ config.filter_run :focus
39
+
40
+ # Run specs in random order to surface order dependencies. If you find an
41
+ # order dependency and want to debug it, you can fix the order by providing
42
+ # the seed, which is printed after each run.
43
+ # --seed 1234
44
+ config.order = 'random'
45
+ end
File without changes
File without changes
@@ -0,0 +1,79 @@
1
+ require 'unit_spec_helper'
2
+
3
+ module GrapeAPISignature
4
+ describe Authorization do
5
+
6
+ let(:request_method) { 'POST' }
7
+ # rubocop:disable LineLength
8
+ let(:headers) do
9
+ {
10
+
11
+ 'Version' => 'HTTP/1.1',
12
+ 'Host' => 'localhost:3000',
13
+ 'Accept' => 'application/json',
14
+ 'Authorization' => 'AWS4-HMAC-SHA256 Credential=abc/20140730/europe/localhost/aws4_request, SignedHeaders=accept;content-type;x-amz-date, Signature=a358bdc1688e595c0f332aa7f7804a749d19908890e43e9e542a6c306190d079',
15
+ 'X-Amz-Date' => '20140730T131050Z',
16
+ 'X-Amz-Algorithm' => 'AWS4-HMAC-SHA256',
17
+ 'X-Amz-Signedheaders' => 'accept;content-type;x-amz-date',
18
+ 'Content-Type' => 'application/json'
19
+
20
+ }
21
+
22
+ end
23
+ # rubocop:enable LineLength
24
+
25
+ let(:uri) { URI('http://localhost:3000/api.json') }
26
+ let(:body) { 'param1=param2, param3, param4' }
27
+
28
+ subject do
29
+ GrapeAPISignature::Authorization.new(
30
+ request_method,
31
+ headers,
32
+ uri,
33
+ body
34
+ ).tap { |auth| allow(auth).to receive(:request_too_old?).and_return(false) }
35
+ end
36
+
37
+ describe '#authentic?' do
38
+
39
+ it 'returns "true" when the signature matches' do
40
+ expect(subject.authentic?('12345678')).to be_truthy
41
+ end
42
+
43
+ it 'returns "false" when the signature does not match' do
44
+ expect(subject.authentic?('01234567')).to be_falsey
45
+ end
46
+
47
+ it 'returns "false" when the signature does match but time is up' do
48
+ allow(subject).to receive(:request_too_old?).and_return(true)
49
+ expect(subject.authentic?('12345678')).to be_falsey
50
+ end
51
+
52
+ end
53
+
54
+ describe '#request_too_old?' do
55
+ let(:datetime) { Time.now }
56
+
57
+ subject do
58
+ GrapeAPISignature::Authorization.new(
59
+ request_method,
60
+ headers,
61
+ uri,
62
+ body
63
+ )
64
+ end
65
+
66
+ it 'returns "false" when 900 seks are not gone' do
67
+ subject.headers['date'] = Time.now
68
+ expect(subject.request_too_old?).to be_falsy
69
+ end
70
+
71
+ it 'returns "true" when 900 seks are gone' do
72
+ subject.headers['date'] = Time.now - 901
73
+ expect(subject.request_too_old?).to be_truthy
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,25 @@
1
+ require 'unit_spec_helper'
2
+
3
+ module GrapeAPISignature
4
+ describe AWSAuthParser do
5
+
6
+ # rubocop:disable LineLength
7
+ let(:aws_auth_str) { 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host;p, Signature=debf546796015d6f6ded8626f5ce98597c33b47b9164cf6b17b4642036fcb592' }
8
+ # rubocop:enable LineLength
9
+
10
+ it 'parses an aws auth string' do
11
+ expect(AWSAuthParser.parse(aws_auth_str)).not_to be_nil
12
+ end
13
+
14
+ it 'sets all aws auth values' do
15
+ result = AWSAuthParser.parse(aws_auth_str)
16
+ expect(result.access_key).to eq 'AKIDEXAMPLE'
17
+ expect(result.date).to eq '20110909'
18
+ expect(result.region).to eq 'us-east-1'
19
+ expect(result.service).to eq 'host'
20
+ expect(result.signed_headers).to eq %w(date host p)
21
+ expect(result.signature).to eq 'debf546796015d6f6ded8626f5ce98597c33b47b9164cf6b17b4642036fcb592'
22
+ end
23
+
24
+ end
25
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ require 'spec_helper'
2
+
3
+ Dir[File.join(File.expand_path(__dir__), 'unit/support/**/*.rb')].each { |f| require f }