Initial commit
[yaffs-website] / node_modules / hawk / test / uri.js
1 // Load modules\r
2 \r
3 var Http = require('http');\r
4 var Url = require('url');\r
5 var Code = require('code');\r
6 var Hawk = require('../lib');\r
7 var Hoek = require('hoek');\r
8 var Lab = require('lab');\r
9 \r
10 \r
11 // Declare internals\r
12 \r
13 var internals = {};\r
14 \r
15 \r
16 // Test shortcuts\r
17 \r
18 var lab = exports.lab = Lab.script();\r
19 var describe = lab.experiment;\r
20 var it = lab.test;\r
21 var expect = Code.expect;\r
22 \r
23 \r
24 describe('Uri', function () {\r
25 \r
26     var credentialsFunc = function (id, callback) {\r
27 \r
28         var credentials = {\r
29             id: id,\r
30             key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',\r
31             algorithm: (id === '1' ? 'sha1' : 'sha256'),\r
32             user: 'steve'\r
33         };\r
34 \r
35         return callback(null, credentials);\r
36     };\r
37 \r
38     it('should generate a bewit then successfully authenticate it', function (done) {\r
39 \r
40         var req = {\r
41             method: 'GET',\r
42             url: '/resource/4?a=1&b=2',\r
43             host: 'example.com',\r
44             port: 80\r
45         };\r
46 \r
47         credentialsFunc('123456', function (err, credentials1) {\r
48 \r
49             var bewit = Hawk.uri.getBewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials1, ttlSec: 60 * 60 * 24 * 365 * 100, ext: 'some-app-data' });\r
50             req.url += '&bewit=' + bewit;\r
51 \r
52             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials2, attributes) {\r
53 \r
54                 expect(err).to.not.exist();\r
55                 expect(credentials2.user).to.equal('steve');\r
56                 expect(attributes.ext).to.equal('some-app-data');\r
57                 done();\r
58             });\r
59         });\r
60     });\r
61 \r
62     it('should generate a bewit then successfully authenticate it (no ext)', function (done) {\r
63 \r
64         var req = {\r
65             method: 'GET',\r
66             url: '/resource/4?a=1&b=2',\r
67             host: 'example.com',\r
68             port: 80\r
69         };\r
70 \r
71         credentialsFunc('123456', function (err, credentials1) {\r
72 \r
73             var bewit = Hawk.uri.getBewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials1, ttlSec: 60 * 60 * 24 * 365 * 100 });\r
74             req.url += '&bewit=' + bewit;\r
75 \r
76             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials2, attributes) {\r
77 \r
78                 expect(err).to.not.exist();\r
79                 expect(credentials2.user).to.equal('steve');\r
80                 done();\r
81             });\r
82         });\r
83     });\r
84 \r
85     it('should successfully authenticate a request (last param)', function (done) {\r
86 \r
87         var req = {\r
88             method: 'GET',\r
89             url: '/resource/4?a=1&b=2&bewit=MTIzNDU2XDQ1MTE0ODQ2MjFcMzFjMmNkbUJFd1NJRVZDOVkva1NFb2c3d3YrdEVNWjZ3RXNmOGNHU2FXQT1cc29tZS1hcHAtZGF0YQ',\r
90             host: 'example.com',\r
91             port: 8080\r
92         };\r
93 \r
94         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
95 \r
96             expect(err).to.not.exist();\r
97             expect(credentials.user).to.equal('steve');\r
98             expect(attributes.ext).to.equal('some-app-data');\r
99             done();\r
100         });\r
101     });\r
102 \r
103     it('should successfully authenticate a request (first param)', function (done) {\r
104 \r
105         var req = {\r
106             method: 'GET',\r
107             url: '/resource/4?bewit=MTIzNDU2XDQ1MTE0ODQ2MjFcMzFjMmNkbUJFd1NJRVZDOVkva1NFb2c3d3YrdEVNWjZ3RXNmOGNHU2FXQT1cc29tZS1hcHAtZGF0YQ&a=1&b=2',\r
108             host: 'example.com',\r
109             port: 8080\r
110         };\r
111 \r
112         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
113 \r
114             expect(err).to.not.exist();\r
115             expect(credentials.user).to.equal('steve');\r
116             expect(attributes.ext).to.equal('some-app-data');\r
117             done();\r
118         });\r
119     });\r
120 \r
121     it('should successfully authenticate a request (only param)', function (done) {\r
122 \r
123         var req = {\r
124             method: 'GET',\r
125             url: '/resource/4?bewit=MTIzNDU2XDQ1MTE0ODQ2NDFcZm1CdkNWT3MvcElOTUUxSTIwbWhrejQ3UnBwTmo4Y1VrSHpQd3Q5OXJ1cz1cc29tZS1hcHAtZGF0YQ',\r
126             host: 'example.com',\r
127             port: 8080\r
128         };\r
129 \r
130         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
131 \r
132             expect(err).to.not.exist();\r
133             expect(credentials.user).to.equal('steve');\r
134             expect(attributes.ext).to.equal('some-app-data');\r
135             done();\r
136         });\r
137     });\r
138 \r
139     it('should fail on multiple authentication', function (done) {\r
140 \r
141         var req = {\r
142             method: 'GET',\r
143             url: '/resource/4?bewit=MTIzNDU2XDQ1MTE0ODQ2NDFcZm1CdkNWT3MvcElOTUUxSTIwbWhrejQ3UnBwTmo4Y1VrSHpQd3Q5OXJ1cz1cc29tZS1hcHAtZGF0YQ',\r
144             host: 'example.com',\r
145             port: 8080,\r
146             authorization: 'Basic asdasdasdasd'\r
147         };\r
148 \r
149         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
150 \r
151             expect(err).to.exist();\r
152             expect(err.output.payload.message).to.equal('Multiple authentications');\r
153             done();\r
154         });\r
155     });\r
156 \r
157     it('should fail on method other than GET', function (done) {\r
158 \r
159         credentialsFunc('123456', function (err, credentials1) {\r
160 \r
161             var req = {\r
162                 method: 'POST',\r
163                 url: '/resource/4?filter=a',\r
164                 host: 'example.com',\r
165                 port: 8080\r
166             };\r
167 \r
168             var exp = Math.floor(Hawk.utils.now() / 1000) + 60;\r
169             var ext = 'some-app-data';\r
170             var mac = Hawk.crypto.calculateMac('bewit', credentials1, {\r
171                 timestamp: exp,\r
172                 nonce: '',\r
173                 method: req.method,\r
174                 resource: req.url,\r
175                 host: req.host,\r
176                 port: req.port,\r
177                 ext: ext\r
178             });\r
179 \r
180             var bewit = credentials1.id + '\\' + exp + '\\' + mac + '\\' + ext;\r
181 \r
182             req.url += '&bewit=' + Hoek.base64urlEncode(bewit);\r
183 \r
184             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials2, attributes) {\r
185 \r
186                 expect(err).to.exist();\r
187                 expect(err.output.payload.message).to.equal('Invalid method');\r
188                 done();\r
189             });\r
190         });\r
191     });\r
192 \r
193     it('should fail on invalid host header', function (done) {\r
194 \r
195         var req = {\r
196             method: 'GET',\r
197             url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',\r
198             headers: {\r
199                 host: 'example.com:something'\r
200             }\r
201         };\r
202 \r
203         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
204 \r
205             expect(err).to.exist();\r
206             expect(err.output.payload.message).to.equal('Invalid Host header');\r
207             done();\r
208         });\r
209     });\r
210 \r
211     it('should fail on empty bewit', function (done) {\r
212 \r
213         var req = {\r
214             method: 'GET',\r
215             url: '/resource/4?bewit=',\r
216             host: 'example.com',\r
217             port: 8080\r
218         };\r
219 \r
220         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
221 \r
222             expect(err).to.exist();\r
223             expect(err.output.payload.message).to.equal('Empty bewit');\r
224             expect(err.isMissing).to.not.exist();\r
225             done();\r
226         });\r
227     });\r
228 \r
229     it('should fail on invalid bewit', function (done) {\r
230 \r
231         var req = {\r
232             method: 'GET',\r
233             url: '/resource/4?bewit=*',\r
234             host: 'example.com',\r
235             port: 8080\r
236         };\r
237 \r
238         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
239 \r
240             expect(err).to.exist();\r
241             expect(err.output.payload.message).to.equal('Invalid bewit encoding');\r
242             expect(err.isMissing).to.not.exist();\r
243             done();\r
244         });\r
245     });\r
246 \r
247     it('should fail on missing bewit', function (done) {\r
248 \r
249         var req = {\r
250             method: 'GET',\r
251             url: '/resource/4',\r
252             host: 'example.com',\r
253             port: 8080\r
254         };\r
255 \r
256         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
257 \r
258             expect(err).to.exist();\r
259             expect(err.output.payload.message).to.not.exist();\r
260             expect(err.isMissing).to.equal(true);\r
261             done();\r
262         });\r
263     });\r
264 \r
265     it('should fail on invalid bewit structure', function (done) {\r
266 \r
267         var req = {\r
268             method: 'GET',\r
269             url: '/resource/4?bewit=abc',\r
270             host: 'example.com',\r
271             port: 8080\r
272         };\r
273 \r
274         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
275 \r
276             expect(err).to.exist();\r
277             expect(err.output.payload.message).to.equal('Invalid bewit structure');\r
278             done();\r
279         });\r
280     });\r
281 \r
282     it('should fail on empty bewit attribute', function (done) {\r
283 \r
284         var req = {\r
285             method: 'GET',\r
286             url: '/resource/4?bewit=YVxcY1xk',\r
287             host: 'example.com',\r
288             port: 8080\r
289         };\r
290 \r
291         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
292 \r
293             expect(err).to.exist();\r
294             expect(err.output.payload.message).to.equal('Missing bewit attributes');\r
295             done();\r
296         });\r
297     });\r
298 \r
299     it('should fail on missing bewit id attribute', function (done) {\r
300 \r
301         var req = {\r
302             method: 'GET',\r
303             url: '/resource/4?bewit=XDQ1NTIxNDc2MjJcK0JFbFhQMXhuWjcvd1Nrbm1ldGhlZm5vUTNHVjZNSlFVRHk4NWpTZVJ4VT1cc29tZS1hcHAtZGF0YQ',\r
304             host: 'example.com',\r
305             port: 8080\r
306         };\r
307 \r
308         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
309 \r
310             expect(err).to.exist();\r
311             expect(err.output.payload.message).to.equal('Missing bewit attributes');\r
312             done();\r
313         });\r
314     });\r
315 \r
316     it('should fail on expired access', function (done) {\r
317 \r
318         var req = {\r
319             method: 'GET',\r
320             url: '/resource/4?a=1&b=2&bewit=MTIzNDU2XDEzNTY0MTg1ODNcWk1wZlMwWU5KNHV0WHpOMmRucTRydEk3NXNXTjFjeWVITTcrL0tNZFdVQT1cc29tZS1hcHAtZGF0YQ',\r
321             host: 'example.com',\r
322             port: 8080\r
323         };\r
324 \r
325         Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {\r
326 \r
327             expect(err).to.exist();\r
328             expect(err.output.payload.message).to.equal('Access expired');\r
329             done();\r
330         });\r
331     });\r
332 \r
333     it('should fail on credentials function error', function (done) {\r
334 \r
335         var req = {\r
336             method: 'GET',\r
337             url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',\r
338             host: 'example.com',\r
339             port: 8080\r
340         };\r
341 \r
342         Hawk.uri.authenticate(req, function (id, callback) {\r
343 \r
344             callback(Hawk.error.badRequest('Boom'));\r
345         }, {}, function (err, credentials, attributes) {\r
346 \r
347             expect(err).to.exist();\r
348             expect(err.output.payload.message).to.equal('Boom');\r
349             done();\r
350         });\r
351     });\r
352 \r
353     it('should fail on credentials function error with credentials', function (done) {\r
354 \r
355         var req = {\r
356             method: 'GET',\r
357             url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',\r
358             host: 'example.com',\r
359             port: 8080\r
360         };\r
361 \r
362         Hawk.uri.authenticate(req, function (id, callback) {\r
363 \r
364             callback(Hawk.error.badRequest('Boom'), { some: 'value' });\r
365         }, {}, function (err, credentials, attributes) {\r
366 \r
367             expect(err).to.exist();\r
368             expect(err.output.payload.message).to.equal('Boom');\r
369             expect(credentials.some).to.equal('value');\r
370             done();\r
371         });\r
372     });\r
373 \r
374     it('should fail on null credentials function response', function (done) {\r
375 \r
376         var req = {\r
377             method: 'GET',\r
378             url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',\r
379             host: 'example.com',\r
380             port: 8080\r
381         };\r
382 \r
383         Hawk.uri.authenticate(req, function (id, callback) {\r
384 \r
385             callback(null, null);\r
386         }, {}, function (err, credentials, attributes) {\r
387 \r
388             expect(err).to.exist();\r
389             expect(err.output.payload.message).to.equal('Unknown credentials');\r
390             done();\r
391         });\r
392     });\r
393 \r
394     it('should fail on invalid credentials function response', function (done) {\r
395 \r
396         var req = {\r
397             method: 'GET',\r
398             url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',\r
399             host: 'example.com',\r
400             port: 8080\r
401         };\r
402 \r
403         Hawk.uri.authenticate(req, function (id, callback) {\r
404 \r
405             callback(null, {});\r
406         }, {}, function (err, credentials, attributes) {\r
407 \r
408             expect(err).to.exist();\r
409             expect(err.message).to.equal('Invalid credentials');\r
410             done();\r
411         });\r
412     });\r
413 \r
414     it('should fail on invalid credentials function response (unknown algorithm)', function (done) {\r
415 \r
416         var req = {\r
417             method: 'GET',\r
418             url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',\r
419             host: 'example.com',\r
420             port: 8080\r
421         };\r
422 \r
423         Hawk.uri.authenticate(req, function (id, callback) {\r
424 \r
425             callback(null, { key: 'xxx', algorithm: 'xxx' });\r
426         }, {}, function (err, credentials, attributes) {\r
427 \r
428             expect(err).to.exist();\r
429             expect(err.message).to.equal('Unknown algorithm');\r
430             done();\r
431         });\r
432     });\r
433 \r
434     it('should fail on expired access', function (done) {\r
435 \r
436         var req = {\r
437             method: 'GET',\r
438             url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',\r
439             host: 'example.com',\r
440             port: 8080\r
441         };\r
442 \r
443         Hawk.uri.authenticate(req, function (id, callback) {\r
444 \r
445             callback(null, { key: 'xxx', algorithm: 'sha256' });\r
446         }, {}, function (err, credentials, attributes) {\r
447 \r
448             expect(err).to.exist();\r
449             expect(err.output.payload.message).to.equal('Bad mac');\r
450             done();\r
451         });\r
452     });\r
453 \r
454     describe('getBewit()', function () {\r
455 \r
456         it('returns a valid bewit value', function (done) {\r
457 \r
458             var credentials = {\r
459                 id: '123456',\r
460                 key: '2983d45yun89q',\r
461                 algorithm: 'sha256'\r
462             };\r
463 \r
464             var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });\r
465             expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdca3NjeHdOUjJ0SnBQMVQxekRMTlBiQjVVaUtJVTl0T1NKWFRVZEc3WDloOD1ceGFuZHlhbmR6');\r
466             done();\r
467         });\r
468 \r
469         it('returns a valid bewit value (explicit port)', function (done) {\r
470 \r
471             var credentials = {\r
472                 id: '123456',\r
473                 key: '2983d45yun89q',\r
474                 algorithm: 'sha256'\r
475             };\r
476 \r
477             var bewit = Hawk.uri.getBewit('https://example.com:8080/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });\r
478             expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcaFpiSjNQMmNLRW80a3kwQzhqa1pBa1J5Q1p1ZWc0V1NOYnhWN3ZxM3hIVT1ceGFuZHlhbmR6');\r
479             done();\r
480         });\r
481 \r
482         it('returns a valid bewit value (null ext)', function (done) {\r
483 \r
484             var credentials = {\r
485                 id: '123456',\r
486                 key: '2983d45yun89q',\r
487                 algorithm: 'sha256'\r
488             };\r
489 \r
490             var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: null });\r
491             expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcSUdZbUxnSXFMckNlOEN4dktQczRKbFdJQStValdKSm91d2dBUmlWaENBZz1c');\r
492             done();\r
493         });\r
494 \r
495         it('returns a valid bewit value (parsed uri)', function (done) {\r
496 \r
497             var credentials = {\r
498                 id: '123456',\r
499                 key: '2983d45yun89q',\r
500                 algorithm: 'sha256'\r
501             };\r
502 \r
503             var bewit = Hawk.uri.getBewit(Url.parse('https://example.com/somewhere/over/the/rainbow'), { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });\r
504             expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdca3NjeHdOUjJ0SnBQMVQxekRMTlBiQjVVaUtJVTl0T1NKWFRVZEc3WDloOD1ceGFuZHlhbmR6');\r
505             done();\r
506         });\r
507 \r
508         it('errors on invalid options', function (done) {\r
509 \r
510             var credentials = {\r
511                 id: '123456',\r
512                 key: '2983d45yun89q',\r
513                 algorithm: 'sha256'\r
514             };\r
515 \r
516             var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', 4);\r
517             expect(bewit).to.equal('');\r
518             done();\r
519         });\r
520 \r
521         it('errors on missing uri', function (done) {\r
522 \r
523             var credentials = {\r
524                 id: '123456',\r
525                 key: '2983d45yun89q',\r
526                 algorithm: 'sha256'\r
527             };\r
528 \r
529             var bewit = Hawk.uri.getBewit('', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });\r
530             expect(bewit).to.equal('');\r
531             done();\r
532         });\r
533 \r
534         it('errors on invalid uri', function (done) {\r
535 \r
536             var credentials = {\r
537                 id: '123456',\r
538                 key: '2983d45yun89q',\r
539                 algorithm: 'sha256'\r
540             };\r
541 \r
542             var bewit = Hawk.uri.getBewit(5, { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });\r
543             expect(bewit).to.equal('');\r
544             done();\r
545         });\r
546 \r
547         it('errors on invalid credentials (id)', function (done) {\r
548 \r
549             var credentials = {\r
550                 key: '2983d45yun89q',\r
551                 algorithm: 'sha256'\r
552             };\r
553 \r
554             var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' });\r
555             expect(bewit).to.equal('');\r
556             done();\r
557         });\r
558 \r
559         it('errors on missing credentials', function (done) {\r
560 \r
561             var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { ttlSec: 3000, ext: 'xandyandz' });\r
562             expect(bewit).to.equal('');\r
563             done();\r
564         });\r
565 \r
566         it('errors on invalid credentials (key)', function (done) {\r
567 \r
568             var credentials = {\r
569                 id: '123456',\r
570                 algorithm: 'sha256'\r
571             };\r
572 \r
573             var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' });\r
574             expect(bewit).to.equal('');\r
575             done();\r
576         });\r
577 \r
578         it('errors on invalid algorithm', function (done) {\r
579 \r
580             var credentials = {\r
581                 id: '123456',\r
582                 key: '2983d45yun89q',\r
583                 algorithm: 'hmac-sha-0'\r
584             };\r
585 \r
586             var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, ext: 'xandyandz' });\r
587             expect(bewit).to.equal('');\r
588             done();\r
589         });\r
590 \r
591         it('errors on missing options', function (done) {\r
592 \r
593             var credentials = {\r
594                 id: '123456',\r
595                 key: '2983d45yun89q',\r
596                 algorithm: 'hmac-sha-0'\r
597             };\r
598 \r
599             var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow');\r
600             expect(bewit).to.equal('');\r
601             done();\r
602         });\r
603     });\r
604 \r
605     describe('authenticateMessage()', function () {\r
606 \r
607         it('should generate an authorization then successfully parse it', function (done) {\r
608 \r
609             credentialsFunc('123456', function (err, credentials1) {\r
610 \r
611                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
612                 expect(auth).to.exist();\r
613 \r
614                 Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {\r
615 \r
616                     expect(err).to.not.exist();\r
617                     expect(credentials2.user).to.equal('steve');\r
618                     done();\r
619                 });\r
620             });\r
621         });\r
622 \r
623         it('should fail authorization on mismatching host', function (done) {\r
624 \r
625             credentialsFunc('123456', function (err, credentials1) {\r
626 \r
627                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
628                 expect(auth).to.exist();\r
629 \r
630                 Hawk.server.authenticateMessage('example1.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {\r
631 \r
632                     expect(err).to.exist();\r
633                     expect(err.message).to.equal('Bad mac');\r
634                     done();\r
635                 });\r
636             });\r
637         });\r
638 \r
639         it('should fail authorization on stale timestamp', function (done) {\r
640 \r
641             credentialsFunc('123456', function (err, credentials1) {\r
642 \r
643                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
644                 expect(auth).to.exist();\r
645 \r
646                 Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { localtimeOffsetMsec: 100000 }, function (err, credentials2) {\r
647 \r
648                     expect(err).to.exist();\r
649                     expect(err.message).to.equal('Stale timestamp');\r
650                     done();\r
651                 });\r
652             });\r
653         });\r
654 \r
655         it('overrides timestampSkewSec', function (done) {\r
656 \r
657             credentialsFunc('123456', function (err, credentials1) {\r
658 \r
659                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1, localtimeOffsetMsec: 100000 });\r
660                 expect(auth).to.exist();\r
661 \r
662                 Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { timestampSkewSec: 500 }, function (err, credentials2) {\r
663 \r
664                     expect(err).to.not.exist();\r
665                     done();\r
666                 });\r
667             });\r
668         });\r
669 \r
670         it('should fail authorization on invalid authorization', function (done) {\r
671 \r
672             credentialsFunc('123456', function (err, credentials1) {\r
673 \r
674                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
675                 expect(auth).to.exist();\r
676                 delete auth.id;\r
677 \r
678                 Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {\r
679 \r
680                     expect(err).to.exist();\r
681                     expect(err.message).to.equal('Invalid authorization');\r
682                     done();\r
683                 });\r
684             });\r
685         });\r
686 \r
687         it('should fail authorization on bad hash', function (done) {\r
688 \r
689             credentialsFunc('123456', function (err, credentials1) {\r
690 \r
691                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
692                 expect(auth).to.exist();\r
693 \r
694                 Hawk.server.authenticateMessage('example.com', 8080, 'some message1', auth, credentialsFunc, {}, function (err, credentials2) {\r
695 \r
696                     expect(err).to.exist();\r
697                     expect(err.message).to.equal('Bad message hash');\r
698                     done();\r
699                 });\r
700             });\r
701         });\r
702 \r
703         it('should fail authorization on nonce error', function (done) {\r
704 \r
705             credentialsFunc('123456', function (err, credentials1) {\r
706 \r
707                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
708                 expect(auth).to.exist();\r
709 \r
710                 Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {\r
711                     nonceFunc: function (key, nonce, ts, callback) {\r
712 \r
713                         callback(new Error('kaboom'));\r
714                     }\r
715                 }, function (err, credentials2) {\r
716 \r
717                     expect(err).to.exist();\r
718                     expect(err.message).to.equal('Invalid nonce');\r
719                     done();\r
720                 });\r
721             });\r
722         });\r
723 \r
724         it('should fail authorization on credentials error', function (done) {\r
725 \r
726             credentialsFunc('123456', function (err, credentials1) {\r
727 \r
728                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
729                 expect(auth).to.exist();\r
730 \r
731                 var errFunc = function (id, callback) {\r
732 \r
733                     callback(new Error('kablooey'));\r
734                 };\r
735 \r
736                 Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {\r
737 \r
738                     expect(err).to.exist();\r
739                     expect(err.message).to.equal('kablooey');\r
740                     done();\r
741                 });\r
742             });\r
743         });\r
744 \r
745         it('should fail authorization on missing credentials', function (done) {\r
746 \r
747             credentialsFunc('123456', function (err, credentials1) {\r
748 \r
749                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
750                 expect(auth).to.exist();\r
751 \r
752                 var errFunc = function (id, callback) {\r
753 \r
754                     callback();\r
755                 };\r
756 \r
757                 Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {\r
758 \r
759                     expect(err).to.exist();\r
760                     expect(err.message).to.equal('Unknown credentials');\r
761                     done();\r
762                 });\r
763             });\r
764         });\r
765 \r
766         it('should fail authorization on invalid credentials', function (done) {\r
767 \r
768             credentialsFunc('123456', function (err, credentials1) {\r
769 \r
770                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
771                 expect(auth).to.exist();\r
772 \r
773                 var errFunc = function (id, callback) {\r
774 \r
775                     callback(null, {});\r
776                 };\r
777 \r
778                 Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {\r
779 \r
780                     expect(err).to.exist();\r
781                     expect(err.message).to.equal('Invalid credentials');\r
782                     done();\r
783                 });\r
784             });\r
785         });\r
786 \r
787         it('should fail authorization on invalid credentials algorithm', function (done) {\r
788 \r
789             credentialsFunc('123456', function (err, credentials1) {\r
790 \r
791                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });\r
792                 expect(auth).to.exist();\r
793 \r
794                 var errFunc = function (id, callback) {\r
795 \r
796                     callback(null, { key: '123', algorithm: '456' });\r
797                 };\r
798 \r
799                 Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {\r
800 \r
801                     expect(err).to.exist();\r
802                     expect(err.message).to.equal('Unknown algorithm');\r
803                     done();\r
804                 });\r
805             });\r
806         });\r
807 \r
808         it('should fail on missing host', function (done) {\r
809 \r
810             credentialsFunc('123456', function (err, credentials1) {\r
811 \r
812                 var auth = Hawk.client.message(null, 8080, 'some message', { credentials: credentials1 });\r
813                 expect(auth).to.not.exist();\r
814                 done();\r
815             });\r
816         });\r
817 \r
818         it('should fail on missing credentials', function (done) {\r
819 \r
820             var auth = Hawk.client.message('example.com', 8080, 'some message', {});\r
821             expect(auth).to.not.exist();\r
822             done();\r
823         });\r
824 \r
825         it('should fail on invalid algorithm', function (done) {\r
826 \r
827             credentialsFunc('123456', function (err, credentials1) {\r
828 \r
829                 var creds = Hoek.clone(credentials1);\r
830                 creds.algorithm = 'blah';\r
831                 var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: creds });\r
832                 expect(auth).to.not.exist();\r
833                 done();\r
834             });\r
835         });\r
836     });\r
837 });\r
838 \r