Initial commit
[yaffs-website] / node_modules / hawk / test / client.js
1 // Load modules\r
2 \r
3 var Url = require('url');\r
4 var Code = require('code');\r
5 var Hawk = require('../lib');\r
6 var Lab = require('lab');\r
7 \r
8 \r
9 // Declare internals\r
10 \r
11 var internals = {};\r
12 \r
13 \r
14 // Test shortcuts\r
15 \r
16 var lab = exports.lab = Lab.script();\r
17 var describe = lab.experiment;\r
18 var it = lab.test;\r
19 var expect = Code.expect;\r
20 \r
21 \r
22 describe('Client', function () {\r
23 \r
24     describe('header()', function () {\r
25 \r
26         it('returns a valid authorization header (sha1)', function (done) {\r
27 \r
28             var credentials = {\r
29                 id: '123456',\r
30                 key: '2983d45yun89q',\r
31                 algorithm: 'sha1'\r
32             };\r
33 \r
34             var header = Hawk.client.header('http://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about' }).field;\r
35             expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="bsvY3IfUllw6V5rvk4tStEvpBhE=", ext="Bazinga!", mac="qbf1ZPG/r/e06F4ht+T77LXi5vw="');\r
36             done();\r
37         });\r
38 \r
39         it('returns a valid authorization header (sha256)', function (done) {\r
40 \r
41             var credentials = {\r
42                 id: '123456',\r
43                 key: '2983d45yun89q',\r
44                 algorithm: 'sha256'\r
45             };\r
46 \r
47             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' }).field;\r
48             expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", ext="Bazinga!", mac="q1CwFoSHzPZSkbIvl0oYlD+91rBUEvFk763nMjMndj8="');\r
49             done();\r
50         });\r
51 \r
52         it('returns a valid authorization header (no ext)', function (done) {\r
53 \r
54             var credentials = {\r
55                 id: '123456',\r
56                 key: '2983d45yun89q',\r
57                 algorithm: 'sha256'\r
58             };\r
59 \r
60             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' }).field;\r
61             expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');\r
62             done();\r
63         });\r
64 \r
65         it('returns a valid authorization header (null ext)', function (done) {\r
66 \r
67             var credentials = {\r
68                 id: '123456',\r
69                 key: '2983d45yun89q',\r
70                 algorithm: 'sha256'\r
71             };\r
72 \r
73             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain', ext: null }).field;\r
74             expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');\r
75             done();\r
76         });\r
77 \r
78         it('returns a valid authorization header (empty payload)', function (done) {\r
79 \r
80             var credentials = {\r
81                 id: '123456',\r
82                 key: '2983d45yun89q',\r
83                 algorithm: 'sha256'\r
84             };\r
85 \r
86             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: '', contentType: 'text/plain' }).field;\r
87             expect(header).to.equal('Hawk id=\"123456\", ts=\"1353809207\", nonce=\"Ygvqdz\", hash=\"q/t+NNAkQZNlq/aAD6PlexImwQTxwgT2MahfTa9XRLA=\", mac=\"U5k16YEzn3UnBHKeBzsDXn067Gu3R4YaY6xOt9PYRZM=\"');\r
88             done();\r
89         });\r
90 \r
91         it('returns a valid authorization header (pre hashed payload)', function (done) {\r
92 \r
93             var credentials = {\r
94                 id: '123456',\r
95                 key: '2983d45yun89q',\r
96                 algorithm: 'sha256'\r
97             };\r
98 \r
99             var options = { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' };\r
100             options.hash = Hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);\r
101             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', options).field;\r
102             expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');\r
103             done();\r
104         });\r
105 \r
106         it('errors on missing uri', function (done) {\r
107 \r
108             var header = Hawk.client.header('', 'POST');\r
109             expect(header.field).to.equal('');\r
110             expect(header.err).to.equal('Invalid argument type');\r
111             done();\r
112         });\r
113 \r
114         it('errors on invalid uri', function (done) {\r
115 \r
116             var header = Hawk.client.header(4, 'POST');\r
117             expect(header.field).to.equal('');\r
118             expect(header.err).to.equal('Invalid argument type');\r
119             done();\r
120         });\r
121 \r
122         it('errors on missing method', function (done) {\r
123 \r
124             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', '');\r
125             expect(header.field).to.equal('');\r
126             expect(header.err).to.equal('Invalid argument type');\r
127             done();\r
128         });\r
129 \r
130         it('errors on invalid method', function (done) {\r
131 \r
132             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 5);\r
133             expect(header.field).to.equal('');\r
134             expect(header.err).to.equal('Invalid argument type');\r
135             done();\r
136         });\r
137 \r
138         it('errors on missing options', function (done) {\r
139 \r
140             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST');\r
141             expect(header.field).to.equal('');\r
142             expect(header.err).to.equal('Invalid argument type');\r
143             done();\r
144         });\r
145 \r
146         it('errors on invalid credentials (id)', function (done) {\r
147 \r
148             var credentials = {\r
149                 key: '2983d45yun89q',\r
150                 algorithm: 'sha256'\r
151             };\r
152 \r
153             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });\r
154             expect(header.field).to.equal('');\r
155             expect(header.err).to.equal('Invalid credential object');\r
156             done();\r
157         });\r
158 \r
159         it('errors on missing credentials', function (done) {\r
160 \r
161             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { ext: 'Bazinga!', timestamp: 1353809207 });\r
162             expect(header.field).to.equal('');\r
163             expect(header.err).to.equal('Invalid credential object');\r
164             done();\r
165         });\r
166 \r
167         it('errors on invalid credentials', function (done) {\r
168 \r
169             var credentials = {\r
170                 id: '123456',\r
171                 algorithm: 'sha256'\r
172             };\r
173 \r
174             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });\r
175             expect(header.field).to.equal('');\r
176             expect(header.err).to.equal('Invalid credential object');\r
177             done();\r
178         });\r
179 \r
180         it('errors on invalid algorithm', function (done) {\r
181 \r
182             var credentials = {\r
183                 id: '123456',\r
184                 key: '2983d45yun89q',\r
185                 algorithm: 'hmac-sha-0'\r
186             };\r
187 \r
188             var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, payload: 'something, anything!', ext: 'Bazinga!', timestamp: 1353809207 });\r
189             expect(header.field).to.equal('');\r
190             expect(header.err).to.equal('Unknown algorithm');\r
191             done();\r
192         });\r
193     });\r
194 \r
195     describe('authenticate()', function () {\r
196 \r
197         it('returns false on invalid header', function (done) {\r
198 \r
199             var res = {\r
200                 headers: {\r
201                     'server-authorization': 'Hawk mac="abc", bad="xyz"'\r
202                 }\r
203             };\r
204 \r
205             expect(Hawk.client.authenticate(res, {})).to.equal(false);\r
206             done();\r
207         });\r
208 \r
209         it('returns false on invalid mac', function (done) {\r
210 \r
211             var res = {\r
212                 headers: {\r
213                     'content-type': 'text/plain',\r
214                     'server-authorization': 'Hawk mac="_IJRsMl/4oL+nn+vKoeVZPdCHXB4yJkNnBbTbHFZUYE=", hash="f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=", ext="response-specific"'\r
215                 }\r
216             };\r
217 \r
218             var artifacts = {\r
219                 method: 'POST',\r
220                 host: 'example.com',\r
221                 port: '8080',\r
222                 resource: '/resource/4?filter=a',\r
223                 ts: '1362336900',\r
224                 nonce: 'eb5S_L',\r
225                 hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',\r
226                 ext: 'some-app-data',\r
227                 app: undefined,\r
228                 dlg: undefined,\r
229                 mac: 'BlmSe8K+pbKIb6YsZCnt4E1GrYvY1AaYayNR82dGpIk=',\r
230                 id: '123456'\r
231             };\r
232 \r
233             var credentials = {\r
234                 id: '123456',\r
235                 key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',\r
236                 algorithm: 'sha256',\r
237                 user: 'steve'\r
238             };\r
239 \r
240             expect(Hawk.client.authenticate(res, credentials, artifacts)).to.equal(false);\r
241             done();\r
242         });\r
243 \r
244         it('returns true on ignoring hash', function (done) {\r
245 \r
246             var res = {\r
247                 headers: {\r
248                     'content-type': 'text/plain',\r
249                     'server-authorization': 'Hawk mac="XIJRsMl/4oL+nn+vKoeVZPdCHXB4yJkNnBbTbHFZUYE=", hash="f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=", ext="response-specific"'\r
250                 }\r
251             };\r
252 \r
253             var artifacts = {\r
254                 method: 'POST',\r
255                 host: 'example.com',\r
256                 port: '8080',\r
257                 resource: '/resource/4?filter=a',\r
258                 ts: '1362336900',\r
259                 nonce: 'eb5S_L',\r
260                 hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',\r
261                 ext: 'some-app-data',\r
262                 app: undefined,\r
263                 dlg: undefined,\r
264                 mac: 'BlmSe8K+pbKIb6YsZCnt4E1GrYvY1AaYayNR82dGpIk=',\r
265                 id: '123456'\r
266             };\r
267 \r
268             var credentials = {\r
269                 id: '123456',\r
270                 key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',\r
271                 algorithm: 'sha256',\r
272                 user: 'steve'\r
273             };\r
274 \r
275             expect(Hawk.client.authenticate(res, credentials, artifacts)).to.equal(true);\r
276             done();\r
277         });\r
278 \r
279         it('fails on invalid WWW-Authenticate header format', function (done) {\r
280 \r
281             var header = 'Hawk ts="1362346425875", tsm="PhwayS28vtnn3qbv0mqRBYSXebN/zggEtucfeZ620Zo=", x="Stale timestamp"';\r
282             expect(Hawk.client.authenticate({ headers: { 'www-authenticate': header } }, {})).to.equal(false);\r
283             done();\r
284         });\r
285 \r
286         it('fails on invalid WWW-Authenticate header format', function (done) {\r
287 \r
288             var credentials = {\r
289                 id: '123456',\r
290                 key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',\r
291                 algorithm: 'sha256',\r
292                 user: 'steve'\r
293             };\r
294 \r
295             var header = 'Hawk ts="1362346425875", tsm="hwayS28vtnn3qbv0mqRBYSXebN/zggEtucfeZ620Zo=", error="Stale timestamp"';\r
296             expect(Hawk.client.authenticate({ headers: { 'www-authenticate': header } }, credentials)).to.equal(false);\r
297             done();\r
298         });\r
299 \r
300         it('skips tsm validation when missing ts', function (done) {\r
301 \r
302             var header = 'Hawk error="Stale timestamp"';\r
303             expect(Hawk.client.authenticate({ headers: { 'www-authenticate': header } }, {})).to.equal(true);\r
304             done();\r
305         });\r
306     });\r
307 \r
308     describe('message()', function () {\r
309 \r
310         it('generates authorization', function (done) {\r
311 \r
312             var credentials = {\r
313                 id: '123456',\r
314                 key: '2983d45yun89q',\r
315                 algorithm: 'sha1'\r
316             };\r
317 \r
318             var auth = Hawk.client.message('example.com', 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });\r
319             expect(auth).to.exist();\r
320             expect(auth.ts).to.equal(1353809207);\r
321             expect(auth.nonce).to.equal('abc123');\r
322             done();\r
323         });\r
324 \r
325         it('errors on invalid host', function (done) {\r
326 \r
327             var credentials = {\r
328                 id: '123456',\r
329                 key: '2983d45yun89q',\r
330                 algorithm: 'sha1'\r
331             };\r
332 \r
333             var auth = Hawk.client.message(5, 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });\r
334             expect(auth).to.not.exist();\r
335             done();\r
336         });\r
337 \r
338         it('errors on invalid port', function (done) {\r
339 \r
340             var credentials = {\r
341                 id: '123456',\r
342                 key: '2983d45yun89q',\r
343                 algorithm: 'sha1'\r
344             };\r
345 \r
346             var auth = Hawk.client.message('example.com', '80', 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });\r
347             expect(auth).to.not.exist();\r
348             done();\r
349         });\r
350 \r
351         it('errors on missing host', function (done) {\r
352 \r
353             var credentials = {\r
354                 id: '123456',\r
355                 key: '2983d45yun89q',\r
356                 algorithm: 'sha1'\r
357             };\r
358 \r
359             var auth = Hawk.client.message('example.com', 0, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });\r
360             expect(auth).to.not.exist();\r
361             done();\r
362         });\r
363 \r
364         it('errors on null message', function (done) {\r
365 \r
366             var credentials = {\r
367                 id: '123456',\r
368                 key: '2983d45yun89q',\r
369                 algorithm: 'sha1'\r
370             };\r
371 \r
372             var auth = Hawk.client.message('example.com', 80, null, { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });\r
373             expect(auth).to.not.exist();\r
374             done();\r
375         });\r
376 \r
377         it('errors on missing message', function (done) {\r
378 \r
379             var credentials = {\r
380                 id: '123456',\r
381                 key: '2983d45yun89q',\r
382                 algorithm: 'sha1'\r
383             };\r
384 \r
385             var auth = Hawk.client.message('example.com', 80, undefined, { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });\r
386             expect(auth).to.not.exist();\r
387             done();\r
388         });\r
389 \r
390         it('errors on invalid message', function (done) {\r
391 \r
392             var credentials = {\r
393                 id: '123456',\r
394                 key: '2983d45yun89q',\r
395                 algorithm: 'sha1'\r
396             };\r
397 \r
398             var auth = Hawk.client.message('example.com', 80, 5, { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });\r
399             expect(auth).to.not.exist();\r
400             done();\r
401         });\r
402 \r
403         it('errors on missing options', function (done) {\r
404 \r
405             var credentials = {\r
406                 id: '123456',\r
407                 key: '2983d45yun89q',\r
408                 algorithm: 'sha1'\r
409             };\r
410 \r
411             var auth = Hawk.client.message('example.com', 80, 'I am the boodyman');\r
412             expect(auth).to.not.exist();\r
413             done();\r
414         });\r
415 \r
416         it('errors on invalid credentials (id)', function (done) {\r
417 \r
418             var credentials = {\r
419                 key: '2983d45yun89q',\r
420                 algorithm: 'sha1'\r
421             };\r
422 \r
423             var auth = Hawk.client.message('example.com', 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });\r
424             expect(auth).to.not.exist();\r
425             done();\r
426         });\r
427 \r
428         it('errors on invalid credentials (key)', function (done) {\r
429 \r
430             var credentials = {\r
431                 id: '123456',\r
432                 algorithm: 'sha1'\r
433             };\r
434 \r
435             var auth = Hawk.client.message('example.com', 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });\r
436             expect(auth).to.not.exist();\r
437             done();\r
438         });\r
439     });\r
440 });\r