wabe 0.6.9 → 0.6.10

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.
Files changed (158) hide show
  1. package/README.md +138 -32
  2. package/bucket/b.txt +1 -0
  3. package/dev/index.ts +215 -0
  4. package/dist/authentication/Session.d.ts +4 -1
  5. package/dist/authentication/interface.d.ts +16 -0
  6. package/dist/email/interface.d.ts +1 -1
  7. package/dist/graphql/resolvers.d.ts +4 -2
  8. package/dist/hooks/index.d.ts +1 -0
  9. package/dist/index.d.ts +0 -1
  10. package/dist/index.js +8713 -8867
  11. package/dist/server/index.d.ts +4 -2
  12. package/dist/utils/crypto.d.ts +7 -0
  13. package/dist/utils/helper.d.ts +4 -1
  14. package/generated/schema.graphql +16 -14
  15. package/generated/wabe.ts +4 -4
  16. package/package.json +15 -15
  17. package/src/authentication/OTP.test.ts +69 -0
  18. package/src/authentication/OTP.ts +66 -0
  19. package/src/authentication/Session.test.ts +665 -0
  20. package/src/authentication/Session.ts +529 -0
  21. package/src/authentication/defaultAuthentication.ts +214 -0
  22. package/src/authentication/index.ts +3 -0
  23. package/src/authentication/interface.ts +157 -0
  24. package/src/authentication/oauth/GitHub.test.ts +105 -0
  25. package/src/authentication/oauth/GitHub.ts +133 -0
  26. package/src/authentication/oauth/Google.test.ts +105 -0
  27. package/src/authentication/oauth/Google.ts +110 -0
  28. package/src/authentication/oauth/Oauth2Client.test.ts +225 -0
  29. package/src/authentication/oauth/Oauth2Client.ts +140 -0
  30. package/src/authentication/oauth/index.ts +2 -0
  31. package/src/authentication/oauth/utils.test.ts +35 -0
  32. package/src/authentication/oauth/utils.ts +28 -0
  33. package/src/authentication/providers/EmailOTP.test.ts +138 -0
  34. package/src/authentication/providers/EmailOTP.ts +93 -0
  35. package/src/authentication/providers/EmailPassword.test.ts +187 -0
  36. package/src/authentication/providers/EmailPassword.ts +130 -0
  37. package/src/authentication/providers/EmailPasswordSRP.test.ts +206 -0
  38. package/src/authentication/providers/EmailPasswordSRP.ts +184 -0
  39. package/src/authentication/providers/GitHub.ts +30 -0
  40. package/src/authentication/providers/Google.ts +30 -0
  41. package/src/authentication/providers/OAuth.test.ts +185 -0
  42. package/src/authentication/providers/OAuth.ts +112 -0
  43. package/src/authentication/providers/PhonePassword.test.ts +187 -0
  44. package/src/authentication/providers/PhonePassword.ts +129 -0
  45. package/src/authentication/providers/QRCodeOTP.test.ts +79 -0
  46. package/src/authentication/providers/QRCodeOTP.ts +65 -0
  47. package/src/authentication/providers/index.ts +6 -0
  48. package/src/authentication/resolvers/refreshResolver.test.ts +37 -0
  49. package/src/authentication/resolvers/refreshResolver.ts +20 -0
  50. package/src/authentication/resolvers/signInWithResolver.inte.test.ts +59 -0
  51. package/src/authentication/resolvers/signInWithResolver.test.ts +307 -0
  52. package/src/authentication/resolvers/signInWithResolver.ts +102 -0
  53. package/src/authentication/resolvers/signOutResolver.test.ts +41 -0
  54. package/src/authentication/resolvers/signOutResolver.ts +22 -0
  55. package/src/authentication/resolvers/signUpWithResolver.test.ts +186 -0
  56. package/src/authentication/resolvers/signUpWithResolver.ts +69 -0
  57. package/src/authentication/resolvers/verifyChallenge.test.ts +136 -0
  58. package/src/authentication/resolvers/verifyChallenge.ts +69 -0
  59. package/src/authentication/roles.test.ts +59 -0
  60. package/src/authentication/roles.ts +40 -0
  61. package/src/authentication/utils.test.ts +99 -0
  62. package/src/authentication/utils.ts +43 -0
  63. package/src/cache/InMemoryCache.test.ts +62 -0
  64. package/src/cache/InMemoryCache.ts +45 -0
  65. package/src/cron/index.test.ts +17 -0
  66. package/src/cron/index.ts +46 -0
  67. package/src/database/DatabaseController.test.ts +625 -0
  68. package/src/database/DatabaseController.ts +983 -0
  69. package/src/database/index.test.ts +1230 -0
  70. package/src/database/index.ts +9 -0
  71. package/src/database/interface.ts +312 -0
  72. package/src/email/DevAdapter.ts +8 -0
  73. package/src/email/EmailController.test.ts +29 -0
  74. package/src/email/EmailController.ts +13 -0
  75. package/src/email/index.ts +2 -0
  76. package/src/email/interface.ts +36 -0
  77. package/src/email/templates/sendOtpCode.ts +120 -0
  78. package/src/file/FileController.ts +28 -0
  79. package/src/file/FileDevAdapter.ts +54 -0
  80. package/src/file/hookDeleteFile.ts +27 -0
  81. package/src/file/hookReadFile.ts +70 -0
  82. package/src/file/hookUploadFile.ts +53 -0
  83. package/src/file/index.test.ts +979 -0
  84. package/src/file/index.ts +2 -0
  85. package/src/file/interface.ts +42 -0
  86. package/src/graphql/GraphQLSchema.test.ts +4399 -0
  87. package/src/graphql/GraphQLSchema.ts +928 -0
  88. package/src/graphql/index.ts +2 -0
  89. package/src/graphql/parseGraphqlSchema.ts +94 -0
  90. package/src/graphql/parser.test.ts +217 -0
  91. package/src/graphql/parser.ts +566 -0
  92. package/src/graphql/pointerAndRelationFunction.ts +200 -0
  93. package/src/graphql/resolvers.ts +467 -0
  94. package/src/graphql/tests/aggregation.test.ts +1123 -0
  95. package/src/graphql/tests/e2e.test.ts +596 -0
  96. package/src/graphql/tests/scalars.test.ts +250 -0
  97. package/src/graphql/types.ts +219 -0
  98. package/src/hooks/HookObject.test.ts +122 -0
  99. package/src/hooks/HookObject.ts +168 -0
  100. package/src/hooks/authentication.ts +76 -0
  101. package/src/hooks/createUser.test.ts +77 -0
  102. package/src/hooks/createUser.ts +10 -0
  103. package/src/hooks/defaultFields.test.ts +187 -0
  104. package/src/hooks/defaultFields.ts +40 -0
  105. package/src/hooks/deleteSession.test.ts +181 -0
  106. package/src/hooks/deleteSession.ts +20 -0
  107. package/src/hooks/hashFieldHook.test.ts +163 -0
  108. package/src/hooks/hashFieldHook.ts +97 -0
  109. package/src/hooks/index.test.ts +207 -0
  110. package/src/hooks/index.ts +430 -0
  111. package/src/hooks/permissions.test.ts +424 -0
  112. package/src/hooks/permissions.ts +113 -0
  113. package/src/hooks/protected.test.ts +551 -0
  114. package/src/hooks/protected.ts +72 -0
  115. package/src/hooks/searchableFields.test.ts +166 -0
  116. package/src/hooks/searchableFields.ts +98 -0
  117. package/src/hooks/session.test.ts +138 -0
  118. package/src/hooks/session.ts +78 -0
  119. package/src/hooks/setEmail.test.ts +216 -0
  120. package/src/hooks/setEmail.ts +35 -0
  121. package/src/hooks/setupAcl.test.ts +589 -0
  122. package/src/hooks/setupAcl.ts +29 -0
  123. package/src/index.ts +9 -0
  124. package/src/schema/Schema.test.ts +484 -0
  125. package/src/schema/Schema.ts +795 -0
  126. package/src/schema/defaultResolvers.ts +94 -0
  127. package/src/schema/index.ts +1 -0
  128. package/src/schema/resolvers/meResolver.test.ts +62 -0
  129. package/src/schema/resolvers/meResolver.ts +14 -0
  130. package/src/schema/resolvers/newFile.ts +0 -0
  131. package/src/schema/resolvers/resetPassword.test.ts +345 -0
  132. package/src/schema/resolvers/resetPassword.ts +64 -0
  133. package/src/schema/resolvers/sendEmail.test.ts +118 -0
  134. package/src/schema/resolvers/sendEmail.ts +21 -0
  135. package/src/schema/resolvers/sendOtpCode.test.ts +153 -0
  136. package/src/schema/resolvers/sendOtpCode.ts +52 -0
  137. package/src/security.test.ts +3461 -0
  138. package/src/server/defaultSessionHandler.test.ts +66 -0
  139. package/src/server/defaultSessionHandler.ts +115 -0
  140. package/src/server/generateCodegen.ts +476 -0
  141. package/src/server/index.test.ts +552 -0
  142. package/src/server/index.ts +354 -0
  143. package/src/server/interface.ts +11 -0
  144. package/src/server/routes/authHandler.ts +187 -0
  145. package/src/server/routes/index.ts +40 -0
  146. package/src/utils/crypto.test.ts +41 -0
  147. package/src/utils/crypto.ts +121 -0
  148. package/src/utils/export.ts +13 -0
  149. package/src/utils/helper.ts +195 -0
  150. package/src/utils/index.test.ts +11 -0
  151. package/src/utils/index.ts +201 -0
  152. package/src/utils/preload.ts +8 -0
  153. package/src/utils/testHelper.ts +117 -0
  154. package/tsconfig.json +32 -0
  155. package/bunfig.toml +0 -4
  156. package/dist/ai/index.d.ts +0 -1
  157. package/dist/ai/interface.d.ts +0 -9
  158. /package/dist/server/{defaultHandlers.d.ts → defaultSessionHandler.d.ts} +0 -0
