@mathrunet/masamune_cloudflare_turso 3.2.1 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +176 -67
- package/dist/functions/turso.js +9 -0
- package/dist/functions/turso.js.map +1 -1
- package/dist/functions/turso_token.js +18 -9
- package/dist/functions/turso_token.js.map +1 -1
- package/dist/lib/request.d.ts +1 -1
- package/dist/lib/request.js +17 -9
- package/dist/lib/request.js.map +1 -1
- package/dist/lib/rules.d.ts +34 -1
- package/dist/lib/rules.js +294 -8
- package/dist/lib/rules.js.map +1 -1
- package/dist/lib/token.d.ts +4 -4
- package/dist/lib/token.js +11 -90
- package/dist/lib/token.js.map +1 -1
- package/dist/lib/turso_client.js +5 -15
- package/dist/lib/turso_client.js.map +1 -1
- package/dist/lib/types.d.ts +12 -10
- package/package.json +1 -1
package/dist/lib/rules.js
CHANGED
|
@@ -3,10 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.RulesEngine = void 0;
|
|
4
4
|
exports.createTursoRulesEngine = createTursoRulesEngine;
|
|
5
5
|
exports.buildRulesPath = buildRulesPath;
|
|
6
|
+
exports.buildDatabaseRulesPath = buildDatabaseRulesPath;
|
|
6
7
|
exports.normalizeHttpMethodToRulesOperation = normalizeHttpMethodToRulesOperation;
|
|
7
8
|
exports.normalizeRulesOperation = normalizeRulesOperation;
|
|
8
9
|
exports.expandRulesOperation = expandRulesOperation;
|
|
9
10
|
exports.filterAllowedScope = filterAllowedScope;
|
|
11
|
+
exports.resolveDatabaseTokenAccess = resolveDatabaseTokenAccess;
|
|
12
|
+
exports.resolveDatabaseTokenAuthorization = resolveDatabaseTokenAuthorization;
|
|
10
13
|
class RulesEngine {
|
|
11
14
|
constructor(config) {
|
|
12
15
|
this.config = normalizeRulesConfig(config);
|
|
@@ -24,20 +27,49 @@ class RulesEngine {
|
|
|
24
27
|
const resolved = resolveInheritedRule(matches.map((match) => ({
|
|
25
28
|
rulePath: match.rulePath,
|
|
26
29
|
entry: this.config.rules[match.rulePath],
|
|
30
|
+
params: match.params,
|
|
27
31
|
})));
|
|
28
|
-
const
|
|
29
|
-
if (!
|
|
32
|
+
const resolvedAccess = resolveAccessRule(resolved.entry, resolved.params, operation);
|
|
33
|
+
if (!resolvedAccess) {
|
|
30
34
|
return {
|
|
31
35
|
allowed: false,
|
|
32
36
|
rulePath: resolved.rulePath,
|
|
33
37
|
};
|
|
34
38
|
}
|
|
35
39
|
return {
|
|
36
|
-
allowed: await evaluateAccessRule(access, input.authentication, input.fetchDocument),
|
|
40
|
+
allowed: await evaluateAccessRule(resolvedAccess.access, input.authentication, input.fetchDocument, resolvedAccess.params, input.server === true),
|
|
37
41
|
rulePath: resolved.rulePath,
|
|
38
|
-
access,
|
|
42
|
+
access: resolvedAccess.access,
|
|
43
|
+
params: resolvedAccess.params,
|
|
39
44
|
};
|
|
40
45
|
}
|
|
46
|
+
hasScopedRestriction({ database, table, operation, }) {
|
|
47
|
+
const normalized = normalizeRulesOperation(operation);
|
|
48
|
+
for (const [rulePath, entry] of Object.entries(this.config.rules)) {
|
|
49
|
+
if (!isRulePathInTableScope(rulePath, database, table)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const access = resolveAccessRule(entry, {}, normalized)?.access;
|
|
53
|
+
if (!access || isDirectSafeScopeAccess(access)) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
hasScopedDeny({ database, table, operation, }) {
|
|
61
|
+
const normalized = normalizeRulesOperation(operation);
|
|
62
|
+
for (const [rulePath, entry] of Object.entries(this.config.rules)) {
|
|
63
|
+
if (!isRulePathInTableScope(rulePath, database, table)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const access = resolveAccessRule(entry, {}, normalized)?.access;
|
|
67
|
+
if (access === "deny") {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
41
73
|
}
|
|
42
74
|
exports.RulesEngine = RulesEngine;
|
|
43
75
|
function createTursoRulesEngine(config) {
|
|
@@ -52,6 +84,12 @@ function buildRulesPath({ database, table, indexKey, }) {
|
|
|
52
84
|
encodePathSegment(indexKey),
|
|
53
85
|
].join("/");
|
|
54
86
|
}
|
|
87
|
+
function buildDatabaseRulesPath({ database, }) {
|
|
88
|
+
return [
|
|
89
|
+
"database",
|
|
90
|
+
encodePathSegment(database),
|
|
91
|
+
].join("/");
|
|
92
|
+
}
|
|
55
93
|
function normalizeHttpMethodToRulesOperation(method) {
|
|
56
94
|
switch (method.toUpperCase()) {
|
|
57
95
|
case "GET":
|
|
@@ -122,6 +160,177 @@ async function filterAllowedScope({ engine, database, scope, authentication, })
|
|
|
122
160
|
}
|
|
123
161
|
return allowed;
|
|
124
162
|
}
|
|
163
|
+
async function resolveDatabaseTokenAccess({ engine, database, scope = [], authentication, }) {
|
|
164
|
+
const path = buildDatabaseRulesPath({ database });
|
|
165
|
+
const directRead = await engine.evaluate({
|
|
166
|
+
path,
|
|
167
|
+
operation: "read",
|
|
168
|
+
authentication,
|
|
169
|
+
server: false,
|
|
170
|
+
});
|
|
171
|
+
const serverRead = directRead.allowed
|
|
172
|
+
? directRead
|
|
173
|
+
: await engine.evaluate({
|
|
174
|
+
path,
|
|
175
|
+
operation: "read",
|
|
176
|
+
authentication,
|
|
177
|
+
server: true,
|
|
178
|
+
});
|
|
179
|
+
if (!serverRead.allowed) {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
const directDatabaseWrite = await evaluateDatabaseWrite({
|
|
183
|
+
engine,
|
|
184
|
+
path,
|
|
185
|
+
authentication,
|
|
186
|
+
server: false,
|
|
187
|
+
});
|
|
188
|
+
const serverDatabaseWrite = directDatabaseWrite
|
|
189
|
+
? true
|
|
190
|
+
: await evaluateDatabaseWrite({
|
|
191
|
+
engine,
|
|
192
|
+
path,
|
|
193
|
+
authentication,
|
|
194
|
+
server: true,
|
|
195
|
+
});
|
|
196
|
+
const scopes = await resolveScopeModes({
|
|
197
|
+
engine,
|
|
198
|
+
database,
|
|
199
|
+
scope,
|
|
200
|
+
authentication,
|
|
201
|
+
});
|
|
202
|
+
const readScopes = scopes.filter((item) => requiresRead(item.operations));
|
|
203
|
+
const writeScopes = scopes.filter((item) => requiresWrite(item.operations));
|
|
204
|
+
const readMode = resolveOverallMode(readScopes.map((item) => item.readMode ?? "none"), scope.length === 0 ? directRead.allowed ? "direct" : "functions" : "none");
|
|
205
|
+
let writeMode = resolveOverallMode(writeScopes.map((item) => item.writeMode ?? "none"), scope.length === 0 ? directDatabaseWrite ? "direct" : serverDatabaseWrite ? "functions" : "none" : "none");
|
|
206
|
+
if (readMode === "functions" && writeMode === "direct") {
|
|
207
|
+
writeMode = serverDatabaseWrite ? "functions" : "none";
|
|
208
|
+
}
|
|
209
|
+
const authorization = resolveTokenAuthorization(readMode, writeMode);
|
|
210
|
+
return {
|
|
211
|
+
authorization,
|
|
212
|
+
readMode,
|
|
213
|
+
writeMode,
|
|
214
|
+
scopes,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
async function resolveScopeModes({ engine, database, scope, authentication, }) {
|
|
218
|
+
const resolved = [];
|
|
219
|
+
for (const item of scope) {
|
|
220
|
+
const readMode = requiresRead(item.operations)
|
|
221
|
+
? await resolveScopedOperationMode({
|
|
222
|
+
engine,
|
|
223
|
+
database,
|
|
224
|
+
table: item.table,
|
|
225
|
+
operation: "read",
|
|
226
|
+
authentication,
|
|
227
|
+
})
|
|
228
|
+
: undefined;
|
|
229
|
+
const writeMode = requiresWrite(item.operations)
|
|
230
|
+
? await resolveScopedOperationMode({
|
|
231
|
+
engine,
|
|
232
|
+
database,
|
|
233
|
+
table: item.table,
|
|
234
|
+
operation: "write",
|
|
235
|
+
authentication,
|
|
236
|
+
})
|
|
237
|
+
: undefined;
|
|
238
|
+
resolved.push({
|
|
239
|
+
table: item.table,
|
|
240
|
+
operations: item.operations,
|
|
241
|
+
...(readMode ? { readMode } : {}),
|
|
242
|
+
...(writeMode ? { writeMode } : {}),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
return resolved;
|
|
246
|
+
}
|
|
247
|
+
async function resolveScopedOperationMode({ engine, database, table, operation, authentication, }) {
|
|
248
|
+
const path = buildRulesPath({
|
|
249
|
+
database,
|
|
250
|
+
table,
|
|
251
|
+
indexKey: "*",
|
|
252
|
+
});
|
|
253
|
+
const expanded = expandRulesOperation(operation);
|
|
254
|
+
const direct = await Promise.all(expanded.map((item) => engine.evaluate({
|
|
255
|
+
path,
|
|
256
|
+
operation: item,
|
|
257
|
+
authentication,
|
|
258
|
+
server: false,
|
|
259
|
+
})));
|
|
260
|
+
const directAllowed = direct.every((result) => result.allowed);
|
|
261
|
+
const restricted = expanded.some((item) => engine.hasScopedRestriction({
|
|
262
|
+
database,
|
|
263
|
+
table,
|
|
264
|
+
operation: item,
|
|
265
|
+
}));
|
|
266
|
+
if (directAllowed && !restricted) {
|
|
267
|
+
return "direct";
|
|
268
|
+
}
|
|
269
|
+
const denied = expanded.some((item) => engine.hasScopedDeny({
|
|
270
|
+
database,
|
|
271
|
+
table,
|
|
272
|
+
operation: item,
|
|
273
|
+
}));
|
|
274
|
+
if (restricted && !denied) {
|
|
275
|
+
return "functions";
|
|
276
|
+
}
|
|
277
|
+
const server = await Promise.all(expanded.map((item) => engine.evaluate({
|
|
278
|
+
path,
|
|
279
|
+
operation: item,
|
|
280
|
+
authentication,
|
|
281
|
+
server: true,
|
|
282
|
+
})));
|
|
283
|
+
return server.every((result) => result.allowed) ? "functions" : "none";
|
|
284
|
+
}
|
|
285
|
+
function resolveOverallMode(scopedModes, fallback) {
|
|
286
|
+
if (scopedModes.length === 0) {
|
|
287
|
+
return fallback;
|
|
288
|
+
}
|
|
289
|
+
if (scopedModes.every((mode) => mode === "direct")) {
|
|
290
|
+
return "direct";
|
|
291
|
+
}
|
|
292
|
+
if (scopedModes.some((mode) => mode === "none")) {
|
|
293
|
+
return "none";
|
|
294
|
+
}
|
|
295
|
+
return "functions";
|
|
296
|
+
}
|
|
297
|
+
function resolveTokenAuthorization(readMode, writeMode) {
|
|
298
|
+
if (writeMode === "direct") {
|
|
299
|
+
return "full-access";
|
|
300
|
+
}
|
|
301
|
+
if (readMode === "direct") {
|
|
302
|
+
return "read-only";
|
|
303
|
+
}
|
|
304
|
+
return undefined;
|
|
305
|
+
}
|
|
306
|
+
function requiresRead(operations) {
|
|
307
|
+
return operations.some((operation) => expandRulesOperation(operation).includes("get"));
|
|
308
|
+
}
|
|
309
|
+
function requiresWrite(operations) {
|
|
310
|
+
return operations.some((operation) => {
|
|
311
|
+
const expanded = expandRulesOperation(operation);
|
|
312
|
+
return expanded.includes("create") || expanded.includes("update") || expanded.includes("delete");
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
async function evaluateDatabaseWrite({ engine, path, authentication, server, }) {
|
|
316
|
+
const results = await Promise.all(expandRulesOperation("write").map((operation) => {
|
|
317
|
+
return engine.evaluate({
|
|
318
|
+
path,
|
|
319
|
+
operation,
|
|
320
|
+
authentication,
|
|
321
|
+
server,
|
|
322
|
+
});
|
|
323
|
+
}));
|
|
324
|
+
return results.every((result) => result.allowed);
|
|
325
|
+
}
|
|
326
|
+
async function resolveDatabaseTokenAuthorization({ engine, database, authentication, }) {
|
|
327
|
+
const access = await resolveDatabaseTokenAccess({
|
|
328
|
+
engine,
|
|
329
|
+
database,
|
|
330
|
+
authentication,
|
|
331
|
+
});
|
|
332
|
+
return access?.authorization;
|
|
333
|
+
}
|
|
125
334
|
function normalizeRulesConfig(config) {
|
|
126
335
|
if (!config) {
|
|
127
336
|
return {
|
|
@@ -146,7 +355,9 @@ function matchRulePath(rulePath, requestPath) {
|
|
|
146
355
|
validateRulePath(rulePath);
|
|
147
356
|
const ruleSegments = splitPath(rulePath);
|
|
148
357
|
const requestSegments = splitPath(requestPath);
|
|
358
|
+
const params = {};
|
|
149
359
|
let literalSegments = 0;
|
|
360
|
+
let namedWildcardSegments = 0;
|
|
150
361
|
let wildcardSegments = 0;
|
|
151
362
|
let deepWildcardSegments = 0;
|
|
152
363
|
for (let i = 0; i < ruleSegments.length; i++) {
|
|
@@ -156,7 +367,9 @@ function matchRulePath(rulePath, requestPath) {
|
|
|
156
367
|
return {
|
|
157
368
|
matched: true,
|
|
158
369
|
rulePath,
|
|
370
|
+
params,
|
|
159
371
|
literalSegments,
|
|
372
|
+
namedWildcardSegments,
|
|
160
373
|
wildcardSegments,
|
|
161
374
|
deepWildcardSegments,
|
|
162
375
|
matchedSegments: requestSegments.length,
|
|
@@ -170,6 +383,13 @@ function matchRulePath(rulePath, requestPath) {
|
|
|
170
383
|
wildcardSegments++;
|
|
171
384
|
continue;
|
|
172
385
|
}
|
|
386
|
+
const paramName = parseNamedPathParam(ruleSegment);
|
|
387
|
+
if (paramName) {
|
|
388
|
+
params[paramName] = requestSegment;
|
|
389
|
+
namedWildcardSegments++;
|
|
390
|
+
wildcardSegments++;
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
173
393
|
if (ruleSegment !== requestSegment) {
|
|
174
394
|
return createUnmatched(rulePath);
|
|
175
395
|
}
|
|
@@ -181,7 +401,9 @@ function matchRulePath(rulePath, requestPath) {
|
|
|
181
401
|
return {
|
|
182
402
|
matched: true,
|
|
183
403
|
rulePath,
|
|
404
|
+
params,
|
|
184
405
|
literalSegments,
|
|
406
|
+
namedWildcardSegments,
|
|
185
407
|
wildcardSegments,
|
|
186
408
|
deepWildcardSegments,
|
|
187
409
|
matchedSegments: requestSegments.length,
|
|
@@ -194,6 +416,9 @@ function compareRulePathMatch(a, b) {
|
|
|
194
416
|
if (a.deepWildcardSegments !== b.deepWildcardSegments) {
|
|
195
417
|
return a.deepWildcardSegments - b.deepWildcardSegments;
|
|
196
418
|
}
|
|
419
|
+
if (a.namedWildcardSegments !== b.namedWildcardSegments) {
|
|
420
|
+
return b.namedWildcardSegments - a.namedWildcardSegments;
|
|
421
|
+
}
|
|
197
422
|
if (a.wildcardSegments !== b.wildcardSegments) {
|
|
198
423
|
return a.wildcardSegments - b.wildcardSegments;
|
|
199
424
|
}
|
|
@@ -204,6 +429,7 @@ function compareRulePathMatch(a, b) {
|
|
|
204
429
|
}
|
|
205
430
|
function resolveInheritedRule(matches) {
|
|
206
431
|
const inherited = {};
|
|
432
|
+
const inheritedParams = {};
|
|
207
433
|
let rulePath = matches[0]?.rulePath ?? "";
|
|
208
434
|
for (const match of [...matches].reverse()) {
|
|
209
435
|
if (!match.entry) {
|
|
@@ -212,18 +438,23 @@ function resolveInheritedRule(matches) {
|
|
|
212
438
|
rulePath = match.rulePath;
|
|
213
439
|
for (const [operation, access] of Object.entries(match.entry)) {
|
|
214
440
|
inherited[operation] = access;
|
|
441
|
+
inheritedParams[operation] = match.params;
|
|
215
442
|
}
|
|
216
443
|
}
|
|
217
444
|
return {
|
|
218
445
|
rulePath,
|
|
219
446
|
entry: inherited,
|
|
447
|
+
params: inheritedParams,
|
|
220
448
|
};
|
|
221
449
|
}
|
|
222
|
-
function resolveAccessRule(entry, operation) {
|
|
450
|
+
function resolveAccessRule(entry, params, operation) {
|
|
223
451
|
for (const operationKey of resolveRulesOperation(operation)) {
|
|
224
452
|
const access = entry[operationKey];
|
|
225
453
|
if (access) {
|
|
226
|
-
return
|
|
454
|
+
return {
|
|
455
|
+
access,
|
|
456
|
+
params: params[operationKey] ?? {},
|
|
457
|
+
};
|
|
227
458
|
}
|
|
228
459
|
}
|
|
229
460
|
return undefined;
|
|
@@ -240,7 +471,7 @@ function resolveRulesOperation(operation) {
|
|
|
240
471
|
return ["delete", "write"];
|
|
241
472
|
}
|
|
242
473
|
}
|
|
243
|
-
async function evaluateAccessRule(access, authentication, fetchDocument) {
|
|
474
|
+
async function evaluateAccessRule(access, authentication, fetchDocument, params = {}, server = false) {
|
|
244
475
|
switch (access) {
|
|
245
476
|
case "deny":
|
|
246
477
|
return false;
|
|
@@ -248,7 +479,16 @@ async function evaluateAccessRule(access, authentication, fetchDocument) {
|
|
|
248
479
|
return true;
|
|
249
480
|
case "authenticated":
|
|
250
481
|
return !!authentication?.uid;
|
|
251
|
-
default:
|
|
482
|
+
default:
|
|
483
|
+
break;
|
|
484
|
+
}
|
|
485
|
+
if ("serverOnly" in access && access.serverOnly === true && !server) {
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
488
|
+
switch (access.type) {
|
|
489
|
+
case "serverOnly":
|
|
490
|
+
return server;
|
|
491
|
+
case "fieldMatch": {
|
|
252
492
|
const uid = authentication?.uid;
|
|
253
493
|
if (!uid || !fetchDocument) {
|
|
254
494
|
return false;
|
|
@@ -256,6 +496,10 @@ async function evaluateAccessRule(access, authentication, fetchDocument) {
|
|
|
256
496
|
const document = await fetchDocument();
|
|
257
497
|
return document?.[access.field] === uid;
|
|
258
498
|
}
|
|
499
|
+
case "pathParamMatch": {
|
|
500
|
+
const uid = authentication?.uid;
|
|
501
|
+
return !!uid && params[access.param] === uid;
|
|
502
|
+
}
|
|
259
503
|
}
|
|
260
504
|
}
|
|
261
505
|
function validateRulePath(path) {
|
|
@@ -266,11 +510,47 @@ function validateRulePath(path) {
|
|
|
266
510
|
if (segments.some((segment) => segment.length === 0)) {
|
|
267
511
|
throw new Error(`Invalid rule path: ${path}`);
|
|
268
512
|
}
|
|
513
|
+
const paramNames = new Set();
|
|
514
|
+
for (const segment of segments) {
|
|
515
|
+
if ((segment.startsWith("{") || segment.endsWith("}")) && !parseNamedPathParam(segment)) {
|
|
516
|
+
throw new Error(`Invalid path parameter segment '${segment}' in rule path: ${path}`);
|
|
517
|
+
}
|
|
518
|
+
const paramName = parseNamedPathParam(segment);
|
|
519
|
+
if (!paramName) {
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
522
|
+
if (paramNames.has(paramName)) {
|
|
523
|
+
throw new Error(`Duplicate path parameter '${paramName}' in rule path: ${path}`);
|
|
524
|
+
}
|
|
525
|
+
paramNames.add(paramName);
|
|
526
|
+
}
|
|
269
527
|
const deepWildcardIndex = segments.indexOf("**");
|
|
270
528
|
if (deepWildcardIndex >= 0 && deepWildcardIndex !== segments.length - 1) {
|
|
271
529
|
throw new Error(`'**' must be the last segment in rule path: ${path}`);
|
|
272
530
|
}
|
|
273
531
|
}
|
|
532
|
+
function isRulePathInTableScope(rulePath, database, table) {
|
|
533
|
+
const segments = splitPath(rulePath);
|
|
534
|
+
if (segments.length <= 4) {
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
return segmentMatches(segments[0], "database") &&
|
|
538
|
+
segmentMatches(segments[1], database) &&
|
|
539
|
+
segmentMatches(segments[2], "table") &&
|
|
540
|
+
segmentMatches(segments[3], table);
|
|
541
|
+
}
|
|
542
|
+
function segmentMatches(ruleSegment, value) {
|
|
543
|
+
if (!ruleSegment) {
|
|
544
|
+
return false;
|
|
545
|
+
}
|
|
546
|
+
if (ruleSegment === "**") {
|
|
547
|
+
return true;
|
|
548
|
+
}
|
|
549
|
+
return ruleSegment === "*" || !!parseNamedPathParam(ruleSegment) || ruleSegment === value;
|
|
550
|
+
}
|
|
551
|
+
function isDirectSafeScopeAccess(access) {
|
|
552
|
+
return access === "allow";
|
|
553
|
+
}
|
|
274
554
|
function splitPath(path) {
|
|
275
555
|
if (path.length === 0 || path.startsWith("/") || path.endsWith("/")) {
|
|
276
556
|
return [];
|
|
@@ -281,12 +561,18 @@ function createUnmatched(rulePath) {
|
|
|
281
561
|
return {
|
|
282
562
|
matched: false,
|
|
283
563
|
rulePath,
|
|
564
|
+
params: {},
|
|
284
565
|
literalSegments: 0,
|
|
566
|
+
namedWildcardSegments: 0,
|
|
285
567
|
wildcardSegments: 0,
|
|
286
568
|
deepWildcardSegments: 0,
|
|
287
569
|
matchedSegments: 0,
|
|
288
570
|
};
|
|
289
571
|
}
|
|
572
|
+
function parseNamedPathParam(segment) {
|
|
573
|
+
const match = /^\{([A-Za-z_][A-Za-z0-9_]*)\}$/.exec(segment);
|
|
574
|
+
return match?.[1];
|
|
575
|
+
}
|
|
290
576
|
function encodePathSegment(segment) {
|
|
291
577
|
if (segment.length === 0 || segment.includes("/")) {
|
|
292
578
|
throw new Error(`Invalid path segment: ${segment}`);
|
package/dist/lib/rules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lib/rules.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lib/rules.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/token.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TursoWorkersOptions } from "./types";
|
|
2
|
+
import type { TursoDatabaseTokenAuthorization } from "./rules";
|
|
2
3
|
export interface IssuedToken {
|
|
3
4
|
token: string;
|
|
4
5
|
expiresAt: number;
|
|
5
6
|
}
|
|
6
|
-
export declare function
|
|
7
|
+
export declare function issueDatabaseToken({ database, authorization, ttlSeconds, options, }: {
|
|
7
8
|
database: string;
|
|
8
|
-
|
|
9
|
+
authorization: TursoDatabaseTokenAuthorization;
|
|
9
10
|
ttlSeconds?: number | undefined;
|
|
10
11
|
options: TursoWorkersOptions;
|
|
11
12
|
}): Promise<IssuedToken>;
|
|
12
|
-
export declare function buildTursoPermissions(scope: TursoTokenScopeInput[]): Record<string, string[]>;
|
package/dist/lib/token.js
CHANGED
|
@@ -1,86 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
async function issueScopedToken({ database, scope, ttlSeconds, options, }) {
|
|
3
|
+
exports.issueDatabaseToken = issueDatabaseToken;
|
|
4
|
+
async function issueDatabaseToken({ database, authorization, ttlSeconds, options, }) {
|
|
6
5
|
const now = Math.floor(Date.now() / 1000);
|
|
7
6
|
const maxTtl = options.maxTtlSeconds ?? 3600;
|
|
8
7
|
const ttl = Math.max(1, Math.min(ttlSeconds ?? 600, maxTtl));
|
|
9
8
|
const expiresAt = now + ttl;
|
|
10
|
-
const
|
|
11
|
-
iss: options.tokenIssuer?.issuer ?? "masamune_cloudflare_turso",
|
|
12
|
-
aud: options.tokenIssuer?.audience ?? "turso",
|
|
13
|
-
iat: now,
|
|
14
|
-
exp: expiresAt,
|
|
9
|
+
const jwt = await issuePlatformDatabaseToken({
|
|
15
10
|
database,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const jwt = await issuePlatformDatabaseToken({
|
|
21
|
-
database,
|
|
22
|
-
ttlSeconds: ttl,
|
|
23
|
-
permissions: payload.permissions,
|
|
24
|
-
options,
|
|
25
|
-
});
|
|
26
|
-
return {
|
|
27
|
-
token: jwt,
|
|
28
|
-
expiresAt,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
const secret = options.tokenIssuer?.secret ?? options.authToken;
|
|
32
|
-
if (!secret) {
|
|
33
|
-
throw new Error("tokenIssuer.secret or authToken is required to issue scoped tokens.");
|
|
34
|
-
}
|
|
11
|
+
ttlSeconds: ttl,
|
|
12
|
+
authorization,
|
|
13
|
+
options,
|
|
14
|
+
});
|
|
35
15
|
return {
|
|
36
|
-
token:
|
|
16
|
+
token: jwt,
|
|
37
17
|
expiresAt,
|
|
38
18
|
};
|
|
39
19
|
}
|
|
40
|
-
function
|
|
41
|
-
const permissions = {};
|
|
42
|
-
for (const item of scope) {
|
|
43
|
-
const tablePermissions = permissions[item.table] ?? new Set();
|
|
44
|
-
for (const operation of item.operations) {
|
|
45
|
-
for (const permission of operationToPermissions(operation)) {
|
|
46
|
-
tablePermissions.add(permission);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
permissions[item.table] = tablePermissions;
|
|
50
|
-
}
|
|
51
|
-
return Object.fromEntries(Object.entries(permissions).map(([table, values]) => {
|
|
52
|
-
return [table, [...values].sort()];
|
|
53
|
-
}));
|
|
54
|
-
}
|
|
55
|
-
async function signHs256(payload, secret) {
|
|
56
|
-
const header = {
|
|
57
|
-
alg: "HS256",
|
|
58
|
-
typ: "JWT",
|
|
59
|
-
};
|
|
60
|
-
const unsigned = `${base64UrlEncodeJson(header)}.${base64UrlEncodeJson(payload)}`;
|
|
61
|
-
const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(secret), {
|
|
62
|
-
name: "HMAC",
|
|
63
|
-
hash: "SHA-256",
|
|
64
|
-
}, false, ["sign"]);
|
|
65
|
-
const signature = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(unsigned));
|
|
66
|
-
return `${unsigned}.${base64UrlEncode(signature)}`;
|
|
67
|
-
}
|
|
68
|
-
function operationToPermissions(operation) {
|
|
69
|
-
switch (operation) {
|
|
70
|
-
case "read":
|
|
71
|
-
case "get":
|
|
72
|
-
return ["data_read"];
|
|
73
|
-
case "create":
|
|
74
|
-
return ["data_add"];
|
|
75
|
-
case "update":
|
|
76
|
-
return ["data_update"];
|
|
77
|
-
case "delete":
|
|
78
|
-
return ["data_delete"];
|
|
79
|
-
case "write":
|
|
80
|
-
return ["data_add", "data_update", "data_delete"];
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
async function issuePlatformDatabaseToken({ database, ttlSeconds, permissions, options, }) {
|
|
20
|
+
async function issuePlatformDatabaseToken({ database, ttlSeconds, authorization, options, }) {
|
|
84
21
|
const databaseName = `${options.databaseNamePrefix ?? ""}${database}`;
|
|
85
22
|
const organizationName = options.organizationName;
|
|
86
23
|
const platformApiToken = options.platformApiToken;
|
|
@@ -89,35 +26,19 @@ async function issuePlatformDatabaseToken({ database, ttlSeconds, permissions, o
|
|
|
89
26
|
}
|
|
90
27
|
const response = await fetch("https://api.turso.tech/v1/organizations/" +
|
|
91
28
|
`${encodeURIComponent(organizationName)}/databases/${encodeURIComponent(databaseName)}` +
|
|
92
|
-
`/auth/tokens?expiration=${ttlSeconds}s&authorization
|
|
29
|
+
`/auth/tokens?expiration=${ttlSeconds}s&authorization=${authorization}`, {
|
|
93
30
|
method: "POST",
|
|
94
31
|
headers: {
|
|
95
32
|
Authorization: `Bearer ${platformApiToken}`,
|
|
96
|
-
"Content-Type": "application/json",
|
|
97
33
|
},
|
|
98
|
-
body: JSON.stringify({ permissions }),
|
|
99
34
|
});
|
|
100
35
|
if (!response.ok) {
|
|
101
36
|
throw new Error(`Failed to issue Turso token: ${response.status}`);
|
|
102
37
|
}
|
|
103
|
-
const body = await response.json();
|
|
38
|
+
const body = (await response.json());
|
|
104
39
|
if (!body.jwt) {
|
|
105
40
|
throw new Error("Turso token response did not include jwt.");
|
|
106
41
|
}
|
|
107
42
|
return body.jwt;
|
|
108
43
|
}
|
|
109
|
-
function base64UrlEncodeJson(value) {
|
|
110
|
-
return base64UrlEncode(new TextEncoder().encode(JSON.stringify(value)));
|
|
111
|
-
}
|
|
112
|
-
function base64UrlEncode(value) {
|
|
113
|
-
const bytes = value instanceof Uint8Array ? value : new Uint8Array(value);
|
|
114
|
-
let binary = "";
|
|
115
|
-
for (const byte of bytes) {
|
|
116
|
-
binary += String.fromCharCode(byte);
|
|
117
|
-
}
|
|
118
|
-
return btoa(binary)
|
|
119
|
-
.replace(/\+/g, "-")
|
|
120
|
-
.replace(/\//g, "_")
|
|
121
|
-
.replace(/=+$/g, "");
|
|
122
|
-
}
|
|
123
44
|
//# sourceMappingURL=token.js.map
|
package/dist/lib/token.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/lib/token.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/lib/token.ts"],"names":[],"mappings":";;AAQA,gDAyBC;AAzBM,KAAK,UAAU,kBAAkB,CAAC,EACvC,QAAQ,EACR,aAAa,EACb,UAAU,EACV,OAAO,GAMR;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC;QAC3C,QAAQ;QACR,UAAU,EAAE,GAAG;QACf,aAAa;QACb,OAAO;KACR,CAAC,CAAC;IACH,OAAO;QACL,KAAK,EAAE,GAAG;QACV,SAAS;KACV,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,EACxC,QAAQ,EACR,UAAU,EACV,aAAa,EACb,OAAO,GAMR;IACC,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,kBAAkB,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAClD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAClD,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,0CAA0C;QACxC,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,cAAc,kBAAkB,CAAC,YAAY,CAAC,EAAE;QACvF,2BAA2B,UAAU,mBAAmB,aAAa,EAAE,EACzE;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,gBAAgB,EAAE;SAC5C;KACF,CACF,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB,CAAC"}
|