fsevents 1.0.7 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fsevents might be problematic. Click here for more details.

Files changed (322) hide show
  1. package/node_modules/ansi/History.md +7 -0
  2. package/node_modules/ansi/LICENSE +24 -0
  3. package/node_modules/ansi/lib/ansi.js +2 -2
  4. package/node_modules/ansi/package.json +15 -10
  5. package/node_modules/ansi-regex/package.json +1 -0
  6. package/node_modules/ansi-styles/package.json +1 -0
  7. package/node_modules/are-we-there-yet/.npmignore +2 -0
  8. package/node_modules/are-we-there-yet/index.js +20 -18
  9. package/node_modules/are-we-there-yet/package.json +15 -13
  10. package/node_modules/asn1/package.json +3 -1
  11. package/node_modules/assert-plus/README.md +50 -21
  12. package/node_modules/assert-plus/assert.js +168 -207
  13. package/node_modules/assert-plus/package.json +55 -15
  14. package/node_modules/async/README.md +86 -4
  15. package/node_modules/async/dist/async.js +4 -3
  16. package/node_modules/async/dist/async.min.js +1 -1
  17. package/node_modules/async/lib/async.js +4 -3
  18. package/node_modules/async/package.json +10 -10
  19. package/node_modules/aws-sign2/package.json +1 -0
  20. package/node_modules/aws4/.npmignore +3 -0
  21. package/node_modules/aws4/.tern-port +1 -0
  22. package/node_modules/{tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match → aws4}/.travis.yml +2 -0
  23. package/node_modules/{tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md → aws4/LICENSE} +1 -3
  24. package/node_modules/aws4/README.md +510 -0
  25. package/node_modules/aws4/aws4.js +313 -0
  26. package/node_modules/aws4/example.js +372 -0
  27. package/node_modules/aws4/node_modules/lru-cache/.npmignore +1 -0
  28. package/node_modules/aws4/node_modules/lru-cache/.travis.yml +8 -0
  29. package/node_modules/aws4/node_modules/lru-cache/CONTRIBUTORS +14 -0
  30. package/node_modules/aws4/node_modules/lru-cache/README.md +137 -0
  31. package/node_modules/aws4/node_modules/lru-cache/lib/lru-cache.js +334 -0
  32. package/node_modules/aws4/node_modules/lru-cache/package.json +66 -0
  33. package/node_modules/aws4/node_modules/lru-cache/test/basic.js +396 -0
  34. package/node_modules/aws4/node_modules/lru-cache/test/foreach.js +120 -0
  35. package/node_modules/aws4/node_modules/lru-cache/test/memory-leak.js +51 -0
  36. package/node_modules/aws4/node_modules/lru-cache/test/serialize.js +216 -0
  37. package/node_modules/aws4/package.json +113 -0
  38. package/node_modules/bl/.travis.yml +5 -6
  39. package/node_modules/bl/bl.js +5 -0
  40. package/node_modules/bl/package.json +16 -13
  41. package/node_modules/bl/test/test.js +554 -6
  42. package/node_modules/block-stream/package.json +1 -0
  43. package/node_modules/boom/package.json +1 -0
  44. package/node_modules/caseless/package.json +1 -0
  45. package/node_modules/chalk/package.json +1 -0
  46. package/node_modules/combined-stream/package.json +1 -0
  47. package/node_modules/commander/package.json +1 -0
  48. package/node_modules/core-util-is/package.json +2 -2
  49. package/node_modules/cryptiles/package.json +1 -0
  50. package/node_modules/dashdash/README.md +70 -7
  51. package/node_modules/dashdash/etc/dashdash.bash_completion.in +388 -0
  52. package/node_modules/dashdash/lib/dashdash.js +202 -2
  53. package/node_modules/dashdash/package.json +12 -9
  54. package/node_modules/debug/.jshintrc +3 -0
  55. package/node_modules/debug/.npmignore +6 -0
  56. package/node_modules/debug/History.md +195 -0
  57. package/node_modules/debug/Makefile +36 -0
  58. package/node_modules/debug/Readme.md +86 -13
  59. package/node_modules/debug/bower.json +28 -0
  60. package/node_modules/debug/browser.js +168 -0
  61. package/node_modules/debug/component.json +19 -0
  62. package/node_modules/debug/debug.js +132 -72
  63. package/node_modules/debug/node.js +209 -0
  64. package/node_modules/debug/package.json +32 -22
  65. package/node_modules/deep-extend/README.md +51 -50
  66. package/node_modules/deep-extend/package.json +14 -16
  67. package/node_modules/delayed-stream/package.json +1 -0
  68. package/node_modules/delegates/History.md +6 -0
  69. package/node_modules/delegates/License +20 -0
  70. package/node_modules/delegates/package.json +17 -13
  71. package/node_modules/ecc-jsbn/package.json +3 -1
  72. package/node_modules/escape-string-regexp/package.json +2 -2
  73. package/node_modules/extend/package.json +1 -0
  74. package/node_modules/extsprintf/package.json +4 -2
  75. package/node_modules/forever-agent/package.json +1 -0
  76. package/node_modules/form-data/package.json +1 -0
  77. package/node_modules/fstream/package.json +1 -0
  78. package/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +1 -0
  79. package/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +1 -0
  80. package/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/package.json +1 -0
  81. package/node_modules/fstream-ignore/node_modules/minimatch/package.json +1 -0
  82. package/node_modules/fstream-ignore/package.json +3 -1
  83. package/node_modules/gauge/package.json +14 -12
  84. package/node_modules/gauge/progress-bar.js +4 -5
  85. package/node_modules/gauge/test/progress-bar.js +1 -1
  86. package/node_modules/generate-function/package.json +1 -0
  87. package/node_modules/generate-object-property/package.json +1 -0
  88. package/node_modules/graceful-fs/README.md +17 -0
  89. package/node_modules/graceful-fs/graceful-fs.js +2 -0
  90. package/node_modules/graceful-fs/package.json +16 -11
  91. package/node_modules/graceful-readlink/package.json +1 -0
  92. package/node_modules/har-validator/README.md +45 -122
  93. package/node_modules/har-validator/package.json +16 -16
  94. package/node_modules/has-ansi/package.json +1 -0
  95. package/node_modules/has-unicode/README.md +6 -3
  96. package/node_modules/has-unicode/index.js +7 -3
  97. package/node_modules/has-unicode/package.json +15 -13
  98. package/node_modules/has-unicode/test/index.js +1 -1
  99. package/node_modules/hawk/README.md +634 -634
  100. package/node_modules/hawk/bower.json +24 -24
  101. package/node_modules/hawk/component.json +18 -18
  102. package/node_modules/hawk/dist/client.js +343 -340
  103. package/node_modules/hawk/example/usage.js +78 -78
  104. package/node_modules/hawk/lib/browser.js +637 -637
  105. package/node_modules/hawk/lib/client.js +369 -369
  106. package/node_modules/hawk/lib/crypto.js +126 -126
  107. package/node_modules/hawk/lib/index.js +15 -15
  108. package/node_modules/hawk/lib/server.js +548 -540
  109. package/node_modules/hawk/lib/utils.js +184 -164
  110. package/node_modules/hawk/package.json +9 -8
  111. package/node_modules/hawk/test/browser.js +1492 -1492
  112. package/node_modules/hawk/test/client.js +440 -440
  113. package/node_modules/hawk/test/crypto.js +70 -70
  114. package/node_modules/hawk/test/index.js +378 -378
  115. package/node_modules/hawk/test/readme.js +95 -95
  116. package/node_modules/hawk/test/server.js +1329 -1302
  117. package/node_modules/hawk/test/uri.js +838 -838
  118. package/node_modules/hawk/test/utils.js +149 -121
  119. package/node_modules/hoek/package.json +1 -0
  120. package/node_modules/http-signature/CHANGES.md +7 -0
  121. package/node_modules/http-signature/http_signing.md +71 -3
  122. package/node_modules/http-signature/lib/signer.js +5 -0
  123. package/node_modules/http-signature/package.json +13 -11
  124. package/node_modules/ini/package.json +3 -1
  125. package/node_modules/is-my-json-valid/formats.js +1 -1
  126. package/node_modules/is-my-json-valid/package.json +11 -10
  127. package/node_modules/is-property/package.json +1 -0
  128. package/node_modules/is-typedarray/package.json +3 -1
  129. package/node_modules/isarray/package.json +2 -2
  130. package/node_modules/isstream/package.json +1 -0
  131. package/node_modules/jodid25519/package.json +3 -1
  132. package/node_modules/jsbn/package.json +3 -1
  133. package/node_modules/json-schema/package.json +2 -1
  134. package/node_modules/json-stringify-safe/package.json +1 -0
  135. package/node_modules/jsonpointer/package.json +1 -0
  136. package/node_modules/jsprim/package.json +3 -1
  137. package/node_modules/lodash._basetostring/package.json +4 -4
  138. package/node_modules/lodash._createpadding/package.json +3 -2
  139. package/node_modules/lodash._root/LICENSE +22 -0
  140. package/node_modules/lodash._root/README.md +18 -0
  141. package/node_modules/lodash._root/index.js +53 -0
  142. package/node_modules/lodash._root/package.json +77 -0
  143. package/node_modules/lodash.pad/LICENSE +2 -2
  144. package/node_modules/lodash.pad/README.md +4 -6
  145. package/node_modules/lodash.pad/index.js +347 -15
  146. package/node_modules/lodash.pad/package.json +20 -34
  147. package/node_modules/lodash.padleft/package.json +3 -1
  148. package/node_modules/lodash.padright/package.json +3 -1
  149. package/node_modules/lodash.repeat/LICENSE +2 -2
  150. package/node_modules/lodash.repeat/README.md +4 -6
  151. package/node_modules/lodash.repeat/index.js +262 -11
  152. package/node_modules/lodash.repeat/package.json +21 -34
  153. package/node_modules/mime-db/package.json +2 -2
  154. package/node_modules/mime-types/package.json +2 -2
  155. package/node_modules/ms/.npmignore +5 -0
  156. package/node_modules/{deep-extend → ms}/LICENSE +2 -2
  157. package/node_modules/ms/README.md +35 -0
  158. package/node_modules/ms/index.js +125 -0
  159. package/node_modules/ms/package.json +56 -0
  160. package/node_modules/node-pre-gyp/CHANGELOG.md +8 -0
  161. package/node_modules/node-pre-gyp/LICENSE +27 -0
  162. package/node_modules/node-pre-gyp/lib/util/abi_crosswalk.json +36 -0
  163. package/node_modules/node-pre-gyp/package.json +23 -22
  164. package/node_modules/node-uuid/package.json +1 -0
  165. package/node_modules/npmlog/package.json +18 -16
  166. package/node_modules/oauth-sign/index.js +2 -0
  167. package/node_modules/oauth-sign/package.json +10 -9
  168. package/node_modules/once/README.md +18 -0
  169. package/node_modules/once/once.js +8 -6
  170. package/node_modules/once/package.json +20 -12
  171. package/node_modules/pinkie/index.js +3 -3
  172. package/node_modules/pinkie/package.json +10 -9
  173. package/node_modules/pinkie/readme.md +1 -1
  174. package/node_modules/pinkie-promise/package.json +1 -0
  175. package/node_modules/process-nextick-args/package.json +2 -2
  176. package/node_modules/qs/.eslintrc +17 -0
  177. package/node_modules/qs/.travis.yml +66 -5
  178. package/node_modules/qs/CHANGELOG.md +86 -75
  179. package/node_modules/qs/README.md +85 -81
  180. package/node_modules/qs/bower.json +1 -1
  181. package/node_modules/qs/component.json +1 -1
  182. package/node_modules/qs/dist/qs.js +108 -177
  183. package/node_modules/qs/lib/index.js +1 -7
  184. package/node_modules/qs/lib/parse.js +26 -49
  185. package/node_modules/qs/lib/stringify.js +22 -46
  186. package/node_modules/qs/lib/utils.js +45 -73
  187. package/node_modules/qs/package.json +51 -28
  188. package/node_modules/qs/test/index.js +5 -0
  189. package/node_modules/qs/test/parse.js +236 -321
  190. package/node_modules/qs/test/stringify.js +139 -197
  191. package/node_modules/qs/test/utils.js +6 -25
  192. package/node_modules/rc/node_modules/minimist/package.json +1 -0
  193. package/node_modules/rc/package.json +1 -0
  194. package/node_modules/readable-stream/package.json +1 -0
  195. package/node_modules/request/CHANGELOG.md +16 -1
  196. package/node_modules/request/README.md +1 -1
  197. package/node_modules/request/lib/har.js +3 -2
  198. package/node_modules/request/lib/multipart.js +3 -0
  199. package/node_modules/request/lib/tunnel.js +0 -2
  200. package/node_modules/request/package.json +20 -17
  201. package/node_modules/request/request.js +50 -26
  202. package/node_modules/rimraf/README.md +1 -1
  203. package/node_modules/rimraf/node_modules/glob/README.md +2 -2
  204. package/node_modules/rimraf/node_modules/glob/glob.js +14 -1
  205. package/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +1 -0
  206. package/node_modules/rimraf/node_modules/glob/node_modules/inflight/package.json +1 -0
  207. package/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json +2 -1
  208. package/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +1 -0
  209. package/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +1 -0
  210. package/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +1 -0
  211. package/node_modules/rimraf/node_modules/glob/node_modules/minimatch/package.json +1 -0
  212. package/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/package.json +1 -0
  213. package/node_modules/rimraf/node_modules/glob/node_modules/once/package.json +1 -0
  214. package/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/package.json +1 -0
  215. package/node_modules/rimraf/node_modules/glob/package.json +11 -11
  216. package/node_modules/rimraf/package.json +13 -12
  217. package/node_modules/semver/package.json +3 -1
  218. package/node_modules/sntp/package.json +1 -0
  219. package/node_modules/sshpk/.npmignore +1 -0
  220. package/node_modules/sshpk/bin/sshpk-sign +176 -0
  221. package/node_modules/sshpk/bin/sshpk-verify +166 -0
  222. package/node_modules/sshpk/lib/ed-compat.js +2 -0
  223. package/node_modules/sshpk/lib/key.js +6 -0
  224. package/node_modules/sshpk/man/man1/sshpk-conv.1 +135 -0
  225. package/node_modules/sshpk/man/man1/sshpk-sign.1 +81 -0
  226. package/node_modules/sshpk/man/man1/sshpk-verify.1 +68 -0
  227. package/node_modules/sshpk/package.json +18 -9
  228. package/node_modules/string_decoder/package.json +2 -2
  229. package/node_modules/stringstream/package.json +1 -0
  230. package/node_modules/strip-ansi/package.json +1 -0
  231. package/node_modules/strip-json-comments/package.json +1 -0
  232. package/node_modules/supports-color/package.json +1 -0
  233. package/node_modules/tar/package.json +1 -0
  234. package/node_modules/tar-pack/README.md +2 -2
  235. package/node_modules/tar-pack/package.json +25 -26
  236. package/node_modules/tough-cookie/package.json +1 -0
  237. package/node_modules/tunnel-agent/package.json +1 -0
  238. package/node_modules/tweetnacl/README.md +1 -1
  239. package/node_modules/tweetnacl/package.json +13 -11
  240. package/node_modules/uid-number/package.json +14 -13
  241. package/node_modules/uid-number/uid-number.js +9 -4
  242. package/node_modules/util-deprecate/package.json +2 -2
  243. package/node_modules/verror/package.json +1 -0
  244. package/node_modules/{tar-pack/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy → wrappy}/package.json +3 -2
  245. package/node_modules/xtend/package.json +1 -0
  246. package/package.json +2 -2
  247. package/node_modules/are-we-there-yet/README.md~ +0 -183
  248. package/node_modules/bl/test/basic-test.js +0 -541
  249. package/node_modules/bl/test/sauce.js +0 -38
  250. package/node_modules/debug/index.js +0 -5
  251. package/node_modules/debug/lib/debug.js +0 -147
  252. package/node_modules/deep-extend/test/index.spec.js +0 -220
  253. package/node_modules/deep-extend/test/mocha.opts +0 -1
  254. package/node_modules/gauge/README.md~ +0 -161
  255. package/node_modules/has-unicode/README.md~ +0 -4
  256. package/node_modules/once/LICENSE +0 -27
  257. package/node_modules/once/test/once.js +0 -18
  258. package/node_modules/sshpk/node_modules/assert-plus/README.md +0 -155
  259. package/node_modules/sshpk/node_modules/assert-plus/assert.js +0 -206
  260. package/node_modules/sshpk/node_modules/assert-plus/package.json +0 -88
  261. package/node_modules/tar-pack/node_modules/rimraf/README.md +0 -43
  262. package/node_modules/tar-pack/node_modules/rimraf/bin.js +0 -40
  263. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/README.md +0 -359
  264. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/common.js +0 -226
  265. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/glob.js +0 -752
  266. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/.eslintrc +0 -17
  267. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/README.md +0 -37
  268. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/inflight.js +0 -44
  269. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +0 -58
  270. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/package.json +0 -67
  271. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/test.js +0 -97
  272. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inherits/LICENSE +0 -16
  273. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inherits/README.md +0 -42
  274. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits.js +0 -1
  275. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits_browser.js +0 -23
  276. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json +0 -58
  277. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inherits/test.js +0 -25
  278. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/README.md +0 -216
  279. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/minimatch.js +0 -912
  280. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore +0 -3
  281. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md +0 -122
  282. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js +0 -8
  283. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js +0 -191
  284. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore +0 -2
  285. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile +0 -6
  286. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md +0 -89
  287. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js +0 -5
  288. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js +0 -50
  289. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +0 -79
  290. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js +0 -84
  291. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml +0 -4
  292. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE +0 -18
  293. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown +0 -62
  294. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js +0 -6
  295. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js +0 -13
  296. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +0 -90
  297. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js +0 -39
  298. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +0 -81
  299. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/minimatch/package.json +0 -66
  300. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/once/README.md +0 -51
  301. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE +0 -15
  302. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/README.md +0 -36
  303. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js +0 -51
  304. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js +0 -33
  305. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/once/once.js +0 -21
  306. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/once/package.json +0 -70
  307. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/index.js +0 -20
  308. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/package.json +0 -78
  309. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/readme.md +0 -51
  310. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/package.json +0 -79
  311. package/node_modules/tar-pack/node_modules/rimraf/node_modules/glob/sync.js +0 -460
  312. package/node_modules/tar-pack/node_modules/rimraf/package.json +0 -69
  313. package/node_modules/tar-pack/node_modules/rimraf/rimraf.js +0 -333
  314. package/node_modules/uid-number/LICENCE +0 -25
  315. /package/node_modules/{sshpk/node_modules/assert-plus → assert-plus}/AUTHORS +0 -0
  316. /package/node_modules/{sshpk/node_modules/assert-plus → assert-plus}/CHANGES.md +0 -0
  317. /package/node_modules/{tar-pack/node_modules/rimraf → aws4/node_modules/lru-cache}/LICENSE +0 -0
  318. /package/node_modules/{tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight → uid-number}/LICENSE +0 -0
  319. /package/node_modules/{tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy → wrappy}/LICENSE +0 -0
  320. /package/node_modules/{tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy → wrappy}/README.md +0 -0
  321. /package/node_modules/{tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy → wrappy}/test/basic.js +0 -0
  322. /package/node_modules/{tar-pack/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy → wrappy}/wrappy.js +0 -0