@@ -0,0 +1,3461 @@
1
+ import { describe, it, expect, afterEach } from 'bun:test'
2
+ import { decode, sign } from 'jsonwebtoken'
3
+ import { gql, type GraphQLClient } from 'graphql-request'
4
+ import type { Wabe } from './server'
5
+ import {
6
+ type DevWabeTypes,
7
+ getAdminUserClient,
8
+ getGraphqlClient,
9
+ getAnonymousClient,
10
+ createUserAndUpdateRole,
11
+ getUserClient,
12
+ } from './utils/helper'
13
+ import { setupTests, closeTests } from './utils/testHelper'
14
+
15
+ describe('Security tests', () => {
16
+ let wabe: Wabe<DevWabeTypes> | undefined
17
+ let port: number
18
+ let client: GraphQLClient
19
+ let rootClient: GraphQLClient
20
+
21
+ afterEach(async () => {
22
+ if (!wabe) return
23
+
24
+ await closeTests(wabe)
25
+ wabe = undefined
26
+ })
27
+
28
+ it('should block requests without a valid CSRF token', async () => {
29
+ const setup = await setupTests(
30
+ [
31
+ {
32
+ name: 'TestCSRF',
33
+ fields: {
34
+ name: { type: 'String' },
35
+ },
36
+ permissions: {
37
+ create: {
38
+ authorizedRoles: ['Client'],
39
+ requireAuthentication: true,
40
+ },
41
+ read: {
42
+ authorizedRoles: ['Client'],
43
+ requireAuthentication: true,
44
+ },
45
+ },
46
+ },
47
+ ],
48
+ { disableCSRFProtection: false },
49
+ )
50
+
51
+ wabe = setup.wabe
52
+ port = setup.port
53
+ client = getAnonymousClient(port)
54
+ rootClient = getGraphqlClient(port)
55
+
56
+ const { userClient, accessToken, csrfToken } =
57
+ await createUserAndUpdateRole({
58
+ anonymousClient: client,
59
+ port,
60
+ roleName: 'Client',
61
+ rootClient,
62
+ })
63
+
64
+ expect(
65
+ userClient.request(gql`
66
+ mutation createTestCSRF {
67
+ createTestCSRF(input: { fields: { name: "CSRF Test" } }) {
68
+ testCSRF {
69
+ id
70
+ }
71
+ }
72
+ }
73
+ `),
74
+ ).rejects.toThrow('Permission denied to create class TestCSRF')
75
+
76
+ const invalidCsrfClient = getUserClient(port, {
77
+ accessToken,
78
+ csrfToken: 'invalid-csrf-token',
79
+ })
80
+ expect(
81
+ invalidCsrfClient.request(gql`
82
+ mutation createTestCSRF {
83
+ createTestCSRF(input: { fields: { name: "CSRF Test" } }) {
84
+ testCSRF {
85
+ id
86
+ }
87
+ }
88
+ }
89
+ `),
90
+ ).rejects.toThrow('Permission denied to create class TestCSRF')
91
+
92
+ const validCsrfClient = getUserClient(port, {
93
+ accessToken,
94
+ csrfToken,
95
+ })
96
+
97
+ const res = await validCsrfClient.request<any>(gql`
98
+ mutation createTestCSRF {
99
+ createTestCSRF(input: { fields: { name: "CSRF Test" } }) {
100
+ testCSRF {
101
+ id
102
+ }
103
+ }
104
+ }
105
+ `)
106
+
107
+ expect(res.createTestCSRF.testCSRF.id).toBeDefined()
108
+
109
+ await closeTests(wabe)
110
+ })
111
+
112
+ it('should not block requests without a valid CSRF token if security.csrfToken is to false', async () => {
113
+ const setup = await setupTests([
114
+ {
115
+ name: 'TestCSRF',
116
+ fields: {
117
+ name: { type: 'String' },
118
+ },
119
+ permissions: {
120
+ create: {
121
+ authorizedRoles: ['Client'],
122
+ requireAuthentication: true,
123
+ },
124
+ read: {
125
+ authorizedRoles: ['Client'],
126
+ requireAuthentication: true,
127
+ },
128
+ },
129
+ },
130
+ ])
131
+
132
+ wabe = setup.wabe
133
+ port = setup.port
134
+ client = getAnonymousClient(port)
135
+ rootClient = getGraphqlClient(port)
136
+
137
+ const { accessToken } = await createUserAndUpdateRole({
138
+ anonymousClient: client,
139
+ port,
140
+ roleName: 'Client',
141
+ rootClient,
142
+ })
143
+
144
+ const invalidCsrfClient = getUserClient(port, {
145
+ accessToken,
146
+ csrfToken: 'invalid-csrf-token',
147
+ })
148
+
149
+ const res = await invalidCsrfClient.request<any>(gql`
150
+ mutation createTestCSRF {
151
+ createTestCSRF(input: { fields: { name: "CSRF Test" } }) {
152
+ testCSRF {
153
+ id
154
+ }
155
+ }
156
+ }
157
+ `)
158
+
159
+ expect(res.createTestCSRF.testCSRF.id).toBeDefined()
160
+
161
+ await closeTests(wabe)
162
+ })
163
+
164
+ it('should not return protected fields in creation response when user is not authorized to read them', async () => {
165
+ const setup = await setupTests([
166
+ {
167
+ name: 'Secret',
168
+ fields: {
169
+ name: { type: 'String' },
170
+ secret: {
171
+ type: 'String',
172
+ protected: {
173
+ protectedOperations: ['read'],
174
+ authorizedRoles: ['Admin'],
175
+ },
176
+ },
177
+ },
178
+ permissions: {
179
+ create: {
180
+ requireAuthentication: true,
181
+ authorizedRoles: ['Client'],
182
+ },
183
+ read: {
184
+ requireAuthentication: true,
185
+ authorizedRoles: ['Client'],
186
+ },
187
+ },
188
+ },
189
+ ])
190
+
191
+ wabe = setup.wabe
192
+ port = setup.port
193
+ client = getAnonymousClient(port)
194
+ rootClient = getGraphqlClient(port)
195
+
196
+ const { userClient } = await createUserAndUpdateRole({
197
+ anonymousClient: client,
198
+ port,
199
+ roleName: 'Client',
200
+ rootClient,
201
+ })
202
+
203
+ await expect(
204
+ userClient.request<any>(gql`
205
+ mutation createSecret {
206
+ createSecret(
207
+ input: { fields: { name: "n", secret: "s" } }
208
+ ) {
209
+ secret {
210
+ id
211
+ secret
212
+ }
213
+ }
214
+ }
215
+ `),
216
+ ).rejects.toThrow('You are not authorized to read this field')
217
+
218
+ await closeTests(wabe)
219
+ })
220
+
221
+ it('should not return created object when ACL denies read access', async () => {
222
+ const setup = await setupTests([
223
+ {
224
+ name: 'NoReadAfterCreate',
225
+ fields: {
226
+ name: { type: 'String' },
227
+ },
228
+ permissions: {
229
+ create: {
230
+ requireAuthentication: true,
231
+ authorizedRoles: ['Client'],
232
+ },
233
+ read: {
234
+ requireAuthentication: true,
235
+ authorizedRoles: ['Client'],
236
+ },
237
+ acl: async (hookObject) => {
238
+ await hookObject.addACL('users', null)
239
+ await hookObject.addACL('roles', null)
240
+ },
241
+ },
242
+ },
243
+ ])
244
+
245
+ wabe = setup.wabe
246
+ port = setup.port
247
+ client = getAnonymousClient(port)
248
+ rootClient = getGraphqlClient(port)
249
+
250
+ const { userClient } = await createUserAndUpdateRole({
251
+ anonymousClient: client,
252
+ port,
253
+ roleName: 'Client',
254
+ rootClient,
255
+ })
256
+
257
+ await expect(
258
+ userClient.request<any>(gql`
259
+ mutation createNoReadAfterCreate {
260
+ createNoReadAfterCreate(input: { fields: { name: "n" } }) {
261
+ noReadAfterCreate {
262
+ id
263
+ name
264
+ }
265
+ }
266
+ }
267
+ `),
268
+ ).rejects.toThrow(/Permission denied|Object not found/)
269
+
270
+ await closeTests(wabe)
271
+ })
272
+
273
+ it('should apply ACL filtering to count queries', async () => {
274
+ const setup = await setupTests([
275
+ {
276
+ name: 'CountAcl',
277
+ fields: {
278
+ name: { type: 'String' },
279
+ },
280
+ permissions: {
281
+ create: {
282
+ requireAuthentication: true,
283
+ authorizedRoles: ['Client'],
284
+ },
285
+ read: {
286
+ requireAuthentication: true,
287
+ authorizedRoles: ['Client'],
288
+ },
289
+ acl: async (hookObject) => {
290
+ await hookObject.addACL('users', null)
291
+ await hookObject.addACL('roles', null)
292
+ },
293
+ },
294
+ },
295
+ ])
296
+
297
+ wabe = setup.wabe
298
+ port = setup.port
299
+ client = getAnonymousClient(port)
300
+ rootClient = getGraphqlClient(port)
301
+
302
+ const { userClient } = await createUserAndUpdateRole({
303
+ anonymousClient: client,
304
+ port,
305
+ roleName: 'Client',
306
+ rootClient,
307
+ })
308
+
309
+ await rootClient.request<any>(gql`
310
+ mutation createCountAcl {
311
+ createCountAcl(input: { fields: { name: "toto" } }) {
312
+ countAcl {
313
+ id
314
+ }
315
+ }
316
+ }
317
+ `)
318
+
319
+ const res = await userClient.request<any>(gql`
320
+ query countAcls {
321
+ countAcls {
322
+ totalCount
323
+ }
324
+ }
325
+ `)
326
+
327
+ expect(res.countAcls.totalCount).toEqual(0)
328
+
329
+ await closeTests(wabe)
330
+ })
331
+
332
+ it('should block GraphQL introspection queries for anonymous and authenticated users for isProduction server', async () => {
333
+ const setup = await setupTests([], { isProduction: true })
334
+ wabe = setup.wabe
335
+ port = setup.port
336
+ client = getAnonymousClient(port)
337
+ rootClient = getGraphqlClient(port)
338
+
339
+ // Test pour un utilisateur anonyme
340
+ expect(
341
+ client.request(gql`
342
+ query IntrospectionQuery {
343
+ __schema {
344
+ types {
345
+ name
346
+ }
347
+ }
348
+ }
349
+ `),
350
+ ).rejects.toThrow('GraphQL introspection is not allowed in production')
351
+
352
+ // Test pour un utilisateur authentifié (même un admin)
353
+ const { userClient } = await createUserAndUpdateRole({
354
+ anonymousClient: client,
355
+ port,
356
+ roleName: 'Admin',
357
+ rootClient,
358
+ })
359
+
360
+ expect(
361
+ userClient.request(gql`
362
+ query IntrospectionQuery {
363
+ __schema {
364
+ types {
365
+ name
366
+ }
367
+ }
368
+ }
369
+ `),
370
+ ).rejects.toThrow('GraphQL introspection is not allowed in production')
371
+
372
+ await closeTests(wabe)
373
+ })
374
+
375
+ it('should return null if the accessToken is an invalid accessToken', async () => {
376
+ const setup = await setupTests()
377
+ wabe = setup.wabe
378
+ port = setup.port
379
+ client = getAnonymousClient(port)
380
+ rootClient = getGraphqlClient(port)
381
+
382
+ const { accessToken } = await createUserAndUpdateRole({
383
+ anonymousClient: getAnonymousClient(port),
384
+ port,
385
+ roleName: 'Client',
386
+ rootClient,
387
+ })
388
+
389
+ const decoded = decode(accessToken) as any
390
+
391
+ const invalidToken = sign(
392
+ {
393
+ ...decoded,
394
+ sub: 'fake-user-id',
395
+ },
396
+ 'dev',
397
+ )
398
+
399
+ const userClient = getUserClient(port, { accessToken: invalidToken })
400
+
401
+ const res = await userClient.request<any>(gql`
402
+ query me {
403
+ me {
404
+ user {
405
+ id
406
+ }
407
+ }
408
+ }
409
+ `)
410
+
411
+ expect(res.me.user).toBeNull()
412
+
413
+ await closeTests(wabe)
414
+ })
415
+
416
+ it('should throw an error if try to access to a class with empty authorizedRoles but not requireAuthentication', async () => {
417
+ const setup = await setupTests([
418
+ {
419
+ name: 'Test',
420
+ fields: {
421
+ name: {
422
+ type: 'String',
423
+ },
424
+ },
425
+ permissions: {
426
+ read: {
427
+ authorizedRoles: [],
428
+ },
429
+ },
430
+ },
431
+ ])
432
+ wabe = setup.wabe
433
+ port = setup.port
434
+ client = getAnonymousClient(port)
435
+ rootClient = getGraphqlClient(port)
436
+
437
+ expect(
438
+ client.request(gql`
439
+ query tests {
440
+ tests {
441
+ totalCount
442
+ }
443
+ }
444
+ `),
445
+ ).rejects.toThrow('Permission denied to read class Test')
446
+
447
+ await closeTests(wabe)
448
+ })
449
+
450
+ it('should throw an error if try to count the number of objects in anonymous', async () => {
451
+ const setup = await setupTests([
452
+ {
453
+ name: 'Test',
454
+ fields: {
455
+ name: {
456
+ type: 'String',
457
+ },
458
+ },
459
+ permissions: {
460
+ read: {
461
+ authorizedRoles: [],
462
+ requireAuthentication: true,
463
+ },
464
+ },
465
+ },
466
+ ])
467
+ wabe = setup.wabe
468
+ port = setup.port
469
+ client = getAnonymousClient(port)
470
+ rootClient = getGraphqlClient(port)
471
+
472
+ expect(
473
+ client.request(gql`
474
+ query tests {
475
+ tests {
476
+ totalCount
477
+ }
478
+ }
479
+ `),
480
+ ).rejects.toThrow('Permission denied to read class Test')
481
+
482
+ await closeTests(wabe)
483
+ })
484
+
485
+ it('should throw an error when I try to update and create ACL field without root access', async () => {
486
+ const setup = await setupTests([
487
+ {
488
+ name: 'Test',
489
+ fields: {
490
+ name: {
491
+ type: 'String',
492
+ },
493
+ },
494
+ permissions: {
495
+ create: {
496
+ authorizedRoles: ['Client'],
497
+ requireAuthentication: true,
498
+ },
499
+ read: {
500
+ authorizedRoles: ['Client'],
501
+ requireAuthentication: true,
502
+ },
503
+ update: {
504
+ authorizedRoles: ['Client'],
505
+ requireAuthentication: true,
506
+ },
507
+ },
508
+ },
509
+ ])
510
+ wabe = setup.wabe
511
+ port = setup.port
512
+ client = getAnonymousClient(port)
513
+ rootClient = getGraphqlClient(port)
514
+
515
+ const { userClient } = await createUserAndUpdateRole({
516
+ anonymousClient: getAnonymousClient(port),
517
+ port,
518
+ roleName: 'Client',
519
+ rootClient,
520
+ })
521
+
522
+ const res = await userClient.request<any>(gql`
523
+ mutation createTest {
524
+ createTest(input: { fields: { name: "Test" } }) {
525
+ test {
526
+ id
527
+ }
528
+ }
529
+ }
530
+ `)
531
+
532
+ const testId = res.createTest.test.id
533
+
534
+ expect(
535
+ userClient.request(gql`
536
+ mutation updateTest {
537
+ updateTest(input: {id: "${testId}", fields: {acl: {users: [{userId: "2"}]}}}) {
538
+ test {
539
+ id
540
+ }
541
+ }
542
+ }
543
+ `),
544
+ ).rejects.toThrow('You are not authorized to update this field')
545
+
546
+ expect(
547
+ userClient.request(gql`
548
+ mutation createTest {
549
+ createTest(
550
+ input: { fields: { acl: { users: [{ userId: "2" }] } } }
551
+ ) {
552
+ test {
553
+ id
554
+ }
555
+ }
556
+ }
557
+ `),
558
+ ).rejects.toThrow('You are not authorized to create this field')
559
+
560
+ await closeTests(wabe)
561
+ })
562
+
563
+ it('should throw an error when I try to create an user with a role without root access', async () => {
564
+ const setup = await setupTests()
565
+ wabe = setup.wabe
566
+ port = setup.port
567
+ client = getAnonymousClient(port)
568
+ rootClient = getGraphqlClient(port)
569
+
570
+ const adminRole = await wabe.controllers.database.getObjects({
571
+ className: 'Role',
572
+ where: {
573
+ name: { equalTo: 'Admin' },
574
+ },
575
+ first: 1,
576
+ select: { id: true },
577
+ context: {
578
+ wabe,
579
+ isRoot: true,
580
+ },
581
+ })
582
+
583
+ expect(
584
+ client.request(gql`
585
+ mutation createUser {
586
+ createUser(input: { fields: {role: {link: "${adminRole[0]?.id}"}} }) {
587
+ user {
588
+ id
589
+ }
590
+ }
591
+ }
592
+ `),
593
+ ).rejects.toThrow('You are not authorized to create this field')
594
+
595
+ await closeTests(wabe)
596
+ })
597
+
598
+ it('should not be able to update role pointer in the User class', async () => {
599
+ const setup = await setupTests()
600
+ wabe = setup.wabe
601
+ port = setup.port
602
+ client = getAnonymousClient(port)
603
+ rootClient = getGraphqlClient(port)
604
+
605
+ const { userId } = await createUserAndUpdateRole({
606
+ anonymousClient: getAnonymousClient(port),
607
+ port,
608
+ roleName: 'Client',
609
+ rootClient,
610
+ })
611
+
612
+ expect(
613
+ wabe.controllers.database.updateObject({
614
+ className: 'User',
615
+ id: userId,
616
+ context: {
617
+ wabe,
618
+ isRoot: false,
619
+ },
620
+ data: {
621
+ role: 'newid',
622
+ },
623
+ }),
624
+ ).rejects.toThrow('You are not authorized to update this field')
625
+
626
+ await closeTests(wabe)
627
+ })
628
+
629
+ it('should not be able to create / update sessions relation in the User class', async () => {
630
+ const setup = await setupTests()
631
+ wabe = setup.wabe
632
+ port = setup.port
633
+ client = getAnonymousClient(port)
634
+ rootClient = getGraphqlClient(port)
635
+
636
+ const { userId } = await createUserAndUpdateRole({
637
+ anonymousClient: getAnonymousClient(port),
638
+ port,
639
+ roleName: 'Client',
640
+ rootClient,
641
+ })
642
+
643
+ expect(
644
+ wabe.controllers.database.updateObject({
645
+ className: 'User',
646
+ id: userId,
647
+ context: {
648
+ wabe,
649
+ isRoot: false,
650
+ },
651
+ data: {
652
+ sessions: ['newid'],
653
+ },
654
+ }),
655
+ ).rejects.toThrow('You are not authorized to update this field')
656
+
657
+ expect(
658
+ wabe.controllers.database.createObject({
659
+ className: 'User',
660
+ context: {
661
+ wabe,
662
+ isRoot: false,
663
+ },
664
+ data: {
665
+ sessions: ['newid'],
666
+ },
667
+ }),
668
+ ).rejects.toThrow('You are not authorized to create this field')
669
+
670
+ await closeTests(wabe)
671
+ })
672
+
673
+ it("should throw an error if the user tries to delete an object and doesn't have access to read the object", async () => {
674
+ const setup = await setupTests([
675
+ {
676
+ name: 'Test1',
677
+ fields: {
678
+ name: {
679
+ type: 'String',
680
+ },
681
+ },
682
+ permissions: {
683
+ read: {
684
+ authorizedRoles: [],
685
+ requireAuthentication: true,
686
+ },
687
+ create: {
688
+ authorizedRoles: ['Client'],
689
+ requireAuthentication: true,
690
+ },
691
+ delete: {
692
+ authorizedRoles: ['Client'],
693
+ requireAuthentication: true,
694
+ },
695
+ },
696
+ },
697
+ ])
698
+ wabe = setup.wabe
699
+ port = setup.port
700
+ client = getAnonymousClient(port)
701
+ rootClient = getGraphqlClient(port)
702
+
703
+ const { userClient } = await createUserAndUpdateRole({
704
+ anonymousClient: getAnonymousClient(port),
705
+ port,
706
+ roleName: 'Client',
707
+ rootClient,
708
+ })
709
+
710
+ const res = await rootClient.request<any>(gql`
711
+ mutation createTest1 {
712
+ createTest1(input: { fields: { name: "test1" } }) {
713
+ test1 {
714
+ id
715
+ }
716
+ }
717
+ }
718
+ `)
719
+
720
+ expect(
721
+ userClient.request(gql`
722
+ mutation deleteTest1{
723
+ deleteTest1(input: {id: "${res.createTest1.test1.id}"}) {
724
+ test1 {
725
+ id
726
+ }
727
+ }
728
+ }
729
+ `),
730
+ ).rejects.toThrow('Permission denied to read class Test1')
731
+
732
+ expect(
733
+ userClient.request(gql`
734
+ mutation deleteTest1s {
735
+ deleteTest1s(
736
+ input: { where: { name: { equalTo: "test1" } } }
737
+ ) {
738
+ edges {
739
+ node {
740
+ id
741
+ }
742
+ }
743
+ }
744
+ }
745
+ `),
746
+ ).rejects.toThrow('Permission denied to read class Test1')
747
+
748
+ await closeTests(wabe)
749
+ })
750
+
751
+ it("should throw an error if the user try to update an object and doesn't have access to read the object", async () => {
752
+ const setup = await setupTests([
753
+ {
754
+ name: 'Test1',
755
+ fields: {
756
+ name: {
757
+ type: 'String',
758
+ },
759
+ },
760
+ permissions: {
761
+ read: {
762
+ authorizedRoles: [],
763
+ requireAuthentication: true,
764
+ },
765
+ create: {
766
+ authorizedRoles: ['Client'],
767
+ requireAuthentication: true,
768
+ },
769
+ update: {
770
+ authorizedRoles: ['Client'],
771
+ requireAuthentication: true,
772
+ },
773
+ },
774
+ },
775
+ ])
776
+ wabe = setup.wabe
777
+ port = setup.port
778
+ client = getAnonymousClient(port)
779
+ rootClient = getGraphqlClient(port)
780
+
781
+ const { userClient } = await createUserAndUpdateRole({
782
+ anonymousClient: getAnonymousClient(port),
783
+ port,
784
+ roleName: 'Client',
785
+ rootClient,
786
+ })
787
+
788
+ const res = await rootClient.request<any>(gql`
789
+ mutation createTest1 {
790
+ createTest1(input: { fields: { name: "test1" } }) {
791
+ test1 {
792
+ id
793
+ }
794
+ }
795
+ }
796
+ `)
797
+
798
+ expect(
799
+ userClient.request(gql`
800
+ mutation updateTest1{
801
+ updateTest1(input: {id: "${res.createTest1.test1.id}", fields: {name: "test1"}}) {
802
+ test1 {
803
+ id
804
+ }
805
+ }
806
+ }
807
+ `),
808
+ ).rejects.toThrow('Permission denied to read class Test1')
809
+
810
+ expect(
811
+ userClient.request(gql`
812
+ mutation updateTest1s {
813
+ updateTest1s(
814
+ input: {
815
+ where: { name: { equalTo: "test1" } }
816
+ fields: { name: "test1" }
817
+ }
818
+ ) {
819
+ edges {
820
+ node {
821
+ id
822
+ }
823
+ }
824
+ }
825
+ }
826
+ `),
827
+ ).rejects.toThrow('Permission denied to read class Test1')
828
+
829
+ await closeTests(wabe)
830
+ })
831
+
832
+ it('should not create object in relation if not have permission to create', async () => {
833
+ const setup = await setupTests([
834
+ {
835
+ name: 'Test1',
836
+ fields: {
837
+ name: {
838
+ type: 'String',
839
+ },
840
+ },
841
+ permissions: {
842
+ read: {
843
+ authorizedRoles: ['Admin'],
844
+ requireAuthentication: true,
845
+ },
846
+ create: {
847
+ authorizedRoles: ['Admin'],
848
+ requireAuthentication: true,
849
+ },
850
+ },
851
+ },
852
+ {
853
+ name: 'Test2',
854
+ fields: {
855
+ field1: {
856
+ type: 'Relation',
857
+ class: 'Test1',
858
+ },
859
+ field2: {
860
+ type: 'Pointer',
861
+ class: 'Test1',
862
+ },
863
+ },
864
+ permissions: {
865
+ read: {
866
+ authorizedRoles: ['Client'],
867
+ requireAuthentication: true,
868
+ },
869
+ create: {
870
+ authorizedRoles: ['Client'],
871
+ requireAuthentication: true,
872
+ },
873
+ },
874
+ },
875
+ ])
876
+ wabe = setup.wabe
877
+ port = setup.port
878
+ client = getAnonymousClient(port)
879
+ rootClient = getGraphqlClient(port)
880
+
881
+ const { userClient } = await createUserAndUpdateRole({
882
+ anonymousClient: client,
883
+ port,
884
+ roleName: 'Client',
885
+ rootClient,
886
+ })
887
+
888
+ expect(
889
+ userClient.request<any>(gql`
890
+ mutation createTest2 {
891
+ createTest2(
892
+ input: {
893
+ fields: {
894
+ field1: { createAndAdd: [{ name: "toto" }] }
895
+ }
896
+ }
897
+ ) {
898
+ test2 {
899
+ id
900
+ }
901
+ }
902
+ }
903
+ `),
904
+ ).rejects.toThrow('Permission denied to create class Test1')
905
+
906
+ await closeTests(wabe)
907
+ })
908
+
909
+ it('should not create object in pointer if not have permission to create', async () => {
910
+ const setup = await setupTests([
911
+ {
912
+ name: 'Test1',
913
+ fields: {
914
+ name: {
915
+ type: 'String',
916
+ },
917
+ },
918
+ permissions: {
919
+ read: {
920
+ authorizedRoles: ['Admin'],
921
+ requireAuthentication: true,
922
+ },
923
+ create: {
924
+ authorizedRoles: ['Admin'],
925
+ requireAuthentication: true,
926
+ },
927
+ },
928
+ },
929
+ {
930
+ name: 'Test2',
931
+ fields: {
932
+ field1: {
933
+ type: 'Relation',
934
+ class: 'Test1',
935
+ },
936
+ field2: {
937
+ type: 'Pointer',
938
+ class: 'Test1',
939
+ },
940
+ },
941
+ permissions: {
942
+ read: {
943
+ authorizedRoles: ['Client'],
944
+ requireAuthentication: true,
945
+ },
946
+ create: {
947
+ authorizedRoles: ['Client'],
948
+ requireAuthentication: true,
949
+ },
950
+ },
951
+ },
952
+ ])
953
+ wabe = setup.wabe
954
+ port = setup.port
955
+ client = getAnonymousClient(port)
956
+ rootClient = getGraphqlClient(port)
957
+
958
+ const { userClient } = await createUserAndUpdateRole({
959
+ anonymousClient: client,
960
+ port,
961
+ roleName: 'Client',
962
+ rootClient,
963
+ })
964
+
965
+ expect(
966
+ userClient.request<any>(gql`
967
+ mutation createTest2 {
968
+ createTest2(
969
+ input: {
970
+ fields: {
971
+ field2: { createAndLink: { name: "toto" } }
972
+ }
973
+ }
974
+ ) {
975
+ test2 {
976
+ id
977
+ }
978
+ }
979
+ }
980
+ `),
981
+ ).rejects.toThrow('Permission denied to create class Test1')
982
+
983
+ await closeTests(wabe)
984
+ })
985
+
986
+ it("should not be able to access to a relation if user doesn't have access on read", async () => {
987
+ const setup = await setupTests([
988
+ {
989
+ name: 'Test1',
990
+ fields: {
991
+ name: {
992
+ type: 'String',
993
+ },
994
+ },
995
+ permissions: {
996
+ read: {
997
+ authorizedRoles: ['Admin'],
998
+ requireAuthentication: true,
999
+ },
1000
+ create: {
1001
+ authorizedRoles: ['Admin'],
1002
+ requireAuthentication: true,
1003
+ },
1004
+ },
1005
+ },
1006
+ {
1007
+ name: 'Test2',
1008
+ fields: {
1009
+ field1: {
1010
+ type: 'Relation',
1011
+ class: 'Test1',
1012
+ },
1013
+ field2: {
1014
+ type: 'Pointer',
1015
+ class: 'Test1',
1016
+ },
1017
+ },
1018
+ permissions: {
1019
+ read: {
1020
+ authorizedRoles: ['Client'],
1021
+ requireAuthentication: true,
1022
+ },
1023
+ create: {
1024
+ authorizedRoles: ['Client'],
1025
+ requireAuthentication: true,
1026
+ },
1027
+ },
1028
+ },
1029
+ ])
1030
+ wabe = setup.wabe
1031
+ port = setup.port
1032
+ client = getAnonymousClient(port)
1033
+ rootClient = getGraphqlClient(port)
1034
+
1035
+ await rootClient.request<any>(gql`
1036
+ mutation createTest2 {
1037
+ createTest2(
1038
+ input: {
1039
+ fields: { field1: { createAndAdd: [{ name: "toto" }] } }
1040
+ }
1041
+ ) {
1042
+ test2 {
1043
+ id
1044
+ }
1045
+ }
1046
+ }
1047
+ `)
1048
+
1049
+ const { userClient } = await createUserAndUpdateRole({
1050
+ anonymousClient: client,
1051
+ port,
1052
+ roleName: 'Client',
1053
+ rootClient,
1054
+ })
1055
+
1056
+ expect(
1057
+ userClient.request(gql`
1058
+ query test2s {
1059
+ test2s {
1060
+ edges {
1061
+ node {
1062
+ id
1063
+ field1 {
1064
+ edges {
1065
+ node {
1066
+ id
1067
+ }
1068
+ }
1069
+ }
1070
+ }
1071
+ }
1072
+ }
1073
+ }
1074
+ `),
1075
+ ).rejects.toThrow('Permission denied to read class Test1')
1076
+
1077
+ await closeTests(wabe)
1078
+ })
1079
+
1080
+ it("should not be able to access to a pointer if user doesn't have access on read", async () => {
1081
+ const setup = await setupTests([
1082
+ {
1083
+ name: 'Test1',
1084
+ fields: {
1085
+ name: {
1086
+ type: 'String',
1087
+ },
1088
+ },
1089
+ permissions: {
1090
+ read: {
1091
+ authorizedRoles: ['Admin'],
1092
+ requireAuthentication: true,
1093
+ },
1094
+ create: {
1095
+ authorizedRoles: ['Admin'],
1096
+ requireAuthentication: true,
1097
+ },
1098
+ },
1099
+ },
1100
+ {
1101
+ name: 'Test2',
1102
+ fields: {
1103
+ field1: {
1104
+ type: 'Relation',
1105
+ class: 'Test1',
1106
+ },
1107
+ field2: {
1108
+ type: 'Pointer',
1109
+ class: 'Test1',
1110
+ },
1111
+ },
1112
+ permissions: {
1113
+ read: {
1114
+ authorizedRoles: ['Client'],
1115
+ requireAuthentication: true,
1116
+ },
1117
+ create: {
1118
+ authorizedRoles: ['Client'],
1119
+ requireAuthentication: true,
1120
+ },
1121
+ },
1122
+ },
1123
+ ])
1124
+ wabe = setup.wabe
1125
+ port = setup.port
1126
+ client = getAnonymousClient(port)
1127
+ rootClient = getGraphqlClient(port)
1128
+
1129
+ await rootClient.request<any>(gql`
1130
+ mutation createTest2 {
1131
+ createTest2(
1132
+ input: {
1133
+ fields: { field2: { createAndLink: { name: "toto" } } }
1134
+ }
1135
+ ) {
1136
+ test2 {
1137
+ id
1138
+ }
1139
+ }
1140
+ }
1141
+ `)
1142
+
1143
+ const { userClient } = await createUserAndUpdateRole({
1144
+ anonymousClient: client,
1145
+ port,
1146
+ roleName: 'Client',
1147
+ rootClient,
1148
+ })
1149
+
1150
+ expect(
1151
+ userClient.request(gql`
1152
+ query test2s {
1153
+ test2s {
1154
+ edges {
1155
+ node {
1156
+ id
1157
+ field2 {
1158
+ id
1159
+ }
1160
+ }
1161
+ }
1162
+ }
1163
+ }
1164
+ `),
1165
+ ).rejects.toThrow('Permission denied to read class Test1')
1166
+
1167
+ await closeTests(wabe)
1168
+ })
1169
+
1170
+ it('should not be able to create / update / delete a role (except root)', async () => {
1171
+ const setup = await setupTests()
1172
+ wabe = setup.wabe
1173
+ port = setup.port
1174
+ client = getAnonymousClient(port)
1175
+ rootClient = getGraphqlClient(port)
1176
+
1177
+ const adminRole = await wabe.controllers.database.getObjects({
1178
+ className: 'Role',
1179
+ where: {
1180
+ name: { equalTo: 'Admin' },
1181
+ },
1182
+ first: 1,
1183
+ select: { id: true },
1184
+ context: {
1185
+ wabe,
1186
+ isRoot: true,
1187
+ },
1188
+ })
1189
+
1190
+ const adminRoleId = adminRole[0]?.id
1191
+
1192
+ const adminClient = await getAdminUserClient(wabe.config.port, wabe, {
1193
+ email: 'admin@wabe.dev',
1194
+ password: 'admin',
1195
+ })
1196
+
1197
+ expect(
1198
+ adminClient.request<any>(gql`
1199
+ mutation deleteRole {
1200
+ deleteRole(input: { id: "${adminRoleId}" }) {
1201
+ role {
1202
+ id
1203
+ }
1204
+ }
1205
+ }
1206
+ `),
1207
+ ).rejects.toThrowError('Permission denied to delete class Role')
1208
+
1209
+ expect(
1210
+ adminClient.request<any>(gql`
1211
+ mutation updateRole {
1212
+ updateRole(input: { id: "${adminRoleId}", fields: {name: "Admin2"} }) {
1213
+ role {
1214
+ id
1215
+ }
1216
+ }
1217
+ }
1218
+ `),
1219
+ ).rejects.toThrowError('Permission denied to update class Role')
1220
+
1221
+ expect(
1222
+ adminClient.request<any>(gql`
1223
+ mutation createRole {
1224
+ createRole(input: { fields: { name: "Admin2" } }) {
1225
+ role {
1226
+ id
1227
+ }
1228
+ }
1229
+ }
1230
+ `),
1231
+ ).rejects.toThrowError('Permission denied to create class Role')
1232
+
1233
+ await closeTests(wabe)
1234
+ })
1235
+
1236
+ it('should not be able to create / update / delete a session (except root)', async () => {
1237
+ const setup = await setupTests()
1238
+ wabe = setup.wabe
1239
+ port = setup.port
1240
+ client = getAnonymousClient(port)
1241
+ rootClient = getGraphqlClient(port)
1242
+
1243
+ const adminClient = await getAdminUserClient(wabe.config.port, wabe, {
1244
+ email: 'admin@wabe.dev',
1245
+ password: 'admin',
1246
+ })
1247
+
1248
+ expect(
1249
+ adminClient.request<any>(gql`
1250
+ mutation create_Session {
1251
+ create_Session(
1252
+ input: {
1253
+ fields: {
1254
+ accessTokenEncrypted: "token"
1255
+ accessTokenExpiresAt: "2025-01-01T00:00:00.000Z"
1256
+ refreshTokenEncrypted: "refresh"
1257
+ refreshTokenExpiresAt: "2025-01-02T00:00:00.000Z"
1258
+ }
1259
+ }
1260
+ ) {
1261
+ _session {
1262
+ id
1263
+ }
1264
+ }
1265
+ }
1266
+ `),
1267
+ ).rejects.toThrowError('Permission denied to create class _Session')
1268
+
1269
+ const res = await adminClient.request<any>(gql`
1270
+ query me {
1271
+ me {
1272
+ user {
1273
+ id
1274
+ }
1275
+ }
1276
+ }
1277
+ `)
1278
+
1279
+ const session = await wabe.controllers.database.createObject({
1280
+ className: '_Session',
1281
+ context: {
1282
+ wabe,
1283
+ isRoot: true,
1284
+ },
1285
+ data: {
1286
+ accessTokenEncrypted: 'token',
1287
+ user: res.me.user.id,
1288
+ accessTokenExpiresAt: new Date(),
1289
+ refreshTokenEncrypted: 'refreshToken',
1290
+ refreshTokenExpiresAt: new Date(),
1291
+ },
1292
+ select: { id: true },
1293
+ })
1294
+
1295
+ const sessionId = session?.id
1296
+
1297
+ if (!sessionId) throw new Error('Session not created')
1298
+
1299
+ expect(
1300
+ adminClient.request<any>(gql`
1301
+ mutation update_Session {
1302
+ update_Session(input: { id: "${sessionId}", fields: {accessTokenEncrypted: "token2"} }) {
1303
+ _session {
1304
+ id
1305
+ }
1306
+ }
1307
+ }
1308
+ `),
1309
+ ).rejects.toThrowError('Permission denied to update class _Session')
1310
+
1311
+ expect(
1312
+ adminClient.request<any>(gql`
1313
+ mutation delete_Session {
1314
+ delete_Session(input: { id:"${sessionId}" }) {
1315
+ _session {
1316
+ id
1317
+ }
1318
+ }
1319
+ }
1320
+ `),
1321
+ // Read because we call getObject before delete the object
1322
+ ).rejects.toThrowError('Permission denied to read class _Session')
1323
+
1324
+ const sessionAfterDelete = await wabe.controllers.database.getObject({
1325
+ className: '_Session',
1326
+ id: sessionId || '',
1327
+ context: {
1328
+ wabe,
1329
+ isRoot: true,
1330
+ },
1331
+ select: { id: true },
1332
+ })
1333
+
1334
+ expect(sessionAfterDelete?.id).toEqual(sessionId)
1335
+
1336
+ await closeTests(wabe)
1337
+ })
1338
+
1339
+ it('should not be able to do some actions with expired session', async () => {
1340
+ const setup = await setupTests([
1341
+ {
1342
+ name: 'Test1',
1343
+ fields: {
1344
+ name: {
1345
+ type: 'String',
1346
+ },
1347
+ },
1348
+ permissions: {
1349
+ read: {
1350
+ authorizedRoles: ['Admin'],
1351
+ requireAuthentication: true,
1352
+ },
1353
+ create: {
1354
+ authorizedRoles: ['Admin'],
1355
+ requireAuthentication: true,
1356
+ },
1357
+ },
1358
+ },
1359
+ ])
1360
+ wabe = setup.wabe
1361
+ port = setup.port
1362
+ client = getAnonymousClient(port)
1363
+ rootClient = getGraphqlClient(port)
1364
+
1365
+ const adminClient = await getAdminUserClient(wabe.config.port, wabe, {
1366
+ email: 'admin@wabe.dev',
1367
+ password: 'admin',
1368
+ })
1369
+
1370
+ expect(
1371
+ adminClient.request(gql`
1372
+ mutation createTest1 {
1373
+ createTest1(input: { fields: { name: "test1" } }) {
1374
+ test1 {
1375
+ id
1376
+ }
1377
+ }
1378
+ }
1379
+ `),
1380
+ ).resolves.toEqual(expect.anything())
1381
+
1382
+ await wabe.controllers.database.updateObjects({
1383
+ className: '_Session',
1384
+ context: {
1385
+ wabe,
1386
+ isRoot: true,
1387
+ },
1388
+ select: { id: true, accessTokenExpiresAt: true },
1389
+ data: {
1390
+ accessTokenExpiresAt: new Date(Date.now() - 1000 * 3600), // 1 hour ago
1391
+ refreshTokenExpiresAt: new Date(Date.now() - 1000 * 3600), // 1 hour ago
1392
+ },
1393
+ where: {},
1394
+ })
1395
+
1396
+ expect(
1397
+ adminClient.request(gql`
1398
+ mutation createTest1 {
1399
+ createTest1(input: { fields: { name: "test1" } }) {
1400
+ test1 {
1401
+ id
1402
+ }
1403
+ }
1404
+ }
1405
+ `),
1406
+ ).rejects.toThrow('Permission denied to create class Test1')
1407
+
1408
+ await closeTests(wabe)
1409
+ })
1410
+
1411
+ it('should be able to refresh session if refresh token is not expired but access token expired', async () => {
1412
+ const setup = await setupTests([
1413
+ {
1414
+ name: 'Test1',
1415
+ fields: {
1416
+ name: {
1417
+ type: 'String',
1418
+ },
1419
+ },
1420
+ permissions: {
1421
+ read: {
1422
+ authorizedRoles: ['Admin'],
1423
+ requireAuthentication: true,
1424
+ },
1425
+ create: {
1426
+ authorizedRoles: ['Admin'],
1427
+ requireAuthentication: true,
1428
+ },
1429
+ },
1430
+ },
1431
+ ])
1432
+ wabe = setup.wabe
1433
+ port = setup.port
1434
+ client = getAnonymousClient(port)
1435
+ rootClient = getGraphqlClient(port)
1436
+
1437
+ const adminClient = await getAdminUserClient(wabe.config.port, wabe, {
1438
+ email: 'admin@wabe.dev',
1439
+ password: 'admin',
1440
+ })
1441
+
1442
+ expect(
1443
+ adminClient.request(gql`
1444
+ mutation createTest1 {
1445
+ createTest1(input: { fields: { name: "test1" } }) {
1446
+ test1 {
1447
+ id
1448
+ }
1449
+ }
1450
+ }
1451
+ `),
1452
+ ).resolves.toEqual(expect.anything())
1453
+
1454
+ await wabe.controllers.database.updateObjects({
1455
+ className: '_Session',
1456
+ context: {
1457
+ wabe,
1458
+ isRoot: true,
1459
+ },
1460
+ data: {
1461
+ accessTokenExpiresAt: new Date(Date.now() - 1000 * 3600), // 1 hour ago
1462
+ refreshTokenExpiresAt: new Date(Date.now() + 1000 * 3600), // 1 hour in future
1463
+ },
1464
+ where: {},
1465
+ })
1466
+
1467
+ expect(
1468
+ adminClient.request(gql`
1469
+ mutation createTest1 {
1470
+ createTest1(input: { fields: { name: "test1" } }) {
1471
+ test1 {
1472
+ id
1473
+ }
1474
+ }
1475
+ }
1476
+ `),
1477
+ ).resolves.toEqual(expect.anything())
1478
+
1479
+ await closeTests(wabe)
1480
+ })
1481
+
1482
+ it('should access to an object', async () => {
1483
+ const setup = await setupTests([
1484
+ {
1485
+ name: 'Test4',
1486
+ fields: {
1487
+ name: { type: 'String' },
1488
+ },
1489
+ permissions: {
1490
+ create: {
1491
+ requireAuthentication: true,
1492
+ authorizedRoles: ['Client'],
1493
+ },
1494
+ read: {
1495
+ requireAuthentication: true,
1496
+ authorizedRoles: ['Client', 'Client2'],
1497
+ },
1498
+ },
1499
+ },
1500
+ ])
1501
+ wabe = setup.wabe
1502
+ port = setup.port
1503
+ client = getAnonymousClient(port)
1504
+ rootClient = getGraphqlClient(port)
1505
+
1506
+ const { userClient } = await createUserAndUpdateRole({
1507
+ anonymousClient: client,
1508
+ port,
1509
+ roleName: 'Client',
1510
+ rootClient,
1511
+ })
1512
+
1513
+ const { userClient: userClient2 } = await createUserAndUpdateRole({
1514
+ anonymousClient: client,
1515
+ port,
1516
+ roleName: 'Client2',
1517
+ rootClient,
1518
+ })
1519
+
1520
+ await userClient.request<any>(gql`
1521
+ mutation createTest4 {
1522
+ createTest4(input: { fields: { name: "test" } }) {
1523
+ test4 {
1524
+ id
1525
+ }
1526
+ }
1527
+ }
1528
+ `)
1529
+
1530
+ const res = await userClient2.request<any>(gql`
1531
+ query test4s {
1532
+ test4s {
1533
+ edges {
1534
+ node {
1535
+ id
1536
+ name
1537
+ }
1538
+ }
1539
+ }
1540
+ }
1541
+ `)
1542
+
1543
+ expect(res.test4s.edges.length).toEqual(1)
1544
+ expect(res.test4s.edges[0].node.name).toEqual('test')
1545
+
1546
+ await closeTests(wabe)
1547
+ })
1548
+
1549
+ it('should access to an object created by another user without ACL', async () => {
1550
+ const setup = await setupTests([
1551
+ {
1552
+ name: 'Test4',
1553
+ fields: {
1554
+ name: { type: 'String' },
1555
+ },
1556
+ permissions: {
1557
+ create: {
1558
+ requireAuthentication: true,
1559
+ authorizedRoles: ['Client'],
1560
+ },
1561
+ read: {
1562
+ requireAuthentication: true,
1563
+ authorizedRoles: ['Client', 'Client2'],
1564
+ },
1565
+ },
1566
+ },
1567
+ ])
1568
+ wabe = setup.wabe
1569
+ port = setup.port
1570
+ client = getAnonymousClient(port)
1571
+ rootClient = getGraphqlClient(port)
1572
+
1573
+ const { userClient } = await createUserAndUpdateRole({
1574
+ anonymousClient: client,
1575
+ port,
1576
+ roleName: 'Client',
1577
+ rootClient,
1578
+ })
1579
+
1580
+ const { userClient: userClient2 } = await createUserAndUpdateRole({
1581
+ anonymousClient: client,
1582
+ port,
1583
+ roleName: 'Client2',
1584
+ rootClient,
1585
+ })
1586
+
1587
+ await userClient.request<any>(gql`
1588
+ mutation createTest4 {
1589
+ createTest4(input: { fields: { name: "test" } }) {
1590
+ test4 {
1591
+ id
1592
+ }
1593
+ }
1594
+ }
1595
+ `)
1596
+
1597
+ const res = await userClient2.request<any>(gql`
1598
+ query test4s {
1599
+ test4s {
1600
+ edges {
1601
+ node {
1602
+ id
1603
+ name
1604
+ }
1605
+ }
1606
+ }
1607
+ }
1608
+ `)
1609
+
1610
+ expect(res.test4s.edges.length).toEqual(1)
1611
+ expect(res.test4s.edges[0].node.name).toEqual('test')
1612
+
1613
+ await closeTests(wabe)
1614
+ })
1615
+
1616
+ it('should authorize user to access to created object with self acl but not an other user', async () => {
1617
+ const setup = await setupTests([
1618
+ {
1619
+ name: 'Test3',
1620
+ fields: {
1621
+ name: { type: 'String' },
1622
+ },
1623
+ permissions: {
1624
+ create: {
1625
+ requireAuthentication: false,
1626
+ },
1627
+ read: {
1628
+ requireAuthentication: false,
1629
+ },
1630
+ acl: async (hookObject) => {
1631
+ await hookObject.addACL('users', {
1632
+ userId: hookObject.context.user?.id || '',
1633
+ read: true,
1634
+ write: true,
1635
+ })
1636
+
1637
+ await hookObject.addACL('roles', null)
1638
+ },
1639
+ },
1640
+ },
1641
+ ])
1642
+ wabe = setup.wabe
1643
+ port = setup.port
1644
+ client = getAnonymousClient(port)
1645
+ rootClient = getGraphqlClient(port)
1646
+
1647
+ const { userClient } = await createUserAndUpdateRole({
1648
+ anonymousClient: client,
1649
+ port,
1650
+ roleName: 'Client',
1651
+ rootClient,
1652
+ })
1653
+
1654
+ const { userClient: userClient2 } = await createUserAndUpdateRole({
1655
+ anonymousClient: client,
1656
+ port,
1657
+ roleName: 'Client',
1658
+ rootClient,
1659
+ email: 'email2@test.fr',
1660
+ })
1661
+
1662
+ const res = await userClient.request<any>(gql`
1663
+ mutation createTest3 {
1664
+ createTest3(input: { fields: { name: "test" } }) {
1665
+ test3 {
1666
+ id
1667
+ }
1668
+ }
1669
+ }
1670
+ `)
1671
+
1672
+ const res2 = await userClient2.request<any>(gql`
1673
+ query test3s {
1674
+ test3s {
1675
+ edges {
1676
+ node {
1677
+ id
1678
+ }
1679
+ }
1680
+ }
1681
+ }
1682
+ `)
1683
+
1684
+ const res3 = await getAnonymousClient(port).request<any>(gql`
1685
+ query test3s {
1686
+ test3s {
1687
+ edges {
1688
+ node {
1689
+ id
1690
+ }
1691
+ }
1692
+ }
1693
+ }
1694
+ `)
1695
+
1696
+ expect(res.createTest3.test3.id).toBeDefined()
1697
+ expect(res2.test3s.edges.length).toEqual(0)
1698
+ expect(res3.test3s.edges.length).toEqual(0)
1699
+
1700
+ await closeTests(wabe)
1701
+ })
1702
+
1703
+ it('should not authorize create object when authorizedRoles is empty', async () => {
1704
+ const setup = await setupTests([
1705
+ {
1706
+ name: 'Test2',
1707
+ fields: {
1708
+ name: { type: 'String' },
1709
+ age: { type: 'Int' },
1710
+ },
1711
+ permissions: {
1712
+ read: {
1713
+ authorizedRoles: ['Client', 'Client2'],
1714
+ requireAuthentication: true,
1715
+ },
1716
+ create: {
1717
+ authorizedRoles: [],
1718
+ requireAuthentication: true,
1719
+ },
1720
+ },
1721
+ },
1722
+ ])
1723
+ wabe = setup.wabe
1724
+ port = setup.port
1725
+ client = getAnonymousClient(port)
1726
+ rootClient = getGraphqlClient(port)
1727
+
1728
+ const { userClient } = await createUserAndUpdateRole({
1729
+ anonymousClient: client,
1730
+ port,
1731
+ roleName: 'Client',
1732
+ rootClient,
1733
+ })
1734
+
1735
+ expect(
1736
+ userClient.request<any>(gql`
1737
+ mutation createTest2 {
1738
+ createTest2(input: { fields: { name: "test" } }) {
1739
+ test2 {
1740
+ id
1741
+ }
1742
+ }
1743
+ }
1744
+ `),
1745
+ ).rejects.toThrow('Permission denied to create class Test2')
1746
+
1747
+ expect(() =>
1748
+ rootClient.request<any>(gql`
1749
+ mutation createTest2 {
1750
+ createTest2(input: { fields: { name: "test" } }) {
1751
+ test2 {
1752
+ id
1753
+ }
1754
+ }
1755
+ }
1756
+ `),
1757
+ ).not.toThrow()
1758
+
1759
+ await closeTests(wabe)
1760
+ })
1761
+
1762
+ it('should not authorize an user to read an object when the user has not access on read to the object (ACL)', async () => {
1763
+ const setup = await setupTests([
1764
+ {
1765
+ name: 'Test',
1766
+ fields: {
1767
+ name: { type: 'String' },
1768
+ pointer: {
1769
+ type: 'Pointer',
1770
+ class: 'Test2',
1771
+ },
1772
+ relation: {
1773
+ type: 'Relation',
1774
+ class: 'Test2',
1775
+ },
1776
+ },
1777
+ permissions: {
1778
+ read: {
1779
+ authorizedRoles: ['Client', 'Client2'],
1780
+ requireAuthentication: true,
1781
+ },
1782
+ update: {
1783
+ authorizedRoles: ['Client'],
1784
+ requireAuthentication: true,
1785
+ },
1786
+ delete: {
1787
+ authorizedRoles: ['Client'],
1788
+ requireAuthentication: true,
1789
+ },
1790
+ create: {
1791
+ authorizedRoles: ['Client2'],
1792
+ requireAuthentication: true,
1793
+ },
1794
+ },
1795
+ },
1796
+ {
1797
+ name: 'Test2',
1798
+ fields: {
1799
+ name: { type: 'String' },
1800
+ age: { type: 'Int' },
1801
+ },
1802
+ permissions: {
1803
+ read: {
1804
+ authorizedRoles: ['Client', 'Client2'],
1805
+ requireAuthentication: true,
1806
+ },
1807
+ create: {
1808
+ authorizedRoles: [],
1809
+ requireAuthentication: true,
1810
+ },
1811
+ },
1812
+ },
1813
+ ])
1814
+ wabe = setup.wabe
1815
+ port = setup.port
1816
+ client = getAnonymousClient(port)
1817
+ rootClient = getGraphqlClient(port)
1818
+
1819
+ const { userClient, userId } = await createUserAndUpdateRole({
1820
+ anonymousClient: client,
1821
+ port,
1822
+ roleName: 'Client',
1823
+ rootClient,
1824
+ })
1825
+
1826
+ const objectCreated = await rootClient.request<any>(gql`
1827
+ mutation createTest {
1828
+ createTest(input: { fields: { name: "test" } }) {
1829
+ test {
1830
+ id
1831
+ }
1832
+ }
1833
+ }
1834
+ `)
1835
+
1836
+ const objectId = objectCreated.createTest.test.id
1837
+
1838
+ await rootClient.request<any>(gql`
1839
+ mutation updateACL{
1840
+ updateTest(input:{id: "${objectId}", fields: {acl:{
1841
+ users: [{
1842
+ userId: "${userId}",
1843
+ read: false,
1844
+ write: true
1845
+ }]
1846
+ }}}){
1847
+ test{
1848
+ id
1849
+ }
1850
+ }
1851
+ }
1852
+ `)
1853
+
1854
+ const res = await userClient.request<any>(gql`
1855
+ query tests {
1856
+ tests {
1857
+ edges {
1858
+ node {
1859
+ id
1860
+ }
1861
+ }
1862
+ }
1863
+ }
1864
+ `)
1865
+
1866
+ expect(res.tests.edges.length).toEqual(0)
1867
+
1868
+ await closeTests(wabe)
1869
+ })
1870
+
1871
+ it('should not authorize an user to write (delete) an object when the user has not access on write to the object (ACL)', async () => {
1872
+ const setup = await setupTests([
1873
+ {
1874
+ name: 'Test',
1875
+ fields: {
1876
+ name: { type: 'String' },
1877
+ pointer: {
1878
+ type: 'Pointer',
1879
+ class: 'Test2',
1880
+ },
1881
+ relation: {
1882
+ type: 'Relation',
1883
+ class: 'Test2',
1884
+ },
1885
+ },
1886
+ permissions: {
1887
+ read: {
1888
+ authorizedRoles: ['Client', 'Client2'],
1889
+ requireAuthentication: true,
1890
+ },
1891
+ update: {
1892
+ authorizedRoles: ['Client'],
1893
+ requireAuthentication: true,
1894
+ },
1895
+ delete: {
1896
+ authorizedRoles: ['Client'],
1897
+ requireAuthentication: true,
1898
+ },
1899
+ create: {
1900
+ authorizedRoles: ['Client2'],
1901
+ requireAuthentication: true,
1902
+ },
1903
+ },
1904
+ },
1905
+ {
1906
+ name: 'Test2',
1907
+ fields: {
1908
+ name: { type: 'String' },
1909
+ age: { type: 'Int' },
1910
+ },
1911
+ permissions: {
1912
+ read: {
1913
+ authorizedRoles: ['Client', 'Client2'],
1914
+ requireAuthentication: true,
1915
+ },
1916
+ create: {
1917
+ authorizedRoles: [],
1918
+ requireAuthentication: true,
1919
+ },
1920
+ },
1921
+ },
1922
+ ])
1923
+ wabe = setup.wabe
1924
+ port = setup.port
1925
+ client = getAnonymousClient(port)
1926
+ rootClient = getGraphqlClient(port)
1927
+
1928
+ const { userClient, userId } = await createUserAndUpdateRole({
1929
+ anonymousClient: client,
1930
+ port,
1931
+ roleName: 'Client',
1932
+ rootClient,
1933
+ })
1934
+
1935
+ const objectCreated = await rootClient.request<any>(gql`
1936
+ mutation createTest {
1937
+ createTest(input: { fields: { name: "test" } }) {
1938
+ test {
1939
+ id
1940
+ }
1941
+ }
1942
+ }
1943
+ `)
1944
+
1945
+ const objectId = objectCreated.createTest.test.id
1946
+
1947
+ await rootClient.request<any>(gql`
1948
+ mutation updateACL{
1949
+ updateTest(input:{id: "${objectId}", fields: {acl:{
1950
+ users: [{
1951
+ userId: "${userId}",
1952
+ read: true,
1953
+ write: false
1954
+ }]
1955
+ }}}){
1956
+ test{
1957
+ id
1958
+ }
1959
+ }
1960
+ }
1961
+ `)
1962
+
1963
+ expect(
1964
+ userClient.request<any>(gql`
1965
+ mutation deleteTest{
1966
+ deleteTest(input:{id: "${objectId}"}){
1967
+ test{
1968
+ id
1969
+ }
1970
+ }
1971
+ }
1972
+ `),
1973
+ ).rejects.toThrow('Object not found')
1974
+
1975
+ await closeTests(wabe)
1976
+ })
1977
+
1978
+ it('should not authorize an user to get the result of mutation (read) when he has access on write but not on read (ACL)', async () => {
1979
+ const setup = await setupTests([
1980
+ {
1981
+ name: 'Test',
1982
+ fields: {
1983
+ name: { type: 'String' },
1984
+ pointer: {
1985
+ type: 'Pointer',
1986
+ class: 'Test2',
1987
+ },
1988
+ relation: {
1989
+ type: 'Relation',
1990
+ class: 'Test2',
1991
+ },
1992
+ },
1993
+ permissions: {
1994
+ read: {
1995
+ authorizedRoles: ['Client', 'Client2'],
1996
+ requireAuthentication: true,
1997
+ },
1998
+ update: {
1999
+ authorizedRoles: ['Client'],
2000
+ requireAuthentication: true,
2001
+ },
2002
+ delete: {
2003
+ authorizedRoles: ['Client'],
2004
+ requireAuthentication: true,
2005
+ },
2006
+ create: {
2007
+ authorizedRoles: ['Client2'],
2008
+ requireAuthentication: true,
2009
+ },
2010
+ },
2011
+ },
2012
+ {
2013
+ name: 'Test2',
2014
+ fields: {
2015
+ name: { type: 'String' },
2016
+ age: { type: 'Int' },
2017
+ },
2018
+ permissions: {
2019
+ read: {
2020
+ authorizedRoles: ['Client', 'Client2'],
2021
+ requireAuthentication: true,
2022
+ },
2023
+ create: {
2024
+ authorizedRoles: [],
2025
+ requireAuthentication: true,
2026
+ },
2027
+ },
2028
+ },
2029
+ ])
2030
+ wabe = setup.wabe
2031
+ port = setup.port
2032
+ client = getAnonymousClient(port)
2033
+ rootClient = getGraphqlClient(port)
2034
+
2035
+ const { userClient, userId } = await createUserAndUpdateRole({
2036
+ anonymousClient: client,
2037
+ port,
2038
+ roleName: 'Client',
2039
+ rootClient,
2040
+ })
2041
+
2042
+ const objectCreated = await rootClient.request<any>(gql`
2043
+ mutation createTest {
2044
+ createTest(input: { fields: { name: "test" } }) {
2045
+ test {
2046
+ id
2047
+ }
2048
+ }
2049
+ }
2050
+ `)
2051
+
2052
+ const objectId = objectCreated.createTest.test.id
2053
+
2054
+ await rootClient.request<any>(gql`
2055
+ mutation updateACL{
2056
+ updateTest(input:{id: "${objectId}", fields: {acl:{
2057
+ users: [{
2058
+ userId: "${userId}",
2059
+ read: false,
2060
+ write: true
2061
+ }]
2062
+ }}}){
2063
+ test{
2064
+ id
2065
+ }
2066
+ }
2067
+ }
2068
+ `)
2069
+
2070
+ expect(
2071
+ userClient.request<any>(gql`
2072
+ mutation updateTest{
2073
+ updateTest(input:{id: "${objectId}", fields : {name: "tata"}}){
2074
+ test{
2075
+ id
2076
+ }
2077
+ }
2078
+ }
2079
+ `),
2080
+ ).rejects.toThrow('Object not found')
2081
+
2082
+ await closeTests(wabe)
2083
+ })
2084
+
2085
+ it('should not authorize an user to write (update) an object when the user has not access on write to the object (ACL)', async () => {
2086
+ const setup = await setupTests([
2087
+ {
2088
+ name: 'Test',
2089
+ fields: {
2090
+ name: { type: 'String' },
2091
+ pointer: {
2092
+ type: 'Pointer',
2093
+ class: 'Test2',
2094
+ },
2095
+ relation: {
2096
+ type: 'Relation',
2097
+ class: 'Test2',
2098
+ },
2099
+ },
2100
+ permissions: {
2101
+ read: {
2102
+ authorizedRoles: ['Client', 'Client2'],
2103
+ requireAuthentication: true,
2104
+ },
2105
+ update: {
2106
+ authorizedRoles: ['Client'],
2107
+ requireAuthentication: true,
2108
+ },
2109
+ delete: {
2110
+ authorizedRoles: ['Client'],
2111
+ requireAuthentication: true,
2112
+ },
2113
+ create: {
2114
+ authorizedRoles: ['Client2'],
2115
+ requireAuthentication: true,
2116
+ },
2117
+ },
2118
+ },
2119
+ {
2120
+ name: 'Test2',
2121
+ fields: {
2122
+ name: { type: 'String' },
2123
+ age: { type: 'Int' },
2124
+ },
2125
+ permissions: {
2126
+ read: {
2127
+ authorizedRoles: ['Client', 'Client2'],
2128
+ requireAuthentication: true,
2129
+ },
2130
+ create: {
2131
+ authorizedRoles: [],
2132
+ requireAuthentication: true,
2133
+ },
2134
+ },
2135
+ },
2136
+ ])
2137
+ wabe = setup.wabe
2138
+ port = setup.port
2139
+ client = getAnonymousClient(port)
2140
+ rootClient = getGraphqlClient(port)
2141
+
2142
+ const { userClient, userId } = await createUserAndUpdateRole({
2143
+ anonymousClient: client,
2144
+ port,
2145
+ roleName: 'Client',
2146
+ rootClient,
2147
+ })
2148
+
2149
+ const objectCreated = await rootClient.request<any>(gql`
2150
+ mutation createTest {
2151
+ createTest(input: { fields: { name: "test" } }) {
2152
+ test {
2153
+ id
2154
+ }
2155
+ }
2156
+ }
2157
+ `)
2158
+
2159
+ const objectId = objectCreated.createTest.test.id
2160
+
2161
+ await rootClient.request<any>(gql`
2162
+ mutation updateACL{
2163
+ updateTest(input:{id: "${objectId}", fields: {acl:{
2164
+ users: [{
2165
+ userId: "${userId}",
2166
+ read: true,
2167
+ write: false
2168
+ }]
2169
+ }}}){
2170
+ test{
2171
+ id
2172
+ }
2173
+ }
2174
+ }
2175
+ `)
2176
+
2177
+ expect(
2178
+ userClient.request<any>(gql`
2179
+ mutation updateTest{
2180
+ updateTest(input:{id: "${objectId}", fields : {name: "tata"}}){
2181
+ test{
2182
+ id
2183
+ }
2184
+ }
2185
+ }
2186
+ `),
2187
+ ).rejects.toThrow('Object not found')
2188
+
2189
+ await closeTests(wabe)
2190
+ })
2191
+
2192
+ it('should authorize an user to read an object when the user has access on read to the object (ACL)', async () => {
2193
+ const setup = await setupTests([
2194
+ {
2195
+ name: 'Test',
2196
+ fields: {
2197
+ name: { type: 'String' },
2198
+ pointer: {
2199
+ type: 'Pointer',
2200
+ class: 'Test2',
2201
+ },
2202
+ relation: {
2203
+ type: 'Relation',
2204
+ class: 'Test2',
2205
+ },
2206
+ },
2207
+ permissions: {
2208
+ read: {
2209
+ authorizedRoles: ['Client', 'Client2'],
2210
+ requireAuthentication: true,
2211
+ },
2212
+ update: {
2213
+ authorizedRoles: ['Client'],
2214
+ requireAuthentication: true,
2215
+ },
2216
+ delete: {
2217
+ authorizedRoles: ['Client'],
2218
+ requireAuthentication: true,
2219
+ },
2220
+ create: {
2221
+ authorizedRoles: ['Client2'],
2222
+ requireAuthentication: true,
2223
+ },
2224
+ },
2225
+ },
2226
+ {
2227
+ name: 'Test2',
2228
+ fields: {
2229
+ name: { type: 'String' },
2230
+ age: { type: 'Int' },
2231
+ },
2232
+ permissions: {
2233
+ read: {
2234
+ authorizedRoles: ['Client', 'Client2'],
2235
+ requireAuthentication: true,
2236
+ },
2237
+ create: {
2238
+ authorizedRoles: [],
2239
+ requireAuthentication: true,
2240
+ },
2241
+ },
2242
+ },
2243
+ ])
2244
+ wabe = setup.wabe
2245
+ port = setup.port
2246
+ client = getAnonymousClient(port)
2247
+ rootClient = getGraphqlClient(port)
2248
+
2249
+ const { userClient, userId } = await createUserAndUpdateRole({
2250
+ anonymousClient: client,
2251
+ port,
2252
+ roleName: 'Client',
2253
+ rootClient,
2254
+ })
2255
+
2256
+ const objectCreated = await rootClient.request<any>(gql`
2257
+ mutation createTest {
2258
+ createTest(input: { fields: { name: "test" } }) {
2259
+ test {
2260
+ id
2261
+ }
2262
+ }
2263
+ }
2264
+ `)
2265
+
2266
+ const objectId = objectCreated.createTest.test.id
2267
+
2268
+ await rootClient.request<any>(gql`
2269
+ mutation updateACL{
2270
+ updateTest(input:{id: "${objectId}", fields: {acl:{
2271
+ users: [{
2272
+ userId: "${userId}",
2273
+ read: true,
2274
+ write: false
2275
+ }]
2276
+ }}}){
2277
+ test{
2278
+ id
2279
+ }
2280
+ }
2281
+ }
2282
+ `)
2283
+
2284
+ const res = await userClient.request<any>(gql`
2285
+ query tests {
2286
+ tests {
2287
+ edges {
2288
+ node {
2289
+ id
2290
+ }
2291
+ }
2292
+ }
2293
+ }
2294
+ `)
2295
+
2296
+ expect(res.tests.edges.length).toEqual(1)
2297
+
2298
+ await closeTests(wabe)
2299
+ })
2300
+
2301
+ it('should not authorized an user to read an object on another class with pointer when the user do not have ACL to read the other class', async () => {
2302
+ const setup = await setupTests([
2303
+ {
2304
+ name: 'Test',
2305
+ fields: {
2306
+ name: { type: 'String' },
2307
+ pointer: {
2308
+ type: 'Pointer',
2309
+ class: 'Test2',
2310
+ },
2311
+ relation: {
2312
+ type: 'Relation',
2313
+ class: 'Test2',
2314
+ },
2315
+ },
2316
+ permissions: {
2317
+ read: {
2318
+ authorizedRoles: ['Client', 'Client2'],
2319
+ requireAuthentication: true,
2320
+ },
2321
+ update: {
2322
+ authorizedRoles: ['Client'],
2323
+ requireAuthentication: true,
2324
+ },
2325
+ delete: {
2326
+ authorizedRoles: ['Client'],
2327
+ requireAuthentication: true,
2328
+ },
2329
+ create: {
2330
+ authorizedRoles: ['Client2'],
2331
+ requireAuthentication: true,
2332
+ },
2333
+ },
2334
+ },
2335
+ {
2336
+ name: 'Test2',
2337
+ fields: {
2338
+ name: { type: 'String' },
2339
+ age: { type: 'Int' },
2340
+ },
2341
+ permissions: {
2342
+ read: {
2343
+ authorizedRoles: ['Client', 'Client2'],
2344
+ requireAuthentication: true,
2345
+ },
2346
+ create: {
2347
+ authorizedRoles: [],
2348
+ requireAuthentication: true,
2349
+ },
2350
+ },
2351
+ },
2352
+ ])
2353
+ wabe = setup.wabe
2354
+ port = setup.port
2355
+ client = getAnonymousClient(port)
2356
+ rootClient = getGraphqlClient(port)
2357
+
2358
+ const { userClient, userId } = await createUserAndUpdateRole({
2359
+ anonymousClient: client,
2360
+ port,
2361
+ roleName: 'Client',
2362
+ rootClient,
2363
+ })
2364
+
2365
+ const objectCreated = await rootClient.request<any>(gql`
2366
+ mutation createTest {
2367
+ createTest(
2368
+ input: {
2369
+ fields: {
2370
+ name: "test"
2371
+ pointer: { createAndLink: { name: "tata" } }
2372
+ }
2373
+ }
2374
+ ) {
2375
+ test {
2376
+ id
2377
+ pointer {
2378
+ id
2379
+ }
2380
+ }
2381
+ }
2382
+ }
2383
+ `)
2384
+
2385
+ const pointerId = objectCreated.createTest.test.pointer.id
2386
+ const testId = objectCreated.createTest.test.id
2387
+
2388
+ await rootClient.request<any>(gql`
2389
+ mutation updateACL{
2390
+ updateTest(input:{id: "${testId}", fields: {acl:{
2391
+ users: [{
2392
+ userId: "${userId}",
2393
+ read: true,
2394
+ write: false
2395
+ }]
2396
+ }}}){
2397
+ test{
2398
+ id
2399
+ }
2400
+ }
2401
+ }
2402
+ `)
2403
+
2404
+ await rootClient.request<any>(gql`
2405
+ mutation updateACL{
2406
+ updateTest2(input:{id: "${pointerId}", fields: {acl:{
2407
+ users: [{
2408
+ userId: "${userId}",
2409
+ read: false,
2410
+ write: false
2411
+ }]
2412
+ }}}){
2413
+ test2{
2414
+ id
2415
+ }
2416
+ }
2417
+ }
2418
+ `)
2419
+
2420
+ expect(
2421
+ userClient.request<any>(gql`
2422
+ query tests {
2423
+ tests {
2424
+ edges {
2425
+ node {
2426
+ id
2427
+ name
2428
+ }
2429
+ }
2430
+ }
2431
+ }
2432
+ `),
2433
+ ).resolves.toEqual(expect.anything())
2434
+
2435
+ expect(
2436
+ userClient.request<any>(gql`
2437
+ query tests {
2438
+ tests {
2439
+ edges {
2440
+ node {
2441
+ id
2442
+ name
2443
+ pointer {
2444
+ id
2445
+ }
2446
+ }
2447
+ }
2448
+ }
2449
+ }
2450
+ `),
2451
+ ).rejects.toThrow('Object not found')
2452
+
2453
+ await closeTests(wabe)
2454
+ })
2455
+
2456
+ it('should not authorized an user to read an object on another class with relation when the user do not have ACL to read the other class', async () => {
2457
+ const setup = await setupTests([
2458
+ {
2459
+ name: 'Test',
2460
+ fields: {
2461
+ name: { type: 'String' },
2462
+ pointer: {
2463
+ type: 'Pointer',
2464
+ class: 'Test2',
2465
+ },
2466
+ relation: {
2467
+ type: 'Relation',
2468
+ class: 'Test2',
2469
+ },
2470
+ },
2471
+ permissions: {
2472
+ read: {
2473
+ authorizedRoles: ['Client', 'Client2'],
2474
+ requireAuthentication: true,
2475
+ },
2476
+ update: {
2477
+ authorizedRoles: ['Client'],
2478
+ requireAuthentication: true,
2479
+ },
2480
+ delete: {
2481
+ authorizedRoles: ['Client'],
2482
+ requireAuthentication: true,
2483
+ },
2484
+ create: {
2485
+ authorizedRoles: ['Client2'],
2486
+ requireAuthentication: true,
2487
+ },
2488
+ },
2489
+ },
2490
+ {
2491
+ name: 'Test2',
2492
+ fields: {
2493
+ name: { type: 'String' },
2494
+ age: { type: 'Int' },
2495
+ },
2496
+ permissions: {
2497
+ read: {
2498
+ authorizedRoles: ['Client', 'Client2'],
2499
+ requireAuthentication: true,
2500
+ },
2501
+ create: {
2502
+ authorizedRoles: [],
2503
+ requireAuthentication: true,
2504
+ },
2505
+ },
2506
+ },
2507
+ ])
2508
+ wabe = setup.wabe
2509
+ port = setup.port
2510
+ client = getAnonymousClient(port)
2511
+ rootClient = getGraphqlClient(port)
2512
+
2513
+ const { userClient, userId } = await createUserAndUpdateRole({
2514
+ anonymousClient: client,
2515
+ port,
2516
+ roleName: 'Client',
2517
+ rootClient,
2518
+ })
2519
+
2520
+ const objectCreated = await rootClient.request<any>(gql`
2521
+ mutation createTest {
2522
+ createTest(
2523
+ input: {
2524
+ fields: {
2525
+ name: "test"
2526
+ relation: { createAndAdd: [{ name: "tata" }] }
2527
+ }
2528
+ }
2529
+ ) {
2530
+ test {
2531
+ id
2532
+ relation {
2533
+ edges {
2534
+ node {
2535
+ id
2536
+ }
2537
+ }
2538
+ }
2539
+ }
2540
+ }
2541
+ }
2542
+ `)
2543
+
2544
+ const relationId = objectCreated.createTest.test.relation.edges[0].node.id
2545
+ const testId = objectCreated.createTest.test.id
2546
+
2547
+ await rootClient.request<any>(gql`
2548
+ mutation updateACL{
2549
+ updateTest(input:{id: "${testId}", fields: {acl:{
2550
+ users: [{
2551
+ userId: "${userId}",
2552
+ read: true,
2553
+ write: false
2554
+ }]
2555
+ }}}){
2556
+ test{
2557
+ id
2558
+ }
2559
+ }
2560
+ }
2561
+ `)
2562
+
2563
+ await rootClient.request<any>(gql`
2564
+ mutation updateACL{
2565
+ updateTest2(input:{id: "${relationId}", fields: {acl:{
2566
+ users: [{
2567
+ userId: "${userId}",
2568
+ read: false,
2569
+ write: false
2570
+ }]
2571
+ }}}){
2572
+ test2{
2573
+ id
2574
+ }
2575
+ }
2576
+ }
2577
+ `)
2578
+
2579
+ expect(
2580
+ userClient.request<any>(gql`
2581
+ query tests {
2582
+ tests {
2583
+ edges {
2584
+ node {
2585
+ id
2586
+ name
2587
+ }
2588
+ }
2589
+ }
2590
+ }
2591
+ `),
2592
+ ).resolves.toEqual(expect.anything())
2593
+
2594
+ const res = await userClient.request<any>(gql`
2595
+ query tests {
2596
+ tests {
2597
+ edges {
2598
+ node {
2599
+ id
2600
+ name
2601
+ relation {
2602
+ edges {
2603
+ node {
2604
+ id
2605
+ }
2606
+ }
2607
+ }
2608
+ }
2609
+ }
2610
+ }
2611
+ }
2612
+ `)
2613
+
2614
+ expect(res.tests.edges[0].node.relation.edges.length).toEqual(0)
2615
+
2616
+ await closeTests(wabe)
2617
+ })
2618
+
2619
+ it('should not authorize an user to create an object on another class with pointer when the user do not have access to write the other class with (CLP)', async () => {
2620
+ const setup = await setupTests([
2621
+ {
2622
+ name: 'Test',
2623
+ fields: {
2624
+ name: { type: 'String' },
2625
+ pointer: {
2626
+ type: 'Pointer',
2627
+ class: 'Test2',
2628
+ },
2629
+ relation: {
2630
+ type: 'Relation',
2631
+ class: 'Test2',
2632
+ },
2633
+ },
2634
+ permissions: {
2635
+ read: {
2636
+ authorizedRoles: ['Client', 'Client2'],
2637
+ requireAuthentication: true,
2638
+ },
2639
+ update: {
2640
+ authorizedRoles: ['Client'],
2641
+ requireAuthentication: true,
2642
+ },
2643
+ delete: {
2644
+ authorizedRoles: ['Client'],
2645
+ requireAuthentication: true,
2646
+ },
2647
+ create: {
2648
+ authorizedRoles: ['Client2'],
2649
+ requireAuthentication: true,
2650
+ },
2651
+ },
2652
+ },
2653
+ {
2654
+ name: 'Test2',
2655
+ fields: {
2656
+ name: { type: 'String' },
2657
+ age: { type: 'Int' },
2658
+ },
2659
+ permissions: {
2660
+ read: {
2661
+ authorizedRoles: ['Client', 'Client2'],
2662
+ requireAuthentication: true,
2663
+ },
2664
+ create: {
2665
+ authorizedRoles: [],
2666
+ requireAuthentication: true,
2667
+ },
2668
+ },
2669
+ },
2670
+ ])
2671
+ wabe = setup.wabe
2672
+ port = setup.port
2673
+ client = getAnonymousClient(port)
2674
+ rootClient = getGraphqlClient(port)
2675
+
2676
+ const { userClient } = await createUserAndUpdateRole({
2677
+ anonymousClient: client,
2678
+ port,
2679
+ roleName: 'Client2',
2680
+ rootClient,
2681
+ })
2682
+
2683
+ expect(
2684
+ userClient.request<any>(gql`
2685
+ mutation createTest {
2686
+ createTest(
2687
+ input: {
2688
+ fields: {
2689
+ name: "test"
2690
+ pointer: { createAndLink: { name: "tata" } }
2691
+ }
2692
+ }
2693
+ ) {
2694
+ test {
2695
+ id
2696
+ pointer {
2697
+ id
2698
+ }
2699
+ }
2700
+ }
2701
+ }
2702
+ `),
2703
+ ).rejects.toThrow('Permission denied to create class Test2')
2704
+
2705
+ await closeTests(wabe)
2706
+ })
2707
+
2708
+ it('should authorize a connected user to access to a protected resource', async () => {
2709
+ const setup = await setupTests([
2710
+ {
2711
+ name: 'Test',
2712
+ fields: {
2713
+ name: { type: 'String' },
2714
+ pointer: {
2715
+ type: 'Pointer',
2716
+ class: 'Test2',
2717
+ },
2718
+ relation: {
2719
+ type: 'Relation',
2720
+ class: 'Test2',
2721
+ },
2722
+ },
2723
+ permissions: {
2724
+ read: {
2725
+ authorizedRoles: ['Client', 'Client2'],
2726
+ requireAuthentication: true,
2727
+ },
2728
+ update: {
2729
+ authorizedRoles: ['Client'],
2730
+ requireAuthentication: true,
2731
+ },
2732
+ delete: {
2733
+ authorizedRoles: ['Client'],
2734
+ requireAuthentication: true,
2735
+ },
2736
+ create: {
2737
+ authorizedRoles: ['Client2'],
2738
+ requireAuthentication: true,
2739
+ },
2740
+ },
2741
+ },
2742
+ {
2743
+ name: 'Test2',
2744
+ fields: {
2745
+ name: { type: 'String' },
2746
+ age: { type: 'Int' },
2747
+ },
2748
+ permissions: {
2749
+ read: {
2750
+ authorizedRoles: ['Client', 'Client2'],
2751
+ requireAuthentication: true,
2752
+ },
2753
+ create: {
2754
+ authorizedRoles: [],
2755
+ requireAuthentication: true,
2756
+ },
2757
+ },
2758
+ },
2759
+ ])
2760
+ wabe = setup.wabe
2761
+ port = setup.port
2762
+ client = getAnonymousClient(port)
2763
+ rootClient = getGraphqlClient(port)
2764
+
2765
+ const { userClient } = await createUserAndUpdateRole({
2766
+ anonymousClient: client,
2767
+ port,
2768
+ roleName: 'Client',
2769
+ rootClient,
2770
+ })
2771
+
2772
+ const resOfTest = await userClient.request<any>(gql`
2773
+ query tests {
2774
+ tests {
2775
+ edges {
2776
+ node {
2777
+ id
2778
+ }
2779
+ }
2780
+ }
2781
+ }
2782
+ `)
2783
+
2784
+ expect(resOfTest.tests.edges.length).toEqual(0)
2785
+
2786
+ await closeTests(wabe)
2787
+ })
2788
+
2789
+ it('should authorize a connected user to access to protected resource after the user refresh his token', async () => {
2790
+ const setup = await setupTests([
2791
+ {
2792
+ name: 'Test',
2793
+ fields: {
2794
+ name: { type: 'String' },
2795
+ pointer: {
2796
+ type: 'Pointer',
2797
+ class: 'Test2',
2798
+ },
2799
+ relation: {
2800
+ type: 'Relation',
2801
+ class: 'Test2',
2802
+ },
2803
+ },
2804
+ permissions: {
2805
+ read: {
2806
+ authorizedRoles: ['Client', 'Client2'],
2807
+ requireAuthentication: true,
2808
+ },
2809
+ update: {
2810
+ authorizedRoles: ['Client'],
2811
+ requireAuthentication: true,
2812
+ },
2813
+ delete: {
2814
+ authorizedRoles: ['Client'],
2815
+ requireAuthentication: true,
2816
+ },
2817
+ create: {
2818
+ authorizedRoles: ['Client2'],
2819
+ requireAuthentication: true,
2820
+ },
2821
+ },
2822
+ },
2823
+ {
2824
+ name: 'Test2',
2825
+ fields: {
2826
+ name: { type: 'String' },
2827
+ age: { type: 'Int' },
2828
+ },
2829
+ permissions: {
2830
+ read: {
2831
+ authorizedRoles: ['Client', 'Client2'],
2832
+ requireAuthentication: true,
2833
+ },
2834
+ create: {
2835
+ authorizedRoles: [],
2836
+ requireAuthentication: true,
2837
+ },
2838
+ },
2839
+ },
2840
+ ])
2841
+ wabe = setup.wabe
2842
+ port = setup.port
2843
+ client = getAnonymousClient(port)
2844
+ rootClient = getGraphqlClient(port)
2845
+
2846
+ const { userClient, refreshToken, accessToken } =
2847
+ await createUserAndUpdateRole({
2848
+ anonymousClient: client,
2849
+ port,
2850
+ roleName: 'Client',
2851
+ rootClient,
2852
+ })
2853
+
2854
+ const resAfterRefresh = await userClient.request<any>(graphql.refresh, {
2855
+ input: {
2856
+ accessToken,
2857
+ refreshToken,
2858
+ },
2859
+ })
2860
+
2861
+ const userClientAfterRefresh = getUserClient(port, {
2862
+ accessToken: resAfterRefresh.refresh.accessToken,
2863
+ })
2864
+
2865
+ const resOfTest = await userClientAfterRefresh.request<any>(gql`
2866
+ query tests {
2867
+ tests {
2868
+ edges {
2869
+ node {
2870
+ id
2871
+ }
2872
+ }
2873
+ }
2874
+ }
2875
+ `)
2876
+
2877
+ expect(resOfTest.tests.edges.length).toEqual(0)
2878
+
2879
+ await closeTests(wabe)
2880
+ })
2881
+
2882
+ it('should not authorize to access to protected resource if the user is not connected', async () => {
2883
+ const setup = await setupTests([
2884
+ {
2885
+ name: 'Test',
2886
+ fields: {
2887
+ name: { type: 'String' },
2888
+ pointer: {
2889
+ type: 'Pointer',
2890
+ class: 'Test2',
2891
+ },
2892
+ relation: {
2893
+ type: 'Relation',
2894
+ class: 'Test2',
2895
+ },
2896
+ },
2897
+ permissions: {
2898
+ read: {
2899
+ authorizedRoles: ['Client', 'Client2'],
2900
+ requireAuthentication: true,
2901
+ },
2902
+ update: {
2903
+ authorizedRoles: ['Client'],
2904
+ requireAuthentication: true,
2905
+ },
2906
+ delete: {
2907
+ authorizedRoles: ['Client'],
2908
+ requireAuthentication: true,
2909
+ },
2910
+ create: {
2911
+ authorizedRoles: ['Client2'],
2912
+ requireAuthentication: true,
2913
+ },
2914
+ },
2915
+ },
2916
+ {
2917
+ name: 'Test2',
2918
+ fields: {
2919
+ name: { type: 'String' },
2920
+ age: { type: 'Int' },
2921
+ },
2922
+ permissions: {
2923
+ read: {
2924
+ authorizedRoles: ['Client', 'Client2'],
2925
+ requireAuthentication: true,
2926
+ },
2927
+ create: {
2928
+ authorizedRoles: [],
2929
+ requireAuthentication: true,
2930
+ },
2931
+ },
2932
+ },
2933
+ ])
2934
+ wabe = setup.wabe
2935
+ port = setup.port
2936
+ client = getAnonymousClient(port)
2937
+ rootClient = getGraphqlClient(port)
2938
+
2939
+ await createUserAndUpdateRole({
2940
+ anonymousClient: client,
2941
+ port,
2942
+ roleName: 'Client3',
2943
+ rootClient,
2944
+ })
2945
+
2946
+ const userClient = getUserClient(port, { accessToken: 'invalidToken' })
2947
+
2948
+ expect(
2949
+ userClient.request<any>(gql`
2950
+ query tests {
2951
+ tests {
2952
+ edges {
2953
+ node {
2954
+ id
2955
+ }
2956
+ }
2957
+ }
2958
+ }
2959
+ `),
2960
+ ).rejects.toThrow('Permission denied to read class Test')
2961
+
2962
+ await closeTests(wabe)
2963
+ })
2964
+
2965
+ it("should not authorized to read an object if the user doesn't had an authorized role (read one)", async () => {
2966
+ const setup = await setupTests([
2967
+ {
2968
+ name: 'Test',
2969
+ fields: {
2970
+ name: { type: 'String' },
2971
+ pointer: {
2972
+ type: 'Pointer',
2973
+ class: 'Test2',
2974
+ },
2975
+ relation: {
2976
+ type: 'Relation',
2977
+ class: 'Test2',
2978
+ },
2979
+ },
2980
+ permissions: {
2981
+ read: {
2982
+ authorizedRoles: ['Client', 'Client2'],
2983
+ requireAuthentication: true,
2984
+ },
2985
+ update: {
2986
+ authorizedRoles: ['Client'],
2987
+ requireAuthentication: true,
2988
+ },
2989
+ delete: {
2990
+ authorizedRoles: ['Client'],
2991
+ requireAuthentication: true,
2992
+ },
2993
+ create: {
2994
+ authorizedRoles: ['Client2'],
2995
+ requireAuthentication: true,
2996
+ },
2997
+ },
2998
+ },
2999
+ {
3000
+ name: 'Test2',
3001
+ fields: {
3002
+ name: { type: 'String' },
3003
+ age: { type: 'Int' },
3004
+ },
3005
+ permissions: {
3006
+ read: {
3007
+ authorizedRoles: ['Client', 'Client2'],
3008
+ requireAuthentication: true,
3009
+ },
3010
+ create: {
3011
+ authorizedRoles: [],
3012
+ requireAuthentication: true,
3013
+ },
3014
+ },
3015
+ },
3016
+ ])
3017
+ wabe = setup.wabe
3018
+ port = setup.port
3019
+ client = getAnonymousClient(port)
3020
+ rootClient = getGraphqlClient(port)
3021
+
3022
+ const { userClient } = await createUserAndUpdateRole({
3023
+ anonymousClient: client,
3024
+ port,
3025
+ roleName: 'Client3',
3026
+ rootClient,
3027
+ })
3028
+
3029
+ const res = await rootClient.request<any>(gql`
3030
+ mutation createTest {
3031
+ createTest(input: { fields: { name: "test" } }) {
3032
+ test {
3033
+ id
3034
+ }
3035
+ }
3036
+ }
3037
+ `)
3038
+
3039
+ const testId = res.createTest.test.id
3040
+
3041
+ expect(
3042
+ userClient.request<any>(gql`
3043
+ query test{
3044
+ test(id: "${testId}") {
3045
+ id
3046
+ }
3047
+ }
3048
+ `),
3049
+ ).rejects.toThrow('Permission denied to read class Test')
3050
+
3051
+ await closeTests(wabe)
3052
+ })
3053
+
3054
+ it("should not authorized to read an object if the user doesn't had an authorized role (read many)", async () => {
3055
+ const setup = await setupTests([
3056
+ {
3057
+ name: 'Test',
3058
+ fields: {
3059
+ name: { type: 'String' },
3060
+ pointer: {
3061
+ type: 'Pointer',
3062
+ class: 'Test2',
3063
+ },
3064
+ relation: {
3065
+ type: 'Relation',
3066
+ class: 'Test2',
3067
+ },
3068
+ },
3069
+ permissions: {
3070
+ read: {
3071
+ authorizedRoles: ['Client', 'Client2'],
3072
+ requireAuthentication: true,
3073
+ },
3074
+ update: {
3075
+ authorizedRoles: ['Client'],
3076
+ requireAuthentication: true,
3077
+ },
3078
+ delete: {
3079
+ authorizedRoles: ['Client'],
3080
+ requireAuthentication: true,
3081
+ },
3082
+ create: {
3083
+ authorizedRoles: ['Client2'],
3084
+ requireAuthentication: true,
3085
+ },
3086
+ },
3087
+ },
3088
+ {
3089
+ name: 'Test2',
3090
+ fields: {
3091
+ name: { type: 'String' },
3092
+ age: { type: 'Int' },
3093
+ },
3094
+ permissions: {
3095
+ read: {
3096
+ authorizedRoles: ['Client', 'Client2'],
3097
+ requireAuthentication: true,
3098
+ },
3099
+ create: {
3100
+ authorizedRoles: [],
3101
+ requireAuthentication: true,
3102
+ },
3103
+ },
3104
+ },
3105
+ ])
3106
+ wabe = setup.wabe
3107
+ port = setup.port
3108
+ client = getAnonymousClient(port)
3109
+ rootClient = getGraphqlClient(port)
3110
+
3111
+ const { userClient } = await createUserAndUpdateRole({
3112
+ anonymousClient: client,
3113
+ port,
3114
+ roleName: 'Client3',
3115
+ rootClient,
3116
+ })
3117
+
3118
+ expect(
3119
+ userClient.request<any>(gql`
3120
+ query tests {
3121
+ tests {
3122
+ edges {
3123
+ node {
3124
+ id
3125
+ }
3126
+ }
3127
+ }
3128
+ }
3129
+ `),
3130
+ ).rejects.toThrow('Permission denied to read class Test')
3131
+
3132
+ await closeTests(wabe)
3133
+ })
3134
+
3135
+ it("should not authorized to delete an object if the user doesn't had an authorized role (delete)", async () => {
3136
+ const setup = await setupTests([
3137
+ {
3138
+ name: 'Test',
3139
+ fields: {
3140
+ name: { type: 'String' },
3141
+ pointer: {
3142
+ type: 'Pointer',
3143
+ class: 'Test2',
3144
+ },
3145
+ relation: {
3146
+ type: 'Relation',
3147
+ class: 'Test2',
3148
+ },
3149
+ },
3150
+ permissions: {
3151
+ read: {
3152
+ authorizedRoles: ['Client', 'Client2'],
3153
+ requireAuthentication: true,
3154
+ },
3155
+ update: {
3156
+ authorizedRoles: ['Client'],
3157
+ requireAuthentication: true,
3158
+ },
3159
+ delete: {
3160
+ authorizedRoles: ['Client'],
3161
+ requireAuthentication: true,
3162
+ },
3163
+ create: {
3164
+ authorizedRoles: ['Client2'],
3165
+ requireAuthentication: true,
3166
+ },
3167
+ },
3168
+ },
3169
+ {
3170
+ name: 'Test2',
3171
+ fields: {
3172
+ name: { type: 'String' },
3173
+ age: { type: 'Int' },
3174
+ },
3175
+ permissions: {
3176
+ read: {
3177
+ authorizedRoles: ['Client', 'Client2'],
3178
+ requireAuthentication: true,
3179
+ },
3180
+ create: {
3181
+ authorizedRoles: [],
3182
+ requireAuthentication: true,
3183
+ },
3184
+ },
3185
+ },
3186
+ ])
3187
+ wabe = setup.wabe
3188
+ port = setup.port
3189
+ client = getAnonymousClient(port)
3190
+ rootClient = getGraphqlClient(port)
3191
+
3192
+ const { userClient } = await createUserAndUpdateRole({
3193
+ anonymousClient: client,
3194
+ port,
3195
+ roleName: 'Client2',
3196
+ rootClient,
3197
+ })
3198
+
3199
+ await rootClient.request<any>(gql`
3200
+ mutation createTest {
3201
+ createTest(input: { fields: { name: "test" } }) {
3202
+ test {
3203
+ id
3204
+ }
3205
+ }
3206
+ }
3207
+ `)
3208
+
3209
+ expect(
3210
+ userClient.request<any>(gql`
3211
+ mutation deleteTests {
3212
+ deleteTests(
3213
+ input: { where: { name: { equalTo: "test" } } }
3214
+ ) {
3215
+ edges {
3216
+ node {
3217
+ id
3218
+ }
3219
+ }
3220
+ }
3221
+ }
3222
+ `),
3223
+ ).rejects.toThrow('Permission denied to delete class Test')
3224
+
3225
+ await closeTests(wabe)
3226
+ })
3227
+
3228
+ it("should not authorized to create an object if the user doesn't had an authorized role (create)", async () => {
3229
+ const setup = await setupTests([
3230
+ {
3231
+ name: 'Test',
3232
+ fields: {
3233
+ name: { type: 'String' },
3234
+ pointer: {
3235
+ type: 'Pointer',
3236
+ class: 'Test2',
3237
+ },
3238
+ relation: {
3239
+ type: 'Relation',
3240
+ class: 'Test2',
3241
+ },
3242
+ },
3243
+ permissions: {
3244
+ read: {
3245
+ authorizedRoles: ['Client', 'Client2'],
3246
+ requireAuthentication: true,
3247
+ },
3248
+ update: {
3249
+ authorizedRoles: ['Client'],
3250
+ requireAuthentication: true,
3251
+ },
3252
+ delete: {
3253
+ authorizedRoles: ['Client'],
3254
+ requireAuthentication: true,
3255
+ },
3256
+ create: {
3257
+ authorizedRoles: ['Client2'],
3258
+ requireAuthentication: true,
3259
+ },
3260
+ },
3261
+ },
3262
+ {
3263
+ name: 'Test2',
3264
+ fields: {
3265
+ name: { type: 'String' },
3266
+ age: { type: 'Int' },
3267
+ },
3268
+ permissions: {
3269
+ read: {
3270
+ authorizedRoles: ['Client', 'Client2'],
3271
+ requireAuthentication: true,
3272
+ },
3273
+ create: {
3274
+ authorizedRoles: [],
3275
+ requireAuthentication: true,
3276
+ },
3277
+ },
3278
+ },
3279
+ ])
3280
+ wabe = setup.wabe
3281
+ port = setup.port
3282
+ client = getAnonymousClient(port)
3283
+ rootClient = getGraphqlClient(port)
3284
+
3285
+ const { userClient } = await createUserAndUpdateRole({
3286
+ anonymousClient: client,
3287
+ port,
3288
+ roleName: 'Client',
3289
+ rootClient,
3290
+ })
3291
+
3292
+ expect(
3293
+ userClient.request<any>(gql`
3294
+ mutation createTest2 {
3295
+ createTest2(input: { fields: { name: "test" } }) {
3296
+ test2 {
3297
+ id
3298
+ }
3299
+ }
3300
+ }
3301
+ `),
3302
+ ).rejects.toThrow('Permission denied to create class Test')
3303
+
3304
+ await closeTests(wabe)
3305
+ })
3306
+
3307
+ it("should not authorized to udpdate an object if the user doesn't had an authorized role (update)", async () => {
3308
+ const setup = await setupTests([
3309
+ {
3310
+ name: 'Test',
3311
+ fields: {
3312
+ name: { type: 'String' },
3313
+ pointer: {
3314
+ type: 'Pointer',
3315
+ class: 'Test2',
3316
+ },
3317
+ relation: {
3318
+ type: 'Relation',
3319
+ class: 'Test2',
3320
+ },
3321
+ },
3322
+ permissions: {
3323
+ read: {
3324
+ authorizedRoles: ['Client', 'Client2'],
3325
+ requireAuthentication: true,
3326
+ },
3327
+ update: {
3328
+ authorizedRoles: ['Client'],
3329
+ requireAuthentication: true,
3330
+ },
3331
+ delete: {
3332
+ authorizedRoles: ['Client'],
3333
+ requireAuthentication: true,
3334
+ },
3335
+ create: {
3336
+ authorizedRoles: ['Client2'],
3337
+ requireAuthentication: true,
3338
+ },
3339
+ },
3340
+ },
3341
+ {
3342
+ name: 'Test2',
3343
+ fields: {
3344
+ name: { type: 'String' },
3345
+ age: { type: 'Int' },
3346
+ },
3347
+ permissions: {
3348
+ read: {
3349
+ authorizedRoles: ['Client', 'Client2'],
3350
+ requireAuthentication: true,
3351
+ },
3352
+ create: {
3353
+ authorizedRoles: [],
3354
+ requireAuthentication: true,
3355
+ },
3356
+ },
3357
+ },
3358
+ ])
3359
+ wabe = setup.wabe
3360
+ port = setup.port
3361
+ client = getAnonymousClient(port)
3362
+ rootClient = getGraphqlClient(port)
3363
+
3364
+ const { userClient } = await createUserAndUpdateRole({
3365
+ anonymousClient: client,
3366
+ port,
3367
+ roleName: 'Client2',
3368
+ rootClient,
3369
+ })
3370
+
3371
+ const res = await rootClient.request<any>(gql`
3372
+ mutation createTest {
3373
+ createTest(input: { fields: { name: "test" } }) {
3374
+ test {
3375
+ id
3376
+ }
3377
+ }
3378
+ }
3379
+ `)
3380
+
3381
+ expect(
3382
+ userClient.request<any>(gql`
3383
+ mutation updateTest{
3384
+ updateTest(input: {id: "${res.createTest.test.id}", fields : {name: "tata"}}){
3385
+ test{
3386
+ id
3387
+ }
3388
+ }
3389
+ }
3390
+ `),
3391
+ ).rejects.toThrow('Permission denied to update class Test')
3392
+
3393
+ await closeTests(wabe)
3394
+ })
3395
+ })
3396
+
3397
+ const graphql = {
3398
+ deleteTests: gql`
3399
+ mutation deleteTests {
3400
+ deleteTests(input: { where: { name: { equalTo: "test" } } }) {
3401
+ edges {
3402
+ node {
3403
+ id
3404
+ }
3405
+ }
3406
+ }
3407
+ }
3408
+ `,
3409
+ deleteUsers: gql`
3410
+ mutation deleteUser {
3411
+ deleteUsers(
3412
+ input: {
3413
+ where: {
3414
+ authentication: {
3415
+ emailPassword: {
3416
+ email: { equalTo: "email@test.fr" }
3417
+ }
3418
+ }
3419
+ }
3420
+ }
3421
+ ) {
3422
+ edges {
3423
+ node {
3424
+ id
3425
+ }
3426
+ }
3427
+ }
3428
+ }
3429
+ `,
3430
+ signInWith: gql`
3431
+ mutation signInWith($input: SignInWithInput!) {
3432
+ signInWith(input: $input) {
3433
+ id
3434
+ accessToken
3435
+ refreshToken
3436
+ }
3437
+ }
3438
+ `,
3439
+ signUpWith: gql`
3440
+ mutation signUpWith($input: SignUpWithInput!) {
3441
+ signUpWith(input: $input) {
3442
+ id
3443
+ accessToken
3444
+ refreshToken
3445
+ }
3446
+ }
3447
+ `,
3448
+ signOut: gql`
3449
+ mutation signOut {
3450
+ signOut
3451
+ }
3452
+ `,
3453
+ refresh: gql`
3454
+ mutation refresh($input: RefreshInput!) {
3455
+ refresh(input: $input) {
3456
+ accessToken
3457
+ refreshToken
3458
+ }
3459
+ }
3460
+ `,
3461
+ }