@crossauth/sveltekit 1.0.1 → 1.1.1

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 (47) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +16 -6181
  4. package/dist/sveltekitadminclientendpoints.d.ts +13 -12
  5. package/dist/sveltekitadminclientendpoints.js +187 -0
  6. package/dist/sveltekitadminendpoints.d.ts +5 -4
  7. package/dist/sveltekitadminendpoints.js +766 -0
  8. package/dist/sveltekitapikey.d.ts +4 -3
  9. package/dist/sveltekitapikey.js +81 -0
  10. package/dist/sveltekitoauthclient.d.ts +6 -4
  11. package/dist/sveltekitoauthclient.js +2309 -0
  12. package/dist/sveltekitoauthserver.d.ts +4 -4
  13. package/dist/sveltekitoauthserver.js +1350 -0
  14. package/dist/sveltekitresserver.d.ts +6 -4
  15. package/dist/sveltekitresserver.js +286 -0
  16. package/dist/sveltekitserver.d.ts +11 -9
  17. package/dist/sveltekitserver.js +393 -0
  18. package/dist/sveltekitsession.d.ts +6 -5
  19. package/dist/sveltekitsession.js +1112 -0
  20. package/dist/sveltekitsessionadapter.d.ts +2 -3
  21. package/dist/sveltekitsessionadapter.js +2 -0
  22. package/dist/sveltekitsharedclientendpoints.d.ts +7 -6
  23. package/dist/sveltekitsharedclientendpoints.js +630 -0
  24. package/dist/sveltekituserclientendpoints.d.ts +13 -12
  25. package/dist/sveltekituserclientendpoints.js +270 -0
  26. package/dist/sveltekituserendpoints.d.ts +6 -5
  27. package/dist/sveltekituserendpoints.js +1813 -0
  28. package/dist/tests/sveltekitadminclientendpoints.test.js +330 -0
  29. package/dist/tests/sveltekitadminendpoints.test.js +242 -0
  30. package/dist/tests/sveltekitapikeyserver.test.js +44 -0
  31. package/dist/tests/sveltekitoauthclient.test.d.ts +5 -5
  32. package/dist/tests/sveltekitoauthclient.test.js +1016 -0
  33. package/dist/tests/sveltekitoauthresserver.test.d.ts +4 -4
  34. package/dist/tests/sveltekitoauthresserver.test.js +185 -0
  35. package/dist/tests/sveltekitoauthserver.test.js +673 -0
  36. package/dist/tests/sveltekituserclientendpoints.test.js +244 -0
  37. package/dist/tests/sveltekituserendpoints.test.js +152 -0
  38. package/dist/tests/sveltemock.test.js +36 -0
  39. package/dist/tests/sveltemocks.d.ts +22 -8
  40. package/dist/tests/sveltemocks.js +114 -0
  41. package/dist/tests/sveltesessionhooks.test.js +224 -0
  42. package/dist/tests/testshared.d.ts +8 -8
  43. package/dist/tests/testshared.js +344 -0
  44. package/dist/utils.d.ts +1 -2
  45. package/dist/utils.js +123 -0
  46. package/package.json +23 -15
  47. package/dist/index.cjs +0 -1
