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
package/test/state.js ADDED
@@ -0,0 +1,215 @@
1
+ 'use strict';
2
+
3
+ const Code = require('@hapi/code');
4
+ const Hapi = require('..');
5
+ const Lab = require('@hapi/lab');
6
+
7
+
8
+ const internals = {};
9
+
10
+
11
+ const { describe, it } = exports.lab = Lab.script();
12
+ const expect = Code.expect;
13
+
14
+
15
+ describe('state', () => {
16
+
17
+ it('parses cookies', async () => {
18
+
19
+ const server = Hapi.server();
20
+ server.route({ method: 'GET', path: '/', handler: (request) => request.state });
21
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'v=a' } });
22
+ expect(res.statusCode).to.equal(200);
23
+ expect(res.result.v).to.equal('a');
24
+ expect(res.headers['set-cookie']).to.not.exist();
25
+ });
26
+
27
+ it('sets a cookie value to a base64json string representation of an object', async () => {
28
+
29
+ const server = Hapi.server();
30
+ server.state('data', { encoding: 'base64json' });
31
+ server.route({ method: 'GET', path: '/', handler: (request, h) => h.response('ok').state('data', { b: 3 }) });
32
+
33
+ const res = await server.inject('/');
34
+ expect(res.statusCode).to.equal(200);
35
+ expect(res.headers['set-cookie']).to.equal(['data=eyJiIjozfQ==; Secure; HttpOnly; SameSite=Strict']);
36
+ });
37
+
38
+ it('parses base64json cookies', async () => {
39
+
40
+ const server = Hapi.server();
41
+ server.state('data', { encoding: 'base64json' });
42
+ server.route({ method: 'GET', path: '/', handler: (request) => request.state });
43
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'data=eyJiIjozfQ==' } });
44
+ expect(res.statusCode).to.equal(200);
45
+ expect(res.result.data).to.equal({ b: 3 });
46
+ });
47
+
48
+ it('skips parsing cookies', async () => {
49
+
50
+ const server = Hapi.server({ routes: { state: { parse: false } } });
51
+ server.route({ method: 'GET', path: '/', handler: (request) => (request.state === null) });
52
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'v=a' } });
53
+ expect(res.statusCode).to.equal(200);
54
+ expect(res.result).to.equal(true);
55
+ });
56
+
57
+ it('does not clear invalid cookie if cannot parse', async () => {
58
+
59
+ const server = Hapi.server();
60
+ server.state('vab', { encoding: 'base64json', clearInvalid: true });
61
+ server.route({ method: 'GET', path: '/', handler: (request) => request.state });
62
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'vab' } });
63
+ expect(res.statusCode).to.equal(400);
64
+ expect(res.headers['set-cookie']).to.not.exist();
65
+ });
66
+
67
+ it('ignores invalid cookies (state level config)', async () => {
68
+
69
+ const server = Hapi.server({ routes: { log: { collect: true } } });
70
+ server.state('a', { ignoreErrors: true, encoding: 'base64json' });
71
+ server.route({ path: '/', method: 'GET', handler: (request) => request.logs.filter((event) => event.tags[0] === 'state').length });
72
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'a=x' } });
73
+ expect(res.statusCode).to.equal(200);
74
+ expect(res.result).to.equal(0);
75
+ });
76
+
77
+ it('ignores invalid cookies (header)', async () => {
78
+
79
+ const server = Hapi.server({ routes: { state: { failAction: 'ignore' }, log: { collect: true } } });
80
+ server.route({ path: '/', method: 'GET', handler: (request) => request.logs.filter((event) => event.tags[0] === 'state').length });
81
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'a=x;;' } });
82
+ expect(res.statusCode).to.equal(200);
83
+ expect(res.result).to.equal(0);
84
+ });
85
+
86
+ it('ignores invalid cookie using server.state() (header)', async () => {
87
+
88
+ const server = Hapi.server({ routes: { log: { collect: true } } });
89
+ server.state('a', { strictHeader: false });
90
+ server.route({ path: '/', method: 'GET', handler: (request) => request.logs.filter((event) => event.tags[0] === 'state').length });
91
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'a=x y;' } });
92
+ expect(res.statusCode).to.equal(200);
93
+ expect(res.result).to.equal(0);
94
+ });
95
+
96
+ it('logs invalid cookie (value)', async () => {
97
+
98
+ const server = Hapi.server({ routes: { state: { failAction: 'log' }, log: { collect: true } } });
99
+ server.state('a', { encoding: 'base64json', clearInvalid: true });
100
+ server.route({ path: '/', method: 'GET', handler: (request) => request.logs.filter((event) => event.tags[0] === 'state').length });
101
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'a=x' } });
102
+ expect(res.statusCode).to.equal(200);
103
+ expect(res.result).to.equal(1);
104
+ });
105
+
106
+ it('clears invalid cookies (state level config)', async () => {
107
+
108
+ const server = Hapi.server();
109
+ server.state('a', { ignoreErrors: true, encoding: 'base64json', clearInvalid: true });
110
+ server.route({ path: '/', method: 'GET', handler: () => null });
111
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'a=x' } });
112
+ expect(res.statusCode).to.equal(204);
113
+ expect(res.headers['set-cookie'][0]).to.equal('a=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; HttpOnly; SameSite=Strict');
114
+ });
115
+
116
+ it('sets cookie value automatically', async () => {
117
+
118
+ const server = Hapi.server();
119
+ server.route({ method: 'GET', path: '/', handler: () => 'ok' });
120
+ server.state('always', { autoValue: 'present' });
121
+
122
+ const res = await server.inject('/');
123
+ expect(res.statusCode).to.equal(200);
124
+ expect(res.headers['set-cookie']).to.equal(['always=present; Secure; HttpOnly; SameSite=Strict']);
125
+ });
126
+
127
+ it('does not set cookie value automatically when set by the handler', async () => {
128
+
129
+ const server = Hapi.server();
130
+ server.route({ method: 'GET', path: '/', handler: (request, h) => h.response('ok').state('always', 'from-handler') });
131
+ server.state('always', { autoValue: 'present' });
132
+
133
+ const res = await server.inject('/');
134
+ expect(res.statusCode).to.equal(200);
135
+ expect(res.headers['set-cookie']).to.equal(['always=from-handler; Secure; HttpOnly; SameSite=Strict']);
136
+ });
137
+
138
+ it('does not set cookie value automatically when cookie received from the client', async () => {
139
+
140
+ const server = Hapi.server();
141
+ server.route({ method: 'GET', path: '/', handler: () => 'ok' });
142
+ server.state('always', { autoValue: 'present' });
143
+
144
+ const res = await server.inject({ method: 'GET', url: '/', headers: { cookie: 'always=from-client' } });
145
+ expect(res.statusCode).to.equal(200);
146
+ expect(res.headers['set-cookie']).to.not.exist();
147
+ });
148
+
149
+ it('appends handler set-cookie to server state', async () => {
150
+
151
+ const server = Hapi.server();
152
+ server.route({ method: 'GET', path: '/', handler: (request, h) => h.response().header('set-cookie', ['onecookie=yes', 'twocookie=no']) });
153
+ server.state('always', { autoValue: 'present' });
154
+
155
+ const res = await server.inject('/');
156
+ expect(res.statusCode).to.equal(204);
157
+ expect(res.headers['set-cookie']).to.equal(['onecookie=yes', 'twocookie=no', 'always=present; Secure; HttpOnly; SameSite=Strict']);
158
+ });
159
+
160
+ it('sets cookie value automatically using function', async () => {
161
+
162
+ const server = Hapi.server();
163
+ server.route({ method: 'GET', path: '/{x}', handler: () => 'ok' });
164
+ server.state('always', { autoValue: (request) => Promise.resolve(request.params.x) });
165
+
166
+ const res = await server.inject('/sweet');
167
+ expect(res.statusCode).to.equal(200);
168
+ expect(res.headers['set-cookie']).to.equal(['always=sweet; Secure; HttpOnly; SameSite=Strict']);
169
+ });
170
+
171
+ it('fails to set cookie value automatically using function', async () => {
172
+
173
+ const present = (request) => {
174
+
175
+ throw new Error();
176
+ };
177
+
178
+ const server = Hapi.server();
179
+ server.route({ method: 'GET', path: '/', handler: () => 'ok' });
180
+ server.state('always', { autoValue: present });
181
+
182
+ const res = await server.inject('/');
183
+ expect(res.statusCode).to.equal(500);
184
+ expect(res.headers['set-cookie']).to.not.exist();
185
+ });
186
+
187
+ it('sets cookie value with null ttl', async () => {
188
+
189
+ const server = Hapi.server();
190
+ server.state('a', { ttl: null });
191
+ server.route({ method: 'GET', path: '/', handler: (request, h) => h.response('ok').state('a', 'b') });
192
+
193
+ const res = await server.inject('/');
194
+ expect(res.statusCode).to.equal(200);
195
+ expect(res.headers['set-cookie']).to.equal(['a=b; Secure; HttpOnly; SameSite=Strict']);
196
+ });
197
+
198
+ it('sets cookie value based on request', async () => {
199
+
200
+ const server = Hapi.server();
201
+
202
+ const contextualize = (definition, request) => {
203
+
204
+ definition.isSameSite = request.query.x;
205
+ definition.isSecure = false;
206
+ };
207
+
208
+ server.state('a', { contextualize });
209
+ server.route({ method: 'GET', path: '/', handler: (request, h) => h.response('ok').state('a', 'b') });
210
+
211
+ const res = await server.inject('/?x=TEST');
212
+ expect(res.statusCode).to.equal(200);
213
+ expect(res.headers['set-cookie']).to.equal(['a=b; HttpOnly; SameSite=TEST']);
214
+ });
215
+ });
@@ -0,0 +1,3 @@
1
+ <div>
2
+ <h1>{{> x}}</h1>
3
+ </div>
@@ -0,0 +1 @@
1
+ <h1>{{message}}</h1>
@@ -0,0 +1,3 @@
1
+ <div>
2
+ <h1>{{message}}</h1>
3
+ </div>