@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.
- package/README.md +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +16 -6181
- package/dist/sveltekitadminclientendpoints.d.ts +13 -12
- package/dist/sveltekitadminclientendpoints.js +187 -0
- package/dist/sveltekitadminendpoints.d.ts +5 -4
- package/dist/sveltekitadminendpoints.js +766 -0
- package/dist/sveltekitapikey.d.ts +4 -3
- package/dist/sveltekitapikey.js +81 -0
- package/dist/sveltekitoauthclient.d.ts +6 -4
- package/dist/sveltekitoauthclient.js +2309 -0
- package/dist/sveltekitoauthserver.d.ts +4 -4
- package/dist/sveltekitoauthserver.js +1350 -0
- package/dist/sveltekitresserver.d.ts +6 -4
- package/dist/sveltekitresserver.js +286 -0
- package/dist/sveltekitserver.d.ts +11 -9
- package/dist/sveltekitserver.js +393 -0
- package/dist/sveltekitsession.d.ts +6 -5
- package/dist/sveltekitsession.js +1112 -0
- package/dist/sveltekitsessionadapter.d.ts +2 -3
- package/dist/sveltekitsessionadapter.js +2 -0
- package/dist/sveltekitsharedclientendpoints.d.ts +7 -6
- package/dist/sveltekitsharedclientendpoints.js +630 -0
- package/dist/sveltekituserclientendpoints.d.ts +13 -12
- package/dist/sveltekituserclientendpoints.js +270 -0
- package/dist/sveltekituserendpoints.d.ts +6 -5
- package/dist/sveltekituserendpoints.js +1813 -0
- package/dist/tests/sveltekitadminclientendpoints.test.js +330 -0
- package/dist/tests/sveltekitadminendpoints.test.js +242 -0
- package/dist/tests/sveltekitapikeyserver.test.js +44 -0
- package/dist/tests/sveltekitoauthclient.test.d.ts +5 -5
- package/dist/tests/sveltekitoauthclient.test.js +1016 -0
- package/dist/tests/sveltekitoauthresserver.test.d.ts +4 -4
- package/dist/tests/sveltekitoauthresserver.test.js +185 -0
- package/dist/tests/sveltekitoauthserver.test.js +673 -0
- package/dist/tests/sveltekituserclientendpoints.test.js +244 -0
- package/dist/tests/sveltekituserendpoints.test.js +152 -0
- package/dist/tests/sveltemock.test.js +36 -0
- package/dist/tests/sveltemocks.d.ts +22 -8
- package/dist/tests/sveltemocks.js +114 -0
- package/dist/tests/sveltesessionhooks.test.js +224 -0
- package/dist/tests/testshared.d.ts +8 -8
- package/dist/tests/testshared.js +344 -0
- package/dist/utils.d.ts +1 -2
- package/dist/utils.js +123 -0
- package/package.json +23 -15
- 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(
|
|
3
|
-
authServer: import(
|
|
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(
|
|
9
|
-
userStorage: import(
|
|
10
|
-
clientStorage: import(
|
|
8
|
+
keyStorage: import("@crossauth/backend").InMemoryKeyStorage;
|
|
9
|
+
userStorage: import("@crossauth/backend").InMemoryUserStorage;
|
|
10
|
+
clientStorage: import("@crossauth/backend").InMemoryOAuthClientStorage;
|
|
11
11
|
}>;
|