@@ -0,0 +1,330 @@
1
+ // Copyright (c) 2026 Matthew Baker. All rights reserved. Licenced under the Apache Licence 2.0. See LICENSE file
2
+ import { MockRequestEvent } from './sveltemocks';
3
+ import { test, expect } from 'vitest';
4
+ import { makeServer, getCsrfToken, login } from './testshared';
5
+ export var passwordResetData;
6
+ test('SvelteKitAdminClientEndpoints.selectClients_user', async () => {
7
+ const { server, resolver, handle } = await makeServer();
8
+ // log in
9
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
10
+ let loginEvent = resp.event;
11
+ loginEvent = resp.event;
12
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
13
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
14
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
15
+ // select clients
16
+ let getRequest = new Request("http://ex.com/oauth/clients", {
17
+ method: "POST",
18
+ body: "csrfToken=" + csrfToken,
19
+ headers: [
20
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
21
+ ["cookie", "SESSIONID=" + sessionCookieValue],
22
+ ["content-type", "application/x-www-form-urlencoded"],
23
+ ]
24
+ });
25
+ let event = new MockRequestEvent("1", getRequest, { id: "bob" });
26
+ event.locals.csrfToken = csrfToken;
27
+ event.locals.sessionId = sessionId;
28
+ event.locals.authType = "cookie";
29
+ event.locals.user = loginEvent.locals.user;
30
+ let resp1 = await server.sessionServer?.adminClientEndpoints.searchClients(event, undefined, undefined, undefined, "bob");
31
+ expect(resp1?.ok).toBe(true);
32
+ expect(resp1?.clients?.length).toBe(1);
33
+ });
34
+ test('SvelteKitAdminClientEndpoints.selectClients_all', async () => {
35
+ const { server, resolver, handle } = await makeServer();
36
+ // log in
37
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
38
+ let loginEvent = resp.event;
39
+ loginEvent = resp.event;
40
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
41
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
42
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
43
+ // select clients
44
+ let getRequest = new Request("http://ex.com/oauth/clients", {
45
+ method: "POST",
46
+ body: "csrfToken=" + csrfToken,
47
+ headers: [
48
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
49
+ ["cookie", "SESSIONID=" + sessionCookieValue],
50
+ ["content-type", "application/x-www-form-urlencoded"],
51
+ ]
52
+ });
53
+ let event = new MockRequestEvent("1", getRequest, { id: "bob" });
54
+ event.locals.csrfToken = csrfToken;
55
+ event.locals.sessionId = sessionId;
56
+ event.locals.authType = "cookie";
57
+ event.locals.user = loginEvent.locals.user;
58
+ let resp1 = await server.sessionServer?.adminClientEndpoints.searchClients(event, undefined, undefined, undefined);
59
+ expect(resp1?.ok).toBe(true);
60
+ expect(resp1?.clients?.length).toBe(2);
61
+ });
62
+ test('SvelteKitAdminClientEndpoints.updateClient', async () => {
63
+ const { server, resolver, handle } = await makeServer();
64
+ // log in
65
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
66
+ let loginEvent = resp.event;
67
+ loginEvent = resp.event;
68
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
69
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
70
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
71
+ let getRequest = new Request("http://ex.com/oauth/clients", {
72
+ method: "GET",
73
+ headers: [
74
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
75
+ ["cookie", "SESSIONID=" + sessionCookieValue],
76
+ ["content-type", "application/x-www-form-urlencoded"],
77
+ ]
78
+ });
79
+ let event = new MockRequestEvent("1", getRequest, { client_id: "ABC" });
80
+ event.locals.csrfToken = csrfToken;
81
+ let status = 200;
82
+ let resp1 = {};
83
+ try {
84
+ resp1 = await server.sessionServer?.adminClientEndpoints.updateClientEndpoint.load(event);
85
+ }
86
+ catch (e) {
87
+ if (e && typeof (e) == "object" && "status" in e && typeof (e.status) == "number")
88
+ status = e.status;
89
+ }
90
+ expect(status).toBe(401);
91
+ event = new MockRequestEvent("1", getRequest, { client_id: "ABC" });
92
+ event.locals.csrfToken = csrfToken;
93
+ event.locals.sessionId = sessionId;
94
+ event.locals.authType = "cookie";
95
+ event.locals.user = loginEvent.locals.user;
96
+ status = 200;
97
+ try {
98
+ resp1 = await server.sessionServer?.adminClientEndpoints.updateClientEndpoint.load(event);
99
+ }
100
+ catch (e) {
101
+ if (e && typeof (e) == "object" && "status" in e && typeof (e.status) == "number")
102
+ status = e.status;
103
+ }
104
+ expect(status).toBe(200);
105
+ event = new MockRequestEvent("1", getRequest, { client_id: "bob_ABC" });
106
+ event.locals.csrfToken = csrfToken;
107
+ event.locals.sessionId = sessionId;
108
+ event.locals.authType = "cookie";
109
+ event.locals.user = loginEvent.locals.user;
110
+ resp1 = await server.sessionServer?.adminClientEndpoints.updateClientEndpoint.load(event);
111
+ expect(resp1?.ok).toBe(true);
112
+ let postRequest = new Request("http://ex.com/oauth/clients", {
113
+ method: "POST",
114
+ body: "csrfToken=" + csrfToken + "&client_name=newName&confidential=on&redirect_uri=http://uri1.com/redirect&authorizationCode=on",
115
+ headers: [
116
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
117
+ ["cookie", "SESSIONID=" + sessionCookieValue],
118
+ ["content-type", "application/x-www-form-urlencoded"],
119
+ ]
120
+ });
121
+ event = new MockRequestEvent("1", postRequest, { client_id: "bob_ABC" });
122
+ event.locals.csrfToken = csrfToken;
123
+ event.locals.sessionId = sessionId;
124
+ event.locals.authType = "cookie";
125
+ event.locals.user = loginEvent.locals.user;
126
+ resp1 = await server.sessionServer?.adminClientEndpoints.updateClientEndpoint.actions.default(event);
127
+ expect(resp1?.ok).toBe(true);
128
+ expect(resp1?.client?.client_name).toBe("newName");
129
+ expect(resp1?.plaintextSecret).toBeUndefined();
130
+ expect(resp1?.client?.client_secret).toContain("pbkdf2:sha256");
131
+ postRequest = new Request("http://ex.com/oauth/clients", {
132
+ method: "POST",
133
+ body: "csrfToken=" + csrfToken + "&client_name=newName&confidential=on&redirect_uri=http://uri1.com/redirect&authorizationCode=on&resetSecret=on",
134
+ headers: [
135
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
136
+ ["cookie", "SESSIONID=" + sessionCookieValue],
137
+ ["content-type", "application/x-www-form-urlencoded"],
138
+ ]
139
+ });
140
+ event = new MockRequestEvent("1", postRequest, { client_id: "bob_ABC" });
141
+ event.locals.csrfToken = csrfToken;
142
+ event.locals.sessionId = sessionId;
143
+ event.locals.authType = "cookie";
144
+ event.locals.user = loginEvent.locals.user;
145
+ resp1 = await server.sessionServer?.adminClientEndpoints.updateClientEndpoint.actions.default(event);
146
+ expect(resp1?.ok).toBe(true);
147
+ expect(resp1?.plaintextSecret).toBeDefined();
148
+ expect(resp1?.client?.client_secret).not.toContain("pbkdf2:sha256");
149
+ });
150
+ test('SvelteKitAdminClientEndpoints.deleteClient', async () => {
151
+ const { server, resolver, handle } = await makeServer();
152
+ // log in
153
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
154
+ let loginEvent = resp.event;
155
+ loginEvent = resp.event;
156
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
157
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
158
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
159
+ let getRequest = new Request("http://ex.com/oauth/clients", {
160
+ method: "GET",
161
+ headers: [
162
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
163
+ ["cookie", "SESSIONID=" + sessionCookieValue],
164
+ ["content-type", "application/x-www-form-urlencoded"],
165
+ ]
166
+ });
167
+ let event = new MockRequestEvent("1", getRequest, { client_id: "ABC" });
168
+ event.locals.csrfToken = csrfToken;
169
+ let status = 200;
170
+ let resp1 = {};
171
+ try {
172
+ resp1 = await server.sessionServer?.adminClientEndpoints.deleteClientEndpoint.load(event);
173
+ }
174
+ catch (e) {
175
+ if (e && typeof (e) == "object" && "status" in e && typeof (e.status) == "number")
176
+ status = e.status;
177
+ }
178
+ expect(status).toBe(401);
179
+ event = new MockRequestEvent("1", getRequest, { client_id: "ABC" });
180
+ event.locals.csrfToken = csrfToken;
181
+ event.locals.sessionId = sessionId;
182
+ event.locals.authType = "cookie";
183
+ event.locals.user = loginEvent.locals.user;
184
+ status = 200;
185
+ try {
186
+ resp1 = await server.sessionServer?.adminClientEndpoints.deleteClientEndpoint.load(event);
187
+ }
188
+ catch (e) {
189
+ if (e && typeof (e) == "object" && "status" in e && typeof (e.status) == "number")
190
+ status = e.status;
191
+ }
192
+ expect(status).toBe(200);
193
+ event = new MockRequestEvent("1", getRequest, { client_id: "bob_ABC" });
194
+ event.locals.csrfToken = csrfToken;
195
+ event.locals.sessionId = sessionId;
196
+ event.locals.authType = "cookie";
197
+ event.locals.user = loginEvent.locals.user;
198
+ resp1 = await server.sessionServer?.adminClientEndpoints.deleteClientEndpoint.load(event);
199
+ expect(resp1?.ok).toBe(true);
200
+ let postRequest = new Request("http://ex.com/oauth/clients", {
201
+ method: "POST",
202
+ body: "csrfToken=" + csrfToken,
203
+ headers: [
204
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
205
+ ["cookie", "SESSIONID=" + sessionCookieValue],
206
+ ["content-type", "application/x-www-form-urlencoded"],
207
+ ]
208
+ });
209
+ event = new MockRequestEvent("1", postRequest, { client_id: "bob_ABC" });
210
+ event.locals.csrfToken = csrfToken;
211
+ event.locals.sessionId = sessionId;
212
+ event.locals.authType = "cookie";
213
+ event.locals.user = loginEvent.locals.user;
214
+ resp1 = await server.sessionServer?.adminClientEndpoints.deleteClientEndpoint.actions.default(event);
215
+ expect(resp1?.ok).toBe(true);
216
+ });
217
+ test('SvelteKitAdminClientEndpoints.createClient', async () => {
218
+ const { server, resolver, handle } = await makeServer();
219
+ // log in
220
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
221
+ let loginEvent = resp.event;
222
+ loginEvent = resp.event;
223
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
224
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
225
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
226
+ let getRequest = new Request("http://ex.com/oauth/clients", {
227
+ method: "GET",
228
+ headers: [
229
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
230
+ ["cookie", "SESSIONID=" + sessionCookieValue],
231
+ ["content-type", "application/x-www-form-urlencoded"],
232
+ ]
233
+ });
234
+ let event = new MockRequestEvent("1", getRequest, {});
235
+ event.locals.csrfToken = csrfToken;
236
+ let status = 200;
237
+ let resp1 = {};
238
+ try {
239
+ resp1 = await server.sessionServer?.adminClientEndpoints.createClientEndpoint.load(event);
240
+ }
241
+ catch (e) {
242
+ if (e && typeof (e) == "object" && "status" in e && typeof (e.status) == "number")
243
+ status = e.status;
244
+ }
245
+ expect(status).toBe(401);
246
+ event = new MockRequestEvent("1", getRequest, {});
247
+ event.locals.csrfToken = csrfToken;
248
+ event.locals.sessionId = sessionId;
249
+ event.locals.authType = "cookie";
250
+ event.locals.user = loginEvent.locals.user;
251
+ resp1 = await server.sessionServer?.adminClientEndpoints.createClientEndpoint.load(event);
252
+ expect(resp1?.ok).toBe(true);
253
+ let postRequest = new Request("http://ex.com/oauth/clients", {
254
+ method: "POST",
255
+ body: "csrfToken=" + csrfToken + "&client_name=newName&confidential=on&redirect_uri=http://uri1.com/redirect&authorizationCode=on",
256
+ headers: [
257
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
258
+ ["cookie", "SESSIONID=" + sessionCookieValue],
259
+ ["content-type", "application/x-www-form-urlencoded"],
260
+ ]
261
+ });
262
+ event = new MockRequestEvent("1", postRequest, { client_id: "bob_ABC" });
263
+ event.locals.csrfToken = csrfToken;
264
+ event.locals.sessionId = sessionId;
265
+ event.locals.authType = "cookie";
266
+ event.locals.user = loginEvent.locals.user;
267
+ resp1 = await server.sessionServer?.adminClientEndpoints.createClientEndpoint.actions.default(event);
268
+ expect(resp1?.ok).toBe(true);
269
+ expect(resp1?.client?.client_name).toBe("newName");
270
+ expect(resp1?.plaintextSecret).toBeUndefined();
271
+ expect(resp1?.client?.client_secret).not.toContain("pbkdf2:sha256");
272
+ expect(resp1?.client?.userid).toBeUndefined();
273
+ });
274
+ test('SvelteKitAdminClientEndpoints.createClientForUser', async () => {
275
+ const { server, resolver, handle } = await makeServer();
276
+ // log in
277
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
278
+ let loginEvent = resp.event;
279
+ loginEvent = resp.event;
280
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
281
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
282
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
283
+ let getRequest = new Request("http://ex.com/oauth/clients", {
284
+ method: "GET",
285
+ headers: [
286
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
287
+ ["cookie", "SESSIONID=" + sessionCookieValue],
288
+ ["content-type", "application/x-www-form-urlencoded"],
289
+ ]
290
+ });
291
+ let event = new MockRequestEvent("1", getRequest, {});
292
+ event.locals.csrfToken = csrfToken;
293
+ let status = 200;
294
+ let resp1 = {};
295
+ try {
296
+ resp1 = await server.sessionServer?.adminClientEndpoints.createClientEndpoint.load(event);
297
+ }
298
+ catch (e) {
299
+ if (e && typeof (e) == "object" && "status" in e && typeof (e.status) == "number")
300
+ status = e.status;
301
+ }
302
+ expect(status).toBe(401);
303
+ event = new MockRequestEvent("1", getRequest, {});
304
+ event.locals.csrfToken = csrfToken;
305
+ event.locals.sessionId = sessionId;
306
+ event.locals.authType = "cookie";
307
+ event.locals.user = loginEvent.locals.user;
308
+ resp1 = await server.sessionServer?.adminClientEndpoints.createClientEndpoint.load(event);
309
+ expect(resp1?.ok).toBe(true);
310
+ let postRequest = new Request("http://ex.com/oauth/clients?userid=bob", {
311
+ method: "POST",
312
+ body: "csrfToken=" + csrfToken + "&client_name=newName&confidential=on&redirect_uri=http://uri1.com/redirect&authorizationCode=on&userid=bob",
313
+ headers: [
314
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
315
+ ["cookie", "SESSIONID=" + sessionCookieValue],
316
+ ["content-type", "application/x-www-form-urlencoded"],
317
+ ]
318
+ });
319
+ event = new MockRequestEvent("1", postRequest, { client_id: "bob_ABC" });
320
+ event.locals.csrfToken = csrfToken;
321
+ event.locals.sessionId = sessionId;
322
+ event.locals.authType = "cookie";
323
+ event.locals.user = loginEvent.locals.user;
324
+ resp1 = await server.sessionServer?.adminClientEndpoints.createClientEndpoint.actions.default(event);
325
+ expect(resp1?.ok).toBe(true);
326
+ expect(resp1?.client?.client_name).toBe("newName");
327
+ expect(resp1?.plaintextSecret).toBeUndefined();
328
+ expect(resp1?.client?.client_secret).not.toContain("pbkdf2:sha256");
329
+ expect(resp1?.client?.userid).toBe("bob");
330
+ });
@@ -0,0 +1,242 @@
1
+ // Copyright (c) 2026 Matthew Baker. All rights reserved. Licenced under the Apache Licence 2.0. See LICENSE file
2
+ import { MockRequestEvent } from './sveltemocks';
3
+ import { test, expect } from 'vitest';
4
+ import { makeServer, getCsrfToken, login } from './testshared';
5
+ import { UserState } from '@crossauth/common';
6
+ export var passwordResetData;
7
+ test('SvelteKitAdminEndpoints.deleteUser', async () => {
8
+ const { server, resolver, handle, userStorage } = await makeServer();
9
+ // log in
10
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
11
+ let loginEvent = resp.event;
12
+ loginEvent = resp.event;
13
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
14
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
15
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
16
+ // delete user
17
+ let postRequest = new Request("http://ex.com/admin/users/delete", {
18
+ method: "POST",
19
+ body: "csrfToken=" + csrfToken,
20
+ headers: [
21
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
22
+ ["cookie", "SESSIONID=" + sessionCookieValue],
23
+ ["content-type", "application/x-www-form-urlencoded"],
24
+ ]
25
+ });
26
+ let event = new MockRequestEvent("1", postRequest, { id: "bob" });
27
+ event.locals.csrfToken = csrfToken;
28
+ event.locals.sessionId = sessionId;
29
+ event.locals.authType = "cookie";
30
+ event.locals.user = loginEvent.locals.user;
31
+ let resp1 = await server.sessionServer?.adminEndpoints.deleteUser(event);
32
+ expect(resp1?.ok).toBe(true);
33
+ let found = false;
34
+ try {
35
+ await userStorage.getUserByUsername("bob");
36
+ found = true;
37
+ }
38
+ catch (e) { }
39
+ expect(found).toBe(false);
40
+ });
41
+ test('SvelteKitAdminEndpoints.createUser', async () => {
42
+ const { server, resolver, handle, userStorage } = await makeServer();
43
+ // log in
44
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
45
+ let loginEvent = resp.event;
46
+ loginEvent = resp.event;
47
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
48
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
49
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
50
+ // create user
51
+ let postRequest = new Request("http://ex.com/admin/users/create", {
52
+ method: "POST",
53
+ body: "csrfToken=" + csrfToken + "&" +
54
+ "username=mary&" +
55
+ "password=maryPass123" +
56
+ "repeat_password=maryPass123&" +
57
+ "user_email=mary@mary.com&" +
58
+ "user_phone=12345",
59
+ headers: [
60
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
61
+ ["cookie", "SESSIONID=" + sessionCookieValue],
62
+ ["content-type", "application/x-www-form-urlencoded"],
63
+ ]
64
+ });
65
+ let event = new MockRequestEvent("1", postRequest, {});
66
+ event.locals.csrfToken = csrfToken;
67
+ event.locals.sessionId = sessionId;
68
+ event.locals.authType = "cookie";
69
+ event.locals.user = loginEvent.locals.user;
70
+ let resp1 = await server.sessionServer?.adminEndpoints.createUser(event);
71
+ expect(resp1?.ok).toBe(true);
72
+ let found = false;
73
+ try {
74
+ await userStorage.getUserByUsername("mary");
75
+ found = true;
76
+ }
77
+ catch (e) { }
78
+ expect(found).toBe(true);
79
+ });
80
+ test('SvelteKitAdminEndpoints.createUserNoPassword', async () => {
81
+ const { server, resolver, handle, userStorage } = await makeServer();
82
+ // log in
83
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
84
+ let loginEvent = resp.event;
85
+ loginEvent = resp.event;
86
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
87
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
88
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
89
+ // @ts-ignore
90
+ server["sessionServer"]["sessionManager"]["tokenEmailer"]["_sendPasswordResetToken"] = async function (token, email, extraData) {
91
+ passwordResetData = { token, extraData };
92
+ };
93
+ // create user
94
+ let postRequest = new Request("http://ex.com/admin/users/create", {
95
+ method: "POST",
96
+ body: "csrfToken=" + csrfToken + "&" +
97
+ "username=mary&" +
98
+ "user_email=mary@mary.com&" +
99
+ "user_phone=12345",
100
+ headers: [
101
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
102
+ ["cookie", "SESSIONID=" + sessionCookieValue],
103
+ ["content-type", "application/x-www-form-urlencoded"],
104
+ ]
105
+ });
106
+ let event = new MockRequestEvent("1", postRequest, {});
107
+ event.locals.csrfToken = csrfToken;
108
+ event.locals.sessionId = sessionId;
109
+ event.locals.authType = "cookie";
110
+ event.locals.user = loginEvent.locals.user;
111
+ let resp1 = await server.sessionServer?.adminEndpoints.createUser(event);
112
+ expect(resp1?.ok).toBe(true);
113
+ let newUser = undefined;
114
+ try {
115
+ const resp2 = await userStorage.getUserByUsername("mary", { skipActiveCheck: true });
116
+ newUser = resp2.user;
117
+ }
118
+ catch (e) { }
119
+ expect(newUser).toBeDefined();
120
+ expect(newUser?.state).toBe(UserState.passwordResetNeeded);
121
+ });
122
+ test('SvelteKitAdminEndpoints.createUserFactor2', async () => {
123
+ const { server, resolver, handle, userStorage } = await makeServer();
124
+ // log in
125
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
126
+ let loginEvent = resp.event;
127
+ loginEvent = resp.event;
128
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
129
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
130
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
131
+ // create user
132
+ let postRequest = new Request("http://ex.com/admin/users/create", {
133
+ method: "POST",
134
+ body: "csrfToken=" + csrfToken + "&" +
135
+ "username=mary&" +
136
+ "user_email=mary@mary.com&" +
137
+ "user_phone=12345&" +
138
+ "password=maryPass123" +
139
+ "repeat_password=maryPass123&" +
140
+ "factor2=dummyFactor2",
141
+ headers: [
142
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
143
+ ["cookie", "SESSIONID=" + sessionCookieValue],
144
+ ["content-type", "application/x-www-form-urlencoded"],
145
+ ]
146
+ });
147
+ let event = new MockRequestEvent("1", postRequest, {});
148
+ event.locals.csrfToken = csrfToken;
149
+ event.locals.sessionId = sessionId;
150
+ event.locals.authType = "cookie";
151
+ event.locals.user = loginEvent.locals.user;
152
+ let resp1 = await server.sessionServer?.adminEndpoints.createUser(event);
153
+ expect(resp1?.ok).toBe(true);
154
+ let newUser = undefined;
155
+ try {
156
+ const resp2 = await userStorage.getUserByUsername("mary", { skipActiveCheck: true });
157
+ newUser = resp2.user;
158
+ }
159
+ catch (e) { }
160
+ expect(newUser).toBeDefined();
161
+ expect(newUser?.state).toBe(UserState.factor2ResetNeeded);
162
+ });
163
+ test('SvelteKitAdminEndpoints.createUserFactor2NoPassword', async () => {
164
+ const { server, resolver, handle, userStorage } = await makeServer();
165
+ // log in
166
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
167
+ let loginEvent = resp.event;
168
+ loginEvent = resp.event;
169
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
170
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
171
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
172
+ // @ts-ignore
173
+ server["sessionServer"]["sessionManager"]["tokenEmailer"]["_sendPasswordResetToken"] = async function (token, email, extraData) {
174
+ passwordResetData = { token, extraData };
175
+ };
176
+ // create user
177
+ let postRequest = new Request("http://ex.com/admin/users/create", {
178
+ method: "POST",
179
+ body: "csrfToken=" + csrfToken + "&" +
180
+ "username=mary&" +
181
+ "user_email=mary@mary.com&" +
182
+ "user_phone=12345&" +
183
+ "factor2=dummyFactor2",
184
+ headers: [
185
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
186
+ ["cookie", "SESSIONID=" + sessionCookieValue],
187
+ ["content-type", "application/x-www-form-urlencoded"],
188
+ ]
189
+ });
190
+ let event = new MockRequestEvent("1", postRequest, {});
191
+ event.locals.csrfToken = csrfToken;
192
+ event.locals.sessionId = sessionId;
193
+ event.locals.authType = "cookie";
194
+ event.locals.user = loginEvent.locals.user;
195
+ let resp1 = await server.sessionServer?.adminEndpoints.createUser(event);
196
+ expect(resp1?.ok).toBe(true);
197
+ let newUser = undefined;
198
+ try {
199
+ const resp2 = await userStorage.getUserByUsername("mary", { skipActiveCheck: true });
200
+ newUser = resp2.user;
201
+ }
202
+ catch (e) { }
203
+ expect(newUser).toBeDefined();
204
+ expect(newUser?.state).toBe(UserState.passwordAndFactor2ResetNeeded);
205
+ });
206
+ test('SvelteKitAdminEndpoints.updateUser', async () => {
207
+ const { server, resolver, handle, userStorage } = await makeServer();
208
+ // log in
209
+ let resp = await login(server, resolver, handle, "admin", "adminPass123");
210
+ let loginEvent = resp.event;
211
+ loginEvent = resp.event;
212
+ const { csrfToken, csrfCookieValue } = await getCsrfToken(server, resolver, handle);
213
+ let sessionCookieValue = loginEvent.cookies.get("SESSIONID");
214
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
215
+ // create user
216
+ let postRequest = new Request("http://ex.com/admin/users/edit", {
217
+ method: "POST",
218
+ body: "csrfToken=" + csrfToken + "&" +
219
+ "user_email=bob1@bob.com",
220
+ headers: [
221
+ ["cookie", "CSRFTOKEN=" + csrfCookieValue],
222
+ ["cookie", "SESSIONID=" + sessionCookieValue],
223
+ ["content-type", "application/x-www-form-urlencoded"],
224
+ ]
225
+ });
226
+ let event = new MockRequestEvent("1", postRequest, { id: "bob" });
227
+ event.locals.csrfToken = csrfToken;
228
+ event.locals.sessionId = sessionId;
229
+ event.locals.authType = "cookie";
230
+ event.locals.user = loginEvent.locals.user;
231
+ const { user } = await userStorage.getUserByUsername("bob");
232
+ let resp1 = await server.sessionServer?.adminEndpoints.updateUser(user, event);
233
+ expect(resp1?.ok).toBe(true);
234
+ let newUser = undefined;
235
+ try {
236
+ const resp2 = await userStorage.getUserByUsername("bob");
237
+ newUser = resp2.user;
238
+ }
239
+ catch (e) { }
240
+ expect(newUser).toBeDefined();
241
+ expect(newUser?.email).toBe("bob1@bob.com");
242
+ });
@@ -0,0 +1,44 @@
1
+ // Copyright (c) 2026 Matthew Baker. All rights reserved. Licenced under the Apache Licence 2.0. See LICENSE file
2
+ import { MockRequestEvent } from './sveltemocks';
3
+ import { test, expect } from 'vitest';
4
+ import { makeServer } from './testshared';
5
+ test('SvelteApiKeyServer.hookWithGetNoKey', async () => {
6
+ const { resolver, handle } = await makeServer();
7
+ const getRequest = new Request("http://ex.com/test", { method: "GET" });
8
+ let event = new MockRequestEvent("1", getRequest, { "param1": "value1" });
9
+ await handle({ event: event, resolve: resolver.mockResolve });
10
+ expect(event.locals.user).toBeUndefined();
11
+ expect(event.locals.apiKey).toBeUndefined();
12
+ });
13
+ test('SvelteApiKeyServer.validKeyAuthenticates', async () => {
14
+ let { apiKeyManager, userStorage, resolver, handle } = await makeServer(false, true);
15
+ expect(apiKeyManager).toBeDefined();
16
+ if (apiKeyManager) {
17
+ const { user } = await userStorage.getUserByUsername("bob");
18
+ const { token } = await apiKeyManager.createKey("default", user.id);
19
+ const getRequest = new Request("http://ex.com/test", {
20
+ method: "GET",
21
+ headers: { authorization: apiKeyManager.authScheme + " " + token }
22
+ });
23
+ let event = new MockRequestEvent("1", getRequest, { "param1": "value1" });
24
+ await handle({ event: event, resolve: resolver.mockResolve });
25
+ expect(event.locals.user?.username).toBe("bob");
26
+ expect(event.locals.apiKey).toBeDefined();
27
+ }
28
+ });
29
+ test('SvelteApiKeyServer.invalidKeyDoesntAuthenticate', async () => {
30
+ let { apiKeyManager, userStorage, resolver, handle } = await makeServer(false, true);
31
+ expect(apiKeyManager).toBeDefined();
32
+ if (apiKeyManager) {
33
+ const { user } = await userStorage.getUserByUsername("bob");
34
+ const { token } = await apiKeyManager.createKey("default", user.id);
35
+ const getRequest = new Request("http://ex.com/test", {
36
+ method: "GET",
37
+ headers: { authorization: apiKeyManager.authScheme + " " + token + "x" }
38
+ });
39
+ let event = new MockRequestEvent("1", getRequest, { "param1": "value1" });
40
+ await handle({ event: event, resolve: resolver.mockResolve });
41
+ expect(event.locals.user).toBeUndefined();
42
+ expect(event.locals.apiKey).toBeUndefined();
43
+ }
44
+ });
@@ -1,11 +1,11 @@
1
1
  export declare function oauthLogin(options?: {}): Promise<{
2
- server: import('..').SvelteKitServer;
3
- authServer: import('@crossauth/backend').OAuthAuthorizationServer;
2
+ server: import("..").SvelteKitServer;
3
+ authServer: import("@crossauth/backend").OAuthAuthorizationServer;
4
4
  sessionCookieValue: string | undefined;
5
5
  sessionId: string | undefined;
6
6
  access_token: any;
7
7
  refresh_token: any;
8
- keyStorage: import('@crossauth/backend').InMemoryKeyStorage;
9
- userStorage: import('@crossauth/backend').InMemoryUserStorage;
10
- clientStorage: import('@crossauth/backend').InMemoryOAuthClientStorage;
8
+ keyStorage: import("@crossauth/backend").InMemoryKeyStorage;
9
+ userStorage: import("@crossauth/backend").InMemoryUserStorage;
10
+ clientStorage: import("@crossauth/backend").InMemoryOAuthClientStorage;
11
11
  }>;