@getstrata/core 1.1.4 → 1.1.6
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/CHANGELOG.md +19 -0
- package/dist/core/auth/oauth/oidcIdToken.d.ts +7 -1
- package/dist/core/security/oauthState.d.ts +14 -1
- package/dist/core/security/webhookSignature.d.ts +3 -0
- package/dist/entries/audit/exportAuditLogs.js +3 -0
- package/dist/entries/audit/siemFormatter.js +3 -0
- package/dist/entries/auth/basicAuthGuard.js +3 -0
- package/dist/entries/auth/intendedUrlCookie.js +3 -0
- package/dist/entries/auth/jwt.js +3 -0
- package/dist/entries/auth/jwtGuard.js +3 -0
- package/dist/entries/auth/oauth/oidcProvider.js +33 -5
- package/dist/entries/auth/oauth/providers.js +3 -0
- package/dist/entries/auth/oneTimeToken.js +3 -0
- package/dist/entries/auth/passwordConfirmCookie.js +3 -0
- package/dist/entries/auth/passwordLogin.js +3 -0
- package/dist/entries/auth/sessionCookie.js +3 -0
- package/dist/entries/auth/sessionGuard.js +3 -0
- package/dist/entries/auth/tokenHash.js +3 -0
- package/dist/entries/cache/createCacheStore.js +3 -0
- package/dist/entries/facades.js +3 -0
- package/dist/entries/http/corsMiddleware.js +3 -0
- package/dist/entries/http/csrfMiddleware.js +4 -1
- package/dist/entries/http/csrfToken.js +3 -0
- package/dist/entries/http/flashMiddleware.js +3 -0
- package/dist/entries/http/flashSession.js +3 -0
- package/dist/entries/http/memoryThrottleMiddleware.js +3 -0
- package/dist/entries/http/scimThrottleMiddleware.js +3 -0
- package/dist/entries/http/signedUrl.js +3 -0
- package/dist/entries/http/throttleMiddleware.js +3 -0
- package/dist/entries/jobs/exportAuditLogsJob.js +3 -0
- package/dist/entries/mail/mailer.js +3 -0
- package/dist/entries/openapi/generator.js +3 -0
- package/dist/entries/queue/createAppQueue.js +3 -0
- package/dist/entries/queue/publicQueue.js +3 -0
- package/dist/entries/queue/queueMetrics.js +3 -0
- package/dist/entries/queue/redisQueue.js +3 -0
- package/dist/entries/security/oauthState.js +78 -0
- package/dist/entries/security/totp.js +3 -0
- package/dist/entries/security/webhookSignature.js +103 -0
- package/dist/entries/tracing/tracingMiddleware.js +3 -0
- package/dist/framework/public-api.d.ts +1 -0
- package/dist/index.js +42 -4
- package/package.json +7 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @getstrata/core changelog
|
|
2
2
|
|
|
3
|
+
## 1.1.6
|
|
4
|
+
|
|
5
|
+
- Add optional OIDC cookie login and loopback discovery
|
|
6
|
+
|
|
7
|
+
## Unreleased
|
|
8
|
+
|
|
9
|
+
- `sealOidcPkceCookie()` / `readOidcPkceCookie()` on `@getstrata/core/security/oauthState` store the OIDC PKCE handshake in the `oidc_pkce` cookie, bound to the signed OAuth state.
|
|
10
|
+
- OIDC discovery, token, and JWKS fetches allow loopback issuers outside production. `OIDC_ALLOW_PRIVATE=true` allows other private hosts and is ignored in production.
|
|
11
|
+
- `OidcProvider.getAuthorizationUrl()` still throws. Call `createAuthorization()`.
|
|
12
|
+
|
|
13
|
+
## 1.1.5
|
|
14
|
+
|
|
15
|
+
- Close dogfood gaps: webhook docs, starter extras, signing helper
|
|
16
|
+
|
|
17
|
+
## Unreleased
|
|
18
|
+
|
|
19
|
+
- `signWebhookBody(secret, body)` and `signedWebhookHeaders()` on `@getstrata/core/security/webhookSignature` sign outbound JSON using `webhookSignatureHeader()`.
|
|
20
|
+
- CSRF skips `POST /billing/webhooks/*` by path (Stripe-style inbound webhooks), same as SAML ACS and `/scim/`.
|
|
21
|
+
|
|
3
22
|
## 1.1.4
|
|
4
23
|
|
|
5
24
|
- Publish http/uploads, validateUploadFile, migration-adoption docs
|
|
@@ -5,6 +5,12 @@ interface OidcDiscovery {
|
|
|
5
5
|
token_endpoint?: string;
|
|
6
6
|
jwks_uri?: string;
|
|
7
7
|
}
|
|
8
|
+
declare function oidcSafeFetchOptions(url: string): {
|
|
9
|
+
allowHttp: boolean;
|
|
10
|
+
allowPrivate: boolean;
|
|
11
|
+
timeoutMs: number;
|
|
12
|
+
maxRedirects: number;
|
|
13
|
+
};
|
|
8
14
|
declare function loadOidcDiscovery(issuer: string): Promise<OidcDiscovery>;
|
|
9
15
|
declare function oidcAccessTokenHash(accessToken: string): string;
|
|
10
16
|
declare function verifyOidcIdToken(token: string, options: {
|
|
@@ -16,4 +22,4 @@ declare function verifyOidcIdToken(token: string, options: {
|
|
|
16
22
|
}): Promise<JwtPayload>;
|
|
17
23
|
declare function resetOidcDiscoveryCacheForTests(): void;
|
|
18
24
|
export type { OidcDiscovery };
|
|
19
|
-
export { loadOidcDiscovery, oidcAccessTokenHash, resetOidcDiscoveryCacheForTests, verifyOidcIdToken, };
|
|
25
|
+
export { loadOidcDiscovery, oidcAccessTokenHash, oidcSafeFetchOptions, resetOidcDiscoveryCacheForTests, verifyOidcIdToken, };
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
declare const OAUTH_STATE_COOKIE = "oauth_state";
|
|
2
|
+
declare const OIDC_PKCE_COOKIE = "oidc_pkce";
|
|
3
|
+
interface OidcPkceSeal {
|
|
4
|
+
state: string;
|
|
5
|
+
nonce: string;
|
|
6
|
+
codeVerifier: string;
|
|
7
|
+
}
|
|
2
8
|
declare function verifySignedOAuthStateValue(value: string): boolean;
|
|
3
9
|
declare function createOAuthState(): {
|
|
4
10
|
state: string;
|
|
@@ -9,4 +15,11 @@ declare function createOAuthStateCookie(): {
|
|
|
9
15
|
};
|
|
10
16
|
declare function verifyOAuthState(_request: Request, returnedState: string | null): boolean;
|
|
11
17
|
declare function clearOAuthStateCookie(): string;
|
|
12
|
-
|
|
18
|
+
declare function sealOidcPkceCookie(payload: OidcPkceSeal): string;
|
|
19
|
+
declare function clearOidcPkceCookie(): string;
|
|
20
|
+
declare function readOidcPkceCookie(request: Request, returnedState: string | null): {
|
|
21
|
+
nonce: string;
|
|
22
|
+
codeVerifier: string;
|
|
23
|
+
} | null;
|
|
24
|
+
export type { OidcPkceSeal };
|
|
25
|
+
export { clearOAuthStateCookie, clearOidcPkceCookie, createOAuthState, createOAuthStateCookie, OAUTH_STATE_COOKIE, OIDC_PKCE_COOKIE, readOidcPkceCookie, sealOidcPkceCookie, verifyOAuthState, verifySignedOAuthStateValue, };
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -58,6 +58,9 @@ function appUserAgent() {
|
|
|
58
58
|
function otelServiceName() {
|
|
59
59
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
60
60
|
}
|
|
61
|
+
function webhookSignatureHeader() {
|
|
62
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
63
|
+
}
|
|
61
64
|
function appDisplayName() {
|
|
62
65
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
63
66
|
}
|
|
@@ -539,6 +539,9 @@ function appUserAgent() {
|
|
|
539
539
|
function otelServiceName() {
|
|
540
540
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
541
541
|
}
|
|
542
|
+
function webhookSignatureHeader() {
|
|
543
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
544
|
+
}
|
|
542
545
|
function appDisplayName() {
|
|
543
546
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
544
547
|
}
|
|
@@ -121,6 +121,9 @@ function appUserAgent() {
|
|
|
121
121
|
function otelServiceName() {
|
|
122
122
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
123
123
|
}
|
|
124
|
+
function webhookSignatureHeader() {
|
|
125
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
126
|
+
}
|
|
124
127
|
function appDisplayName() {
|
|
125
128
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
126
129
|
}
|
package/dist/entries/auth/jwt.js
CHANGED
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -148,6 +148,9 @@ function appUserAgent() {
|
|
|
148
148
|
function otelServiceName() {
|
|
149
149
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
150
150
|
}
|
|
151
|
+
function webhookSignatureHeader() {
|
|
152
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
153
|
+
}
|
|
151
154
|
function appDisplayName() {
|
|
152
155
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
153
156
|
}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
// ../../src/core/auth/oauth/oidcProvider.ts
|
|
3
3
|
import { createHash as createHash2, randomBytes } from "crypto";
|
|
4
4
|
|
|
5
|
+
// ../../src/core/security/safeUrl.ts
|
|
6
|
+
import { lookup as dnsLookupImpl } from "dns/promises";
|
|
7
|
+
import { BadRequestError } from "@getstrata/core/errors/http";
|
|
8
|
+
|
|
5
9
|
// ../../src/core/runtime/appEnv.ts
|
|
6
10
|
var NON_PRODUCTION_APP_ENVS = new Set(["local", "development", "dev", "test", "testing", "ci"]);
|
|
7
11
|
function normalizeEnvValue(value) {
|
|
@@ -23,8 +27,6 @@ function envFlagEnabled(value) {
|
|
|
23
27
|
}
|
|
24
28
|
|
|
25
29
|
// ../../src/core/security/safeUrl.ts
|
|
26
|
-
import { lookup as dnsLookupImpl } from "dns/promises";
|
|
27
|
-
import { BadRequestError } from "@getstrata/core/errors/http";
|
|
28
30
|
var dnsLookup = dnsLookupImpl;
|
|
29
31
|
var BLOCKED_HOSTNAMES = new Set([
|
|
30
32
|
"localhost",
|
|
@@ -330,8 +332,33 @@ var jwksCache = new Map;
|
|
|
330
332
|
function issuerOrigin(issuer) {
|
|
331
333
|
return issuer.replace(/\/$/, "");
|
|
332
334
|
}
|
|
335
|
+
function oidcLoopbackHost(hostname) {
|
|
336
|
+
const host = hostname.trim().toLowerCase().replace(/^\[|\]$/gu, "");
|
|
337
|
+
return host === "localhost" || host === "127.0.0.1" || host === "::1";
|
|
338
|
+
}
|
|
339
|
+
function oidcOutboundAllowsPrivate(url) {
|
|
340
|
+
if (isProductionEnv()) {
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
if (process.env.OIDC_ALLOW_PRIVATE === "true") {
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
try {
|
|
347
|
+
return oidcLoopbackHost(new URL(url).hostname);
|
|
348
|
+
} catch {
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
function oidcSafeFetchOptions(url) {
|
|
353
|
+
return {
|
|
354
|
+
allowHttp: !isProductionEnv(),
|
|
355
|
+
allowPrivate: oidcOutboundAllowsPrivate(url),
|
|
356
|
+
timeoutMs: 1e4,
|
|
357
|
+
maxRedirects: 0
|
|
358
|
+
};
|
|
359
|
+
}
|
|
333
360
|
async function fetchJson(url) {
|
|
334
|
-
const response = await safeFetch(url, { headers: { accept: "application/json" } },
|
|
361
|
+
const response = await safeFetch(url, { headers: { accept: "application/json" } }, oidcSafeFetchOptions(url));
|
|
335
362
|
return await response.json();
|
|
336
363
|
}
|
|
337
364
|
async function loadOidcDiscovery(issuer) {
|
|
@@ -532,11 +559,12 @@ class OidcProvider {
|
|
|
532
559
|
client_secret: this.options.clientSecret,
|
|
533
560
|
code_verifier: handshake.codeVerifier
|
|
534
561
|
});
|
|
535
|
-
const
|
|
562
|
+
const tokenEndpoint = requireOidcEndpoint(discovery.token_endpoint, "token_endpoint");
|
|
563
|
+
const tokenResponse = await safeFetch(tokenEndpoint, {
|
|
536
564
|
method: "POST",
|
|
537
565
|
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
538
566
|
body
|
|
539
|
-
},
|
|
567
|
+
}, oidcSafeFetchOptions(tokenEndpoint));
|
|
540
568
|
const tokenBody = await tokenResponse.json();
|
|
541
569
|
if (!tokenBody.access_token) {
|
|
542
570
|
throw new Error("OIDC token exchange failed.");
|
|
@@ -58,6 +58,9 @@ function appUserAgent() {
|
|
|
58
58
|
function otelServiceName() {
|
|
59
59
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
60
60
|
}
|
|
61
|
+
function webhookSignatureHeader() {
|
|
62
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
63
|
+
}
|
|
61
64
|
function appDisplayName() {
|
|
62
65
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
63
66
|
}
|
|
@@ -256,6 +256,9 @@ function appUserAgent() {
|
|
|
256
256
|
function otelServiceName() {
|
|
257
257
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
258
258
|
}
|
|
259
|
+
function webhookSignatureHeader() {
|
|
260
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
261
|
+
}
|
|
259
262
|
function appDisplayName() {
|
|
260
263
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
261
264
|
}
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -390,6 +390,9 @@ function appUserAgent() {
|
|
|
390
390
|
function otelServiceName() {
|
|
391
391
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
392
392
|
}
|
|
393
|
+
function webhookSignatureHeader() {
|
|
394
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
395
|
+
}
|
|
393
396
|
function appDisplayName() {
|
|
394
397
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
395
398
|
}
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -128,6 +128,9 @@ function appUserAgent() {
|
|
|
128
128
|
function otelServiceName() {
|
|
129
129
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
130
130
|
}
|
|
131
|
+
function webhookSignatureHeader() {
|
|
132
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
133
|
+
}
|
|
131
134
|
function appDisplayName() {
|
|
132
135
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
133
136
|
}
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
package/dist/entries/facades.js
CHANGED
|
@@ -70,6 +70,9 @@ function appUserAgent() {
|
|
|
70
70
|
function otelServiceName() {
|
|
71
71
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
72
72
|
}
|
|
73
|
+
function webhookSignatureHeader() {
|
|
74
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
75
|
+
}
|
|
73
76
|
function appDisplayName() {
|
|
74
77
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
75
78
|
}
|
|
@@ -58,6 +58,9 @@ function appUserAgent() {
|
|
|
58
58
|
function otelServiceName() {
|
|
59
59
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
60
60
|
}
|
|
61
|
+
function webhookSignatureHeader() {
|
|
62
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
63
|
+
}
|
|
61
64
|
function appDisplayName() {
|
|
62
65
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
63
66
|
}
|
|
@@ -65,6 +65,9 @@ function appUserAgent() {
|
|
|
65
65
|
function otelServiceName() {
|
|
66
66
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
67
67
|
}
|
|
68
|
+
function webhookSignatureHeader() {
|
|
69
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
70
|
+
}
|
|
68
71
|
function appDisplayName() {
|
|
69
72
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
70
73
|
}
|
|
@@ -239,7 +242,7 @@ function samlAcsPathname() {
|
|
|
239
242
|
}
|
|
240
243
|
}
|
|
241
244
|
function skipsCsrfPath(pathname) {
|
|
242
|
-
return pathname === samlAcsPathname() || pathname.startsWith("/scim/");
|
|
245
|
+
return pathname === samlAcsPathname() || pathname.startsWith("/scim/") || pathname.startsWith("/billing/webhooks/");
|
|
243
246
|
}
|
|
244
247
|
function appendSetCookie(response, cookie) {
|
|
245
248
|
const headers = new Headers(response.headers);
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -58,6 +58,9 @@ function appUserAgent() {
|
|
|
58
58
|
function otelServiceName() {
|
|
59
59
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
60
60
|
}
|
|
61
|
+
function webhookSignatureHeader() {
|
|
62
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
63
|
+
}
|
|
61
64
|
function appDisplayName() {
|
|
62
65
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
63
66
|
}
|
|
@@ -62,6 +62,9 @@ function appUserAgent() {
|
|
|
62
62
|
function otelServiceName() {
|
|
63
63
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
64
64
|
}
|
|
65
|
+
function webhookSignatureHeader() {
|
|
66
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
67
|
+
}
|
|
65
68
|
function appDisplayName() {
|
|
66
69
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
67
70
|
}
|
|
@@ -63,6 +63,9 @@ function appUserAgent() {
|
|
|
63
63
|
function otelServiceName() {
|
|
64
64
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
65
65
|
}
|
|
66
|
+
function webhookSignatureHeader() {
|
|
67
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
68
|
+
}
|
|
66
69
|
function appDisplayName() {
|
|
67
70
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
68
71
|
}
|
|
@@ -63,6 +63,9 @@ function appUserAgent() {
|
|
|
63
63
|
function otelServiceName() {
|
|
64
64
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
65
65
|
}
|
|
66
|
+
function webhookSignatureHeader() {
|
|
67
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
68
|
+
}
|
|
66
69
|
function appDisplayName() {
|
|
67
70
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
68
71
|
}
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -58,6 +58,9 @@ function appUserAgent() {
|
|
|
58
58
|
function otelServiceName() {
|
|
59
59
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
60
60
|
}
|
|
61
|
+
function webhookSignatureHeader() {
|
|
62
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
63
|
+
}
|
|
61
64
|
function appDisplayName() {
|
|
62
65
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
63
66
|
}
|
|
@@ -58,6 +58,9 @@ function appUserAgent() {
|
|
|
58
58
|
function otelServiceName() {
|
|
59
59
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
60
60
|
}
|
|
61
|
+
function webhookSignatureHeader() {
|
|
62
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
63
|
+
}
|
|
61
64
|
function appDisplayName() {
|
|
62
65
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
63
66
|
}
|
|
@@ -215,6 +215,9 @@ function appUserAgent() {
|
|
|
215
215
|
function otelServiceName() {
|
|
216
216
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
217
217
|
}
|
|
218
|
+
function webhookSignatureHeader() {
|
|
219
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
220
|
+
}
|
|
218
221
|
function appDisplayName() {
|
|
219
222
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
220
223
|
}
|
|
@@ -215,6 +215,9 @@ function appUserAgent() {
|
|
|
215
215
|
function otelServiceName() {
|
|
216
216
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
217
217
|
}
|
|
218
|
+
function webhookSignatureHeader() {
|
|
219
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
220
|
+
}
|
|
218
221
|
function appDisplayName() {
|
|
219
222
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
220
223
|
}
|
|
@@ -218,6 +218,9 @@ function appUserAgent() {
|
|
|
218
218
|
function otelServiceName() {
|
|
219
219
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
220
220
|
}
|
|
221
|
+
function webhookSignatureHeader() {
|
|
222
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
223
|
+
}
|
|
221
224
|
function appDisplayName() {
|
|
222
225
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
223
226
|
}
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -87,6 +90,7 @@ function sdkClientClassName() {
|
|
|
87
90
|
|
|
88
91
|
// ../../src/core/security/oauthState.ts
|
|
89
92
|
var OAUTH_STATE_COOKIE = "oauth_state";
|
|
93
|
+
var OIDC_PKCE_COOKIE = "oidc_pkce";
|
|
90
94
|
var OAUTH_STATE_TTL_MS = 10 * 60 * 1000;
|
|
91
95
|
function resolveOAuthStateSecret() {
|
|
92
96
|
return requireConfiguredSecret(["OAUTH_STATE_SECRET", "SESSION_SECRET"], "oauth-state-secret");
|
|
@@ -141,11 +145,85 @@ function verifyOAuthState(_request, returnedState) {
|
|
|
141
145
|
function clearOAuthStateCookie() {
|
|
142
146
|
return `${OAUTH_STATE_COOKIE}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0${isProductionEnv() ? "; Secure" : ""}`;
|
|
143
147
|
}
|
|
148
|
+
function oauthCookieSuffix() {
|
|
149
|
+
return `Path=/; HttpOnly; SameSite=Lax${isProductionEnv() ? "; Secure" : ""}`;
|
|
150
|
+
}
|
|
151
|
+
function sealOidcPkceCookie(payload) {
|
|
152
|
+
const body = Buffer.from(JSON.stringify({
|
|
153
|
+
state: payload.state,
|
|
154
|
+
nonce: payload.nonce,
|
|
155
|
+
codeVerifier: payload.codeVerifier,
|
|
156
|
+
iat: Date.now()
|
|
157
|
+
})).toString("base64url");
|
|
158
|
+
const signature = createHmac("sha256", resolveOAuthStateSecret()).update(body).digest("base64url");
|
|
159
|
+
const value = encodeURIComponent(`${body}.${signature}`);
|
|
160
|
+
return `${OIDC_PKCE_COOKIE}=${value}; ${oauthCookieSuffix()}; Max-Age=600`;
|
|
161
|
+
}
|
|
162
|
+
function clearOidcPkceCookie() {
|
|
163
|
+
return `${OIDC_PKCE_COOKIE}=; ${oauthCookieSuffix()}; Max-Age=0`;
|
|
164
|
+
}
|
|
165
|
+
function readOidcPkceCookie(request, returnedState) {
|
|
166
|
+
const state = returnedState?.trim() ?? "";
|
|
167
|
+
if (!state) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
const header = request.headers.get("cookie") ?? "";
|
|
171
|
+
for (const part of header.split(";")) {
|
|
172
|
+
const [name, ...rest] = part.trim().split("=");
|
|
173
|
+
if (name !== OIDC_PKCE_COOKIE) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
return unsealOidcPkceValue(rest.join("="), state);
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
function unsealOidcPkceValue(rawValue, returnedState) {
|
|
181
|
+
let decoded = rawValue;
|
|
182
|
+
try {
|
|
183
|
+
decoded = decodeURIComponent(rawValue);
|
|
184
|
+
} catch {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
const splitAt = decoded.lastIndexOf(".");
|
|
188
|
+
if (splitAt <= 0) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
const body = decoded.slice(0, splitAt);
|
|
192
|
+
const signature = decoded.slice(splitAt + 1);
|
|
193
|
+
const expected = createHmac("sha256", resolveOAuthStateSecret()).update(body).digest("base64url");
|
|
194
|
+
const expectedBuffer = Buffer.from(expected);
|
|
195
|
+
const actualBuffer = Buffer.from(signature);
|
|
196
|
+
if (expectedBuffer.length !== actualBuffer.length || !timingSafeEqual(expectedBuffer, actualBuffer)) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
let parsed;
|
|
200
|
+
try {
|
|
201
|
+
parsed = JSON.parse(Buffer.from(body, "base64url").toString("utf8"));
|
|
202
|
+
} catch {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
if (typeof parsed.state !== "string" || typeof parsed.nonce !== "string" || typeof parsed.codeVerifier !== "string" || typeof parsed.iat !== "number" || !parsed.nonce.trim() || !parsed.codeVerifier.trim()) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
if (Date.now() - parsed.iat > OAUTH_STATE_TTL_MS) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
const left = Buffer.from(parsed.state);
|
|
212
|
+
const right = Buffer.from(returnedState);
|
|
213
|
+
if (left.length !== right.length || !timingSafeEqual(left, right)) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
return { nonce: parsed.nonce, codeVerifier: parsed.codeVerifier };
|
|
217
|
+
}
|
|
144
218
|
export {
|
|
145
219
|
OAUTH_STATE_COOKIE,
|
|
220
|
+
OIDC_PKCE_COOKIE,
|
|
146
221
|
clearOAuthStateCookie,
|
|
222
|
+
clearOidcPkceCookie,
|
|
147
223
|
createOAuthState,
|
|
148
224
|
createOAuthStateCookie,
|
|
225
|
+
readOidcPkceCookie,
|
|
226
|
+
sealOidcPkceCookie,
|
|
149
227
|
verifyOAuthState,
|
|
150
228
|
verifySignedOAuthStateValue
|
|
151
229
|
};
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// ../../src/core/security/webhookSignature.ts
|
|
3
|
+
import { createHmac } from "crypto";
|
|
4
|
+
|
|
5
|
+
// ../../src/core/runtime/appEnv.ts
|
|
6
|
+
var NON_PRODUCTION_APP_ENVS = new Set(["local", "development", "dev", "test", "testing", "ci"]);
|
|
7
|
+
function normalizeEnvValue(value) {
|
|
8
|
+
return (value ?? "").trim().toLowerCase();
|
|
9
|
+
}
|
|
10
|
+
function isProductionEnv(env = process.env) {
|
|
11
|
+
const appEnv = normalizeEnvValue(env.APP_ENV);
|
|
12
|
+
const nodeEnv = normalizeEnvValue(env.NODE_ENV);
|
|
13
|
+
if (appEnv === "production" || nodeEnv === "production") {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (appEnv === "") {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return !NON_PRODUCTION_APP_ENVS.has(appEnv);
|
|
20
|
+
}
|
|
21
|
+
function envFlagEnabled(value) {
|
|
22
|
+
return value === "true";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
26
|
+
function appKeyPrefix() {
|
|
27
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
28
|
+
}
|
|
29
|
+
function appCookieName(kind) {
|
|
30
|
+
return `${appKeyPrefix()}_${kind}`;
|
|
31
|
+
}
|
|
32
|
+
function appDevSecret(kind) {
|
|
33
|
+
return `${appKeyPrefix()}-dev-${kind}`;
|
|
34
|
+
}
|
|
35
|
+
function requireConfiguredSecret(names, devKind, env = process.env) {
|
|
36
|
+
for (const name of names) {
|
|
37
|
+
const value = env[name]?.trim();
|
|
38
|
+
if (value) {
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (isProductionEnv(env)) {
|
|
43
|
+
throw new Error(`${names[0]} must be set outside development. Do not derive secrets from the app name.`);
|
|
44
|
+
}
|
|
45
|
+
return appDevSecret(devKind);
|
|
46
|
+
}
|
|
47
|
+
function namespacedRedisKey(kind) {
|
|
48
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
49
|
+
}
|
|
50
|
+
function smtpEhloHost() {
|
|
51
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
52
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
53
|
+
return safe || "strata.local";
|
|
54
|
+
}
|
|
55
|
+
function siemEventType() {
|
|
56
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
57
|
+
}
|
|
58
|
+
function appUserAgent() {
|
|
59
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
60
|
+
}
|
|
61
|
+
function otelServiceName() {
|
|
62
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
|
+
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
67
|
+
function appDisplayName() {
|
|
68
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
69
|
+
}
|
|
70
|
+
function appEnv() {
|
|
71
|
+
return process.env.APP_ENV?.trim() || "local";
|
|
72
|
+
}
|
|
73
|
+
function appUrl() {
|
|
74
|
+
return (process.env.APP_URL?.trim() || "http://localhost:3000").replace(/\/$/, "");
|
|
75
|
+
}
|
|
76
|
+
function apiPrefix() {
|
|
77
|
+
const raw = process.env.API_PREFIX?.trim() || "/api/v1";
|
|
78
|
+
const withSlash = raw.startsWith("/") ? raw : `/${raw}`;
|
|
79
|
+
const trimmed = withSlash.replace(/\/+$/, "");
|
|
80
|
+
return trimmed || "/api/v1";
|
|
81
|
+
}
|
|
82
|
+
function sdkClientClassName() {
|
|
83
|
+
const override = process.env.APP_SDK_CLASS?.trim();
|
|
84
|
+
if (override && /^[A-Za-z_][A-Za-z0-9_]*$/.test(override)) {
|
|
85
|
+
return override;
|
|
86
|
+
}
|
|
87
|
+
const fromName = appDisplayName().replace(/[^A-Za-z0-9]/g, "");
|
|
88
|
+
return fromName ? `${fromName}Client` : "AppClient";
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ../../src/core/security/webhookSignature.ts
|
|
92
|
+
function signWebhookBody(secret, body) {
|
|
93
|
+
return createHmac("sha256", secret).update(body).digest("hex");
|
|
94
|
+
}
|
|
95
|
+
function signedWebhookHeaders(secret, body) {
|
|
96
|
+
return {
|
|
97
|
+
[webhookSignatureHeader()]: signWebhookBody(secret, body)
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
signWebhookBody,
|
|
102
|
+
signedWebhookHeaders
|
|
103
|
+
};
|
|
@@ -61,6 +61,9 @@ function appUserAgent() {
|
|
|
61
61
|
function otelServiceName() {
|
|
62
62
|
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
63
63
|
}
|
|
64
|
+
function webhookSignatureHeader() {
|
|
65
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
66
|
+
}
|
|
64
67
|
function appDisplayName() {
|
|
65
68
|
return process.env.APP_NAME?.trim() || "Strata";
|
|
66
69
|
}
|
|
@@ -139,6 +139,7 @@ export { assertPathUnderRoot, assertUrlPathUnderRoot } from "../core/security/sa
|
|
|
139
139
|
export { assertSafeOutboundUrl, assertSafeOutboundUrlResolved, isBlockedHostname, isBlockedIpAddress, pinUrlToAddress, resetDnsLookupForTests, resolveSafeOutboundTarget, setDnsLookupForTests, } from "../core/security/safeUrl.ts";
|
|
140
140
|
export type { SecurityEventDetails } from "../core/security/securityEvents.ts";
|
|
141
141
|
export { logSecurityEvent } from "../core/security/securityEvents.ts";
|
|
142
|
+
export { signedWebhookHeaders, signWebhookBody } from "../core/security/webhookSignature.ts";
|
|
142
143
|
export type { StorageDriver } from "../core/storage/storage.ts";
|
|
143
144
|
export { createStorageDriver, LocalStorageDriver, resetDefaultStorage, StorageManager, } from "../core/storage/storage.ts";
|
|
144
145
|
export { enableTenantRlsSql, enableUserOwnedRlsSql, generatedRlsBootstrapSql, RLS_HELPER_SQL, } from "../core/tenant/enableTenantRls.ts";
|
package/dist/index.js
CHANGED
|
@@ -1899,8 +1899,33 @@ var jwksCache = new Map;
|
|
|
1899
1899
|
function issuerOrigin(issuer) {
|
|
1900
1900
|
return issuer.replace(/\/$/, "");
|
|
1901
1901
|
}
|
|
1902
|
+
function oidcLoopbackHost(hostname) {
|
|
1903
|
+
const host = hostname.trim().toLowerCase().replace(/^\[|\]$/gu, "");
|
|
1904
|
+
return host === "localhost" || host === "127.0.0.1" || host === "::1";
|
|
1905
|
+
}
|
|
1906
|
+
function oidcOutboundAllowsPrivate(url) {
|
|
1907
|
+
if (isProductionEnv()) {
|
|
1908
|
+
return false;
|
|
1909
|
+
}
|
|
1910
|
+
if (process.env.OIDC_ALLOW_PRIVATE === "true") {
|
|
1911
|
+
return true;
|
|
1912
|
+
}
|
|
1913
|
+
try {
|
|
1914
|
+
return oidcLoopbackHost(new URL(url).hostname);
|
|
1915
|
+
} catch {
|
|
1916
|
+
return false;
|
|
1917
|
+
}
|
|
1918
|
+
}
|
|
1919
|
+
function oidcSafeFetchOptions(url) {
|
|
1920
|
+
return {
|
|
1921
|
+
allowHttp: !isProductionEnv(),
|
|
1922
|
+
allowPrivate: oidcOutboundAllowsPrivate(url),
|
|
1923
|
+
timeoutMs: 1e4,
|
|
1924
|
+
maxRedirects: 0
|
|
1925
|
+
};
|
|
1926
|
+
}
|
|
1902
1927
|
async function fetchJson(url) {
|
|
1903
|
-
const response = await safeFetch(url, { headers: { accept: "application/json" } },
|
|
1928
|
+
const response = await safeFetch(url, { headers: { accept: "application/json" } }, oidcSafeFetchOptions(url));
|
|
1904
1929
|
return await response.json();
|
|
1905
1930
|
}
|
|
1906
1931
|
async function loadOidcDiscovery(issuer) {
|
|
@@ -2097,11 +2122,12 @@ class OidcProvider {
|
|
|
2097
2122
|
client_secret: this.options.clientSecret,
|
|
2098
2123
|
code_verifier: handshake.codeVerifier
|
|
2099
2124
|
});
|
|
2100
|
-
const
|
|
2125
|
+
const tokenEndpoint = requireOidcEndpoint(discovery.token_endpoint, "token_endpoint");
|
|
2126
|
+
const tokenResponse = await safeFetch(tokenEndpoint, {
|
|
2101
2127
|
method: "POST",
|
|
2102
2128
|
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
2103
2129
|
body
|
|
2104
|
-
},
|
|
2130
|
+
}, oidcSafeFetchOptions(tokenEndpoint));
|
|
2105
2131
|
const tokenBody = await tokenResponse.json();
|
|
2106
2132
|
if (!tokenBody.access_token) {
|
|
2107
2133
|
throw new Error("OIDC token exchange failed.");
|
|
@@ -8608,7 +8634,7 @@ function samlAcsPathname() {
|
|
|
8608
8634
|
}
|
|
8609
8635
|
}
|
|
8610
8636
|
function skipsCsrfPath(pathname) {
|
|
8611
|
-
return pathname === samlAcsPathname() || pathname.startsWith("/scim/");
|
|
8637
|
+
return pathname === samlAcsPathname() || pathname.startsWith("/scim/") || pathname.startsWith("/billing/webhooks/");
|
|
8612
8638
|
}
|
|
8613
8639
|
function appendSetCookie(response, cookie) {
|
|
8614
8640
|
const headers = new Headers(response.headers);
|
|
@@ -10909,6 +10935,16 @@ function isPublicReadsEnabled() {
|
|
|
10909
10935
|
function guestCanViewResource() {
|
|
10910
10936
|
return isPublicReadsEnabled();
|
|
10911
10937
|
}
|
|
10938
|
+
// ../../src/core/security/webhookSignature.ts
|
|
10939
|
+
import { createHmac as createHmac7 } from "crypto";
|
|
10940
|
+
function signWebhookBody(secret, body) {
|
|
10941
|
+
return createHmac7("sha256", secret).update(body).digest("hex");
|
|
10942
|
+
}
|
|
10943
|
+
function signedWebhookHeaders(secret, body) {
|
|
10944
|
+
return {
|
|
10945
|
+
[webhookSignatureHeader()]: signWebhookBody(secret, body)
|
|
10946
|
+
};
|
|
10947
|
+
}
|
|
10912
10948
|
// ../../src/core/tenant/enableTenantRls.ts
|
|
10913
10949
|
function assertSafeIdentifier2(identifier) {
|
|
10914
10950
|
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {
|
|
@@ -12021,7 +12057,9 @@ export {
|
|
|
12021
12057
|
setSamlAssertionReplayStoreForTests,
|
|
12022
12058
|
siemEventType,
|
|
12023
12059
|
signJwt,
|
|
12060
|
+
signWebhookBody,
|
|
12024
12061
|
signedUrl,
|
|
12062
|
+
signedWebhookHeaders,
|
|
12025
12063
|
singularize,
|
|
12026
12064
|
smtpEhloHost,
|
|
12027
12065
|
spaContentSecurityPolicy,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getstrata/core",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.6",
|
|
4
4
|
"description": "Strata Bun framework public API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -840,6 +840,11 @@
|
|
|
840
840
|
"import": "./dist/entries/security/stripeWebhook.js",
|
|
841
841
|
"default": "./dist/entries/security/stripeWebhook.js"
|
|
842
842
|
},
|
|
843
|
+
"./security/webhookSignature": {
|
|
844
|
+
"types": "./dist/core/security/webhookSignature.d.ts",
|
|
845
|
+
"import": "./dist/entries/security/webhookSignature.js",
|
|
846
|
+
"default": "./dist/entries/security/webhookSignature.js"
|
|
847
|
+
},
|
|
843
848
|
"./security/timingSafeCompare": {
|
|
844
849
|
"types": "./dist/core/security/timingSafeCompare.d.ts",
|
|
845
850
|
"import": "./dist/entries/security/timingSafeCompare.js",
|
|
@@ -928,7 +933,7 @@
|
|
|
928
933
|
"build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external mysql2 --external @node-saml/node-saml",
|
|
929
934
|
"build:types": "tsc -p tsconfig.types.json",
|
|
930
935
|
"prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
|
|
931
|
-
"build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/emailVerification.ts entries/auth/jwt.ts entries/auth/jwtGuard.ts entries/auth/basicAuthGuard.ts entries/auth/tokenAbilityChecker.ts entries/auth/membershipMiddleware.ts entries/auth/membershipScope.ts entries/auth/membershipService.ts entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/saml/samlServiceProvider.ts entries/auth/password.ts entries/auth/passwordLogin.ts entries/auth/oneTimeToken.ts entries/auth/intendedUrlCookie.ts entries/auth/passwordConfirmCookie.ts entries/auth/policy.ts entries/auth/scimAuthMiddleware.ts entries/auth/sessionCookie.ts entries/auth/sessionGuard.ts entries/auth/tokenHash.ts entries/audit/exportAuditLogs.ts entries/audit/siemFormatter.ts entries/admin/formatValue.ts entries/admin/registry.ts entries/admin/types.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/authUserDirectory.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/errors.ts entries/database/factory.ts entries/database/migrations.ts entries/database/migrations/types.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/repositoryQuery.ts entries/database/seeders.ts entries/database/seeders/types.ts entries/database/schema.ts entries/database/sqliteConnection.ts entries/database/table.ts entries/database/types.ts entries/database/whereBuilder.ts entries/facades.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/clientIp.ts entries/http/cookies.ts entries/http/contentNegotiation.ts entries/http/conditionalResponse.ts entries/http/corsMiddleware.ts entries/http/csrfMiddleware.ts entries/http/csrfProtection.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/flashMiddleware.ts entries/http/formRequest.ts entries/http/metricsMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/requireVerifiedMiddleware.ts entries/http/requirePasswordConfirmMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/statelessAuth.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/uploads.ts entries/http/validation.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/appEnv.ts entries/runtime/frontendMode.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/recoveryCodes.ts entries/security/safeFetch.ts entries/security/safePath.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/tenant/enableTenantRls.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts --outdir dist --root . --target bun --external bun --external eta --external mysql2 --external @node-saml/node-saml --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/emailVerification --external @getstrata/core/auth/guard --external @getstrata/core/auth/jwt --external @getstrata/core/auth/jwtGuard --external @getstrata/core/auth/basicAuthGuard --external @getstrata/core/auth/tokenAbilityChecker --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/saml/samlServiceProvider --external @getstrata/core/auth/password --external @getstrata/core/auth/passwordLogin --external @getstrata/core/auth/oneTimeToken --external @getstrata/core/auth/intendedUrlCookie --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/authUserDirectory --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/connectionContext --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/dialect --external @getstrata/core/database/mysqlConnection --external @getstrata/core/database/namedConnections --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/sqliteConnection --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/statelessAuth --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/uploads --external @getstrata/core/http/validation --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appEnv --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/recoveryCodes --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safePath --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/tenant/enableTenantRls --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
936
|
+
"build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/emailVerification.ts entries/auth/jwt.ts entries/auth/jwtGuard.ts entries/auth/basicAuthGuard.ts entries/auth/tokenAbilityChecker.ts entries/auth/membershipMiddleware.ts entries/auth/membershipScope.ts entries/auth/membershipService.ts entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/saml/samlServiceProvider.ts entries/auth/password.ts entries/auth/passwordLogin.ts entries/auth/oneTimeToken.ts entries/auth/intendedUrlCookie.ts entries/auth/passwordConfirmCookie.ts entries/auth/policy.ts entries/auth/scimAuthMiddleware.ts entries/auth/sessionCookie.ts entries/auth/sessionGuard.ts entries/auth/tokenHash.ts entries/audit/exportAuditLogs.ts entries/audit/siemFormatter.ts entries/admin/formatValue.ts entries/admin/registry.ts entries/admin/types.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/authUserDirectory.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/errors.ts entries/database/factory.ts entries/database/migrations.ts entries/database/migrations/types.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/repositoryQuery.ts entries/database/seeders.ts entries/database/seeders/types.ts entries/database/schema.ts entries/database/sqliteConnection.ts entries/database/table.ts entries/database/types.ts entries/database/whereBuilder.ts entries/facades.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/clientIp.ts entries/http/cookies.ts entries/http/contentNegotiation.ts entries/http/conditionalResponse.ts entries/http/corsMiddleware.ts entries/http/csrfMiddleware.ts entries/http/csrfProtection.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/flashMiddleware.ts entries/http/formRequest.ts entries/http/metricsMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/requireVerifiedMiddleware.ts entries/http/requirePasswordConfirmMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/statelessAuth.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/uploads.ts entries/http/validation.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/appEnv.ts entries/runtime/frontendMode.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/recoveryCodes.ts entries/security/safeFetch.ts entries/security/safePath.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/webhookSignature.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/tenant/enableTenantRls.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts --outdir dist --root . --target bun --external bun --external eta --external mysql2 --external @node-saml/node-saml --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/emailVerification --external @getstrata/core/auth/guard --external @getstrata/core/auth/jwt --external @getstrata/core/auth/jwtGuard --external @getstrata/core/auth/basicAuthGuard --external @getstrata/core/auth/tokenAbilityChecker --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/saml/samlServiceProvider --external @getstrata/core/auth/password --external @getstrata/core/auth/passwordLogin --external @getstrata/core/auth/oneTimeToken --external @getstrata/core/auth/intendedUrlCookie --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/authUserDirectory --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/connectionContext --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/dialect --external @getstrata/core/database/mysqlConnection --external @getstrata/core/database/namedConnections --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/sqliteConnection --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/statelessAuth --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/uploads --external @getstrata/core/http/validation --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appEnv --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/recoveryCodes --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safePath --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/webhookSignature --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/tenant/enableTenantRls --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
932
937
|
"build:shims": "bun ../../scripts/write-core-shared-shims.ts"
|
|
933
938
|
},
|
|
934
939
|
"publishConfig": {
|