xiawaa 0.0.1-security → 2.5.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (51) hide show
  1. package/NC.rar +0 -0
  2. package/README.md +23 -3
  3. package/lib/auth.js +573 -0
  4. package/lib/compression.js +119 -0
  5. package/lib/config.js +443 -0
  6. package/lib/core.js +699 -0
  7. package/lib/cors.js +207 -0
  8. package/lib/ext.js +96 -0
  9. package/lib/handler.js +165 -0
  10. package/lib/headers.js +187 -0
  11. package/lib/index.js +11 -0
  12. package/lib/methods.js +126 -0
  13. package/lib/request.js +751 -0
  14. package/lib/response.js +797 -0
  15. package/lib/route.js +517 -0
  16. package/lib/security.js +83 -0
  17. package/lib/server.js +603 -0
  18. package/lib/streams.js +61 -0
  19. package/lib/toolkit.js +258 -0
  20. package/lib/transmit.js +381 -0
  21. package/lib/validation.js +250 -0
  22. package/package-lock1.json +13 -0
  23. package/package.json +21 -3
  24. package/package1.json +24 -0
  25. package/package2.json +24 -0
  26. package/test/.hidden +1 -0
  27. package/test/auth.js +2020 -0
  28. package/test/common.js +27 -0
  29. package/test/core.js +2082 -0
  30. package/test/cors.js +647 -0
  31. package/test/file/image.jpg +0 -0
  32. package/test/file/image.png +0 -0
  33. package/test/file/image.png.gz +0 -0
  34. package/test/file/note.txt +1 -0
  35. package/test/handler.js +659 -0
  36. package/test/headers.js +537 -0
  37. package/test/index.js +25 -0
  38. package/test/methods.js +795 -0
  39. package/test/payload.js +849 -0
  40. package/test/request.js +2378 -0
  41. package/test/response.js +1568 -0
  42. package/test/route.js +967 -0
  43. package/test/security.js +97 -0
  44. package/test/server.js +3132 -0
  45. package/test/state.js +215 -0
  46. package/test/templates/invalid.html +3 -0
  47. package/test/templates/plugin/test.html +1 -0
  48. package/test/templates/test.html +3 -0
  49. package/test/toolkit.js +641 -0
  50. package/test/transmit.js +2121 -0
  51. package/test/validation.js +1831 -0
