@happyvertical/smrt-users 0.54.0 → 0.54.3
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/AGENTS.md +16 -0
- package/README.md +129 -3
- package/dist/chunks/{TerminalAuthService-BfxG493c.js → TerminalAuthService-Bc67JXJ5.js} +969 -155
- package/dist/chunks/TerminalAuthService-Bc67JXJ5.js.map +1 -0
- package/dist/collections/PasswordCredentialCollection.d.ts +53 -0
- package/dist/collections/PasswordCredentialCollection.d.ts.map +1 -0
- package/dist/collections/SessionCollection.d.ts +7 -2
- package/dist/collections/SessionCollection.d.ts.map +1 -1
- package/dist/collections/index.d.ts +1 -0
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -4
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +424 -2
- package/dist/models/PasswordCredential.d.ts +36 -0
- package/dist/models/PasswordCredential.d.ts.map +1 -0
- package/dist/models/index.d.ts +1 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/services/DeviceCredentialService.d.ts.map +1 -1
- package/dist/services/PasswordCredentialService.d.ts +302 -0
- package/dist/services/PasswordCredentialService.d.ts.map +1 -0
- package/dist/services/SessionService.d.ts +3 -1
- package/dist/services/SessionService.d.ts.map +1 -1
- package/dist/services/credential-hash.d.ts +76 -0
- package/dist/services/credential-hash.d.ts.map +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/smrt-knowledge.json +208 -8
- package/dist/sveltekit/index.d.ts +1 -0
- package/dist/sveltekit/index.d.ts.map +1 -1
- package/dist/sveltekit/password-handlers.d.ts +91 -0
- package/dist/sveltekit/password-handlers.d.ts.map +1 -0
- package/dist/sveltekit.js +237 -68
- package/dist/sveltekit.js.map +1 -1
- package/package.json +12 -12
- package/dist/chunks/TerminalAuthService-BfxG493c.js.map +0 -1
package/dist/sveltekit.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { A as readMobileBearerToken, D as withSessionPermissionContext, F as encodeOidcTransaction, H as DeviceCredentialForbiddenError, I as getUsersOidcConfig, L as resolveOidcProviderConfig, M as OidcLoginError, N as OidcLoginService, O as MobileAuthError, P as decodeOidcTransaction, U as DeviceCredentialPolicyError, V as DeviceCredentialError, W as DeviceCredentialService, Y as SessionService, _ as PasswordCredentialService, a as TerminalAuthError, at as LoginRateLimitError, b as OperationPermissionError, g as PasswordCredentialForbiddenError, h as PasswordCredentialError, j as validateMobileRedirectUri, k as MobileAuthService, o as TerminalAuthRateLimitError, s as TerminalAuthService, v as PasswordPolicyError } from "./chunks/TerminalAuthService-Bc67JXJ5.js";
|
|
2
2
|
import { DiscoveryArtifactValidationError, SMRT_APP_RESULT_CONTRACT, SMRT_APP_RESULT_SCHEMA, SMRT_APP_RESULT_VERSION, SMRT_DISCOVERY_CONFORMANCE_ARTIFACT_SCHEMA, SMRT_DISCOVERY_CONFORMANCE_SCHEMA, SMRT_DISCOVERY_CONFORMANCE_VERSION, SMRT_MCP_RESULT_METADATA_KEY, canonicalizeDiscoveryArtifact, createDiscoveryConformanceArtifact, deriveCommandRequirements, validateDiscoveryConformanceArtifact } from "./app-contract.js";
|
|
3
3
|
import { ObjectRegistry, createClassNamePredicate, resolveCustomActionMetadata, resolveEffectiveActionMetadata } from "@happyvertical/smrt-core";
|
|
4
4
|
import { createLogger } from "@happyvertical/logger";
|
|
5
5
|
import { classnameToTablename } from "@happyvertical/smrt-core/utils";
|
|
6
6
|
import { methodNameToKebab, resolveApiActionSet } from "@happyvertical/smrt-core/vite-plugin";
|
|
7
7
|
//#region src/sveltekit/device-credential-handlers.ts
|
|
8
|
-
var logger$
|
|
9
|
-
var NO_STORE_HEADERS$
|
|
8
|
+
var logger$3 = createLogger({ level: "info" });
|
|
9
|
+
var NO_STORE_HEADERS$3 = {
|
|
10
10
|
"cache-control": "private, no-store",
|
|
11
11
|
pragma: "no-cache"
|
|
12
12
|
};
|
|
13
|
-
function json(body2, status = 200, headers) {
|
|
13
|
+
function json$1(body2, status = 200, headers) {
|
|
14
14
|
return new Response(JSON.stringify(body2), {
|
|
15
15
|
status,
|
|
16
16
|
headers: {
|
|
@@ -22,40 +22,40 @@ function json(body2, status = 200, headers) {
|
|
|
22
22
|
function bearer(event) {
|
|
23
23
|
return (event.request.headers.get("authorization")?.match(/^Bearer\s+(.+)$/iu))?.[1]?.trim() || null;
|
|
24
24
|
}
|
|
25
|
-
async function body(event) {
|
|
25
|
+
async function body$1(event) {
|
|
26
26
|
const parsed = await event.request.json().catch(() => null);
|
|
27
27
|
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
28
28
|
}
|
|
29
|
-
function str(value) {
|
|
29
|
+
function str$1(value) {
|
|
30
30
|
return typeof value === "string" ? value : "";
|
|
31
31
|
}
|
|
32
|
-
function errorResponse$
|
|
33
|
-
if (error instanceof LoginRateLimitError) return json({
|
|
32
|
+
function errorResponse$2(error) {
|
|
33
|
+
if (error instanceof LoginRateLimitError) return json$1({
|
|
34
34
|
error: "Too many attempts. Try again later.",
|
|
35
35
|
code: "rate_limited"
|
|
36
36
|
}, 429, {
|
|
37
|
-
...NO_STORE_HEADERS$
|
|
37
|
+
...NO_STORE_HEADERS$3,
|
|
38
38
|
"retry-after": String(error.retryAfterSeconds)
|
|
39
39
|
});
|
|
40
|
-
if (error instanceof DeviceCredentialError) return json({
|
|
40
|
+
if (error instanceof DeviceCredentialError) return json$1({
|
|
41
41
|
error: "Invalid credentials.",
|
|
42
42
|
code: "invalid_credentials"
|
|
43
|
-
}, 401, NO_STORE_HEADERS$
|
|
44
|
-
if (error instanceof DeviceCredentialForbiddenError) return json({
|
|
43
|
+
}, 401, NO_STORE_HEADERS$3);
|
|
44
|
+
if (error instanceof DeviceCredentialForbiddenError) return json$1({
|
|
45
45
|
error: error.message,
|
|
46
46
|
code: "forbidden"
|
|
47
|
-
}, 403, NO_STORE_HEADERS$
|
|
48
|
-
if (error instanceof DeviceCredentialPolicyError) return json({
|
|
47
|
+
}, 403, NO_STORE_HEADERS$3);
|
|
48
|
+
if (error instanceof DeviceCredentialPolicyError) return json$1({
|
|
49
49
|
error: error.message,
|
|
50
50
|
code: "pin_policy"
|
|
51
|
-
}, 400, NO_STORE_HEADERS$
|
|
52
|
-
logger$
|
|
53
|
-
return json({
|
|
51
|
+
}, 400, NO_STORE_HEADERS$3);
|
|
52
|
+
logger$3.error("Device credential handler error", { error });
|
|
53
|
+
return json$1({
|
|
54
54
|
error: "Internal error.",
|
|
55
55
|
code: "internal"
|
|
56
|
-
}, 500, NO_STORE_HEADERS$
|
|
56
|
+
}, 500, NO_STORE_HEADERS$3);
|
|
57
57
|
}
|
|
58
|
-
async function resolveActor(event, service) {
|
|
58
|
+
async function resolveActor$1(event, service) {
|
|
59
59
|
const token = bearer(event);
|
|
60
60
|
if (token) return service.resolveActor(token);
|
|
61
61
|
const locals = event.locals ?? {};
|
|
@@ -87,22 +87,22 @@ function createDeviceCredentialHandlers(options) {
|
|
|
87
87
|
service,
|
|
88
88
|
pinSignIn: async (event) => {
|
|
89
89
|
const deviceToken = bearer(event);
|
|
90
|
-
const input = await body(event);
|
|
91
|
-
const userId = str(input.userId).trim();
|
|
92
|
-
const pin = str(input.pin);
|
|
93
|
-
if (!deviceToken || !userId || !pin) return json({
|
|
90
|
+
const input = await body$1(event);
|
|
91
|
+
const userId = str$1(input.userId).trim();
|
|
92
|
+
const pin = str$1(input.pin);
|
|
93
|
+
if (!deviceToken || !userId || !pin) return json$1({
|
|
94
94
|
error: "Invalid credentials.",
|
|
95
95
|
code: "invalid_credentials"
|
|
96
|
-
}, 401, NO_STORE_HEADERS$
|
|
96
|
+
}, 401, NO_STORE_HEADERS$3);
|
|
97
97
|
try {
|
|
98
|
-
return json(await (await service()).signInWithPin({
|
|
98
|
+
return json$1(await (await service()).signInWithPin({
|
|
99
99
|
deviceToken,
|
|
100
100
|
userId,
|
|
101
101
|
pin,
|
|
102
102
|
...meta(event)
|
|
103
|
-
}), 201, NO_STORE_HEADERS$
|
|
103
|
+
}), 201, NO_STORE_HEADERS$3);
|
|
104
104
|
} catch (error) {
|
|
105
|
-
return errorResponse$
|
|
105
|
+
return errorResponse$2(error);
|
|
106
106
|
}
|
|
107
107
|
},
|
|
108
108
|
signOut: async (event) => {
|
|
@@ -110,74 +110,74 @@ function createDeviceCredentialHandlers(options) {
|
|
|
110
110
|
if (token) try {
|
|
111
111
|
await (await service()).signOut(token);
|
|
112
112
|
} catch (error) {
|
|
113
|
-
logger$
|
|
113
|
+
logger$3.error("Device credential sign-out error", { error });
|
|
114
114
|
}
|
|
115
|
-
return json({ authenticated: false }, 200, NO_STORE_HEADERS$
|
|
115
|
+
return json$1({ authenticated: false }, 200, NO_STORE_HEADERS$3);
|
|
116
116
|
},
|
|
117
117
|
setPin: async (event) => {
|
|
118
|
-
const actor = await resolveActor(event, await service());
|
|
119
|
-
if (!actor) return json({
|
|
118
|
+
const actor = await resolveActor$1(event, await service());
|
|
119
|
+
if (!actor) return json$1({
|
|
120
120
|
error: "Unauthenticated.",
|
|
121
121
|
code: "unauthenticated"
|
|
122
|
-
}, 401, NO_STORE_HEADERS$
|
|
123
|
-
const input = await body(event);
|
|
122
|
+
}, 401, NO_STORE_HEADERS$3);
|
|
123
|
+
const input = await body$1(event);
|
|
124
124
|
try {
|
|
125
125
|
await (await service()).setPin({
|
|
126
126
|
actor,
|
|
127
|
-
userId: str(input.userId).trim() || (actor.user.id ?? ""),
|
|
128
|
-
pin: str(input.pin),
|
|
129
|
-
currentPin: str(input.currentPin) || void 0,
|
|
127
|
+
userId: str$1(input.userId).trim() || (actor.user.id ?? ""),
|
|
128
|
+
pin: str$1(input.pin),
|
|
129
|
+
currentPin: str$1(input.currentPin) || void 0,
|
|
130
130
|
ipAddress: event.getClientAddress?.()
|
|
131
131
|
});
|
|
132
132
|
return new Response(null, {
|
|
133
133
|
status: 204,
|
|
134
|
-
headers: NO_STORE_HEADERS$
|
|
134
|
+
headers: NO_STORE_HEADERS$3
|
|
135
135
|
});
|
|
136
136
|
} catch (error) {
|
|
137
|
-
return errorResponse$
|
|
137
|
+
return errorResponse$2(error);
|
|
138
138
|
}
|
|
139
139
|
},
|
|
140
140
|
resetPin: async (event) => {
|
|
141
|
-
const actor = await resolveActor(event, await service());
|
|
142
|
-
if (!actor) return json({
|
|
141
|
+
const actor = await resolveActor$1(event, await service());
|
|
142
|
+
if (!actor) return json$1({
|
|
143
143
|
error: "Unauthenticated.",
|
|
144
144
|
code: "unauthenticated"
|
|
145
|
-
}, 401, NO_STORE_HEADERS$
|
|
146
|
-
const input = await body(event);
|
|
145
|
+
}, 401, NO_STORE_HEADERS$3);
|
|
146
|
+
const input = await body$1(event);
|
|
147
147
|
try {
|
|
148
|
-
return json(await (await service()).resetPin({
|
|
148
|
+
return json$1(await (await service()).resetPin({
|
|
149
149
|
actor,
|
|
150
|
-
userId: str(input.userId).trim(),
|
|
151
|
-
pin: str(input.pin),
|
|
150
|
+
userId: str$1(input.userId).trim(),
|
|
151
|
+
pin: str$1(input.pin),
|
|
152
152
|
ipAddress: event.getClientAddress?.()
|
|
153
|
-
}), 200, NO_STORE_HEADERS$
|
|
153
|
+
}), 200, NO_STORE_HEADERS$3);
|
|
154
154
|
} catch (error) {
|
|
155
|
-
return errorResponse$
|
|
155
|
+
return errorResponse$2(error);
|
|
156
156
|
}
|
|
157
157
|
},
|
|
158
158
|
clearPin: async (event) => {
|
|
159
|
-
const actor = await resolveActor(event, await service());
|
|
160
|
-
if (!actor) return json({
|
|
159
|
+
const actor = await resolveActor$1(event, await service());
|
|
160
|
+
if (!actor) return json$1({
|
|
161
161
|
error: "Unauthenticated.",
|
|
162
162
|
code: "unauthenticated"
|
|
163
|
-
}, 401, NO_STORE_HEADERS$
|
|
164
|
-
const input = await body(event);
|
|
163
|
+
}, 401, NO_STORE_HEADERS$3);
|
|
164
|
+
const input = await body$1(event);
|
|
165
165
|
try {
|
|
166
|
-
return json(await (await service()).clearPin({
|
|
166
|
+
return json$1(await (await service()).clearPin({
|
|
167
167
|
actor,
|
|
168
|
-
userId: str(input.userId).trim() || (actor.user.id ?? ""),
|
|
168
|
+
userId: str$1(input.userId).trim() || (actor.user.id ?? ""),
|
|
169
169
|
ipAddress: event.getClientAddress?.()
|
|
170
|
-
}), 200, NO_STORE_HEADERS$
|
|
170
|
+
}), 200, NO_STORE_HEADERS$3);
|
|
171
171
|
} catch (error) {
|
|
172
|
-
return errorResponse$
|
|
172
|
+
return errorResponse$2(error);
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
};
|
|
176
176
|
}
|
|
177
177
|
//#endregion
|
|
178
178
|
//#region src/sveltekit/mobile-handlers.ts
|
|
179
|
-
var logger$
|
|
180
|
-
var NO_STORE_HEADERS$
|
|
179
|
+
var logger$2 = createLogger({ level: "info" });
|
|
180
|
+
var NO_STORE_HEADERS$2 = {
|
|
181
181
|
"cache-control": "private, no-store",
|
|
182
182
|
pragma: "no-cache"
|
|
183
183
|
};
|
|
@@ -186,23 +186,23 @@ function jsonResponse$2(body, status = 200) {
|
|
|
186
186
|
status,
|
|
187
187
|
headers: {
|
|
188
188
|
"content-type": "application/json",
|
|
189
|
-
...NO_STORE_HEADERS$
|
|
189
|
+
...NO_STORE_HEADERS$2
|
|
190
190
|
}
|
|
191
191
|
});
|
|
192
192
|
}
|
|
193
193
|
function withNoStoreDefault(response) {
|
|
194
194
|
if (response.headers.has("cache-control")) return response;
|
|
195
195
|
const headers = new Headers(response.headers);
|
|
196
|
-
for (const [name, value] of Object.entries(NO_STORE_HEADERS$
|
|
196
|
+
for (const [name, value] of Object.entries(NO_STORE_HEADERS$2)) headers.set(name, value);
|
|
197
197
|
return new Response(response.body, {
|
|
198
198
|
status: response.status,
|
|
199
199
|
statusText: response.statusText,
|
|
200
200
|
headers
|
|
201
201
|
});
|
|
202
202
|
}
|
|
203
|
-
function errorResponse(error) {
|
|
203
|
+
function errorResponse$1(error) {
|
|
204
204
|
if (error instanceof MobileAuthError) {
|
|
205
|
-
if (error.status >= 500) logger$
|
|
205
|
+
if (error.status >= 500) logger$2.error("Mobile handler server error", {
|
|
206
206
|
code: error.code,
|
|
207
207
|
message: error.message
|
|
208
208
|
});
|
|
@@ -217,7 +217,7 @@ function errorResponse(error) {
|
|
|
217
217
|
reason: error.decision.reason,
|
|
218
218
|
permission: error.permission
|
|
219
219
|
}, error.status);
|
|
220
|
-
logger$
|
|
220
|
+
logger$2.error("Unexpected mobile handler error", { error });
|
|
221
221
|
return jsonResponse$2({
|
|
222
222
|
error: "Internal server error",
|
|
223
223
|
code: "internal_error"
|
|
@@ -283,7 +283,7 @@ function createMobileAuthHandlers(options) {
|
|
|
283
283
|
const body = await readJsonBody(event);
|
|
284
284
|
return jsonResponse$2(await service.start(parseStartRequest(body)));
|
|
285
285
|
} catch (error) {
|
|
286
|
-
return errorResponse(error);
|
|
286
|
+
return errorResponse$1(error);
|
|
287
287
|
}
|
|
288
288
|
};
|
|
289
289
|
const authComplete = async (event) => {
|
|
@@ -295,21 +295,21 @@ function createMobileAuthHandlers(options) {
|
|
|
295
295
|
ipAddress: clientAddress(event)
|
|
296
296
|
}));
|
|
297
297
|
} catch (error) {
|
|
298
|
-
return errorResponse(error);
|
|
298
|
+
return errorResponse$1(error);
|
|
299
299
|
}
|
|
300
300
|
};
|
|
301
301
|
const sessionGet = async (event) => {
|
|
302
302
|
try {
|
|
303
303
|
return jsonResponse$2(await (await getService()).bootstrap(event.request.headers.get("authorization")));
|
|
304
304
|
} catch (error) {
|
|
305
|
-
return errorResponse(error);
|
|
305
|
+
return errorResponse$1(error);
|
|
306
306
|
}
|
|
307
307
|
};
|
|
308
308
|
const sessionDelete = async (event) => {
|
|
309
309
|
try {
|
|
310
310
|
return jsonResponse$2(await (await getService()).logout(event.request.headers.get("authorization")));
|
|
311
311
|
} catch (error) {
|
|
312
|
-
return errorResponse(error);
|
|
312
|
+
return errorResponse$1(error);
|
|
313
313
|
}
|
|
314
314
|
};
|
|
315
315
|
const withSession = async (event, fn) => {
|
|
@@ -329,7 +329,7 @@ function createMobileAuthHandlers(options) {
|
|
|
329
329
|
return withNoStoreDefault(await fn(event, context));
|
|
330
330
|
});
|
|
331
331
|
} catch (error) {
|
|
332
|
-
return errorResponse(error);
|
|
332
|
+
return errorResponse$1(error);
|
|
333
333
|
}
|
|
334
334
|
};
|
|
335
335
|
return {
|
|
@@ -351,6 +351,175 @@ function resolveMobileUploadDedupKey(formData, headers, fieldName = "clientCaptu
|
|
|
351
351
|
return header && header.length > 0 ? header : null;
|
|
352
352
|
}
|
|
353
353
|
//#endregion
|
|
354
|
+
//#region src/sveltekit/password-handlers.ts
|
|
355
|
+
var logger$1 = createLogger({ level: "info" });
|
|
356
|
+
var NO_STORE_HEADERS$1 = {
|
|
357
|
+
"cache-control": "private, no-store",
|
|
358
|
+
pragma: "no-cache"
|
|
359
|
+
};
|
|
360
|
+
function json(body2, status = 200, headers) {
|
|
361
|
+
return new Response(JSON.stringify(body2), {
|
|
362
|
+
status,
|
|
363
|
+
headers: {
|
|
364
|
+
"content-type": "application/json",
|
|
365
|
+
...headers
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
var invalidCredentials = () => json({
|
|
370
|
+
error: "Invalid credentials.",
|
|
371
|
+
code: "invalid_credentials"
|
|
372
|
+
}, 401, NO_STORE_HEADERS$1);
|
|
373
|
+
var unauthenticated = () => json({
|
|
374
|
+
error: "Unauthenticated.",
|
|
375
|
+
code: "unauthenticated"
|
|
376
|
+
}, 401, NO_STORE_HEADERS$1);
|
|
377
|
+
async function body(event) {
|
|
378
|
+
const type = event.request.headers.get("content-type") ?? "";
|
|
379
|
+
if (type.includes("application/x-www-form-urlencoded") || type.includes("multipart/form-data")) {
|
|
380
|
+
const form = await event.request.formData().catch(() => null);
|
|
381
|
+
if (!form) return {};
|
|
382
|
+
const fields = {};
|
|
383
|
+
for (const [key, value] of form.entries()) if (typeof value === "string") fields[key] = value;
|
|
384
|
+
return fields;
|
|
385
|
+
}
|
|
386
|
+
const parsed = await event.request.json().catch(() => null);
|
|
387
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
388
|
+
}
|
|
389
|
+
function str(value) {
|
|
390
|
+
return typeof value === "string" ? value : "";
|
|
391
|
+
}
|
|
392
|
+
function errorResponse(error) {
|
|
393
|
+
if (error instanceof LoginRateLimitError) return json({
|
|
394
|
+
error: "Too many attempts. Try again later.",
|
|
395
|
+
code: "rate_limited"
|
|
396
|
+
}, 429, {
|
|
397
|
+
...NO_STORE_HEADERS$1,
|
|
398
|
+
"retry-after": String(error.retryAfterSeconds)
|
|
399
|
+
});
|
|
400
|
+
if (error instanceof PasswordCredentialError) return invalidCredentials();
|
|
401
|
+
if (error instanceof PasswordCredentialForbiddenError) return json({
|
|
402
|
+
error: "Not permitted.",
|
|
403
|
+
code: "forbidden"
|
|
404
|
+
}, 403, NO_STORE_HEADERS$1);
|
|
405
|
+
if (error instanceof PasswordPolicyError) return json({
|
|
406
|
+
error: error.message,
|
|
407
|
+
code: "password_policy"
|
|
408
|
+
}, 400, NO_STORE_HEADERS$1);
|
|
409
|
+
logger$1.error("Password credential handler error", { error: error instanceof Error ? error.name : "unknown" });
|
|
410
|
+
return json({
|
|
411
|
+
error: "Internal error.",
|
|
412
|
+
code: "internal"
|
|
413
|
+
}, 500, NO_STORE_HEADERS$1);
|
|
414
|
+
}
|
|
415
|
+
function resolveActor(event) {
|
|
416
|
+
const locals = event.locals ?? {};
|
|
417
|
+
const user = locals.user;
|
|
418
|
+
const sessionId = locals.sessionId;
|
|
419
|
+
if (!user || !sessionId) return null;
|
|
420
|
+
if (!("authMethod" in locals)) return null;
|
|
421
|
+
return {
|
|
422
|
+
user,
|
|
423
|
+
membership: locals.membership ?? null,
|
|
424
|
+
permissions: Array.isArray(locals.permissions) ? locals.permissions : [],
|
|
425
|
+
tenantId: locals.tenantId ?? null,
|
|
426
|
+
sessionId,
|
|
427
|
+
authMethod: locals.authMethod ?? null,
|
|
428
|
+
parent: locals.sessionParent ?? null
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
function createPasswordCredentialHandlers(options) {
|
|
432
|
+
const { tenantId: tenantOption, cookieName = "sid", cookiePath = "/", cookieDomain, cookieSecure, cookieSameSite = "lax", ...serviceOptions } = options;
|
|
433
|
+
let servicePromise = null;
|
|
434
|
+
const service = () => {
|
|
435
|
+
servicePromise ??= PasswordCredentialService.create(serviceOptions);
|
|
436
|
+
return servicePromise;
|
|
437
|
+
};
|
|
438
|
+
const resolveTenant = async (event) => (typeof tenantOption === "function" ? await tenantOption(event) : tenantOption) ?? null;
|
|
439
|
+
const clearCookie = (event) => event.cookies.delete(cookieName, {
|
|
440
|
+
path: cookiePath,
|
|
441
|
+
domain: cookieDomain
|
|
442
|
+
});
|
|
443
|
+
const management = (run) => async (event) => {
|
|
444
|
+
const actor = resolveActor(event);
|
|
445
|
+
if (!actor) return unauthenticated();
|
|
446
|
+
try {
|
|
447
|
+
const input = await body(event);
|
|
448
|
+
return json(await run(await service(), actor, input, event), 200, NO_STORE_HEADERS$1);
|
|
449
|
+
} catch (error) {
|
|
450
|
+
return errorResponse(error);
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
return {
|
|
454
|
+
service,
|
|
455
|
+
signIn: async (event) => {
|
|
456
|
+
try {
|
|
457
|
+
const input = await body(event);
|
|
458
|
+
const result = await (await service()).signIn({
|
|
459
|
+
identifier: str(input.email) || str(input.identifier),
|
|
460
|
+
password: str(input.password),
|
|
461
|
+
tenantId: await resolveTenant(event),
|
|
462
|
+
ipAddress: event.getClientAddress?.(),
|
|
463
|
+
userAgent: event.request.headers.get("user-agent") ?? void 0,
|
|
464
|
+
replaceSessionId: event.cookies.get(cookieName) ?? null
|
|
465
|
+
});
|
|
466
|
+
event.cookies.set(cookieName, result.sessionId, {
|
|
467
|
+
path: cookiePath,
|
|
468
|
+
domain: cookieDomain,
|
|
469
|
+
httpOnly: true,
|
|
470
|
+
secure: cookieSecure ?? event.url.protocol === "https:",
|
|
471
|
+
sameSite: cookieSameSite,
|
|
472
|
+
maxAge: Math.max(1, Math.floor((Date.parse(result.expiresAt) - Date.now()) / 1e3))
|
|
473
|
+
});
|
|
474
|
+
return json({
|
|
475
|
+
authenticated: true,
|
|
476
|
+
userId: result.userId,
|
|
477
|
+
tenantId: result.tenantId,
|
|
478
|
+
expiresAt: result.expiresAt,
|
|
479
|
+
mustChange: result.mustChange
|
|
480
|
+
}, 200, NO_STORE_HEADERS$1);
|
|
481
|
+
} catch (error) {
|
|
482
|
+
return errorResponse(error);
|
|
483
|
+
}
|
|
484
|
+
},
|
|
485
|
+
setPassword: management((svc, actor, input, event) => svc.setPassword({
|
|
486
|
+
actor,
|
|
487
|
+
userId: str(input.userId).trim() || (actor.user.id ?? ""),
|
|
488
|
+
password: str(input.password),
|
|
489
|
+
ipAddress: event.getClientAddress?.()
|
|
490
|
+
})),
|
|
491
|
+
changePassword: management(async (svc, actor, input, event) => {
|
|
492
|
+
const result = await svc.changePassword({
|
|
493
|
+
actor,
|
|
494
|
+
currentPassword: str(input.currentPassword),
|
|
495
|
+
newPassword: str(input.newPassword),
|
|
496
|
+
ipAddress: event.getClientAddress?.()
|
|
497
|
+
});
|
|
498
|
+
if (result.endedCurrentSession) {
|
|
499
|
+
clearCookie(event);
|
|
500
|
+
return {
|
|
501
|
+
revokedSessions: result.revokedSessions,
|
|
502
|
+
signedOut: true
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
return { revokedSessions: result.revokedSessions };
|
|
506
|
+
}),
|
|
507
|
+
resetPassword: management((svc, actor, input, event) => svc.resetPassword({
|
|
508
|
+
actor,
|
|
509
|
+
userId: str(input.userId).trim(),
|
|
510
|
+
password: str(input.password),
|
|
511
|
+
mustChange: typeof input.mustChange === "boolean" ? input.mustChange : input.mustChange === "false" ? false : void 0,
|
|
512
|
+
ipAddress: event.getClientAddress?.()
|
|
513
|
+
})),
|
|
514
|
+
clearPassword: management((svc, actor, input, event) => svc.clearPassword({
|
|
515
|
+
actor,
|
|
516
|
+
userId: str(input.userId).trim() || (actor.user.id ?? ""),
|
|
517
|
+
currentPassword: str(input.currentPassword) || void 0,
|
|
518
|
+
ipAddress: event.getClientAddress?.()
|
|
519
|
+
}))
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
//#endregion
|
|
354
523
|
//#region src/sveltekit/resource-list-handler.ts
|
|
355
524
|
var STANDARD_API_ACTIONS = [
|
|
356
525
|
"list",
|
|
@@ -1195,6 +1364,6 @@ var NO_STORE_HEADERS = {
|
|
|
1195
1364
|
pragma: "no-cache"
|
|
1196
1365
|
};
|
|
1197
1366
|
//#endregion
|
|
1198
|
-
export { DiscoveryArtifactValidationError, InvalidBearerError, MobileAuthError, MobileAuthService, SMRT_APP_RESULT_CONTRACT, SMRT_APP_RESULT_SCHEMA, SMRT_APP_RESULT_VERSION, SMRT_DISCOVERY_CONFORMANCE_ARTIFACT_SCHEMA, SMRT_DISCOVERY_CONFORMANCE_SCHEMA, SMRT_DISCOVERY_CONFORMANCE_VERSION, SMRT_MCP_RESULT_METADATA_KEY, TerminalAuthError, TerminalAuthRateLimitError, TerminalAuthService, beginOidcLogin, canonicalizeDiscoveryArtifact, completeOidcLogin, createBearerSessionDeleteHandler, createDeviceCredentialHandlers, createDiscoveryConformanceArtifact, createMobileAuthHandlers, createOidcCallbackHandler, createOidcLoginHandler, createResourceListHandler, createSessionCookie, createSessionHandler, createTerminalAuthStartHandler, createTerminalAuthTokenHandler, defaultSessionLocals, deriveCommandRequirements, destroySessionCookie, loadBearerSessionContext, mountTerminalLoginPage, parseBearerToken, readMobileBearerToken, resolveMobileUploadDedupKey, switchSessionTenant, validateDiscoveryConformanceArtifact, validateMobileRedirectUri };
|
|
1367
|
+
export { DiscoveryArtifactValidationError, InvalidBearerError, MobileAuthError, MobileAuthService, SMRT_APP_RESULT_CONTRACT, SMRT_APP_RESULT_SCHEMA, SMRT_APP_RESULT_VERSION, SMRT_DISCOVERY_CONFORMANCE_ARTIFACT_SCHEMA, SMRT_DISCOVERY_CONFORMANCE_SCHEMA, SMRT_DISCOVERY_CONFORMANCE_VERSION, SMRT_MCP_RESULT_METADATA_KEY, TerminalAuthError, TerminalAuthRateLimitError, TerminalAuthService, beginOidcLogin, canonicalizeDiscoveryArtifact, completeOidcLogin, createBearerSessionDeleteHandler, createDeviceCredentialHandlers, createDiscoveryConformanceArtifact, createMobileAuthHandlers, createOidcCallbackHandler, createOidcLoginHandler, createPasswordCredentialHandlers, createResourceListHandler, createSessionCookie, createSessionHandler, createTerminalAuthStartHandler, createTerminalAuthTokenHandler, defaultSessionLocals, deriveCommandRequirements, destroySessionCookie, loadBearerSessionContext, mountTerminalLoginPage, parseBearerToken, readMobileBearerToken, resolveMobileUploadDedupKey, switchSessionTenant, validateDiscoveryConformanceArtifact, validateMobileRedirectUri };
|
|
1199
1368
|
|
|
1200
1369
|
//# sourceMappingURL=sveltekit.js.map
|