@@ -1,1302 +1,1329 @@
1
- // Load modules
2
-
3
- var Url = require('url');
4
- var Code = require('code');
5
- var Hawk = require('../lib');
6
- var Hoek = require('hoek');
7
- var Lab = require('lab');
8
-
9
-
10
- // Declare internals
11
-
12
- var internals = {};
13
-
14
-
15
- // Test shortcuts
16
-
17
- var lab = exports.lab = Lab.script();
18
- var describe = lab.experiment;
19
- var it = lab.test;
20
- var expect = Code.expect;
21
-
22
-
23
- describe('Server', function () {
24
-
25
- var credentialsFunc = function (id, callback) {
26
-
27
- var credentials = {
28
- id: id,
29
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
30
- algorithm: (id === '1' ? 'sha1' : 'sha256'),
31
- user: 'steve'
32
- };
33
-
34
- return callback(null, credentials);
35
- };
36
-
37
- describe('authenticate()', function () {
38
-
39
- it('parses a valid authentication header (sha1)', function (done) {
40
-
41
- var req = {
42
- method: 'GET',
43
- url: '/resource/4?filter=a',
44
- host: 'example.com',
45
- port: 8080,
46
- authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
47
- };
48
-
49
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
50
-
51
- expect(err).to.not.exist();
52
- expect(credentials.user).to.equal('steve');
53
- done();
54
- });
55
- });
56
-
57
- it('parses a valid authentication header (sha256)', function (done) {
58
-
59
- var req = {
60
- method: 'GET',
61
- url: '/resource/1?b=1&a=2',
62
- host: 'example.com',
63
- port: 8000,
64
- authorization: 'Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", mac="m8r1rHbXN6NgO+KIIhjO7sFRyd78RNGVUwehe8Cp2dU=", ext="some-app-data"'
65
- };
66
-
67
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353832234000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
68
-
69
- expect(err).to.not.exist();
70
- expect(credentials.user).to.equal('steve');
71
- done();
72
- });
73
- });
74
-
75
- it('parses a valid authentication header (host override)', function (done) {
76
-
77
- var req = {
78
- method: 'GET',
79
- url: '/resource/4?filter=a',
80
- headers: {
81
- host: 'example1.com:8080',
82
- authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
83
- }
84
- };
85
-
86
- Hawk.server.authenticate(req, credentialsFunc, { host: 'example.com', localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
87
-
88
- expect(err).to.not.exist();
89
- expect(credentials.user).to.equal('steve');
90
- done();
91
- });
92
- });
93
-
94
- it('parses a valid authentication header (host port override)', function (done) {
95
-
96
- var req = {
97
- method: 'GET',
98
- url: '/resource/4?filter=a',
99
- headers: {
100
- host: 'example1.com:80',
101
- authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
102
- }
103
- };
104
-
105
- Hawk.server.authenticate(req, credentialsFunc, { host: 'example.com', port: 8080, localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
106
-
107
- expect(err).to.not.exist();
108
- expect(credentials.user).to.equal('steve');
109
- done();
110
- });
111
- });
112
-
113
- it('parses a valid authentication header (POST with payload)', function (done) {
114
-
115
- var req = {
116
- method: 'POST',
117
- url: '/resource/4?filter=a',
118
- host: 'example.com',
119
- port: 8080,
120
- authorization: 'Hawk id="123456", ts="1357926341", nonce="1AwuJD", hash="qAiXIVv+yjDATneWxZP2YCTa9aHRgQdnH9b3Wc+o3dg=", ext="some-app-data", mac="UeYcj5UoTVaAWXNvJfLVia7kU3VabxCqrccXP8sUGC4="'
121
- };
122
-
123
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1357926341000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
124
-
125
- expect(err).to.not.exist();
126
- expect(credentials.user).to.equal('steve');
127
- done();
128
- });
129
- });
130
-
131
- it('errors on missing hash', function (done) {
132
-
133
- var req = {
134
- method: 'GET',
135
- url: '/resource/1?b=1&a=2',
136
- host: 'example.com',
137
- port: 8000,
138
- authorization: 'Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", mac="m8r1rHbXN6NgO+KIIhjO7sFRyd78RNGVUwehe8Cp2dU=", ext="some-app-data"'
139
- };
140
-
141
- Hawk.server.authenticate(req, credentialsFunc, { payload: 'body', localtimeOffsetMsec: 1353832234000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
142
-
143
- expect(err).to.exist();
144
- expect(err.output.payload.message).to.equal('Missing required payload hash');
145
- done();
146
- });
147
- });
148
-
149
- it('errors on a stale timestamp', function (done) {
150
-
151
- var req = {
152
- method: 'GET',
153
- url: '/resource/4?filter=a',
154
- host: 'example.com',
155
- port: 8080,
156
- authorization: 'Hawk id="123456", ts="1362337299", nonce="UzmxSs", ext="some-app-data", mac="wnNUxchvvryMH2RxckTdZ/gY3ijzvccx4keVvELC61w="'
157
- };
158
-
159
- Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
160
-
161
- expect(err).to.exist();
162
- expect(err.output.payload.message).to.equal('Stale timestamp');
163
- var header = err.output.headers['WWW-Authenticate'];
164
- var ts = header.match(/^Hawk ts\=\"(\d+)\"\, tsm\=\"([^\"]+)\"\, error=\"Stale timestamp\"$/);
165
- var now = Hawk.utils.now();
166
- expect(parseInt(ts[1], 10) * 1000).to.be.within(now - 1000, now + 1000);
167
-
168
- var res = {
169
- headers: {
170
- 'www-authenticate': header
171
- }
172
- };
173
-
174
- expect(Hawk.client.authenticate(res, credentials, artifacts)).to.equal(true);
175
- done();
176
- });
177
- });
178
-
179
- it('errors on a replay', function (done) {
180
-
181
- var req = {
182
- method: 'GET',
183
- url: '/resource/4?filter=a',
184
- host: 'example.com',
185
- port: 8080,
186
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="bXx7a7p1h9QYQNZ8x7QhvDQym8ACgab4m3lVSFn4DBw=", ext="hello"'
187
- };
188
-
189
- var memoryCache = {};
190
- var options = {
191
- localtimeOffsetMsec: 1353788437000 - Hawk.utils.now(),
192
- nonceFunc: function (key, nonce, ts, callback) {
193
-
194
- if (memoryCache[key + nonce]) {
195
- return callback(new Error());
196
- }
197
-
198
- memoryCache[key + nonce] = true;
199
- return callback();
200
- }
201
- };
202
-
203
- Hawk.server.authenticate(req, credentialsFunc, options, function (err, credentials1, artifacts1) {
204
-
205
- expect(err).to.not.exist();
206
- expect(credentials1.user).to.equal('steve');
207
-
208
- Hawk.server.authenticate(req, credentialsFunc, options, function (err, credentials2, artifacts2) {
209
-
210
- expect(err).to.exist();
211
- expect(err.output.payload.message).to.equal('Invalid nonce');
212
- done();
213
- });
214
- });
215
- });
216
-
217
- it('does not error on nonce collision if keys differ', function (done) {
218
-
219
- var reqSteve = {
220
- method: 'GET',
221
- url: '/resource/4?filter=a',
222
- host: 'example.com',
223
- port: 8080,
224
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="bXx7a7p1h9QYQNZ8x7QhvDQym8ACgab4m3lVSFn4DBw=", ext="hello"'
225
- };
226
-
227
- var reqBob = {
228
- method: 'GET',
229
- url: '/resource/4?filter=a',
230
- host: 'example.com',
231
- port: 8080,
232
- authorization: 'Hawk id="456", ts="1353788437", nonce="k3j4h2", mac="LXfmTnRzrLd9TD7yfH+4se46Bx6AHyhpM94hLCiNia4=", ext="hello"'
233
- };
234
-
235
- var credentialsFuncion = function (id, callback) {
236
-
237
- var credentials = {
238
- '123': {
239
- id: id,
240
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
241
- algorithm: (id === '1' ? 'sha1' : 'sha256'),
242
- user: 'steve'
243
- },
244
- '456': {
245
- id: id,
246
- key: 'xrunpaw3489ruxnpa98w4rxnwerxhqb98rpaxn39848',
247
- algorithm: (id === '1' ? 'sha1' : 'sha256'),
248
- user: 'bob'
249
- }
250
- };
251
-
252
- return callback(null, credentials[id]);
253
- };
254
-
255
- var memoryCache = {};
256
- var options = {
257
- localtimeOffsetMsec: 1353788437000 - Hawk.utils.now(),
258
- nonceFunc: function (key, nonce, ts, callback) {
259
-
260
- if (memoryCache[key + nonce]) {
261
- return callback(new Error());
262
- }
263
-
264
- memoryCache[key + nonce] = true;
265
- return callback();
266
- }
267
- };
268
-
269
- Hawk.server.authenticate(reqSteve, credentialsFuncion, options, function (err, credentials1, artifacts1) {
270
-
271
- expect(err).to.not.exist();
272
- expect(credentials1.user).to.equal('steve');
273
-
274
- Hawk.server.authenticate(reqBob, credentialsFuncion, options, function (err, credentials2, artifacts2) {
275
-
276
- expect(err).to.not.exist();
277
- expect(credentials2.user).to.equal('bob');
278
- done();
279
- });
280
- });
281
- });
282
-
283
- it('errors on an invalid authentication header: wrong scheme', function (done) {
284
-
285
- var req = {
286
- method: 'GET',
287
- url: '/resource/4?filter=a',
288
- host: 'example.com',
289
- port: 8080,
290
- authorization: 'Basic asdasdasdasd'
291
- };
292
-
293
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
294
-
295
- expect(err).to.exist();
296
- expect(err.output.payload.message).to.not.exist();
297
- done();
298
- });
299
- });
300
-
301
- it('errors on an invalid authentication header: no scheme', function (done) {
302
-
303
- var req = {
304
- method: 'GET',
305
- url: '/resource/4?filter=a',
306
- host: 'example.com',
307
- port: 8080,
308
- authorization: '!@#'
309
- };
310
-
311
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
312
-
313
- expect(err).to.exist();
314
- expect(err.output.payload.message).to.equal('Invalid header syntax');
315
- done();
316
- });
317
- });
318
-
319
- it('errors on an missing authorization header', function (done) {
320
-
321
- var req = {
322
- method: 'GET',
323
- url: '/resource/4?filter=a',
324
- host: 'example.com',
325
- port: 8080
326
- };
327
-
328
- Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
329
-
330
- expect(err).to.exist();
331
- expect(err.isMissing).to.equal(true);
332
- done();
333
- });
334
- });
335
-
336
- it('errors on an missing host header', function (done) {
337
-
338
- var req = {
339
- method: 'GET',
340
- url: '/resource/4?filter=a',
341
- headers: {
342
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
343
- }
344
- };
345
-
346
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
347
-
348
- expect(err).to.exist();
349
- expect(err.output.payload.message).to.equal('Invalid Host header');
350
- done();
351
- });
352
- });
353
-
354
- it('errors on an missing authorization attribute (id)', function (done) {
355
-
356
- var req = {
357
- method: 'GET',
358
- url: '/resource/4?filter=a',
359
- host: 'example.com',
360
- port: 8080,
361
- authorization: 'Hawk ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
362
- };
363
-
364
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
365
-
366
- expect(err).to.exist();
367
- expect(err.output.payload.message).to.equal('Missing attributes');
368
- done();
369
- });
370
- });
371
-
372
- it('errors on an missing authorization attribute (ts)', function (done) {
373
-
374
- var req = {
375
- method: 'GET',
376
- url: '/resource/4?filter=a',
377
- host: 'example.com',
378
- port: 8080,
379
- authorization: 'Hawk id="123", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
380
- };
381
-
382
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
383
-
384
- expect(err).to.exist();
385
- expect(err.output.payload.message).to.equal('Missing attributes');
386
- done();
387
- });
388
- });
389
-
390
- it('errors on an missing authorization attribute (nonce)', function (done) {
391
-
392
- var req = {
393
- method: 'GET',
394
- url: '/resource/4?filter=a',
395
- host: 'example.com',
396
- port: 8080,
397
- authorization: 'Hawk id="123", ts="1353788437", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
398
- };
399
-
400
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
401
-
402
- expect(err).to.exist();
403
- expect(err.output.payload.message).to.equal('Missing attributes');
404
- done();
405
- });
406
- });
407
-
408
- it('errors on an missing authorization attribute (mac)', function (done) {
409
-
410
- var req = {
411
- method: 'GET',
412
- url: '/resource/4?filter=a',
413
- host: 'example.com',
414
- port: 8080,
415
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", ext="hello"'
416
- };
417
-
418
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
419
-
420
- expect(err).to.exist();
421
- expect(err.output.payload.message).to.equal('Missing attributes');
422
- done();
423
- });
424
- });
425
-
426
- it('errors on an unknown authorization attribute', function (done) {
427
-
428
- var req = {
429
- method: 'GET',
430
- url: '/resource/4?filter=a',
431
- host: 'example.com',
432
- port: 8080,
433
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", x="3", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
434
- };
435
-
436
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
437
-
438
- expect(err).to.exist();
439
- expect(err.output.payload.message).to.equal('Unknown attribute: x');
440
- done();
441
- });
442
- });
443
-
444
- it('errors on an bad authorization header format', function (done) {
445
-
446
- var req = {
447
- method: 'GET',
448
- url: '/resource/4?filter=a',
449
- host: 'example.com',
450
- port: 8080,
451
- authorization: 'Hawk id="123\\", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
452
- };
453
-
454
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
455
-
456
- expect(err).to.exist();
457
- expect(err.output.payload.message).to.equal('Bad header format');
458
- done();
459
- });
460
- });
461
-
462
- it('errors on an bad authorization attribute value', function (done) {
463
-
464
- var req = {
465
- method: 'GET',
466
- url: '/resource/4?filter=a',
467
- host: 'example.com',
468
- port: 8080,
469
- authorization: 'Hawk id="\t", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
470
- };
471
-
472
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
473
-
474
- expect(err).to.exist();
475
- expect(err.output.payload.message).to.equal('Bad attribute value: id');
476
- done();
477
- });
478
- });
479
-
480
- it('errors on an empty authorization attribute value', function (done) {
481
-
482
- var req = {
483
- method: 'GET',
484
- url: '/resource/4?filter=a',
485
- host: 'example.com',
486
- port: 8080,
487
- authorization: 'Hawk id="", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
488
- };
489
-
490
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
491
-
492
- expect(err).to.exist();
493
- expect(err.output.payload.message).to.equal('Bad attribute value: id');
494
- done();
495
- });
496
- });
497
-
498
- it('errors on duplicated authorization attribute key', function (done) {
499
-
500
- var req = {
501
- method: 'GET',
502
- url: '/resource/4?filter=a',
503
- host: 'example.com',
504
- port: 8080,
505
- authorization: 'Hawk id="123", id="456", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
506
- };
507
-
508
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
509
-
510
- expect(err).to.exist();
511
- expect(err.output.payload.message).to.equal('Duplicate attribute: id');
512
- done();
513
- });
514
- });
515
-
516
- it('errors on an invalid authorization header format', function (done) {
517
-
518
- var req = {
519
- method: 'GET',
520
- url: '/resource/4?filter=a',
521
- host: 'example.com',
522
- port: 8080,
523
- authorization: 'Hawk'
524
- };
525
-
526
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
527
-
528
- expect(err).to.exist();
529
- expect(err.output.payload.message).to.equal('Invalid header syntax');
530
- done();
531
- });
532
- });
533
-
534
- it('errors on an bad host header (missing host)', function (done) {
535
-
536
- var req = {
537
- method: 'GET',
538
- url: '/resource/4?filter=a',
539
- headers: {
540
- host: ':8080',
541
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
542
- }
543
- };
544
-
545
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
546
-
547
- expect(err).to.exist();
548
- expect(err.output.payload.message).to.equal('Invalid Host header');
549
- done();
550
- });
551
- });
552
-
553
- it('errors on an bad host header (pad port)', function (done) {
554
-
555
- var req = {
556
- method: 'GET',
557
- url: '/resource/4?filter=a',
558
- headers: {
559
- host: 'example.com:something',
560
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
561
- }
562
- };
563
-
564
- Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
565
-
566
- expect(err).to.exist();
567
- expect(err.output.payload.message).to.equal('Invalid Host header');
568
- done();
569
- });
570
- });
571
-
572
- it('errors on credentialsFunc error', function (done) {
573
-
574
- var req = {
575
- method: 'GET',
576
- url: '/resource/4?filter=a',
577
- host: 'example.com',
578
- port: 8080,
579
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
580
- };
581
-
582
- var credentialsFuncion = function (id, callback) {
583
-
584
- return callback(new Error('Unknown user'));
585
- };
586
-
587
- Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
588
-
589
- expect(err).to.exist();
590
- expect(err.message).to.equal('Unknown user');
591
- done();
592
- });
593
- });
594
-
595
- it('errors on credentialsFunc error (with credentials)', function (done) {
596
-
597
- var req = {
598
- method: 'GET',
599
- url: '/resource/4?filter=a',
600
- host: 'example.com',
601
- port: 8080,
602
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
603
- };
604
-
605
- var credentialsFuncion = function (id, callback) {
606
-
607
- return callback(new Error('Unknown user'), { some: 'value' });
608
- };
609
-
610
- Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
611
-
612
- expect(err).to.exist();
613
- expect(err.message).to.equal('Unknown user');
614
- expect(credentials.some).to.equal('value');
615
- done();
616
- });
617
- });
618
-
619
- it('errors on missing credentials', function (done) {
620
-
621
- var req = {
622
- method: 'GET',
623
- url: '/resource/4?filter=a',
624
- host: 'example.com',
625
- port: 8080,
626
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
627
- };
628
-
629
- var credentialsFuncion = function (id, callback) {
630
-
631
- return callback(null, null);
632
- };
633
-
634
- Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
635
-
636
- expect(err).to.exist();
637
- expect(err.output.payload.message).to.equal('Unknown credentials');
638
- done();
639
- });
640
- });
641
-
642
- it('errors on invalid credentials (id)', function (done) {
643
-
644
- var req = {
645
- method: 'GET',
646
- url: '/resource/4?filter=a',
647
- host: 'example.com',
648
- port: 8080,
649
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
650
- };
651
-
652
- var credentialsFuncion = function (id, callback) {
653
-
654
- var credentials = {
655
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
656
- user: 'steve'
657
- };
658
-
659
- return callback(null, credentials);
660
- };
661
-
662
- Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
663
-
664
- expect(err).to.exist();
665
- expect(err.message).to.equal('Invalid credentials');
666
- expect(err.output.payload.message).to.equal('An internal server error occurred');
667
- done();
668
- });
669
- });
670
-
671
- it('errors on invalid credentials (key)', function (done) {
672
-
673
- var req = {
674
- method: 'GET',
675
- url: '/resource/4?filter=a',
676
- host: 'example.com',
677
- port: 8080,
678
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
679
- };
680
-
681
- var credentialsFuncion = function (id, callback) {
682
-
683
- var credentials = {
684
- id: '23434d3q4d5345d',
685
- user: 'steve'
686
- };
687
-
688
- return callback(null, credentials);
689
- };
690
-
691
- Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
692
-
693
- expect(err).to.exist();
694
- expect(err.message).to.equal('Invalid credentials');
695
- expect(err.output.payload.message).to.equal('An internal server error occurred');
696
- done();
697
- });
698
- });
699
-
700
- it('errors on unknown credentials algorithm', function (done) {
701
-
702
- var req = {
703
- method: 'GET',
704
- url: '/resource/4?filter=a',
705
- host: 'example.com',
706
- port: 8080,
707
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
708
- };
709
-
710
- var credentialsFuncion = function (id, callback) {
711
-
712
- var credentials = {
713
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
714
- algorithm: 'hmac-sha-0',
715
- user: 'steve'
716
- };
717
-
718
- return callback(null, credentials);
719
- };
720
-
721
- Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
722
-
723
- expect(err).to.exist();
724
- expect(err.message).to.equal('Unknown algorithm');
725
- expect(err.output.payload.message).to.equal('An internal server error occurred');
726
- done();
727
- });
728
- });
729
-
730
- it('errors on unknown bad mac', function (done) {
731
-
732
- var req = {
733
- method: 'GET',
734
- url: '/resource/4?filter=a',
735
- host: 'example.com',
736
- port: 8080,
737
- authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcU4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
738
- };
739
-
740
- var credentialsFuncion = function (id, callback) {
741
-
742
- var credentials = {
743
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
744
- algorithm: 'sha256',
745
- user: 'steve'
746
- };
747
-
748
- return callback(null, credentials);
749
- };
750
-
751
- Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
752
-
753
- expect(err).to.exist();
754
- expect(err.output.payload.message).to.equal('Bad mac');
755
- done();
756
- });
757
- });
758
- });
759
-
760
- describe('header()', function () {
761
-
762
- it('generates header', function (done) {
763
-
764
- var credentials = {
765
- id: '123456',
766
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
767
- algorithm: 'sha256',
768
- user: 'steve'
769
- };
770
-
771
- var artifacts = {
772
- method: 'POST',
773
- host: 'example.com',
774
- port: '8080',
775
- resource: '/resource/4?filter=a',
776
- ts: '1398546787',
777
- nonce: 'xUwusx',
778
- hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
779
- ext: 'some-app-data',
780
- mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
781
- id: '123456'
782
- };
783
-
784
- var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
785
- expect(header).to.equal('Hawk mac=\"n14wVJK4cOxAytPUMc5bPezQzuJGl5n7MYXhFQgEKsE=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\", ext=\"response-specific\"');
786
- done();
787
- });
788
-
789
- it('generates header (empty payload)', function (done) {
790
-
791
- var credentials = {
792
- id: '123456',
793
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
794
- algorithm: 'sha256',
795
- user: 'steve'
796
- };
797
-
798
- var artifacts = {
799
- method: 'POST',
800
- host: 'example.com',
801
- port: '8080',
802
- resource: '/resource/4?filter=a',
803
- ts: '1398546787',
804
- nonce: 'xUwusx',
805
- hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
806
- ext: 'some-app-data',
807
- mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
808
- id: '123456'
809
- };
810
-
811
- var header = Hawk.server.header(credentials, artifacts, { payload: '', contentType: 'text/plain', ext: 'response-specific' });
812
- expect(header).to.equal('Hawk mac=\"i8/kUBDx0QF+PpCtW860kkV/fa9dbwEoe/FpGUXowf0=\", hash=\"q/t+NNAkQZNlq/aAD6PlexImwQTxwgT2MahfTa9XRLA=\", ext=\"response-specific\"');
813
- done();
814
- });
815
-
816
- it('generates header (pre calculated hash)', function (done) {
817
-
818
- var credentials = {
819
- id: '123456',
820
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
821
- algorithm: 'sha256',
822
- user: 'steve'
823
- };
824
-
825
- var artifacts = {
826
- method: 'POST',
827
- host: 'example.com',
828
- port: '8080',
829
- resource: '/resource/4?filter=a',
830
- ts: '1398546787',
831
- nonce: 'xUwusx',
832
- hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
833
- ext: 'some-app-data',
834
- mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
835
- id: '123456'
836
- };
837
-
838
- var options = { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' };
839
- options.hash = Hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
840
- var header = Hawk.server.header(credentials, artifacts, options);
841
- expect(header).to.equal('Hawk mac=\"n14wVJK4cOxAytPUMc5bPezQzuJGl5n7MYXhFQgEKsE=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\", ext=\"response-specific\"');
842
- done();
843
- });
844
-
845
- it('generates header (null ext)', function (done) {
846
-
847
- var credentials = {
848
- id: '123456',
849
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
850
- algorithm: 'sha256',
851
- user: 'steve'
852
- };
853
-
854
- var artifacts = {
855
- method: 'POST',
856
- host: 'example.com',
857
- port: '8080',
858
- resource: '/resource/4?filter=a',
859
- ts: '1398546787',
860
- nonce: 'xUwusx',
861
- hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
862
- mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
863
- id: '123456'
864
- };
865
-
866
- var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: null });
867
- expect(header).to.equal('Hawk mac=\"6PrybJTJs20jsgBw5eilXpcytD8kUbaIKNYXL+6g0ns=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\"');
868
- done();
869
- });
870
-
871
- it('errors on missing artifacts', function (done) {
872
-
873
- var credentials = {
874
- id: '123456',
875
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
876
- algorithm: 'sha256',
877
- user: 'steve'
878
- };
879
-
880
- var header = Hawk.server.header(credentials, null, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
881
- expect(header).to.equal('');
882
- done();
883
- });
884
-
885
- it('errors on invalid artifacts', function (done) {
886
-
887
- var credentials = {
888
- id: '123456',
889
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
890
- algorithm: 'sha256',
891
- user: 'steve'
892
- };
893
-
894
- var header = Hawk.server.header(credentials, 5, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
895
- expect(header).to.equal('');
896
- done();
897
- });
898
-
899
- it('errors on missing credentials', function (done) {
900
-
901
- var artifacts = {
902
- method: 'POST',
903
- host: 'example.com',
904
- port: '8080',
905
- resource: '/resource/4?filter=a',
906
- ts: '1398546787',
907
- nonce: 'xUwusx',
908
- hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
909
- ext: 'some-app-data',
910
- mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
911
- id: '123456'
912
- };
913
-
914
- var header = Hawk.server.header(null, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
915
- expect(header).to.equal('');
916
- done();
917
- });
918
-
919
- it('errors on invalid credentials (key)', function (done) {
920
-
921
- var credentials = {
922
- id: '123456',
923
- algorithm: 'sha256',
924
- user: 'steve'
925
- };
926
-
927
- var artifacts = {
928
- method: 'POST',
929
- host: 'example.com',
930
- port: '8080',
931
- resource: '/resource/4?filter=a',
932
- ts: '1398546787',
933
- nonce: 'xUwusx',
934
- hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
935
- ext: 'some-app-data',
936
- mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
937
- id: '123456'
938
- };
939
-
940
- var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
941
- expect(header).to.equal('');
942
- done();
943
- });
944
-
945
- it('errors on invalid algorithm', function (done) {
946
-
947
- var credentials = {
948
- id: '123456',
949
- key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
950
- algorithm: 'x',
951
- user: 'steve'
952
- };
953
-
954
- var artifacts = {
955
- method: 'POST',
956
- host: 'example.com',
957
- port: '8080',
958
- resource: '/resource/4?filter=a',
959
- ts: '1398546787',
960
- nonce: 'xUwusx',
961
- hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
962
- ext: 'some-app-data',
963
- mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
964
- id: '123456'
965
- };
966
-
967
- var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
968
- expect(header).to.equal('');
969
- done();
970
- });
971
- });
972
-
973
- describe('authenticateMessage()', function () {
974
-
975
- it('errors on invalid authorization (ts)', function (done) {
976
-
977
- credentialsFunc('123456', function (err, credentials1) {
978
-
979
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
980
- delete auth.ts;
981
-
982
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
983
-
984
- expect(err).to.exist();
985
- expect(err.message).to.equal('Invalid authorization');
986
- done();
987
- });
988
- });
989
- });
990
-
991
- it('errors on invalid authorization (nonce)', function (done) {
992
-
993
- credentialsFunc('123456', function (err, credentials1) {
994
-
995
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
996
- delete auth.nonce;
997
-
998
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
999
-
1000
- expect(err).to.exist();
1001
- expect(err.message).to.equal('Invalid authorization');
1002
- done();
1003
- });
1004
- });
1005
- });
1006
-
1007
- it('errors on invalid authorization (hash)', function (done) {
1008
-
1009
- credentialsFunc('123456', function (err, credentials1) {
1010
-
1011
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1012
- delete auth.hash;
1013
-
1014
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1015
-
1016
- expect(err).to.exist();
1017
- expect(err.message).to.equal('Invalid authorization');
1018
- done();
1019
- });
1020
- });
1021
- });
1022
-
1023
- it('errors with credentials', function (done) {
1024
-
1025
- credentialsFunc('123456', function (err, credentials1) {
1026
-
1027
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1028
-
1029
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, function (id, callback) {
1030
-
1031
- callback(new Error('something'), { some: 'value' });
1032
- }, {}, function (err, credentials2) {
1033
-
1034
- expect(err).to.exist();
1035
- expect(err.message).to.equal('something');
1036
- expect(credentials2.some).to.equal('value');
1037
- done();
1038
- });
1039
- });
1040
- });
1041
-
1042
- it('errors on nonce collision', function (done) {
1043
-
1044
- credentialsFunc('123456', function (err, credentials1) {
1045
-
1046
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1047
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {
1048
- nonceFunc: function (key, nonce, ts, nonceCallback) {
1049
-
1050
- nonceCallback(true);
1051
- }
1052
- }, function (err, credentials2) {
1053
-
1054
- expect(err).to.exist();
1055
- expect(err.message).to.equal('Invalid nonce');
1056
- done();
1057
- });
1058
- });
1059
- });
1060
-
1061
- it('should generate an authorization then successfully parse it', function (done) {
1062
-
1063
- credentialsFunc('123456', function (err, credentials1) {
1064
-
1065
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1066
- expect(auth).to.exist();
1067
-
1068
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1069
-
1070
- expect(err).to.not.exist();
1071
- expect(credentials2.user).to.equal('steve');
1072
- done();
1073
- });
1074
- });
1075
- });
1076
-
1077
- it('should fail authorization on mismatching host', function (done) {
1078
-
1079
- credentialsFunc('123456', function (err, credentials1) {
1080
-
1081
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1082
- expect(auth).to.exist();
1083
-
1084
- Hawk.server.authenticateMessage('example1.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1085
-
1086
- expect(err).to.exist();
1087
- expect(err.message).to.equal('Bad mac');
1088
- done();
1089
- });
1090
- });
1091
- });
1092
-
1093
- it('should fail authorization on stale timestamp', function (done) {
1094
-
1095
- credentialsFunc('123456', function (err, credentials1) {
1096
-
1097
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1098
- expect(auth).to.exist();
1099
-
1100
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { localtimeOffsetMsec: 100000 }, function (err, credentials2) {
1101
-
1102
- expect(err).to.exist();
1103
- expect(err.message).to.equal('Stale timestamp');
1104
- done();
1105
- });
1106
- });
1107
- });
1108
-
1109
- it('overrides timestampSkewSec', function (done) {
1110
-
1111
- credentialsFunc('123456', function (err, credentials1) {
1112
-
1113
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1, localtimeOffsetMsec: 100000 });
1114
- expect(auth).to.exist();
1115
-
1116
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { timestampSkewSec: 500 }, function (err, credentials2) {
1117
-
1118
- expect(err).to.not.exist();
1119
- done();
1120
- });
1121
- });
1122
- });
1123
-
1124
- it('should fail authorization on invalid authorization', function (done) {
1125
-
1126
- credentialsFunc('123456', function (err, credentials1) {
1127
-
1128
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1129
- expect(auth).to.exist();
1130
- delete auth.id;
1131
-
1132
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1133
-
1134
- expect(err).to.exist();
1135
- expect(err.message).to.equal('Invalid authorization');
1136
- done();
1137
- });
1138
- });
1139
- });
1140
-
1141
- it('should fail authorization on bad hash', function (done) {
1142
-
1143
- credentialsFunc('123456', function (err, credentials1) {
1144
-
1145
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1146
- expect(auth).to.exist();
1147
-
1148
- Hawk.server.authenticateMessage('example.com', 8080, 'some message1', auth, credentialsFunc, {}, function (err, credentials2) {
1149
-
1150
- expect(err).to.exist();
1151
- expect(err.message).to.equal('Bad message hash');
1152
- done();
1153
- });
1154
- });
1155
- });
1156
-
1157
- it('should fail authorization on nonce error', function (done) {
1158
-
1159
- credentialsFunc('123456', function (err, credentials1) {
1160
-
1161
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1162
- expect(auth).to.exist();
1163
-
1164
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {
1165
- nonceFunc: function (key, nonce, ts, callback) {
1166
-
1167
- callback(new Error('kaboom'));
1168
- }
1169
- }, function (err, credentials2) {
1170
-
1171
- expect(err).to.exist();
1172
- expect(err.message).to.equal('Invalid nonce');
1173
- done();
1174
- });
1175
- });
1176
- });
1177
-
1178
- it('should fail authorization on credentials error', function (done) {
1179
-
1180
- credentialsFunc('123456', function (err, credentials1) {
1181
-
1182
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1183
- expect(auth).to.exist();
1184
-
1185
- var errFunc = function (id, callback) {
1186
-
1187
- callback(new Error('kablooey'));
1188
- };
1189
-
1190
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
1191
-
1192
- expect(err).to.exist();
1193
- expect(err.message).to.equal('kablooey');
1194
- done();
1195
- });
1196
- });
1197
- });
1198
-
1199
- it('should fail authorization on missing credentials', function (done) {
1200
-
1201
- credentialsFunc('123456', function (err, credentials1) {
1202
-
1203
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1204
- expect(auth).to.exist();
1205
-
1206
- var errFunc = function (id, callback) {
1207
-
1208
- callback();
1209
- };
1210
-
1211
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
1212
-
1213
- expect(err).to.exist();
1214
- expect(err.message).to.equal('Unknown credentials');
1215
- done();
1216
- });
1217
- });
1218
- });
1219
-
1220
- it('should fail authorization on invalid credentials', function (done) {
1221
-
1222
- credentialsFunc('123456', function (err, credentials1) {
1223
-
1224
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1225
- expect(auth).to.exist();
1226
-
1227
- var errFunc = function (id, callback) {
1228
-
1229
- callback(null, {});
1230
- };
1231
-
1232
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
1233
-
1234
- expect(err).to.exist();
1235
- expect(err.message).to.equal('Invalid credentials');
1236
- done();
1237
- });
1238
- });
1239
- });
1240
-
1241
- it('should fail authorization on invalid credentials algorithm', function (done) {
1242
-
1243
- credentialsFunc('123456', function (err, credentials1) {
1244
-
1245
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1246
- expect(auth).to.exist();
1247
-
1248
- var errFunc = function (id, callback) {
1249
-
1250
- callback(null, { key: '123', algorithm: '456' });
1251
- };
1252
-
1253
- Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
1254
-
1255
- expect(err).to.exist();
1256
- expect(err.message).to.equal('Unknown algorithm');
1257
- done();
1258
- });
1259
- });
1260
- });
1261
-
1262
- it('should fail on missing host', function (done) {
1263
-
1264
- credentialsFunc('123456', function (err, credentials) {
1265
-
1266
- var auth = Hawk.client.message(null, 8080, 'some message', { credentials: credentials });
1267
- expect(auth).to.not.exist();
1268
- done();
1269
- });
1270
- });
1271
-
1272
- it('should fail on missing credentials', function (done) {
1273
-
1274
- var auth = Hawk.client.message('example.com', 8080, 'some message', {});
1275
- expect(auth).to.not.exist();
1276
- done();
1277
- });
1278
-
1279
- it('should fail on invalid algorithm', function (done) {
1280
-
1281
- credentialsFunc('123456', function (err, credentials) {
1282
-
1283
- var creds = Hoek.clone(credentials);
1284
- creds.algorithm = 'blah';
1285
- var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: creds });
1286
- expect(auth).to.not.exist();
1287
- done();
1288
- });
1289
- });
1290
- });
1291
-
1292
- describe('authenticatePayloadHash()', function () {
1293
-
1294
- it('checks payload hash', function (done) {
1295
-
1296
- expect(Hawk.server.authenticatePayloadHash('abcdefg', { hash: 'abcdefg' })).to.equal(true);
1297
- expect(Hawk.server.authenticatePayloadHash('1234567', { hash: 'abcdefg' })).to.equal(false);
1298
- done();
1299
- });
1300
- });
1301
- });
1302
-
1
+ // Load modules
2
+
3
+ var Url = require('url');
4
+ var Code = require('code');
5
+ var Hawk = require('../lib');
6
+ var Hoek = require('hoek');
7
+ var Lab = require('lab');
8
+
9
+
10
+ // Declare internals
11
+
12
+ var internals = {};
13
+
14
+
15
+ // Test shortcuts
16
+
17
+ var lab = exports.lab = Lab.script();
18
+ var describe = lab.experiment;
19
+ var it = lab.test;
20
+ var expect = Code.expect;
21
+
22
+
23
+ describe('Server', function () {
24
+
25
+ var credentialsFunc = function (id, callback) {
26
+
27
+ var credentials = {
28
+ id: id,
29
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
30
+ algorithm: (id === '1' ? 'sha1' : 'sha256'),
31
+ user: 'steve'
32
+ };
33
+
34
+ return callback(null, credentials);
35
+ };
36
+
37
+ describe('authenticate()', function () {
38
+
39
+ it('parses a valid authentication header (sha1)', function (done) {
40
+
41
+ var req = {
42
+ method: 'GET',
43
+ url: '/resource/4?filter=a',
44
+ host: 'example.com',
45
+ port: 8080,
46
+ authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
47
+ };
48
+
49
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
50
+
51
+ expect(err).to.not.exist();
52
+ expect(credentials.user).to.equal('steve');
53
+ done();
54
+ });
55
+ });
56
+
57
+ it('parses a valid authentication header (sha256)', function (done) {
58
+
59
+ var req = {
60
+ method: 'GET',
61
+ url: '/resource/1?b=1&a=2',
62
+ host: 'example.com',
63
+ port: 8000,
64
+ authorization: 'Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", mac="m8r1rHbXN6NgO+KIIhjO7sFRyd78RNGVUwehe8Cp2dU=", ext="some-app-data"'
65
+ };
66
+
67
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353832234000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
68
+
69
+ expect(err).to.not.exist();
70
+ expect(credentials.user).to.equal('steve');
71
+ done();
72
+ });
73
+ });
74
+
75
+ it('parses a valid authentication header (host override)', function (done) {
76
+
77
+ var req = {
78
+ method: 'GET',
79
+ url: '/resource/4?filter=a',
80
+ headers: {
81
+ host: 'example1.com:8080',
82
+ authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
83
+ }
84
+ };
85
+
86
+ Hawk.server.authenticate(req, credentialsFunc, { host: 'example.com', localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
87
+
88
+ expect(err).to.not.exist();
89
+ expect(credentials.user).to.equal('steve');
90
+ done();
91
+ });
92
+ });
93
+
94
+ it('parses a valid authentication header (host port override)', function (done) {
95
+
96
+ var req = {
97
+ method: 'GET',
98
+ url: '/resource/4?filter=a',
99
+ headers: {
100
+ host: 'example1.com:80',
101
+ authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
102
+ }
103
+ };
104
+
105
+ Hawk.server.authenticate(req, credentialsFunc, { host: 'example.com', port: 8080, localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
106
+
107
+ expect(err).to.not.exist();
108
+ expect(credentials.user).to.equal('steve');
109
+ done();
110
+ });
111
+ });
112
+
113
+ it('parses a valid authentication header (POST with payload)', function (done) {
114
+
115
+ var req = {
116
+ method: 'POST',
117
+ url: '/resource/4?filter=a',
118
+ host: 'example.com',
119
+ port: 8080,
120
+ authorization: 'Hawk id="123456", ts="1357926341", nonce="1AwuJD", hash="qAiXIVv+yjDATneWxZP2YCTa9aHRgQdnH9b3Wc+o3dg=", ext="some-app-data", mac="UeYcj5UoTVaAWXNvJfLVia7kU3VabxCqrccXP8sUGC4="'
121
+ };
122
+
123
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1357926341000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
124
+
125
+ expect(err).to.not.exist();
126
+ expect(credentials.user).to.equal('steve');
127
+ done();
128
+ });
129
+ });
130
+
131
+ it('errors on missing hash', function (done) {
132
+
133
+ var req = {
134
+ method: 'GET',
135
+ url: '/resource/1?b=1&a=2',
136
+ host: 'example.com',
137
+ port: 8000,
138
+ authorization: 'Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", mac="m8r1rHbXN6NgO+KIIhjO7sFRyd78RNGVUwehe8Cp2dU=", ext="some-app-data"'
139
+ };
140
+
141
+ Hawk.server.authenticate(req, credentialsFunc, { payload: 'body', localtimeOffsetMsec: 1353832234000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
142
+
143
+ expect(err).to.exist();
144
+ expect(err.output.payload.message).to.equal('Missing required payload hash');
145
+ done();
146
+ });
147
+ });
148
+
149
+ it('errors on a stale timestamp', function (done) {
150
+
151
+ var req = {
152
+ method: 'GET',
153
+ url: '/resource/4?filter=a',
154
+ host: 'example.com',
155
+ port: 8080,
156
+ authorization: 'Hawk id="123456", ts="1362337299", nonce="UzmxSs", ext="some-app-data", mac="wnNUxchvvryMH2RxckTdZ/gY3ijzvccx4keVvELC61w="'
157
+ };
158
+
159
+ Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
160
+
161
+ expect(err).to.exist();
162
+ expect(err.output.payload.message).to.equal('Stale timestamp');
163
+ var header = err.output.headers['WWW-Authenticate'];
164
+ var ts = header.match(/^Hawk ts\=\"(\d+)\"\, tsm\=\"([^\"]+)\"\, error=\"Stale timestamp\"$/);
165
+ var now = Hawk.utils.now();
166
+ expect(parseInt(ts[1], 10) * 1000).to.be.within(now - 1000, now + 1000);
167
+
168
+ var res = {
169
+ headers: {
170
+ 'www-authenticate': header
171
+ }
172
+ };
173
+
174
+ expect(Hawk.client.authenticate(res, credentials, artifacts)).to.equal(true);
175
+ done();
176
+ });
177
+ });
178
+
179
+ it('errors on a replay', function (done) {
180
+
181
+ var req = {
182
+ method: 'GET',
183
+ url: '/resource/4?filter=a',
184
+ host: 'example.com',
185
+ port: 8080,
186
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="bXx7a7p1h9QYQNZ8x7QhvDQym8ACgab4m3lVSFn4DBw=", ext="hello"'
187
+ };
188
+
189
+ var memoryCache = {};
190
+ var options = {
191
+ localtimeOffsetMsec: 1353788437000 - Hawk.utils.now(),
192
+ nonceFunc: function (key, nonce, ts, callback) {
193
+
194
+ if (memoryCache[key + nonce]) {
195
+ return callback(new Error());
196
+ }
197
+
198
+ memoryCache[key + nonce] = true;
199
+ return callback();
200
+ }
201
+ };
202
+
203
+ Hawk.server.authenticate(req, credentialsFunc, options, function (err, credentials1, artifacts1) {
204
+
205
+ expect(err).to.not.exist();
206
+ expect(credentials1.user).to.equal('steve');
207
+
208
+ Hawk.server.authenticate(req, credentialsFunc, options, function (err, credentials2, artifacts2) {
209
+
210
+ expect(err).to.exist();
211
+ expect(err.output.payload.message).to.equal('Invalid nonce');
212
+ done();
213
+ });
214
+ });
215
+ });
216
+
217
+ it('does not error on nonce collision if keys differ', function (done) {
218
+
219
+ var reqSteve = {
220
+ method: 'GET',
221
+ url: '/resource/4?filter=a',
222
+ host: 'example.com',
223
+ port: 8080,
224
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="bXx7a7p1h9QYQNZ8x7QhvDQym8ACgab4m3lVSFn4DBw=", ext="hello"'
225
+ };
226
+
227
+ var reqBob = {
228
+ method: 'GET',
229
+ url: '/resource/4?filter=a',
230
+ host: 'example.com',
231
+ port: 8080,
232
+ authorization: 'Hawk id="456", ts="1353788437", nonce="k3j4h2", mac="LXfmTnRzrLd9TD7yfH+4se46Bx6AHyhpM94hLCiNia4=", ext="hello"'
233
+ };
234
+
235
+ var credentialsFuncion = function (id, callback) {
236
+
237
+ var credentials = {
238
+ '123': {
239
+ id: id,
240
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
241
+ algorithm: (id === '1' ? 'sha1' : 'sha256'),
242
+ user: 'steve'
243
+ },
244
+ '456': {
245
+ id: id,
246
+ key: 'xrunpaw3489ruxnpa98w4rxnwerxhqb98rpaxn39848',
247
+ algorithm: (id === '1' ? 'sha1' : 'sha256'),
248
+ user: 'bob'
249
+ }
250
+ };
251
+
252
+ return callback(null, credentials[id]);
253
+ };
254
+
255
+ var memoryCache = {};
256
+ var options = {
257
+ localtimeOffsetMsec: 1353788437000 - Hawk.utils.now(),
258
+ nonceFunc: function (key, nonce, ts, callback) {
259
+
260
+ if (memoryCache[key + nonce]) {
261
+ return callback(new Error());
262
+ }
263
+
264
+ memoryCache[key + nonce] = true;
265
+ return callback();
266
+ }
267
+ };
268
+
269
+ Hawk.server.authenticate(reqSteve, credentialsFuncion, options, function (err, credentials1, artifacts1) {
270
+
271
+ expect(err).to.not.exist();
272
+ expect(credentials1.user).to.equal('steve');
273
+
274
+ Hawk.server.authenticate(reqBob, credentialsFuncion, options, function (err, credentials2, artifacts2) {
275
+
276
+ expect(err).to.not.exist();
277
+ expect(credentials2.user).to.equal('bob');
278
+ done();
279
+ });
280
+ });
281
+ });
282
+
283
+ it('errors on an invalid authentication header: wrong scheme', function (done) {
284
+
285
+ var req = {
286
+ method: 'GET',
287
+ url: '/resource/4?filter=a',
288
+ host: 'example.com',
289
+ port: 8080,
290
+ authorization: 'Basic asdasdasdasd'
291
+ };
292
+
293
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
294
+
295
+ expect(err).to.exist();
296
+ expect(err.output.payload.message).to.not.exist();
297
+ done();
298
+ });
299
+ });
300
+
301
+ it('errors on an invalid authentication header: no scheme', function (done) {
302
+
303
+ var req = {
304
+ method: 'GET',
305
+ url: '/resource/4?filter=a',
306
+ host: 'example.com',
307
+ port: 8080,
308
+ authorization: '!@#'
309
+ };
310
+
311
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
312
+
313
+ expect(err).to.exist();
314
+ expect(err.output.payload.message).to.equal('Invalid header syntax');
315
+ done();
316
+ });
317
+ });
318
+
319
+ it('errors on an missing authorization header', function (done) {
320
+
321
+ var req = {
322
+ method: 'GET',
323
+ url: '/resource/4?filter=a',
324
+ host: 'example.com',
325
+ port: 8080
326
+ };
327
+
328
+ Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
329
+
330
+ expect(err).to.exist();
331
+ expect(err.isMissing).to.equal(true);
332
+ done();
333
+ });
334
+ });
335
+
336
+ it('errors on an missing host header', function (done) {
337
+
338
+ var req = {
339
+ method: 'GET',
340
+ url: '/resource/4?filter=a',
341
+ headers: {
342
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
343
+ }
344
+ };
345
+
346
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
347
+
348
+ expect(err).to.exist();
349
+ expect(err.output.payload.message).to.equal('Invalid Host header');
350
+ done();
351
+ });
352
+ });
353
+
354
+ it('errors on an missing authorization attribute (id)', function (done) {
355
+
356
+ var req = {
357
+ method: 'GET',
358
+ url: '/resource/4?filter=a',
359
+ host: 'example.com',
360
+ port: 8080,
361
+ authorization: 'Hawk ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
362
+ };
363
+
364
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
365
+
366
+ expect(err).to.exist();
367
+ expect(err.output.payload.message).to.equal('Missing attributes');
368
+ done();
369
+ });
370
+ });
371
+
372
+ it('errors on an missing authorization attribute (ts)', function (done) {
373
+
374
+ var req = {
375
+ method: 'GET',
376
+ url: '/resource/4?filter=a',
377
+ host: 'example.com',
378
+ port: 8080,
379
+ authorization: 'Hawk id="123", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
380
+ };
381
+
382
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
383
+
384
+ expect(err).to.exist();
385
+ expect(err.output.payload.message).to.equal('Missing attributes');
386
+ done();
387
+ });
388
+ });
389
+
390
+ it('errors on an missing authorization attribute (nonce)', function (done) {
391
+
392
+ var req = {
393
+ method: 'GET',
394
+ url: '/resource/4?filter=a',
395
+ host: 'example.com',
396
+ port: 8080,
397
+ authorization: 'Hawk id="123", ts="1353788437", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
398
+ };
399
+
400
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
401
+
402
+ expect(err).to.exist();
403
+ expect(err.output.payload.message).to.equal('Missing attributes');
404
+ done();
405
+ });
406
+ });
407
+
408
+ it('errors on an missing authorization attribute (mac)', function (done) {
409
+
410
+ var req = {
411
+ method: 'GET',
412
+ url: '/resource/4?filter=a',
413
+ host: 'example.com',
414
+ port: 8080,
415
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", ext="hello"'
416
+ };
417
+
418
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
419
+
420
+ expect(err).to.exist();
421
+ expect(err.output.payload.message).to.equal('Missing attributes');
422
+ done();
423
+ });
424
+ });
425
+
426
+ it('errors on an unknown authorization attribute', function (done) {
427
+
428
+ var req = {
429
+ method: 'GET',
430
+ url: '/resource/4?filter=a',
431
+ host: 'example.com',
432
+ port: 8080,
433
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", x="3", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
434
+ };
435
+
436
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
437
+
438
+ expect(err).to.exist();
439
+ expect(err.output.payload.message).to.equal('Unknown attribute: x');
440
+ done();
441
+ });
442
+ });
443
+
444
+ it('errors on an bad authorization header format', function (done) {
445
+
446
+ var req = {
447
+ method: 'GET',
448
+ url: '/resource/4?filter=a',
449
+ host: 'example.com',
450
+ port: 8080,
451
+ authorization: 'Hawk id="123\\", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
452
+ };
453
+
454
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
455
+
456
+ expect(err).to.exist();
457
+ expect(err.output.payload.message).to.equal('Bad header format');
458
+ done();
459
+ });
460
+ });
461
+
462
+ it('errors on an bad authorization attribute value', function (done) {
463
+
464
+ var req = {
465
+ method: 'GET',
466
+ url: '/resource/4?filter=a',
467
+ host: 'example.com',
468
+ port: 8080,
469
+ authorization: 'Hawk id="\t", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
470
+ };
471
+
472
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
473
+
474
+ expect(err).to.exist();
475
+ expect(err.output.payload.message).to.equal('Bad attribute value: id');
476
+ done();
477
+ });
478
+ });
479
+
480
+ it('errors on an empty authorization attribute value', function (done) {
481
+
482
+ var req = {
483
+ method: 'GET',
484
+ url: '/resource/4?filter=a',
485
+ host: 'example.com',
486
+ port: 8080,
487
+ authorization: 'Hawk id="", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
488
+ };
489
+
490
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
491
+
492
+ expect(err).to.exist();
493
+ expect(err.output.payload.message).to.equal('Bad attribute value: id');
494
+ done();
495
+ });
496
+ });
497
+
498
+ it('errors on duplicated authorization attribute key', function (done) {
499
+
500
+ var req = {
501
+ method: 'GET',
502
+ url: '/resource/4?filter=a',
503
+ host: 'example.com',
504
+ port: 8080,
505
+ authorization: 'Hawk id="123", id="456", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
506
+ };
507
+
508
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
509
+
510
+ expect(err).to.exist();
511
+ expect(err.output.payload.message).to.equal('Duplicate attribute: id');
512
+ done();
513
+ });
514
+ });
515
+
516
+ it('errors on an invalid authorization header format', function (done) {
517
+
518
+ var req = {
519
+ method: 'GET',
520
+ url: '/resource/4?filter=a',
521
+ host: 'example.com',
522
+ port: 8080,
523
+ authorization: 'Hawk'
524
+ };
525
+
526
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
527
+
528
+ expect(err).to.exist();
529
+ expect(err.output.payload.message).to.equal('Invalid header syntax');
530
+ done();
531
+ });
532
+ });
533
+
534
+ it('errors on an bad host header (missing host)', function (done) {
535
+
536
+ var req = {
537
+ method: 'GET',
538
+ url: '/resource/4?filter=a',
539
+ headers: {
540
+ host: ':8080',
541
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
542
+ }
543
+ };
544
+
545
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
546
+
547
+ expect(err).to.exist();
548
+ expect(err.output.payload.message).to.equal('Invalid Host header');
549
+ done();
550
+ });
551
+ });
552
+
553
+ it('errors on an bad host header (pad port)', function (done) {
554
+
555
+ var req = {
556
+ method: 'GET',
557
+ url: '/resource/4?filter=a',
558
+ headers: {
559
+ host: 'example.com:something',
560
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
561
+ }
562
+ };
563
+
564
+ Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
565
+
566
+ expect(err).to.exist();
567
+ expect(err.output.payload.message).to.equal('Invalid Host header');
568
+ done();
569
+ });
570
+ });
571
+
572
+ it('errors on credentialsFunc error', function (done) {
573
+
574
+ var req = {
575
+ method: 'GET',
576
+ url: '/resource/4?filter=a',
577
+ host: 'example.com',
578
+ port: 8080,
579
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
580
+ };
581
+
582
+ var credentialsFuncion = function (id, callback) {
583
+
584
+ return callback(new Error('Unknown user'));
585
+ };
586
+
587
+ Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
588
+
589
+ expect(err).to.exist();
590
+ expect(err.message).to.equal('Unknown user');
591
+ done();
592
+ });
593
+ });
594
+
595
+ it('errors on credentialsFunc error (with credentials)', function (done) {
596
+
597
+ var req = {
598
+ method: 'GET',
599
+ url: '/resource/4?filter=a',
600
+ host: 'example.com',
601
+ port: 8080,
602
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
603
+ };
604
+
605
+ var credentialsFuncion = function (id, callback) {
606
+
607
+ return callback(new Error('Unknown user'), { some: 'value' });
608
+ };
609
+
610
+ Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
611
+
612
+ expect(err).to.exist();
613
+ expect(err.message).to.equal('Unknown user');
614
+ expect(credentials.some).to.equal('value');
615
+ done();
616
+ });
617
+ });
618
+
619
+ it('errors on missing credentials', function (done) {
620
+
621
+ var req = {
622
+ method: 'GET',
623
+ url: '/resource/4?filter=a',
624
+ host: 'example.com',
625
+ port: 8080,
626
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
627
+ };
628
+
629
+ var credentialsFuncion = function (id, callback) {
630
+
631
+ return callback(null, null);
632
+ };
633
+
634
+ Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
635
+
636
+ expect(err).to.exist();
637
+ expect(err.output.payload.message).to.equal('Unknown credentials');
638
+ done();
639
+ });
640
+ });
641
+
642
+ it('errors on invalid credentials (id)', function (done) {
643
+
644
+ var req = {
645
+ method: 'GET',
646
+ url: '/resource/4?filter=a',
647
+ host: 'example.com',
648
+ port: 8080,
649
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
650
+ };
651
+
652
+ var credentialsFuncion = function (id, callback) {
653
+
654
+ var credentials = {
655
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
656
+ user: 'steve'
657
+ };
658
+
659
+ return callback(null, credentials);
660
+ };
661
+
662
+ Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
663
+
664
+ expect(err).to.exist();
665
+ expect(err.message).to.equal('Invalid credentials');
666
+ expect(err.output.payload.message).to.equal('An internal server error occurred');
667
+ done();
668
+ });
669
+ });
670
+
671
+ it('errors on invalid credentials (key)', function (done) {
672
+
673
+ var req = {
674
+ method: 'GET',
675
+ url: '/resource/4?filter=a',
676
+ host: 'example.com',
677
+ port: 8080,
678
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
679
+ };
680
+
681
+ var credentialsFuncion = function (id, callback) {
682
+
683
+ var credentials = {
684
+ id: '23434d3q4d5345d',
685
+ user: 'steve'
686
+ };
687
+
688
+ return callback(null, credentials);
689
+ };
690
+
691
+ Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
692
+
693
+ expect(err).to.exist();
694
+ expect(err.message).to.equal('Invalid credentials');
695
+ expect(err.output.payload.message).to.equal('An internal server error occurred');
696
+ done();
697
+ });
698
+ });
699
+
700
+ it('errors on unknown credentials algorithm', function (done) {
701
+
702
+ var req = {
703
+ method: 'GET',
704
+ url: '/resource/4?filter=a',
705
+ host: 'example.com',
706
+ port: 8080,
707
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
708
+ };
709
+
710
+ var credentialsFuncion = function (id, callback) {
711
+
712
+ var credentials = {
713
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
714
+ algorithm: 'hmac-sha-0',
715
+ user: 'steve'
716
+ };
717
+
718
+ return callback(null, credentials);
719
+ };
720
+
721
+ Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
722
+
723
+ expect(err).to.exist();
724
+ expect(err.message).to.equal('Unknown algorithm');
725
+ expect(err.output.payload.message).to.equal('An internal server error occurred');
726
+ done();
727
+ });
728
+ });
729
+
730
+ it('errors on unknown bad mac', function (done) {
731
+
732
+ var req = {
733
+ method: 'GET',
734
+ url: '/resource/4?filter=a',
735
+ host: 'example.com',
736
+ port: 8080,
737
+ authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcU4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
738
+ };
739
+
740
+ var credentialsFuncion = function (id, callback) {
741
+
742
+ var credentials = {
743
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
744
+ algorithm: 'sha256',
745
+ user: 'steve'
746
+ };
747
+
748
+ return callback(null, credentials);
749
+ };
750
+
751
+ Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
752
+
753
+ expect(err).to.exist();
754
+ expect(err.output.payload.message).to.equal('Bad mac');
755
+ done();
756
+ });
757
+ });
758
+ });
759
+
760
+ describe('header()', function () {
761
+
762
+ it('generates header', function (done) {
763
+
764
+ var credentials = {
765
+ id: '123456',
766
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
767
+ algorithm: 'sha256',
768
+ user: 'steve'
769
+ };
770
+
771
+ var artifacts = {
772
+ method: 'POST',
773
+ host: 'example.com',
774
+ port: '8080',
775
+ resource: '/resource/4?filter=a',
776
+ ts: '1398546787',
777
+ nonce: 'xUwusx',
778
+ hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
779
+ ext: 'some-app-data',
780
+ mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
781
+ id: '123456'
782
+ };
783
+
784
+ var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
785
+ expect(header).to.equal('Hawk mac=\"n14wVJK4cOxAytPUMc5bPezQzuJGl5n7MYXhFQgEKsE=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\", ext=\"response-specific\"');
786
+ done();
787
+ });
788
+
789
+ it('generates header (empty payload)', function (done) {
790
+
791
+ var credentials = {
792
+ id: '123456',
793
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
794
+ algorithm: 'sha256',
795
+ user: 'steve'
796
+ };
797
+
798
+ var artifacts = {
799
+ method: 'POST',
800
+ host: 'example.com',
801
+ port: '8080',
802
+ resource: '/resource/4?filter=a',
803
+ ts: '1398546787',
804
+ nonce: 'xUwusx',
805
+ hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
806
+ ext: 'some-app-data',
807
+ mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
808
+ id: '123456'
809
+ };
810
+
811
+ var header = Hawk.server.header(credentials, artifacts, { payload: '', contentType: 'text/plain', ext: 'response-specific' });
812
+ expect(header).to.equal('Hawk mac=\"i8/kUBDx0QF+PpCtW860kkV/fa9dbwEoe/FpGUXowf0=\", hash=\"q/t+NNAkQZNlq/aAD6PlexImwQTxwgT2MahfTa9XRLA=\", ext=\"response-specific\"');
813
+ done();
814
+ });
815
+
816
+ it('generates header (pre calculated hash)', function (done) {
817
+
818
+ var credentials = {
819
+ id: '123456',
820
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
821
+ algorithm: 'sha256',
822
+ user: 'steve'
823
+ };
824
+
825
+ var artifacts = {
826
+ method: 'POST',
827
+ host: 'example.com',
828
+ port: '8080',
829
+ resource: '/resource/4?filter=a',
830
+ ts: '1398546787',
831
+ nonce: 'xUwusx',
832
+ hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
833
+ ext: 'some-app-data',
834
+ mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
835
+ id: '123456'
836
+ };
837
+
838
+ var options = { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' };
839
+ options.hash = Hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
840
+ var header = Hawk.server.header(credentials, artifacts, options);
841
+ expect(header).to.equal('Hawk mac=\"n14wVJK4cOxAytPUMc5bPezQzuJGl5n7MYXhFQgEKsE=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\", ext=\"response-specific\"');
842
+ done();
843
+ });
844
+
845
+ it('generates header (null ext)', function (done) {
846
+
847
+ var credentials = {
848
+ id: '123456',
849
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
850
+ algorithm: 'sha256',
851
+ user: 'steve'
852
+ };
853
+
854
+ var artifacts = {
855
+ method: 'POST',
856
+ host: 'example.com',
857
+ port: '8080',
858
+ resource: '/resource/4?filter=a',
859
+ ts: '1398546787',
860
+ nonce: 'xUwusx',
861
+ hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
862
+ mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
863
+ id: '123456'
864
+ };
865
+
866
+ var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: null });
867
+ expect(header).to.equal('Hawk mac=\"6PrybJTJs20jsgBw5eilXpcytD8kUbaIKNYXL+6g0ns=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\"');
868
+ done();
869
+ });
870
+
871
+ it('errors on missing artifacts', function (done) {
872
+
873
+ var credentials = {
874
+ id: '123456',
875
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
876
+ algorithm: 'sha256',
877
+ user: 'steve'
878
+ };
879
+
880
+ var header = Hawk.server.header(credentials, null, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
881
+ expect(header).to.equal('');
882
+ done();
883
+ });
884
+
885
+ it('errors on invalid artifacts', function (done) {
886
+
887
+ var credentials = {
888
+ id: '123456',
889
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
890
+ algorithm: 'sha256',
891
+ user: 'steve'
892
+ };
893
+
894
+ var header = Hawk.server.header(credentials, 5, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
895
+ expect(header).to.equal('');
896
+ done();
897
+ });
898
+
899
+ it('errors on missing credentials', function (done) {
900
+
901
+ var artifacts = {
902
+ method: 'POST',
903
+ host: 'example.com',
904
+ port: '8080',
905
+ resource: '/resource/4?filter=a',
906
+ ts: '1398546787',
907
+ nonce: 'xUwusx',
908
+ hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
909
+ ext: 'some-app-data',
910
+ mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
911
+ id: '123456'
912
+ };
913
+
914
+ var header = Hawk.server.header(null, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
915
+ expect(header).to.equal('');
916
+ done();
917
+ });
918
+
919
+ it('errors on invalid credentials (key)', function (done) {
920
+
921
+ var credentials = {
922
+ id: '123456',
923
+ algorithm: 'sha256',
924
+ user: 'steve'
925
+ };
926
+
927
+ var artifacts = {
928
+ method: 'POST',
929
+ host: 'example.com',
930
+ port: '8080',
931
+ resource: '/resource/4?filter=a',
932
+ ts: '1398546787',
933
+ nonce: 'xUwusx',
934
+ hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
935
+ ext: 'some-app-data',
936
+ mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
937
+ id: '123456'
938
+ };
939
+
940
+ var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
941
+ expect(header).to.equal('');
942
+ done();
943
+ });
944
+
945
+ it('errors on invalid algorithm', function (done) {
946
+
947
+ var credentials = {
948
+ id: '123456',
949
+ key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
950
+ algorithm: 'x',
951
+ user: 'steve'
952
+ };
953
+
954
+ var artifacts = {
955
+ method: 'POST',
956
+ host: 'example.com',
957
+ port: '8080',
958
+ resource: '/resource/4?filter=a',
959
+ ts: '1398546787',
960
+ nonce: 'xUwusx',
961
+ hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
962
+ ext: 'some-app-data',
963
+ mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
964
+ id: '123456'
965
+ };
966
+
967
+ var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
968
+ expect(header).to.equal('');
969
+ done();
970
+ });
971
+ });
972
+
973
+ describe('authenticateBewit()', function () {
974
+
975
+ it('errors on uri too long', function (done) {
976
+
977
+ var long = '/';
978
+ for (var i = 0; i < 5000; ++i) {
979
+ long += 'x';
980
+ }
981
+
982
+ var req = {
983
+ method: 'GET',
984
+ url: long,
985
+ host: 'example.com',
986
+ port: 8080,
987
+ authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
988
+ };
989
+
990
+ Hawk.server.authenticateBewit(req, credentialsFunc, {}, function (err, credentials, bewit) {
991
+
992
+ expect(err).to.exist();
993
+ expect(err.output.statusCode).to.equal(400);
994
+ expect(err.message).to.equal('Resource path exceeds max length');
995
+ done();
996
+ });
997
+ });
998
+ });
999
+
1000
+ describe('authenticateMessage()', function () {
1001
+
1002
+ it('errors on invalid authorization (ts)', function (done) {
1003
+
1004
+ credentialsFunc('123456', function (err, credentials1) {
1005
+
1006
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1007
+ delete auth.ts;
1008
+
1009
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1010
+
1011
+ expect(err).to.exist();
1012
+ expect(err.message).to.equal('Invalid authorization');
1013
+ done();
1014
+ });
1015
+ });
1016
+ });
1017
+
1018
+ it('errors on invalid authorization (nonce)', function (done) {
1019
+
1020
+ credentialsFunc('123456', function (err, credentials1) {
1021
+
1022
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1023
+ delete auth.nonce;
1024
+
1025
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1026
+
1027
+ expect(err).to.exist();
1028
+ expect(err.message).to.equal('Invalid authorization');
1029
+ done();
1030
+ });
1031
+ });
1032
+ });
1033
+
1034
+ it('errors on invalid authorization (hash)', function (done) {
1035
+
1036
+ credentialsFunc('123456', function (err, credentials1) {
1037
+
1038
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1039
+ delete auth.hash;
1040
+
1041
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1042
+
1043
+ expect(err).to.exist();
1044
+ expect(err.message).to.equal('Invalid authorization');
1045
+ done();
1046
+ });
1047
+ });
1048
+ });
1049
+
1050
+ it('errors with credentials', function (done) {
1051
+
1052
+ credentialsFunc('123456', function (err, credentials1) {
1053
+
1054
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1055
+
1056
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, function (id, callback) {
1057
+
1058
+ callback(new Error('something'), { some: 'value' });
1059
+ }, {}, function (err, credentials2) {
1060
+
1061
+ expect(err).to.exist();
1062
+ expect(err.message).to.equal('something');
1063
+ expect(credentials2.some).to.equal('value');
1064
+ done();
1065
+ });
1066
+ });
1067
+ });
1068
+
1069
+ it('errors on nonce collision', function (done) {
1070
+
1071
+ credentialsFunc('123456', function (err, credentials1) {
1072
+
1073
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1074
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {
1075
+ nonceFunc: function (key, nonce, ts, nonceCallback) {
1076
+
1077
+ nonceCallback(true);
1078
+ }
1079
+ }, function (err, credentials2) {
1080
+
1081
+ expect(err).to.exist();
1082
+ expect(err.message).to.equal('Invalid nonce');
1083
+ done();
1084
+ });
1085
+ });
1086
+ });
1087
+
1088
+ it('should generate an authorization then successfully parse it', function (done) {
1089
+
1090
+ credentialsFunc('123456', function (err, credentials1) {
1091
+
1092
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1093
+ expect(auth).to.exist();
1094
+
1095
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1096
+
1097
+ expect(err).to.not.exist();
1098
+ expect(credentials2.user).to.equal('steve');
1099
+ done();
1100
+ });
1101
+ });
1102
+ });
1103
+
1104
+ it('should fail authorization on mismatching host', function (done) {
1105
+
1106
+ credentialsFunc('123456', function (err, credentials1) {
1107
+
1108
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1109
+ expect(auth).to.exist();
1110
+
1111
+ Hawk.server.authenticateMessage('example1.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1112
+
1113
+ expect(err).to.exist();
1114
+ expect(err.message).to.equal('Bad mac');
1115
+ done();
1116
+ });
1117
+ });
1118
+ });
1119
+
1120
+ it('should fail authorization on stale timestamp', function (done) {
1121
+
1122
+ credentialsFunc('123456', function (err, credentials1) {
1123
+
1124
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1125
+ expect(auth).to.exist();
1126
+
1127
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { localtimeOffsetMsec: 100000 }, function (err, credentials2) {
1128
+
1129
+ expect(err).to.exist();
1130
+ expect(err.message).to.equal('Stale timestamp');
1131
+ done();
1132
+ });
1133
+ });
1134
+ });
1135
+
1136
+ it('overrides timestampSkewSec', function (done) {
1137
+
1138
+ credentialsFunc('123456', function (err, credentials1) {
1139
+
1140
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1, localtimeOffsetMsec: 100000 });
1141
+ expect(auth).to.exist();
1142
+
1143
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { timestampSkewSec: 500 }, function (err, credentials2) {
1144
+
1145
+ expect(err).to.not.exist();
1146
+ done();
1147
+ });
1148
+ });
1149
+ });
1150
+
1151
+ it('should fail authorization on invalid authorization', function (done) {
1152
+
1153
+ credentialsFunc('123456', function (err, credentials1) {
1154
+
1155
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1156
+ expect(auth).to.exist();
1157
+ delete auth.id;
1158
+
1159
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
1160
+
1161
+ expect(err).to.exist();
1162
+ expect(err.message).to.equal('Invalid authorization');
1163
+ done();
1164
+ });
1165
+ });
1166
+ });
1167
+
1168
+ it('should fail authorization on bad hash', function (done) {
1169
+
1170
+ credentialsFunc('123456', function (err, credentials1) {
1171
+
1172
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1173
+ expect(auth).to.exist();
1174
+
1175
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message1', auth, credentialsFunc, {}, function (err, credentials2) {
1176
+
1177
+ expect(err).to.exist();
1178
+ expect(err.message).to.equal('Bad message hash');
1179
+ done();
1180
+ });
1181
+ });
1182
+ });
1183
+
1184
+ it('should fail authorization on nonce error', function (done) {
1185
+
1186
+ credentialsFunc('123456', function (err, credentials1) {
1187
+
1188
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1189
+ expect(auth).to.exist();
1190
+
1191
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {
1192
+ nonceFunc: function (key, nonce, ts, callback) {
1193
+
1194
+ callback(new Error('kaboom'));
1195
+ }
1196
+ }, function (err, credentials2) {
1197
+
1198
+ expect(err).to.exist();
1199
+ expect(err.message).to.equal('Invalid nonce');
1200
+ done();
1201
+ });
1202
+ });
1203
+ });
1204
+
1205
+ it('should fail authorization on credentials error', function (done) {
1206
+
1207
+ credentialsFunc('123456', function (err, credentials1) {
1208
+
1209
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1210
+ expect(auth).to.exist();
1211
+
1212
+ var errFunc = function (id, callback) {
1213
+
1214
+ callback(new Error('kablooey'));
1215
+ };
1216
+
1217
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
1218
+
1219
+ expect(err).to.exist();
1220
+ expect(err.message).to.equal('kablooey');
1221
+ done();
1222
+ });
1223
+ });
1224
+ });
1225
+
1226
+ it('should fail authorization on missing credentials', function (done) {
1227
+
1228
+ credentialsFunc('123456', function (err, credentials1) {
1229
+
1230
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1231
+ expect(auth).to.exist();
1232
+
1233
+ var errFunc = function (id, callback) {
1234
+
1235
+ callback();
1236
+ };
1237
+
1238
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
1239
+
1240
+ expect(err).to.exist();
1241
+ expect(err.message).to.equal('Unknown credentials');
1242
+ done();
1243
+ });
1244
+ });
1245
+ });
1246
+
1247
+ it('should fail authorization on invalid credentials', function (done) {
1248
+
1249
+ credentialsFunc('123456', function (err, credentials1) {
1250
+
1251
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1252
+ expect(auth).to.exist();
1253
+
1254
+ var errFunc = function (id, callback) {
1255
+
1256
+ callback(null, {});
1257
+ };
1258
+
1259
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
1260
+
1261
+ expect(err).to.exist();
1262
+ expect(err.message).to.equal('Invalid credentials');
1263
+ done();
1264
+ });
1265
+ });
1266
+ });
1267
+
1268
+ it('should fail authorization on invalid credentials algorithm', function (done) {
1269
+
1270
+ credentialsFunc('123456', function (err, credentials1) {
1271
+
1272
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
1273
+ expect(auth).to.exist();
1274
+
1275
+ var errFunc = function (id, callback) {
1276
+
1277
+ callback(null, { key: '123', algorithm: '456' });
1278
+ };
1279
+
1280
+ Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
1281
+
1282
+ expect(err).to.exist();
1283
+ expect(err.message).to.equal('Unknown algorithm');
1284
+ done();
1285
+ });
1286
+ });
1287
+ });
1288
+
1289
+ it('should fail on missing host', function (done) {
1290
+
1291
+ credentialsFunc('123456', function (err, credentials) {
1292
+
1293
+ var auth = Hawk.client.message(null, 8080, 'some message', { credentials: credentials });
1294
+ expect(auth).to.not.exist();
1295
+ done();
1296
+ });
1297
+ });
1298
+
1299
+ it('should fail on missing credentials', function (done) {
1300
+
1301
+ var auth = Hawk.client.message('example.com', 8080, 'some message', {});
1302
+ expect(auth).to.not.exist();
1303
+ done();
1304
+ });
1305
+
1306
+ it('should fail on invalid algorithm', function (done) {
1307
+
1308
+ credentialsFunc('123456', function (err, credentials) {
1309
+
1310
+ var creds = Hoek.clone(credentials);
1311
+ creds.algorithm = 'blah';
1312
+ var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: creds });
1313
+ expect(auth).to.not.exist();
1314
+ done();
1315
+ });
1316
+ });
1317
+ });
1318
+
1319
+ describe('authenticatePayloadHash()', function () {
1320
+
1321
+ it('checks payload hash', function (done) {
1322
+
1323
+ expect(Hawk.server.authenticatePayloadHash('abcdefg', { hash: 'abcdefg' })).to.equal(true);
1324
+ expect(Hawk.server.authenticatePayloadHash('1234567', { hash: 'abcdefg' })).to.equal(false);
1325
+ done();
1326
+ });
1327
+ });
1328
+ });
1329
+