@supacloud/lite 0.29.4 → 0.30.0
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 +25 -0
- package/dist/cli.js +182 -51
- package/dist/index.js +182 -51
- package/dist/project-runtime.d.ts.map +1 -1
- package/dist/runtime/auth/handler.d.ts +1 -0
- package/dist/runtime/auth/handler.d.ts.map +1 -1
- package/dist/runtime/auth/oauth.d.ts +6 -0
- package/dist/runtime/auth/oauth.d.ts.map +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/node/load-config.d.ts +3 -0
- package/dist/runtime/node/load-config.d.ts.map +1 -1
- package/dist/runtime/storage/handler.d.ts +3 -0
- package/dist/runtime/storage/handler.d.ts.map +1 -1
- package/dist/runtime/storage/image-transform.d.ts +7 -1
- package/dist/runtime/storage/image-transform.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +2 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/package.json +13 -13
package/dist/index.js
CHANGED
|
@@ -88,7 +88,7 @@ function randomToken(bytes = 32) {
|
|
|
88
88
|
// package.json
|
|
89
89
|
var package_default = {
|
|
90
90
|
name: "@supacloud/lite",
|
|
91
|
-
version: "0.
|
|
91
|
+
version: "0.30.0",
|
|
92
92
|
description: "Bun-native, single-project Supabase-compatible backend powered by PGlite or native PostgreSQL",
|
|
93
93
|
type: "module",
|
|
94
94
|
license: "Apache-2.0",
|
|
@@ -147,16 +147,16 @@ var package_default = {
|
|
|
147
147
|
"@electric-sql/pglite-pgmq": "0.0.8",
|
|
148
148
|
"@electric-sql/pglite-pgvector": "0.0.11",
|
|
149
149
|
"@electric-sql/pglite-postgis": "0.2.10",
|
|
150
|
-
"@supacloud/db": "
|
|
150
|
+
"@supacloud/db": "0.18.1",
|
|
151
151
|
"exact-mirror": "1.2.6",
|
|
152
152
|
tar: "^7.5.22",
|
|
153
153
|
typebox: "1.3.37"
|
|
154
154
|
},
|
|
155
155
|
devDependencies: {
|
|
156
|
-
"@supacloud/app": "
|
|
157
|
-
"@supacloud/contracts": "
|
|
158
|
-
"@supacloud/compiler": "
|
|
159
|
-
"@supacloud/elysia": "
|
|
156
|
+
"@supacloud/app": "0.27.2",
|
|
157
|
+
"@supacloud/contracts": "0.11.2",
|
|
158
|
+
"@supacloud/compiler": "0.46.7",
|
|
159
|
+
"@supacloud/elysia": "0.33.2",
|
|
160
160
|
"@supabase/supabase-js": "^2.117.3",
|
|
161
161
|
"@types/bun": "^1.4.3",
|
|
162
162
|
effect: "4.0.5",
|
|
@@ -165,13 +165,13 @@ var package_default = {
|
|
|
165
165
|
typescript: "^7.0.2"
|
|
166
166
|
},
|
|
167
167
|
overrides: {
|
|
168
|
-
"@supacloud/db": "
|
|
169
|
-
"@supacloud/app": "
|
|
170
|
-
"@supacloud/compiler": "
|
|
171
|
-
"@supacloud/elysia": "
|
|
172
|
-
"@supacloud/contracts": "
|
|
173
|
-
"@supacloud/commands": "
|
|
174
|
-
"@supacloud/delivery": "
|
|
168
|
+
"@supacloud/db": "0.18.1",
|
|
169
|
+
"@supacloud/app": "0.27.2",
|
|
170
|
+
"@supacloud/compiler": "0.46.7",
|
|
171
|
+
"@supacloud/elysia": "0.33.2",
|
|
172
|
+
"@supacloud/contracts": "0.11.2",
|
|
173
|
+
"@supacloud/commands": "0.9.4",
|
|
174
|
+
"@supacloud/delivery": "0.19.1",
|
|
175
175
|
"@graphql-tools/utils": "^12.0.4"
|
|
176
176
|
},
|
|
177
177
|
engines: {
|
|
@@ -248,6 +248,13 @@ function isAllowedRedirect(requested, siteUrl, allowList = []) {
|
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
// src/runtime/auth/oauth.ts
|
|
251
|
+
class OAuthAccountIneligibleError extends Error {
|
|
252
|
+
code;
|
|
253
|
+
constructor(code) {
|
|
254
|
+
super(code);
|
|
255
|
+
this.code = code;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
251
258
|
var PRESETS = {
|
|
252
259
|
google: {
|
|
253
260
|
authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
@@ -370,14 +377,30 @@ class OAuthService {
|
|
|
370
377
|
const msg = encodeURIComponent(e instanceof Error ? e.message : "oauth_error");
|
|
371
378
|
return redirect(`${flow.redirect_to}#error=server_error&error_description=${msg}`);
|
|
372
379
|
}
|
|
373
|
-
|
|
380
|
+
let userId;
|
|
381
|
+
try {
|
|
382
|
+
userId = await this.upsertUser(provider.name, profile);
|
|
383
|
+
} catch (e) {
|
|
384
|
+
if (e instanceof OAuthAccountIneligibleError) {
|
|
385
|
+
return redirect(`${flow.redirect_to}#error=access_denied&error_code=${e.code}`);
|
|
386
|
+
}
|
|
387
|
+
throw e;
|
|
388
|
+
}
|
|
374
389
|
if (flow.code_challenge) {
|
|
375
390
|
const authCode = randomToken(24);
|
|
376
391
|
await this.db.query(`insert into auth.flow_state (provider, provider_state, redirect_to, code_challenge, code_challenge_method, auth_code, user_id, expires_at)
|
|
377
392
|
values ($1, $2, $3, $4, $5, $6, $7, now() + interval '5 minutes')`, [flow.provider, randomToken(16), flow.redirect_to, flow.code_challenge, flow.code_challenge_method, authCode, userId]);
|
|
378
393
|
return redirect(`${flow.redirect_to}?code=${authCode}`);
|
|
379
394
|
}
|
|
380
|
-
|
|
395
|
+
let session;
|
|
396
|
+
try {
|
|
397
|
+
session = await createSession(userId);
|
|
398
|
+
} catch (e) {
|
|
399
|
+
if (e instanceof OAuthAccountIneligibleError) {
|
|
400
|
+
return redirect(`${flow.redirect_to}#error=access_denied&error_code=${e.code}`);
|
|
401
|
+
}
|
|
402
|
+
throw e;
|
|
403
|
+
}
|
|
381
404
|
const hash = `#access_token=${session.access_token}&refresh_token=${session.refresh_token}&expires_in=${session.expires_in}&token_type=bearer&provider_token=`;
|
|
382
405
|
return redirect(`${flow.redirect_to}${hash}`);
|
|
383
406
|
}
|
|
@@ -428,31 +451,37 @@ class OAuthService {
|
|
|
428
451
|
return profile;
|
|
429
452
|
}
|
|
430
453
|
async upsertUser(provider, profile) {
|
|
431
|
-
|
|
454
|
+
return this.db.transaction((query) => this.upsertUserInTransaction(query, provider, profile));
|
|
455
|
+
}
|
|
456
|
+
async upsertUserInTransaction(query, provider, profile) {
|
|
457
|
+
const existing = await query(`select user_id from auth.identities where provider = $1 and provider_id = $2`, [provider, profile.id]);
|
|
432
458
|
if (existing.rows[0]) {
|
|
433
|
-
await this.
|
|
459
|
+
await this.assertUserEligible(query, existing.rows[0].user_id);
|
|
460
|
+
await query(`update auth.identities set last_sign_in_at = now(), identity_data = $3 where provider = $1 and provider_id = $2`, [
|
|
434
461
|
provider,
|
|
435
462
|
profile.id,
|
|
436
463
|
JSON.stringify({ sub: profile.id, email: profile.email, ...profile.metadata })
|
|
437
464
|
]);
|
|
438
|
-
await
|
|
465
|
+
await query(`update auth.users set last_sign_in_at = now() where id = $1`, [existing.rows[0].user_id]);
|
|
439
466
|
return existing.rows[0].user_id;
|
|
440
467
|
}
|
|
441
468
|
let userId;
|
|
442
469
|
const email = profile.email?.toLowerCase() ?? null;
|
|
443
470
|
const verified = !!profile.email && profile.emailVerified === true;
|
|
444
471
|
if (email && verified) {
|
|
445
|
-
const byEmail = await
|
|
472
|
+
const byEmail = await query(`select id from auth.users where email = $1`, [email]);
|
|
446
473
|
userId = byEmail.rows[0]?.id;
|
|
474
|
+
if (userId)
|
|
475
|
+
await this.assertUserEligible(query, userId);
|
|
447
476
|
}
|
|
448
477
|
if (!userId) {
|
|
449
478
|
let userEmail = verified ? email : null;
|
|
450
479
|
if (userEmail) {
|
|
451
|
-
const taken = await
|
|
480
|
+
const taken = await query(`select 1 from auth.users where email = $1`, [userEmail]);
|
|
452
481
|
if (taken.rows.length > 0)
|
|
453
482
|
userEmail = null;
|
|
454
483
|
}
|
|
455
|
-
const created = await
|
|
484
|
+
const created = await query(`insert into auth.users (aud, role, email, email_confirmed_at, last_sign_in_at, raw_app_meta_data, raw_user_meta_data)
|
|
456
485
|
values ('authenticated','authenticated',$1, $2, now(),
|
|
457
486
|
$3::jsonb, $4::jsonb) returning id`, [
|
|
458
487
|
userEmail,
|
|
@@ -465,12 +494,22 @@ class OAuthService {
|
|
|
465
494
|
throw new Error("OAuth user creation returned no row");
|
|
466
495
|
userId = user.id;
|
|
467
496
|
}
|
|
468
|
-
await
|
|
497
|
+
await query(`insert into auth.identities (user_id, provider, provider_id, identity_data)
|
|
469
498
|
values ($1, $2, $3, $4::jsonb)`, [userId, provider, profile.id, JSON.stringify({ sub: profile.id, email: profile.email, ...profile.metadata })]);
|
|
470
499
|
if (!userId)
|
|
471
500
|
throw new Error("OAuth identity has no user ID");
|
|
472
501
|
return userId;
|
|
473
502
|
}
|
|
503
|
+
async assertUserEligible(query, userId) {
|
|
504
|
+
const users = await query(`select deleted_at is not null as is_deleted,
|
|
505
|
+
coalesce(banned_until > now(), false) as is_banned
|
|
506
|
+
from auth.users where id = $1 for update`, [userId]);
|
|
507
|
+
const user = users.rows[0];
|
|
508
|
+
if (!user || user.is_deleted)
|
|
509
|
+
throw new OAuthAccountIneligibleError("user_not_found");
|
|
510
|
+
if (user.is_banned)
|
|
511
|
+
throw new OAuthAccountIneligibleError("user_banned");
|
|
512
|
+
}
|
|
474
513
|
}
|
|
475
514
|
function redirect(location) {
|
|
476
515
|
return new Response(null, { status: 303, headers: { location } });
|
|
@@ -1356,6 +1395,8 @@ class AuthHandler {
|
|
|
1356
1395
|
return await this.admin(req, ctx, path, method);
|
|
1357
1396
|
return authError(404, "not_found", `unknown auth endpoint: ${path}`);
|
|
1358
1397
|
} catch (e) {
|
|
1398
|
+
if (e instanceof OAuthAccountIneligibleError)
|
|
1399
|
+
return authError(400, e.code, e.message);
|
|
1359
1400
|
const msg = e instanceof Error ? e.message : String(e);
|
|
1360
1401
|
return authError(500, "unexpected_failure", msg);
|
|
1361
1402
|
}
|
|
@@ -1419,8 +1460,12 @@ class AuthHandler {
|
|
|
1419
1460
|
const body = await req.json().catch(() => ({}));
|
|
1420
1461
|
if (grantType === "password") {
|
|
1421
1462
|
const email = (body.email ?? "").toLowerCase().trim();
|
|
1422
|
-
const res = await this.db.query(`select
|
|
1463
|
+
const res = await this.db.query(`select *, coalesce(banned_until > now(), false) as is_banned
|
|
1464
|
+
from auth.users where email = $1 and deleted_at is null`, [email]);
|
|
1423
1465
|
const user = res.rows[0];
|
|
1466
|
+
if (user?.encrypted_password && user.is_banned) {
|
|
1467
|
+
return authError(400, "user_banned", "User is banned");
|
|
1468
|
+
}
|
|
1424
1469
|
if (!user || !user.encrypted_password || !await verifyPassword(body.password ?? "", user.encrypted_password)) {
|
|
1425
1470
|
await this.audit("login_failed", { actorEmail: email, traits: { grant_type: "password" } });
|
|
1426
1471
|
return authError(400, "invalid_credentials", "Invalid login credentials");
|
|
@@ -1446,8 +1491,7 @@ class AuthHandler {
|
|
|
1446
1491
|
const userId = await this.oauth.exchangePkce(authCode, verifier);
|
|
1447
1492
|
if (!userId)
|
|
1448
1493
|
return authError(403, "flow_state_not_found", "invalid or expired auth code");
|
|
1449
|
-
|
|
1450
|
-
return json(200, await this.sessionForOAuth(ures.rows[0]));
|
|
1494
|
+
return json(200, await this.sessionForOAuth(userId));
|
|
1451
1495
|
}
|
|
1452
1496
|
return authError(400, "invalid_grant", `unsupported grant_type: ${grantType}`);
|
|
1453
1497
|
}
|
|
@@ -1742,7 +1786,10 @@ Or sign in with this link: ${link}`
|
|
|
1742
1786
|
tokenTypes: `{${types.join(",")}}`,
|
|
1743
1787
|
email: email?.toLowerCase().trim() ?? null
|
|
1744
1788
|
};
|
|
1745
|
-
return this.db.transaction((query) =>
|
|
1789
|
+
return this.db.transaction(async (query) => {
|
|
1790
|
+
const user = await this.claimEmailToken(query, redemption);
|
|
1791
|
+
return user ? this.sessionFor(user, undefined, undefined, query) : null;
|
|
1792
|
+
});
|
|
1746
1793
|
}
|
|
1747
1794
|
async claimEmailToken(query, redemption) {
|
|
1748
1795
|
const candidate = await this.findEmailTokenCandidate(query, redemption);
|
|
@@ -1754,7 +1801,10 @@ Or sign in with this link: ${link}`
|
|
|
1754
1801
|
return claimedToken ? this.confirmEmailTokenUser(query, claimedToken) : null;
|
|
1755
1802
|
}
|
|
1756
1803
|
async lockAndDeleteEmailToken(query, candidate, redemption) {
|
|
1757
|
-
await query(`select id from auth.users where id = $1
|
|
1804
|
+
const eligible = await query(`select id from auth.users where id = $1 and deleted_at is null
|
|
1805
|
+
and (banned_until is null or banned_until <= now()) for update`, [candidate.user_id]);
|
|
1806
|
+
if (eligible.rows.length === 0)
|
|
1807
|
+
return null;
|
|
1758
1808
|
const claimedTokens = await query(`delete from auth.one_time_tokens
|
|
1759
1809
|
where id = $1 and token = $2 and token_type = any($3::text[])
|
|
1760
1810
|
and expires_at > now() and attempts < $4
|
|
@@ -1807,10 +1857,10 @@ Or sign in with this link: ${link}`
|
|
|
1807
1857
|
return json(200, session);
|
|
1808
1858
|
}
|
|
1809
1859
|
const types = body.type === "recovery" ? ["recovery"] : body.type === "magiclink" ? ["magiclink"] : ["otp", "magiclink"];
|
|
1810
|
-
const
|
|
1811
|
-
if (!
|
|
1860
|
+
const session = await this.redeem(token, types, body.email);
|
|
1861
|
+
if (!session)
|
|
1812
1862
|
return authError(403, "otp_expired", "Token has expired or is invalid");
|
|
1813
|
-
return json(200,
|
|
1863
|
+
return json(200, session);
|
|
1814
1864
|
}
|
|
1815
1865
|
async redeemPhoneOtp(phone, code) {
|
|
1816
1866
|
const tokenDigest = `hmac-sha256:v1:${await keyedDigest(this.config.jwtSecret, "supacloud-lite:phone-otp:v1", `${phone}\x00${code}`)}`;
|
|
@@ -1851,11 +1901,10 @@ Or sign in with this link: ${link}`
|
|
|
1851
1901
|
const token = url.searchParams.get("token") ?? "";
|
|
1852
1902
|
const type = url.searchParams.get("type") ?? "magiclink";
|
|
1853
1903
|
const redirectTo = resolveRedirect(url.searchParams.get("redirect_to"), this.config.siteUrl, this.config.uriAllowList, this.config.enforceRedirectAllowList);
|
|
1854
|
-
const
|
|
1855
|
-
if (!
|
|
1904
|
+
const session = await this.redeem(token, [type]);
|
|
1905
|
+
if (!session) {
|
|
1856
1906
|
return new Response(null, { status: 303, headers: { location: `${redirectTo}#error=access_denied&error_code=otp_expired` } });
|
|
1857
1907
|
}
|
|
1858
|
-
const session = await this.sessionFor(user);
|
|
1859
1908
|
const hash = `#access_token=${session.access_token}&refresh_token=${session.refresh_token}&expires_in=${session.expires_in}&token_type=bearer&type=${type}`;
|
|
1860
1909
|
return new Response(null, { status: 303, headers: { location: `${redirectTo}${hash}` } });
|
|
1861
1910
|
}
|
|
@@ -2156,6 +2205,11 @@ Or sign in with this link: ${link}`
|
|
|
2156
2205
|
return authError(422, "mfa_verification_failed", "Invalid TOTP code entered");
|
|
2157
2206
|
}
|
|
2158
2207
|
const session = await this.db.transaction(async (query) => {
|
|
2208
|
+
const currentUsers = await query(`select * from auth.users where id = $1 and deleted_at is null
|
|
2209
|
+
and (banned_until is null or banned_until <= now()) for update`, [user.id]);
|
|
2210
|
+
const currentUser = currentUsers.rows[0];
|
|
2211
|
+
if (!currentUser)
|
|
2212
|
+
return null;
|
|
2159
2213
|
const claimed = await query(`update auth.mfa_challenges set verified_at = now()
|
|
2160
2214
|
where id = $1 and factor_id = $2 and verified_at is null and expires_at >= now()
|
|
2161
2215
|
returning id`, [challenge.id, factorId]);
|
|
@@ -2164,7 +2218,7 @@ Or sign in with this link: ${link}`
|
|
|
2164
2218
|
if (factor.status !== "verified") {
|
|
2165
2219
|
await query(`update auth.mfa_factors set status = 'verified', updated_at = now() where id = $1`, [factorId]);
|
|
2166
2220
|
}
|
|
2167
|
-
return this.sessionFor(
|
|
2221
|
+
return this.sessionFor(currentUser, undefined, {
|
|
2168
2222
|
aal: "aal2",
|
|
2169
2223
|
amr: [
|
|
2170
2224
|
{ method: "password", timestamp: Math.floor(Date.now() / 1000) },
|
|
@@ -2225,6 +2279,18 @@ Or sign in with this link: ${link}`
|
|
|
2225
2279
|
}
|
|
2226
2280
|
async rotateRefreshToken(token) {
|
|
2227
2281
|
return this.db.transaction(async (query) => {
|
|
2282
|
+
const availableToken = await this.findAvailableRefreshToken(query, token);
|
|
2283
|
+
if (!availableToken)
|
|
2284
|
+
return authError(400, "refresh_token_not_found", "Invalid Refresh Token: Refresh Token Not Found");
|
|
2285
|
+
const userResult = await query(`select *, coalesce(banned_until > now(), false) as is_banned
|
|
2286
|
+
from auth.users where id = $1 for update`, [availableToken.user_id]);
|
|
2287
|
+
const user = userResult.rows[0];
|
|
2288
|
+
if (!user || user.deleted_at !== null) {
|
|
2289
|
+
return authError(400, "refresh_token_not_found", "Invalid Refresh Token: Refresh Token Not Found");
|
|
2290
|
+
}
|
|
2291
|
+
if (user.is_banned) {
|
|
2292
|
+
return authError(400, "user_banned", "Invalid Refresh Token: User Banned");
|
|
2293
|
+
}
|
|
2228
2294
|
const claimedToken = await this.claimRefreshToken(query, token);
|
|
2229
2295
|
if (!claimedToken)
|
|
2230
2296
|
return authError(400, "refresh_token_not_found", "Invalid Refresh Token: Refresh Token Not Found");
|
|
@@ -2232,14 +2298,19 @@ Or sign in with this link: ${link}`
|
|
|
2232
2298
|
const expiryError = this.refreshExpiryError(claimedToken, sessionStartedAt);
|
|
2233
2299
|
if (expiryError)
|
|
2234
2300
|
return expiryError;
|
|
2235
|
-
const
|
|
2236
|
-
const session = await this.sessionFor(userResult.rows[0], token, {
|
|
2301
|
+
const session = await this.sessionFor(user, token, {
|
|
2237
2302
|
sessionId: claimedToken.session_id ?? undefined,
|
|
2238
2303
|
sessionStartedAt: sessionStartedAt === null ? undefined : Math.floor(sessionStartedAt / 1000)
|
|
2239
2304
|
}, query);
|
|
2240
2305
|
return json(200, session);
|
|
2241
2306
|
});
|
|
2242
2307
|
}
|
|
2308
|
+
async findAvailableRefreshToken(query, token) {
|
|
2309
|
+
const available = await query(`select user_id, session_id, created_at
|
|
2310
|
+
from auth.refresh_tokens
|
|
2311
|
+
where token = $1 and revoked is not true`, [token]);
|
|
2312
|
+
return available.rows[0];
|
|
2313
|
+
}
|
|
2243
2314
|
async claimRefreshToken(query, token) {
|
|
2244
2315
|
const claimed = await query(`update auth.refresh_tokens set revoked = true, updated_at = now()
|
|
2245
2316
|
where token = $1 and revoked is not true
|
|
@@ -2267,7 +2338,8 @@ Or sign in with this link: ${link}`
|
|
|
2267
2338
|
const claims = await this.claimsFromBearer(req);
|
|
2268
2339
|
if (!claims?.sub)
|
|
2269
2340
|
return null;
|
|
2270
|
-
const res = await this.db.query(`select * from auth.users where id = $1
|
|
2341
|
+
const res = await this.db.query(`select * from auth.users where id = $1 and deleted_at is null
|
|
2342
|
+
and (banned_until is null or banned_until <= now())`, [claims.sub]);
|
|
2271
2343
|
return res.rows[0] ?? null;
|
|
2272
2344
|
}
|
|
2273
2345
|
async claimsFromBearer(req) {
|
|
@@ -2296,14 +2368,22 @@ Or sign in with this link: ${link}`
|
|
|
2296
2368
|
is_anonymous: u.is_anonymous ?? false
|
|
2297
2369
|
};
|
|
2298
2370
|
}
|
|
2299
|
-
sessionForOAuth(
|
|
2300
|
-
return this.
|
|
2301
|
-
|
|
2371
|
+
sessionForOAuth(userId) {
|
|
2372
|
+
return this.db.transaction(async (query) => {
|
|
2373
|
+
const res = await query(`select *, coalesce(banned_until > now(), false) as is_banned
|
|
2374
|
+
from auth.users where id = $1 for update`, [userId]);
|
|
2375
|
+
const user = res.rows[0];
|
|
2376
|
+
if (!user || user.deleted_at !== null)
|
|
2377
|
+
throw new OAuthAccountIneligibleError("user_not_found");
|
|
2378
|
+
if (user.is_banned)
|
|
2379
|
+
throw new OAuthAccountIneligibleError("user_banned");
|
|
2380
|
+
return this.sessionFor(user, undefined, {
|
|
2381
|
+
amr: [{ method: "oauth", timestamp: Math.floor(Date.now() / 1000) }]
|
|
2382
|
+
}, query);
|
|
2302
2383
|
});
|
|
2303
2384
|
}
|
|
2304
2385
|
async oauthSessionTokensFor(userId) {
|
|
2305
|
-
const
|
|
2306
|
-
const session = await this.sessionForOAuth(res.rows[0]);
|
|
2386
|
+
const session = await this.sessionForOAuth(userId);
|
|
2307
2387
|
return { access_token: session.access_token, refresh_token: session.refresh_token, expires_in: session.expires_in };
|
|
2308
2388
|
}
|
|
2309
2389
|
async sessionFor(user, parentToken, opts, query = (sql, params) => this.db.query(sql, params)) {
|
|
@@ -8968,8 +9048,18 @@ var IMAGE_FORMAT_CONTENT_TYPES = {
|
|
|
8968
9048
|
gif: "image/gif"
|
|
8969
9049
|
};
|
|
8970
9050
|
var MAX_TRANSFORM_DIMENSION = 2500;
|
|
8971
|
-
var MAX_TRANSFORM_BYTES =
|
|
9051
|
+
var MAX_TRANSFORM_BYTES = 500 * 1024 * 1024;
|
|
8972
9052
|
var MAX_TRANSFORM_PIXELS = 50000000;
|
|
9053
|
+
function resolveImageTransformLimits(options = {}) {
|
|
9054
|
+
const maxInputBytes = options.maxInputBytes === undefined ? MAX_TRANSFORM_BYTES : options.maxInputBytes;
|
|
9055
|
+
const maxOutputBytes = options.maxOutputBytes === undefined ? MAX_TRANSFORM_BYTES : options.maxOutputBytes;
|
|
9056
|
+
for (const [name, value] of Object.entries({ maxInputBytes, maxOutputBytes })) {
|
|
9057
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > MAX_TRANSFORM_BYTES) {
|
|
9058
|
+
throw new Error(`Invalid image transformation ${name}: expected 1..${MAX_TRANSFORM_BYTES} bytes`);
|
|
9059
|
+
}
|
|
9060
|
+
}
|
|
9061
|
+
return { maxInputBytes, maxOutputBytes };
|
|
9062
|
+
}
|
|
8973
9063
|
function invalid(message) {
|
|
8974
9064
|
return { ok: false, status: 400, error: "InvalidTransformation", message };
|
|
8975
9065
|
}
|
|
@@ -9027,7 +9117,16 @@ function parseImageTransform(query) {
|
|
|
9027
9117
|
if (quality !== undefined && format === "png") {
|
|
9028
9118
|
return invalid("quality is supported only for jpeg and webp output");
|
|
9029
9119
|
}
|
|
9030
|
-
return {
|
|
9120
|
+
return {
|
|
9121
|
+
ok: true,
|
|
9122
|
+
value: {
|
|
9123
|
+
resize,
|
|
9124
|
+
format,
|
|
9125
|
+
...width === undefined ? {} : { width },
|
|
9126
|
+
...height === undefined ? {} : { height },
|
|
9127
|
+
...quality === undefined ? {} : { quality }
|
|
9128
|
+
}
|
|
9129
|
+
};
|
|
9031
9130
|
}
|
|
9032
9131
|
function imageTransformToSearchParams(options) {
|
|
9033
9132
|
const query = new URLSearchParams;
|
|
@@ -9101,15 +9200,16 @@ function applyResize(image, metadata, options) {
|
|
|
9101
9200
|
const proportionalWidth = Math.max(1, Math.round(metadata.width * height / metadata.height));
|
|
9102
9201
|
image.resize(proportionalWidth);
|
|
9103
9202
|
}
|
|
9104
|
-
async function transformImage(source, options, knownSourceSize) {
|
|
9203
|
+
async function transformImage(source, options, knownSourceSize, configuredLimits = {}) {
|
|
9204
|
+
const limits = resolveImageTransformLimits(configuredLimits);
|
|
9105
9205
|
const actualSourceSize = source instanceof Uint8Array ? source.byteLength : await Promise.resolve(source.size);
|
|
9106
9206
|
const sourceSize = Math.max(knownSourceSize ?? 0, actualSourceSize);
|
|
9107
|
-
if (sourceSize >
|
|
9207
|
+
if (sourceSize > limits.maxInputBytes) {
|
|
9108
9208
|
return {
|
|
9109
9209
|
ok: false,
|
|
9110
9210
|
status: 413,
|
|
9111
9211
|
error: "ImageTooLarge",
|
|
9112
|
-
message:
|
|
9212
|
+
message: `The source image exceeds the transformation limit (${limits.maxInputBytes} bytes)`
|
|
9113
9213
|
};
|
|
9114
9214
|
}
|
|
9115
9215
|
const image = new Bun.Image(source, { maxPixels: MAX_TRANSFORM_PIXELS });
|
|
@@ -9142,12 +9242,12 @@ async function transformImage(source, options, knownSourceSize) {
|
|
|
9142
9242
|
}
|
|
9143
9243
|
try {
|
|
9144
9244
|
const bytes = await image.bytes();
|
|
9145
|
-
if (bytes.byteLength >
|
|
9245
|
+
if (bytes.byteLength > limits.maxOutputBytes) {
|
|
9146
9246
|
return {
|
|
9147
9247
|
ok: false,
|
|
9148
9248
|
status: 413,
|
|
9149
9249
|
error: "ImageTooLarge",
|
|
9150
|
-
message:
|
|
9250
|
+
message: `The transformed image exceeds the transformation limit (${limits.maxOutputBytes} bytes)`
|
|
9151
9251
|
};
|
|
9152
9252
|
}
|
|
9153
9253
|
return { ok: true, bytes, contentType };
|
|
@@ -9350,10 +9450,12 @@ class StorageHandler {
|
|
|
9350
9450
|
tusUploads = new Map;
|
|
9351
9451
|
mutationTail = Promise.resolve();
|
|
9352
9452
|
imageTransforms = new ImageTransformCache;
|
|
9453
|
+
transformLimits;
|
|
9353
9454
|
constructor(db, driver, config) {
|
|
9354
9455
|
this.db = db;
|
|
9355
9456
|
this.driver = driver;
|
|
9356
9457
|
this.config = config;
|
|
9458
|
+
this.transformLimits = resolveImageTransformLimits(config.imageTransformLimits);
|
|
9357
9459
|
}
|
|
9358
9460
|
async ensureBuckets(buckets) {
|
|
9359
9461
|
for (const b of buckets) {
|
|
@@ -9629,7 +9731,7 @@ class StorageHandler {
|
|
|
9629
9731
|
const source = await this.readObjectSource(row);
|
|
9630
9732
|
if (source === null)
|
|
9631
9733
|
throw new StorageObjectMissingError;
|
|
9632
|
-
return transformImage(source, parsed.value, objectSize(row));
|
|
9734
|
+
return transformImage(source, parsed.value, objectSize(row), this.transformLimits);
|
|
9633
9735
|
});
|
|
9634
9736
|
} catch (error) {
|
|
9635
9737
|
if (error instanceof StorageObjectMissingError) {
|
|
@@ -11476,6 +11578,7 @@ ${msg.text}` : `[mail] to=${msg.to} subject="${msg.subject}"`));
|
|
|
11476
11578
|
const storage = new StorageHandler(db, config.storageDriver ?? new MemoryStorageDriver, {
|
|
11477
11579
|
jwtSecret,
|
|
11478
11580
|
defaultFileSizeLimit: config.storageFileSizeLimit,
|
|
11581
|
+
imageTransformLimits: config.storageImageTransformLimits,
|
|
11479
11582
|
log
|
|
11480
11583
|
});
|
|
11481
11584
|
if (config.buckets?.length) {
|
|
@@ -13697,6 +13800,19 @@ function readStorage(root) {
|
|
|
13697
13800
|
const limit = getByteSize(storage, "file_size_limit");
|
|
13698
13801
|
if (limit !== undefined)
|
|
13699
13802
|
out.fileSizeLimit = limit;
|
|
13803
|
+
const image = tableAt(root, "storage.image_transformation");
|
|
13804
|
+
if (image) {
|
|
13805
|
+
const limits = {};
|
|
13806
|
+
for (const [key, field] of [["max_input_bytes", "maxInputBytes"], ["max_output_bytes", "maxOutputBytes"]]) {
|
|
13807
|
+
if (!image.values.has(key))
|
|
13808
|
+
continue;
|
|
13809
|
+
const value = getByteSize(image, key);
|
|
13810
|
+
if (value === undefined)
|
|
13811
|
+
throw new Error(`Invalid image transformation ${key}`);
|
|
13812
|
+
limits[field] = value;
|
|
13813
|
+
}
|
|
13814
|
+
out.imageTransformLimits = resolveImageTransformLimits(limits);
|
|
13815
|
+
}
|
|
13700
13816
|
const buckets = tableAt(root, "storage.buckets");
|
|
13701
13817
|
if (buckets && buckets.children.size > 0) {
|
|
13702
13818
|
out.buckets = [...buckets.children].map(([id, t]) => ({
|
|
@@ -14037,8 +14153,22 @@ async function loadFunctionsUnlocked(projectDir, options, mode) {
|
|
|
14037
14153
|
import { lstat, readdir as readdir2, readFile as readFile5 } from "fs/promises";
|
|
14038
14154
|
import { join as join6 } from "path";
|
|
14039
14155
|
|
|
14040
|
-
//
|
|
14156
|
+
// ../db/dist/index.js
|
|
14041
14157
|
import { createHash as createHash4 } from "crypto";
|
|
14158
|
+
|
|
14159
|
+
// ../contracts/dist/index.mjs
|
|
14160
|
+
var commandErrorBrand = Symbol.for("@supacloud/contracts/CommandError/v1");
|
|
14161
|
+
var commandErrorCodes = new Set([
|
|
14162
|
+
"COMMAND_INPUT_INVALID",
|
|
14163
|
+
"COMMAND_REJECTED",
|
|
14164
|
+
"COMMAND_UNAVAILABLE",
|
|
14165
|
+
"COMMAND_IDEMPOTENCY_CONFLICT",
|
|
14166
|
+
"COMMAND_RECEIPT_INVALID",
|
|
14167
|
+
"COMMAND_OUTCOME_UNKNOWN",
|
|
14168
|
+
"COMMAND_INPUT_EXPIRED"
|
|
14169
|
+
]);
|
|
14170
|
+
|
|
14171
|
+
// ../db/dist/index.js
|
|
14042
14172
|
var TOKEN = /__[A-Z][A-Z0-9_]*__/g;
|
|
14043
14173
|
var RESERVED_TOKEN = /__SC_BINDING_[A-Z0-9_]+__/;
|
|
14044
14174
|
var HASH = /^[a-f0-9]{64}$/;
|
|
@@ -14582,6 +14712,7 @@ async function createProjectBackend(options = {}) {
|
|
|
14582
14712
|
dbSchemas: config.api.schemas,
|
|
14583
14713
|
maxRows: config.api.maxRows,
|
|
14584
14714
|
storageFileSizeLimit: config.storage.fileSizeLimit,
|
|
14715
|
+
storageImageTransformLimits: config.storage.imageTransformLimits,
|
|
14585
14716
|
buckets: config.storage.buckets,
|
|
14586
14717
|
migrations: options.applyMigrations === false ? [] : project.migrations,
|
|
14587
14718
|
seedSql: options.applyMigrations === false || options.includeSeed === false ? undefined : project.seedSql,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-runtime.d.ts","sourceRoot":"","sources":["../src/project-runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"project-runtime.d.ts","sourceRoot":"","sources":["../src/project-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -163,6 +163,7 @@ export declare class AuthHandler {
|
|
|
163
163
|
private ensureEmailIdentity;
|
|
164
164
|
private userJsonWithRelations;
|
|
165
165
|
private rotateRefreshToken;
|
|
166
|
+
private findAvailableRefreshToken;
|
|
166
167
|
private claimRefreshToken;
|
|
167
168
|
private refreshSessionStartedAt;
|
|
168
169
|
private refreshExpiryError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,mBAAmB,CAAA;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAc,SAAS,EAAE,MAAM,aAAa,CAAA;AAEhF,OAAO,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import type { Database } from '../db/database.js';
|
|
14
14
|
type OAuthRawProfile = Record<string, unknown>;
|
|
15
|
+
export declare class OAuthAccountIneligibleError extends Error {
|
|
16
|
+
readonly code: 'user_banned' | 'user_not_found';
|
|
17
|
+
constructor(code: 'user_banned' | 'user_not_found');
|
|
18
|
+
}
|
|
15
19
|
/** Operator-supplied config for one OAuth provider. Endpoint URLs are optional for presets (google, github). */
|
|
16
20
|
export interface OAuthProviderConfig {
|
|
17
21
|
/** OAuth client id issued by the provider */
|
|
@@ -75,6 +79,8 @@ export declare class OAuthService {
|
|
|
75
79
|
private exchangeCode;
|
|
76
80
|
private fetchProfile;
|
|
77
81
|
private upsertUser;
|
|
82
|
+
private upsertUserInTransaction;
|
|
83
|
+
private assertUserEligible;
|
|
78
84
|
}
|
|
79
85
|
/** The minimal session the callback puts in the redirect fragment for the implicit flow. */
|
|
80
86
|
export interface OAuthSession {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import type { AuthSettings } from '../auth/settings.js';
|
|
|
12
12
|
import type { OAuthProviderConfig } from '../auth/oauth.js';
|
|
13
13
|
import type { RateLimitRule } from '../auth/rate-limit.js';
|
|
14
14
|
import type { BucketSeed } from '../types.js';
|
|
15
|
+
import { type ImageTransformLimits } from '../storage/image-transform.js';
|
|
15
16
|
import { type RuntimeMode } from '../functions/profile.js';
|
|
16
17
|
import type { GraphqlOptions } from '../graphql.js';
|
|
17
18
|
import { type Environment } from './config-toml.js';
|
|
@@ -70,6 +71,8 @@ export interface ApiConfig {
|
|
|
70
71
|
export interface StorageConfig {
|
|
71
72
|
/** [storage].file_size_limit: default per-bucket byte limit */
|
|
72
73
|
fileSizeLimit?: number;
|
|
74
|
+
/** [storage.image_transformation].max_input_bytes / max_output_bytes */
|
|
75
|
+
imageTransformLimits?: ImageTransformLimits;
|
|
73
76
|
/** [storage.buckets.*]: buckets to create at boot */
|
|
74
77
|
buckets?: BucketSeed[];
|
|
75
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../../src/runtime/node/load-config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../../src/runtime/node/load-config.ts"],"names":[],"mappings":"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"}
|