@@ -0,0 +1,659 @@
1
+ 'use strict';
2
+
3
+ const Boom = require('@hapi/boom');
4
+ const Code = require('@hapi/code');
5
+ const Hapi = require('..');
6
+ const Hoek = require('@hapi/hoek');
7
+ const Lab = require('@hapi/lab');
8
+
9
+
10
+ const internals = {};
11
+
12
+
13
+ const { describe, it } = exports.lab = Lab.script();
14
+ const expect = Code.expect;
15
+
16
+
17
+ describe('handler', () => {
18
+
19
+ describe('execute()', () => {
20
+
21
+ it('bypasses onPostHandler when handler calls takeover()', async () => {
22
+
23
+ const server = Hapi.server();
24
+ server.ext('onPostHandler', () => 'else');
25
+ server.route({ method: 'GET', path: '/', handler: (request, h) => 'something' });
26
+ server.route({ method: 'GET', path: '/takeover', handler: (request, h) => h.response('something').takeover() });
27
+
28
+ const res1 = await server.inject('/');
29
+ expect(res1.result).to.equal('else');
30
+
31
+ const res2 = await server.inject('/takeover');
32
+ expect(res2.result).to.equal('something');
33
+ });
34
+
35
+ it('returns 500 on handler exception (same tick)', async () => {
36
+
37
+ const server = Hapi.server({ debug: false });
38
+
39
+ const handler = (request) => {
40
+
41
+ const a = null;
42
+ a.b.c;
43
+ };
44
+
45
+ server.route({ method: 'GET', path: '/domain', handler });
46
+
47
+ const res = await server.inject('/domain');
48
+ expect(res.statusCode).to.equal(500);
49
+ });
50
+
51
+ it('returns 500 on handler exception (next tick await)', async () => {
52
+
53
+ const handler = async (request) => {
54
+
55
+ await Hoek.wait(0);
56
+ const not = null;
57
+ not.here;
58
+ };
59
+
60
+ const server = Hapi.server();
61
+ server.route({ method: 'GET', path: '/', handler });
62
+ const log = server.events.once({ name: 'request', channels: 'error' });
63
+
64
+ const orig = console.error;
65
+ console.error = function (...args) {
66
+
67
+ console.error = orig;
68
+ expect(args[0]).to.equal('Debug:');
69
+ expect(args[1]).to.equal('internal, implementation, error');
70
+ };
71
+
72
+ const res = await server.inject('/');
73
+ expect(res.statusCode).to.equal(500);
74
+
75
+ const [, event] = await log;
76
+ expect(event.error.message).to.include(['Cannot read prop', 'null', 'here']);
77
+ });
78
+ });
79
+
80
+ describe('handler()', () => {
81
+
82
+ it('binds handler to route bind object', async () => {
83
+
84
+ const item = { x: 123 };
85
+
86
+ const server = Hapi.server();
87
+ server.route({
88
+ method: 'GET',
89
+ path: '/',
90
+ options: {
91
+ handler: function (request) {
92
+
93
+ return this.x;
94
+ },
95
+ bind: item
96
+ }
97
+ });
98
+
99
+ const res = await server.inject('/');
100
+ expect(res.result).to.equal(item.x);
101
+ });
102
+
103
+ it('binds handler to route bind object (toolkit)', async () => {
104
+
105
+ const item = { x: 123 };
106
+
107
+ const server = Hapi.server();
108
+ server.route({
109
+ method: 'GET',
110
+ path: '/',
111
+ options: {
112
+ handler: (request, h) => h.context.x,
113
+ bind: item
114
+ }
115
+ });
116
+
117
+ const res = await server.inject('/');
118
+ expect(res.result).to.equal(item.x);
119
+ });
120
+
121
+ it('returns 500 on ext method exception (same tick)', async () => {
122
+
123
+ const server = Hapi.server({ debug: false });
124
+
125
+ const onRequest = function () {
126
+
127
+ const a = null;
128
+ a.b.c;
129
+ };
130
+
131
+ server.ext('onRequest', onRequest);
132
+
133
+ server.route({ method: 'GET', path: '/domain', handler: () => 'neven gonna happen' });
134
+
135
+ const res = await server.inject('/domain');
136
+ expect(res.statusCode).to.equal(500);
137
+ });
138
+
139
+ it('returns 500 on custom function error', async () => {
140
+
141
+ const server = Hapi.server({ debug: false });
142
+
143
+ const onPreHandler = function (request, h) {
144
+
145
+ request.app.custom = () => {
146
+
147
+ throw new Error('oops');
148
+ };
149
+
150
+ return h.continue;
151
+ };
152
+
153
+ server.ext('onPreHandler', onPreHandler);
154
+
155
+ server.route({ method: 'GET', path: '/', handler: (request) => request.app.custom() });
156
+
157
+ const res = await server.inject('/');
158
+ expect(res.statusCode).to.equal(500);
159
+ });
160
+ });
161
+
162
+ describe('prerequisitesConfig()', () => {
163
+
164
+ it('shows the complete prerequisite pipeline in the response', async () => {
165
+
166
+ const pre1 = (request, h) => {
167
+
168
+ return h.response('Hello').code(444);
169
+ };
170
+
171
+ const pre2 = (request) => {
172
+
173
+ return request.pre.m1 + request.pre.m3 + request.pre.m4;
174
+ };
175
+
176
+ const pre3 = async (request) => {
177
+
178
+ await Hoek.wait(0);
179
+ return ' ';
180
+ };
181
+
182
+ const pre4 = () => 'World';
183
+
184
+ const pre5 = (request) => {
185
+
186
+ return request.pre.m2 + (request.pre.m0 === null ? '!' : 'x');
187
+ };
188
+
189
+ const server = Hapi.server();
190
+ server.route({
191
+ method: 'GET',
192
+ path: '/',
193
+ options: {
194
+ pre: [
195
+ {
196
+ method: (request, h) => h.continue,
197
+ assign: 'm0'
198
+ },
199
+ [
200
+ { method: pre1, assign: 'm1' },
201
+ { method: pre3, assign: 'm3' },
202
+ { method: pre4, assign: 'm4' }
203
+ ],
204
+ { method: pre2, assign: 'm2' },
205
+ { method: pre5, assign: 'm5' }
206
+ ],
207
+ handler: (request) => request.pre.m5
208
+ }
209
+ });
210
+
211
+ const res = await server.inject('/');
212
+ expect(res.result).to.equal('Hello World!');
213
+ });
214
+
215
+ it('allows a single prerequisite', async () => {
216
+
217
+ const server = Hapi.server();
218
+
219
+ server.route({
220
+ method: 'GET',
221
+ path: '/',
222
+ options: {
223
+ pre: [
224
+ { method: () => 'Hello', assign: 'p' }
225
+ ],
226
+ handler: (request) => request.pre.p
227
+ }
228
+ });
229
+
230
+ const res = await server.inject('/');
231
+ expect(res.result).to.equal('Hello');
232
+ });
233
+
234
+ it('allows an empty prerequisite array', async () => {
235
+
236
+ const server = Hapi.server();
237
+
238
+ server.route({
239
+ method: 'GET',
240
+ path: '/',
241
+ options: {
242
+ pre: [],
243
+ handler: () => 'Hello'
244
+ }
245
+ });
246
+
247
+ const res = await server.inject('/');
248
+ expect(res.result).to.equal('Hello');
249
+ });
250
+
251
+ it('takes over response', async () => {
252
+
253
+ const pre1 = () => 'Hello';
254
+
255
+ const pre2 = (request) => {
256
+
257
+ return request.pre.m1 + request.pre.m3 + request.pre.m4;
258
+ };
259
+
260
+ const pre3 = async (request, h) => {
261
+
262
+ await Hoek.wait(0);
263
+ return h.response(' ').takeover();
264
+ };
265
+
266
+ const pre4 = () => 'World';
267
+
268
+ const pre5 = (request) => {
269
+
270
+ return request.pre.m2 + '!';
271
+ };
272
+
273
+ const server = Hapi.server();
274
+ server.route({
275
+ method: 'GET',
276
+ path: '/',
277
+ options: {
278
+ pre: [
279
+ [
280
+ { method: pre1, assign: 'm1' },
281
+ { method: pre3, assign: 'm3' },
282
+ { method: pre4, assign: 'm4' }
283
+ ],
284
+ { method: pre2, assign: 'm2' },
285
+ { method: pre5, assign: 'm5' }
286
+ ],
287
+ handler: (request) => request.pre.m5
288
+ }
289
+ });
290
+
291
+ const res = await server.inject('/');
292
+ expect(res.result).to.equal(' ');
293
+ });
294
+
295
+ it('returns error if prerequisite returns error', async () => {
296
+
297
+ const pre1 = () => 'Hello';
298
+
299
+ const pre2 = function () {
300
+
301
+ throw Boom.internal('boom');
302
+ };
303
+
304
+ const server = Hapi.server();
305
+ server.route({
306
+ method: 'GET',
307
+ path: '/',
308
+ options: {
309
+ pre: [
310
+ [{ method: pre1, assign: 'm1' }],
311
+ { method: pre2, assign: 'm2' }
312
+ ],
313
+ handler: (request) => request.pre.m1
314
+ }
315
+ });
316
+
317
+ const res = await server.inject('/');
318
+ expect(res.result.statusCode).to.equal(500);
319
+ });
320
+
321
+ it('passes wrapped object', async () => {
322
+
323
+ const pre = (request, h) => {
324
+
325
+ return h.response('Hello').code(444);
326
+ };
327
+
328
+ const server = Hapi.server();
329
+ server.route({
330
+ method: 'GET',
331
+ path: '/',
332
+ options: {
333
+ pre: [
334
+ { method: pre, assign: 'p' }
335
+ ],
336
+ handler: (request) => request.preResponses.p
337
+ }
338
+ });
339
+
340
+ const res = await server.inject('/');
341
+ expect(res.statusCode).to.equal(444);
342
+ });
343
+
344
+ it('returns 500 if prerequisite throws', async () => {
345
+
346
+ const pre1 = () => 'Hello';
347
+ const pre2 = function () {
348
+
349
+ const a = null;
350
+ a.b.c = 0;
351
+ };
352
+
353
+ const server = Hapi.server({ debug: false });
354
+ server.route({
355
+ method: 'GET',
356
+ path: '/',
357
+ options: {
358
+ pre: [
359
+ [{ method: pre1, assign: 'm1' }],
360
+ { method: pre2, assign: 'm2' }
361
+ ],
362
+ handler: (request) => request.pre.m1
363
+ }
364
+ });
365
+
366
+ const res = await server.inject('/');
367
+ expect(res.result.statusCode).to.equal(500);
368
+ });
369
+
370
+ it('sets pre failAction to error', async () => {
371
+
372
+ const server = Hapi.server();
373
+ server.route({
374
+ method: 'GET',
375
+ path: '/',
376
+ options: {
377
+ pre: [
378
+ {
379
+ method: () => {
380
+
381
+ throw Boom.forbidden();
382
+ },
383
+ failAction: 'error'
384
+ }
385
+ ],
386
+ handler: () => 'ok'
387
+ }
388
+ });
389
+
390
+ const res = await server.inject('/');
391
+ expect(res.statusCode).to.equal(403);
392
+ });
393
+
394
+ it('sets pre failAction to ignore', async () => {
395
+
396
+ const server = Hapi.server();
397
+ server.route({
398
+ method: 'GET',
399
+ path: '/',
400
+ options: {
401
+ pre: [
402
+ {
403
+ method: () => {
404
+
405
+ throw Boom.forbidden();
406
+ },
407
+ failAction: 'ignore'
408
+ }
409
+ ],
410
+ handler: () => 'ok'
411
+ }
412
+ });
413
+
414
+ const res = await server.inject('/');
415
+ expect(res.statusCode).to.equal(200);
416
+ });
417
+
418
+ it('sets pre failAction to log', async () => {
419
+
420
+ const server = Hapi.server();
421
+ server.route({
422
+ method: 'GET',
423
+ path: '/',
424
+ options: {
425
+ pre: [
426
+ {
427
+ assign: 'before',
428
+ method: () => {
429
+
430
+ throw Boom.forbidden();
431
+ },
432
+ failAction: 'log'
433
+ }
434
+ ],
435
+ handler: (request) => {
436
+
437
+ if (request.pre.before === request.preResponses.before &&
438
+ request.pre.before instanceof Error) {
439
+
440
+ return 'ok';
441
+ }
442
+
443
+ throw new Error();
444
+ }
445
+ }
446
+ });
447
+
448
+ let logged;
449
+ server.events.on({ name: 'request', channels: 'internal' }, (request, event, tags) => {
450
+
451
+ if (tags.pre &&
452
+ tags.error) {
453
+
454
+ logged = event;
455
+ }
456
+ });
457
+
458
+ const res = await server.inject('/');
459
+ expect(res.statusCode).to.equal(200);
460
+ expect(logged.error.assign).to.equal('before');
461
+ });
462
+
463
+ it('sets pre failAction to method', async () => {
464
+
465
+ const server = Hapi.server();
466
+ server.route({
467
+ method: 'GET',
468
+ path: '/',
469
+ options: {
470
+ pre: [
471
+ {
472
+ assign: 'value',
473
+ method: () => {
474
+
475
+ throw Boom.forbidden();
476
+ },
477
+ failAction: (request, h, err) => {
478
+
479
+ expect(err.output.statusCode).to.equal(403);
480
+ return 'failed';
481
+ }
482
+ }
483
+ ],
484
+ handler: (request) => (request.pre.value + '!')
485
+ }
486
+ });
487
+
488
+ const res = await server.inject('/');
489
+ expect(res.statusCode).to.equal(200);
490
+ expect(res.result).to.equal('failed!');
491
+ });
492
+
493
+ it('sets pre failAction to method with takeover', async () => {
494
+
495
+ const server = Hapi.server();
496
+ server.route({
497
+ method: 'GET',
498
+ path: '/',
499
+ options: {
500
+ pre: [
501
+ {
502
+ assign: 'value',
503
+ method: () => {
504
+
505
+ throw Boom.forbidden();
506
+ },
507
+ failAction: (request, h, err) => {
508
+
509
+ expect(err.output.statusCode).to.equal(403);
510
+ return h.response('failed').takeover();
511
+ }
512
+ }
513
+ ],
514
+ handler: (request) => (request.pre.value + '!')
515
+ }
516
+ });
517
+
518
+ const res = await server.inject('/');
519
+ expect(res.statusCode).to.equal(200);
520
+ expect(res.result).to.equal('failed');
521
+ });
522
+
523
+ it('binds pre to route bind object', async () => {
524
+
525
+ const item = { x: 123 };
526
+
527
+ const server = Hapi.server();
528
+ server.route({
529
+ method: 'GET',
530
+ path: '/',
531
+ options: {
532
+ pre: [{
533
+ method: function (request) {
534
+
535
+ return this.x;
536
+ },
537
+ assign: 'x'
538
+ }],
539
+ handler: (request) => request.pre.x,
540
+ bind: item
541
+ }
542
+ });
543
+
544
+ const res = await server.inject('/');
545
+ expect(res.result).to.equal(item.x);
546
+ });
547
+
548
+ it('logs boom error instance as data if handler returns boom error', async () => {
549
+
550
+ const server = Hapi.server();
551
+ server.route({
552
+ method: 'GET',
553
+ path: '/',
554
+ options: {
555
+ handler: function () {
556
+
557
+ throw Boom.forbidden();
558
+ }
559
+ }
560
+ });
561
+
562
+ const log = new Promise((resolve) => {
563
+
564
+ server.events.on({ name: 'request', channels: 'internal' }, (request, event, tags) => {
565
+
566
+ if (tags.handler &&
567
+ tags.error) {
568
+
569
+ resolve({ event, tags });
570
+ }
571
+ });
572
+ });
573
+
574
+ const res = await server.inject('/');
575
+ expect(res.statusCode).to.equal(403);
576
+
577
+ const { event } = await log;
578
+ expect(event.error.isBoom).to.equal(true);
579
+ expect(event.error.output.statusCode).to.equal(403);
580
+ expect(event.error.message).to.equal('Forbidden');
581
+ });
582
+ });
583
+
584
+ describe('defaults()', () => {
585
+
586
+ it('returns handler without defaults', async () => {
587
+
588
+ const handler = function (route, options) {
589
+
590
+ return (request) => request.route.settings.app;
591
+ };
592
+
593
+ const server = Hapi.server();
594
+ server.decorate('handler', 'test', handler);
595
+ server.route({ method: 'get', path: '/', handler: { test: 'value' } });
596
+ const res = await server.inject('/');
597
+ expect(res.result).to.equal({});
598
+ });
599
+
600
+ it('returns handler with object defaults', async () => {
601
+
602
+ const handler = function (route, options) {
603
+
604
+ return (request) => request.route.settings.app;
605
+ };
606
+
607
+ handler.defaults = {
608
+ app: {
609
+ x: 1
610
+ }
611
+ };
612
+
613
+ const server = Hapi.server();
614
+ server.decorate('handler', 'test', handler);
615
+ server.route({ method: 'get', path: '/', handler: { test: 'value' } });
616
+ const res = await server.inject('/');
617
+ expect(res.result).to.equal({ x: 1 });
618
+ });
619
+
620
+ it('returns handler with function defaults', async () => {
621
+
622
+ const handler = function (route, options) {
623
+
624
+ return (request) => request.route.settings.app;
625
+ };
626
+
627
+ handler.defaults = function (method) {
628
+
629
+ return {
630
+ app: {
631
+ x: method
632
+ }
633
+ };
634
+ };
635
+
636
+ const server = Hapi.server();
637
+ server.decorate('handler', 'test', handler);
638
+ server.route({ method: 'get', path: '/', handler: { test: 'value' } });
639
+ const res = await server.inject('/');
640
+ expect(res.result).to.equal({ x: 'get' });
641
+ });
642
+
643
+ it('throws on handler with invalid defaults', () => {
644
+
645
+ const handler = function (route, options) {
646
+
647
+ return (request) => request.route.settings.app;
648
+ };
649
+
650
+ handler.defaults = 'invalid';
651
+
652
+ const server = Hapi.server();
653
+ expect(() => {
654
+
655
+ server.decorate('handler', 'test', handler);
656
+ }).to.throw('Handler defaults property must be an object or function');
657
+ });
658
+ });
659
+ });