@arcblock/did-connect-service 4.0.4 → 4.0.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/assets/fonts/noto-sans-sc-regular.otf +0 -0
- package/dist/embedded.d.ts +32 -0
- package/dist/embedded.d.ts.map +1 -1
- package/dist/embedded.js +3 -0
- package/dist/embedded.js.map +1 -1
- package/dist/handlers/auth-handler.d.ts +5 -0
- package/dist/handlers/auth-handler.d.ts.map +1 -1
- package/dist/handlers/auth-handler.js +33 -0
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/branding-handler.d.ts +17 -0
- package/dist/handlers/branding-handler.d.ts.map +1 -1
- package/dist/handlers/branding-handler.js +107 -5
- package/dist/handlers/branding-handler.js.map +1 -1
- package/dist/identity/csrf.d.ts +17 -0
- package/dist/identity/csrf.d.ts.map +1 -0
- package/dist/identity/csrf.js +56 -0
- package/dist/identity/csrf.js.map +1 -0
- package/dist/og/emoji.d.ts +12 -0
- package/dist/og/emoji.d.ts.map +1 -0
- package/dist/og/emoji.js +71 -0
- package/dist/og/emoji.js.map +1 -0
- package/dist/og/generator.d.ts +3 -0
- package/dist/og/generator.d.ts.map +1 -0
- package/dist/og/generator.js +338 -0
- package/dist/og/generator.js.map +1 -0
- package/dist/og/index.d.ts +6 -0
- package/dist/og/index.d.ts.map +1 -0
- package/dist/og/index.js +4 -0
- package/dist/og/index.js.map +1 -0
- package/dist/og/passport-svg.d.ts +52 -0
- package/dist/og/passport-svg.d.ts.map +1 -0
- package/dist/og/passport-svg.js +157 -0
- package/dist/og/passport-svg.js.map +1 -0
- package/dist/og/ssrf-guard.d.ts +38 -0
- package/dist/og/ssrf-guard.d.ts.map +1 -0
- package/dist/og/ssrf-guard.js +188 -0
- package/dist/og/ssrf-guard.js.map +1 -0
- package/dist/og/templates.d.ts +26 -0
- package/dist/og/templates.d.ts.map +1 -0
- package/dist/og/templates.js +302 -0
- package/dist/og/templates.js.map +1 -0
- package/dist/og/types.d.ts +74 -0
- package/dist/og/types.d.ts.map +1 -0
- package/dist/og/types.js +14 -0
- package/dist/og/types.js.map +1 -0
- package/package.json +18 -4
- package/dist/access-key-handler.d.ts +0 -37
- package/dist/access-key-handler.d.ts.map +0 -1
- package/dist/access-key-handler.js +0 -316
- package/dist/access-key-handler.js.map +0 -1
- package/dist/access-key-util.d.ts +0 -19
- package/dist/access-key-util.d.ts.map +0 -1
- package/dist/access-key-util.js +0 -45
- package/dist/access-key-util.js.map +0 -1
- package/dist/access-policy.d.ts +0 -53
- package/dist/access-policy.d.ts.map +0 -1
- package/dist/access-policy.js +0 -153
- package/dist/access-policy.js.map +0 -1
- package/dist/auth-client.d.ts +0 -20
- package/dist/auth-client.d.ts.map +0 -1
- package/dist/auth-client.js +0 -42
- package/dist/auth-client.js.map +0 -1
- package/dist/auth-entrypoint.d.ts +0 -45
- package/dist/auth-entrypoint.d.ts.map +0 -1
- package/dist/auth-entrypoint.js +0 -31
- package/dist/auth-entrypoint.js.map +0 -1
- package/dist/auth-handler.d.ts +0 -136
- package/dist/auth-handler.d.ts.map +0 -1
- package/dist/auth-handler.js +0 -408
- package/dist/auth-handler.js.map +0 -1
- package/dist/auth-rpc-types.d.ts +0 -139
- package/dist/auth-rpc-types.d.ts.map +0 -1
- package/dist/auth-rpc-types.js +0 -11
- package/dist/auth-rpc-types.js.map +0 -1
- package/dist/auth-rpc.d.ts +0 -80
- package/dist/auth-rpc.d.ts.map +0 -1
- package/dist/auth-rpc.js +0 -257
- package/dist/auth-rpc.js.map +0 -1
- package/dist/auth-worker.d.ts +0 -42
- package/dist/auth-worker.d.ts.map +0 -1
- package/dist/auth-worker.js +0 -120
- package/dist/auth-worker.js.map +0 -1
- package/dist/blocklet-js-handler.d.ts +0 -22
- package/dist/blocklet-js-handler.d.ts.map +0 -1
- package/dist/blocklet-js-handler.js +0 -205
- package/dist/blocklet-js-handler.js.map +0 -1
- package/dist/branding-handler.d.ts +0 -42
- package/dist/branding-handler.d.ts.map +0 -1
- package/dist/branding-handler.js +0 -326
- package/dist/branding-handler.js.map +0 -1
- package/dist/d1-token-storage.d.ts +0 -31
- package/dist/d1-token-storage.d.ts.map +0 -1
- package/dist/d1-token-storage.js +0 -83
- package/dist/d1-token-storage.js.map +0 -1
- package/dist/did-connect-handler.d.ts +0 -57
- package/dist/did-connect-handler.d.ts.map +0 -1
- package/dist/did-connect-handler.js +0 -182
- package/dist/did-connect-handler.js.map +0 -1
- package/dist/did.d.ts +0 -14
- package/dist/did.d.ts.map +0 -1
- package/dist/did.js +0 -17
- package/dist/did.js.map +0 -1
- package/dist/email-login-handler.d.ts +0 -50
- package/dist/email-login-handler.d.ts.map +0 -1
- package/dist/email-login-handler.js +0 -238
- package/dist/email-login-handler.js.map +0 -1
- package/dist/federation-utils.d.ts +0 -23
- package/dist/federation-utils.d.ts.map +0 -1
- package/dist/federation-utils.js +0 -25
- package/dist/federation-utils.js.map +0 -1
- package/dist/handler.d.ts +0 -90
- package/dist/handler.d.ts.map +0 -1
- package/dist/handler.js +0 -591
- package/dist/handler.js.map +0 -1
- package/dist/identity/invitation-util.d.ts +0 -7
- package/dist/identity/invitation-util.d.ts.map +0 -1
- package/dist/identity/invitation-util.js +0 -66
- package/dist/identity/invitation-util.js.map +0 -1
- package/dist/instance-role.d.ts +0 -10
- package/dist/instance-role.d.ts.map +0 -1
- package/dist/instance-role.js +0 -20
- package/dist/instance-role.js.map +0 -1
- package/dist/jwt.d.ts +0 -7
- package/dist/jwt.d.ts.map +0 -1
- package/dist/jwt.js +0 -72
- package/dist/jwt.js.map +0 -1
- package/dist/login-entry.d.ts +0 -9
- package/dist/login-entry.d.ts.map +0 -1
- package/dist/login-entry.js +0 -9
- package/dist/login-entry.js.map +0 -1
- package/dist/membership-handler.d.ts +0 -27
- package/dist/membership-handler.d.ts.map +0 -1
- package/dist/membership-handler.js +0 -111
- package/dist/membership-handler.js.map +0 -1
- package/dist/oauth-callback-page.d.ts +0 -9
- package/dist/oauth-callback-page.d.ts.map +0 -1
- package/dist/oauth-callback-page.js +0 -31
- package/dist/oauth-callback-page.js.map +0 -1
- package/dist/oauth-handler.d.ts +0 -72
- package/dist/oauth-handler.d.ts.map +0 -1
- package/dist/oauth-handler.js +0 -423
- package/dist/oauth-handler.js.map +0 -1
- package/dist/page.d.ts +0 -33
- package/dist/page.d.ts.map +0 -1
- package/dist/page.js +0 -59
- package/dist/page.js.map +0 -1
- package/dist/pages/auth-script.d.ts +0 -18
- package/dist/pages/auth-script.d.ts.map +0 -1
- package/dist/pages/auth-script.js +0 -185
- package/dist/pages/auth-script.js.map +0 -1
- package/dist/pages/design-tokens.d.ts +0 -86
- package/dist/pages/design-tokens.d.ts.map +0 -1
- package/dist/pages/design-tokens.js +0 -159
- package/dist/pages/design-tokens.js.map +0 -1
- package/dist/pages/did-connect-script.d.ts +0 -16
- package/dist/pages/did-connect-script.d.ts.map +0 -1
- package/dist/pages/did-connect-script.js +0 -105
- package/dist/pages/did-connect-script.js.map +0 -1
- package/dist/pages/shared-styles.d.ts +0 -6
- package/dist/pages/shared-styles.d.ts.map +0 -1
- package/dist/pages/shared-styles.js +0 -109
- package/dist/pages/shared-styles.js.map +0 -1
- package/dist/rbac.d.ts +0 -19
- package/dist/rbac.d.ts.map +0 -1
- package/dist/rbac.js +0 -76
- package/dist/rbac.js.map +0 -1
- package/dist/session-context.d.ts +0 -35
- package/dist/session-context.d.ts.map +0 -1
- package/dist/session-context.js +0 -39
- package/dist/session-context.js.map +0 -1
- package/dist/store.d.ts +0 -222
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -1366
- package/dist/store.js.map +0 -1
- package/dist/team-handler.d.ts +0 -90
- package/dist/team-handler.d.ts.map +0 -1
- package/dist/team-handler.js +0 -1225
- package/dist/team-handler.js.map +0 -1
- package/dist/ticket-handler.d.ts +0 -28
- package/dist/ticket-handler.d.ts.map +0 -1
- package/dist/ticket-handler.js +0 -74
- package/dist/ticket-handler.js.map +0 -1
- package/dist/wallet-identity.d.ts +0 -32
- package/dist/wallet-identity.d.ts.map +0 -1
- package/dist/wallet-identity.js +0 -43
- package/dist/wallet-identity.js.map +0 -1
- package/dist/webauthn.d.ts +0 -65
- package/dist/webauthn.d.ts.map +0 -1
- package/dist/webauthn.js +0 -112
- package/dist/webauthn.js.map +0 -1
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AccessKeyHandler — HTTP handler for access key management API.
|
|
3
|
-
*
|
|
4
|
-
* API routes (/.well-known/service/api/access-keys):
|
|
5
|
-
* GET / — List access keys (paginated, searchable)
|
|
6
|
-
* POST / — Create a new access key
|
|
7
|
-
* GET /:id — Get access key details
|
|
8
|
-
* PUT /:id — Update access key (remark, expireAt)
|
|
9
|
-
* DELETE /:id — Delete an access key
|
|
10
|
-
*/
|
|
11
|
-
import { generateAccessKey } from "./access/access-key-util.js";
|
|
12
|
-
import { resolveInstanceRole } from "./identity/instance-role.js";
|
|
13
|
-
import { PermissionError, requirePermission } from "./access/rbac.js";
|
|
14
|
-
const API_BASE = "/.well-known/service/api/access-keys";
|
|
15
|
-
const ROLE_RANK = { owner: 3, admin: 2, member: 1, guest: 0 };
|
|
16
|
-
const ADMIN_RANK = 2;
|
|
17
|
-
const MAX_REMARK_LENGTH = 200;
|
|
18
|
-
const MAX_PAGE_SIZE = 100;
|
|
19
|
-
const VALID_ROLES = ["owner", "admin", "member", "guest"];
|
|
20
|
-
export class AccessKeyHandler {
|
|
21
|
-
store;
|
|
22
|
-
passkey;
|
|
23
|
-
apiBase;
|
|
24
|
-
constructor(options) {
|
|
25
|
-
this.store = options.store;
|
|
26
|
-
this.passkey = options.passkey;
|
|
27
|
-
this.apiBase = options.basePath ?? API_BASE;
|
|
28
|
-
}
|
|
29
|
-
/** Main HTTP router. Returns Response or null if path doesn't match. */
|
|
30
|
-
async fetch(request, instanceDid) {
|
|
31
|
-
const url = new URL(request.url);
|
|
32
|
-
const { pathname } = url;
|
|
33
|
-
if (!pathname.startsWith(this.apiBase))
|
|
34
|
-
return null;
|
|
35
|
-
const path = pathname.slice(this.apiBase.length) || "/";
|
|
36
|
-
return this.handleAPI(request, path, url, instanceDid);
|
|
37
|
-
}
|
|
38
|
-
async handleAPI(request, path, url, instanceDid) {
|
|
39
|
-
const method = request.method;
|
|
40
|
-
try {
|
|
41
|
-
const caller = await this.verifyAndCheckApproval(request, instanceDid);
|
|
42
|
-
// List: GET /
|
|
43
|
-
if (method === "GET" && path === "/") {
|
|
44
|
-
return await this.handleList(caller, url, instanceDid);
|
|
45
|
-
}
|
|
46
|
-
// Create: POST /
|
|
47
|
-
if (method === "POST" && path === "/") {
|
|
48
|
-
return await this.handleCreate(caller, request, instanceDid);
|
|
49
|
-
}
|
|
50
|
-
// Detail/Update/Delete: /:id
|
|
51
|
-
const idMatch = path.match(/^\/([^/]+)$/);
|
|
52
|
-
if (!idMatch)
|
|
53
|
-
return this.errorResponse("Not found", 404, "NOT_FOUND");
|
|
54
|
-
const accessKeyId = decodeURIComponent(idMatch[1]);
|
|
55
|
-
if (method === "GET") {
|
|
56
|
-
return await this.handleGet(caller, accessKeyId, instanceDid);
|
|
57
|
-
}
|
|
58
|
-
if (method === "PUT") {
|
|
59
|
-
return await this.handleUpdate(caller, accessKeyId, request, instanceDid);
|
|
60
|
-
}
|
|
61
|
-
if (method === "DELETE") {
|
|
62
|
-
return await this.handleDelete(caller, accessKeyId, instanceDid);
|
|
63
|
-
}
|
|
64
|
-
return this.errorResponse("Not found", 404, "NOT_FOUND");
|
|
65
|
-
}
|
|
66
|
-
catch (err) {
|
|
67
|
-
if (err instanceof AccessKeyError) {
|
|
68
|
-
return this.errorResponse(err.message, err.status, err.code);
|
|
69
|
-
}
|
|
70
|
-
if (err instanceof PermissionError) {
|
|
71
|
-
return this.errorResponse("Insufficient permissions", 403, "FORBIDDEN");
|
|
72
|
-
}
|
|
73
|
-
const message = err instanceof Error ? err.message : "Internal error";
|
|
74
|
-
return this.errorResponse(message, 500, "INTERNAL_ERROR");
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
// ─── Auth middleware ─────────────────────────────────────────────────
|
|
78
|
-
async verifyAndCheckApproval(request, instanceDid) {
|
|
79
|
-
const caller = await this.passkey.verifyFull(request);
|
|
80
|
-
if (!caller) {
|
|
81
|
-
throw new AccessKeyError("Authentication required", 401, "UNAUTHENTICATED");
|
|
82
|
-
}
|
|
83
|
-
const user = await this.store.getUserByDid(caller.did);
|
|
84
|
-
if (!user) {
|
|
85
|
-
throw new AccessKeyError("User not found", 401, "UNAUTHENTICATED");
|
|
86
|
-
}
|
|
87
|
-
if (!user.approved) {
|
|
88
|
-
throw new AccessKeyError("User is blocked", 403, "BLOCKED");
|
|
89
|
-
}
|
|
90
|
-
const ip = request.headers.get("CF-Connecting-IP") ?? undefined;
|
|
91
|
-
if (instanceDid) {
|
|
92
|
-
const effectiveRole = await resolveInstanceRole(this.store, caller.did, instanceDid, user.role ?? undefined);
|
|
93
|
-
if (!effectiveRole) {
|
|
94
|
-
throw new AccessKeyError("Not a member of this instance", 403, "FORBIDDEN");
|
|
95
|
-
}
|
|
96
|
-
return { ...caller, role: effectiveRole, ip };
|
|
97
|
-
}
|
|
98
|
-
return {
|
|
99
|
-
...caller,
|
|
100
|
-
role: caller.role ?? user.role ?? "guest",
|
|
101
|
-
ip,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
// ─── Handlers ────────────────────────────────────────────────────────
|
|
105
|
-
async handleList(caller, url, instanceDid) {
|
|
106
|
-
requirePermission(caller.role, "accessKey.list");
|
|
107
|
-
let page = Number.parseInt(url.searchParams.get("page") ?? "1", 10);
|
|
108
|
-
let pageSize = Number.parseInt(url.searchParams.get("pageSize") ?? "20", 10);
|
|
109
|
-
const search = url.searchParams.get("search") ?? undefined;
|
|
110
|
-
if (page < 1)
|
|
111
|
-
page = 1;
|
|
112
|
-
if (pageSize > MAX_PAGE_SIZE)
|
|
113
|
-
pageSize = MAX_PAGE_SIZE;
|
|
114
|
-
if (pageSize < 1)
|
|
115
|
-
pageSize = 20;
|
|
116
|
-
// Non-admin users only see their own keys
|
|
117
|
-
const callerRank = ROLE_RANK[caller.role] ?? 0;
|
|
118
|
-
const createdBy = callerRank >= ADMIN_RANK ? undefined : caller.did;
|
|
119
|
-
const result = await this.store.getAccessKeys({
|
|
120
|
-
page,
|
|
121
|
-
pageSize,
|
|
122
|
-
search,
|
|
123
|
-
createdBy,
|
|
124
|
-
instanceDid,
|
|
125
|
-
});
|
|
126
|
-
return this.jsonResponse({ ...result, page, pageSize });
|
|
127
|
-
}
|
|
128
|
-
async handleCreate(caller, request, instanceDid) {
|
|
129
|
-
requirePermission(caller.role, "accessKey.create");
|
|
130
|
-
const body = await this.parseJSON(request);
|
|
131
|
-
// Validate role
|
|
132
|
-
if (!body.role) {
|
|
133
|
-
throw new AccessKeyError("Missing required field: role", 400, "VALIDATION_ERROR");
|
|
134
|
-
}
|
|
135
|
-
if (!VALID_ROLES.includes(body.role)) {
|
|
136
|
-
throw new AccessKeyError(`Invalid role: ${body.role}. Must be one of: ${VALID_ROLES.join(", ")}`, 400, "VALIDATION_ERROR");
|
|
137
|
-
}
|
|
138
|
-
// Role escalation prevention: caller cannot create key with higher role
|
|
139
|
-
const callerRank = ROLE_RANK[caller.role] ?? 0;
|
|
140
|
-
const targetRank = ROLE_RANK[body.role] ?? 0;
|
|
141
|
-
if (targetRank > callerRank) {
|
|
142
|
-
throw new AccessKeyError("Cannot create key with higher role than your own", 403, "FORBIDDEN");
|
|
143
|
-
}
|
|
144
|
-
// Validate expireAt (if provided)
|
|
145
|
-
if (body.expireAt !== undefined && body.expireAt !== null) {
|
|
146
|
-
const expireDate = new Date(body.expireAt);
|
|
147
|
-
if (Number.isNaN(expireDate.getTime())) {
|
|
148
|
-
throw new AccessKeyError("Invalid expireAt date", 400, "VALIDATION_ERROR");
|
|
149
|
-
}
|
|
150
|
-
if (expireDate < new Date()) {
|
|
151
|
-
throw new AccessKeyError("expireAt must be in the future", 400, "VALIDATION_ERROR");
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// Truncate remark
|
|
155
|
-
const remark = (body.remark ?? "").slice(0, MAX_REMARK_LENGTH);
|
|
156
|
-
// Generate access key
|
|
157
|
-
const key = generateAccessKey();
|
|
158
|
-
const stored = await this.store.createAccessKey({
|
|
159
|
-
accessKeyId: key.accessKeyId,
|
|
160
|
-
accessKeyPublic: key.accessKeyPublic,
|
|
161
|
-
role: body.role,
|
|
162
|
-
remark,
|
|
163
|
-
createdBy: caller.did,
|
|
164
|
-
expireAt: body.expireAt ?? null,
|
|
165
|
-
instanceDid,
|
|
166
|
-
});
|
|
167
|
-
// Audit log
|
|
168
|
-
await this.store.createAuditLog({
|
|
169
|
-
action: "accessKey.create",
|
|
170
|
-
operatorDid: caller.did,
|
|
171
|
-
metadata: { accessKeyId: key.accessKeyId, role: body.role, remark },
|
|
172
|
-
ip: caller.ip,
|
|
173
|
-
instanceDid,
|
|
174
|
-
});
|
|
175
|
-
return this.jsonResponse({
|
|
176
|
-
...stored,
|
|
177
|
-
accessKeySecret: key.accessKeySecret,
|
|
178
|
-
createdByName: caller.displayName ?? null,
|
|
179
|
-
}, 201);
|
|
180
|
-
}
|
|
181
|
-
async handleGet(caller, accessKeyId, instanceDid) {
|
|
182
|
-
requirePermission(caller.role, "accessKey.view");
|
|
183
|
-
const key = await this.store.getAccessKeyById(accessKeyId);
|
|
184
|
-
if (!key) {
|
|
185
|
-
throw new AccessKeyError("Access key not found", 404, "NOT_FOUND");
|
|
186
|
-
}
|
|
187
|
-
// Instance ownership check: only instance's own keys are visible
|
|
188
|
-
if (instanceDid && key.instanceDid !== instanceDid) {
|
|
189
|
-
throw new AccessKeyError("Access key not found", 404, "NOT_FOUND");
|
|
190
|
-
}
|
|
191
|
-
// Non-admin users can only view their own keys
|
|
192
|
-
this.requireOwnership(caller, key.createdBy);
|
|
193
|
-
return this.jsonResponse(key);
|
|
194
|
-
}
|
|
195
|
-
async handleUpdate(caller, accessKeyId, request, instanceDid) {
|
|
196
|
-
requirePermission(caller.role, "accessKey.update");
|
|
197
|
-
const existing = await this.store.getAccessKeyById(accessKeyId);
|
|
198
|
-
if (!existing) {
|
|
199
|
-
throw new AccessKeyError("Access key not found", 404, "NOT_FOUND");
|
|
200
|
-
}
|
|
201
|
-
// Instance ownership check: only instance's own keys are accessible
|
|
202
|
-
if (instanceDid && existing.instanceDid !== instanceDid) {
|
|
203
|
-
throw new AccessKeyError("Access key not found", 404, "NOT_FOUND");
|
|
204
|
-
}
|
|
205
|
-
// Non-admin users can only update their own keys
|
|
206
|
-
this.requireOwnership(caller, existing.createdBy);
|
|
207
|
-
// Role-rank enforcement (admin+): cannot modify key with higher role
|
|
208
|
-
const callerRank = ROLE_RANK[caller.role] ?? 0;
|
|
209
|
-
if (callerRank >= ADMIN_RANK) {
|
|
210
|
-
const keyRank = ROLE_RANK[existing.role] ?? 0;
|
|
211
|
-
if (keyRank > callerRank) {
|
|
212
|
-
throw new AccessKeyError("Cannot modify key with higher role than your own", 403, "FORBIDDEN");
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
const body = await this.parseJSON(request);
|
|
216
|
-
// Validate expireAt
|
|
217
|
-
if (body.expireAt !== undefined && body.expireAt !== null) {
|
|
218
|
-
const expireDate = new Date(body.expireAt);
|
|
219
|
-
if (Number.isNaN(expireDate.getTime())) {
|
|
220
|
-
throw new AccessKeyError("Invalid expireAt date", 400, "VALIDATION_ERROR");
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
// Truncate remark
|
|
224
|
-
const update = {};
|
|
225
|
-
if (body.remark !== undefined) {
|
|
226
|
-
update.remark = body.remark.slice(0, MAX_REMARK_LENGTH);
|
|
227
|
-
}
|
|
228
|
-
if ("expireAt" in body) {
|
|
229
|
-
update.expireAt = body.expireAt;
|
|
230
|
-
}
|
|
231
|
-
const updated = await this.store.updateAccessKey(accessKeyId, update);
|
|
232
|
-
// Audit log
|
|
233
|
-
await this.store.createAuditLog({
|
|
234
|
-
action: "accessKey.update",
|
|
235
|
-
operatorDid: caller.did,
|
|
236
|
-
targetDid: accessKeyId,
|
|
237
|
-
metadata: update,
|
|
238
|
-
ip: caller.ip,
|
|
239
|
-
instanceDid,
|
|
240
|
-
});
|
|
241
|
-
return this.jsonResponse(updated);
|
|
242
|
-
}
|
|
243
|
-
async handleDelete(caller, accessKeyId, instanceDid) {
|
|
244
|
-
requirePermission(caller.role, "accessKey.delete");
|
|
245
|
-
const existing = await this.store.getAccessKeyById(accessKeyId);
|
|
246
|
-
if (!existing) {
|
|
247
|
-
throw new AccessKeyError("Access key not found", 404, "NOT_FOUND");
|
|
248
|
-
}
|
|
249
|
-
// Instance ownership check: only instance's own keys are accessible
|
|
250
|
-
if (instanceDid && existing.instanceDid !== instanceDid) {
|
|
251
|
-
throw new AccessKeyError("Access key not found", 404, "NOT_FOUND");
|
|
252
|
-
}
|
|
253
|
-
// Non-admin users can only delete their own keys
|
|
254
|
-
this.requireOwnership(caller, existing.createdBy);
|
|
255
|
-
// Role-rank enforcement (admin+): cannot delete key with higher role
|
|
256
|
-
const callerRank = ROLE_RANK[caller.role] ?? 0;
|
|
257
|
-
if (callerRank >= ADMIN_RANK) {
|
|
258
|
-
const keyRank = ROLE_RANK[existing.role] ?? 0;
|
|
259
|
-
if (keyRank > callerRank) {
|
|
260
|
-
throw new AccessKeyError("Cannot delete key with higher role than your own", 403, "FORBIDDEN");
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
await this.store.deleteAccessKey(accessKeyId);
|
|
264
|
-
// Audit log
|
|
265
|
-
await this.store.createAuditLog({
|
|
266
|
-
action: "accessKey.delete",
|
|
267
|
-
operatorDid: caller.did,
|
|
268
|
-
targetDid: accessKeyId,
|
|
269
|
-
metadata: { role: existing.role },
|
|
270
|
-
ip: caller.ip,
|
|
271
|
-
instanceDid,
|
|
272
|
-
});
|
|
273
|
-
return new Response(null, { status: 204 });
|
|
274
|
-
}
|
|
275
|
-
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
276
|
-
/** Non-admin callers can only operate on keys they created. Admin+ can operate on any key. */
|
|
277
|
-
requireOwnership(caller, keyCreatedBy) {
|
|
278
|
-
const callerRank = ROLE_RANK[caller.role] ?? 0;
|
|
279
|
-
if (callerRank >= ADMIN_RANK)
|
|
280
|
-
return; // admin+ can access all keys
|
|
281
|
-
if (caller.did !== keyCreatedBy) {
|
|
282
|
-
throw new AccessKeyError("Access key not found", 404, "NOT_FOUND");
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
jsonResponse(data, status = 200) {
|
|
286
|
-
return new Response(JSON.stringify(data), {
|
|
287
|
-
status,
|
|
288
|
-
headers: {
|
|
289
|
-
"Content-Type": "application/json",
|
|
290
|
-
"Cache-Control": "private, no-store",
|
|
291
|
-
},
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
errorResponse(message, status, code) {
|
|
295
|
-
return this.jsonResponse({ ok: false, error: message, code }, status);
|
|
296
|
-
}
|
|
297
|
-
async parseJSON(request) {
|
|
298
|
-
try {
|
|
299
|
-
return (await request.json());
|
|
300
|
-
}
|
|
301
|
-
catch {
|
|
302
|
-
throw new AccessKeyError("Invalid JSON body", 400, "VALIDATION_ERROR");
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
class AccessKeyError extends Error {
|
|
307
|
-
status;
|
|
308
|
-
code;
|
|
309
|
-
constructor(message, status, code) {
|
|
310
|
-
super(message);
|
|
311
|
-
this.status = status;
|
|
312
|
-
this.code = code;
|
|
313
|
-
this.name = "AccessKeyError";
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
//# sourceMappingURL=access-key-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"access-key-handler.js","sourceRoot":"","sources":["../src/access-key-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generate a new access key (keypair-based).
|
|
3
|
-
* Returns accessKeyId (DID), accessKeyPublic (for DB storage), and accessKeySecret (shown once).
|
|
4
|
-
*/
|
|
5
|
-
export declare function generateAccessKey(): {
|
|
6
|
-
accessKeyId: string;
|
|
7
|
-
accessKeyPublic: string;
|
|
8
|
-
accessKeySecret: string;
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Check if a token string looks like an access key token (blocklet-<base58(publicKey)>).
|
|
12
|
-
*/
|
|
13
|
-
export declare function isAccessKeyToken(token: unknown): boolean;
|
|
14
|
-
/**
|
|
15
|
-
* Derive the accessKeyId (DID) from an access key token.
|
|
16
|
-
* Returns null if the token is invalid or cannot be decoded.
|
|
17
|
-
*/
|
|
18
|
-
export declare function deriveAccessKeyId(token: string): string | null;
|
|
19
|
-
//# sourceMappingURL=access-key-util.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"access-key-util.d.ts","sourceRoot":"","sources":["../src/access-key-util.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB,CAOA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS9D"}
|
package/dist/access-key-util.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { fromBase58, toBase58 } from "@ocap/util";
|
|
2
|
-
import { fromPublicKey, fromRandom } from "@ocap/wallet";
|
|
3
|
-
const ACCESS_KEY_PREFIX = "blocklet-";
|
|
4
|
-
// Valid base58 format: 'z' multibase prefix + base58btc characters (typically 44 chars for Ed25519 32-byte key)
|
|
5
|
-
const BASE58_RE = /^z[1-9A-HJ-NP-Za-km-z]{30,50}$/;
|
|
6
|
-
/**
|
|
7
|
-
* Generate a new access key (keypair-based).
|
|
8
|
-
* Returns accessKeyId (DID), accessKeyPublic (for DB storage), and accessKeySecret (shown once).
|
|
9
|
-
*/
|
|
10
|
-
export function generateAccessKey() {
|
|
11
|
-
const wallet = fromRandom();
|
|
12
|
-
return {
|
|
13
|
-
accessKeyId: wallet.address,
|
|
14
|
-
accessKeyPublic: wallet.publicKey,
|
|
15
|
-
accessKeySecret: `${ACCESS_KEY_PREFIX}${toBase58(wallet.publicKey)}`,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Check if a token string looks like an access key token (blocklet-<base58(publicKey)>).
|
|
20
|
-
*/
|
|
21
|
-
export function isAccessKeyToken(token) {
|
|
22
|
-
if (typeof token !== "string")
|
|
23
|
-
return false;
|
|
24
|
-
if (!token.startsWith(ACCESS_KEY_PREFIX))
|
|
25
|
-
return false;
|
|
26
|
-
const pk = token.slice(ACCESS_KEY_PREFIX.length);
|
|
27
|
-
return BASE58_RE.test(pk);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Derive the accessKeyId (DID) from an access key token.
|
|
31
|
-
* Returns null if the token is invalid or cannot be decoded.
|
|
32
|
-
*/
|
|
33
|
-
export function deriveAccessKeyId(token) {
|
|
34
|
-
try {
|
|
35
|
-
if (!isAccessKeyToken(token))
|
|
36
|
-
return null;
|
|
37
|
-
const b58 = token.slice(ACCESS_KEY_PREFIX.length);
|
|
38
|
-
const wallet = fromPublicKey(fromBase58(b58));
|
|
39
|
-
return wallet.address;
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=access-key-util.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"access-key-util.js","sourceRoot":"","sources":["../src/access-key-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,iBAAiB,GAAG,WAAW,CAAC;AACtC,gHAAgH;AAChH,MAAM,SAAS,GAAG,gCAAgC,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAK/B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,OAAO;QAC3B,eAAe,EAAE,MAAM,CAAC,SAAS;QACjC,eAAe,EAAE,GAAG,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;KACrE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/access-policy.d.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Access policy enforcement logic — evaluates route-level access control.
|
|
3
|
-
*
|
|
4
|
-
* Pure functions, no I/O. Used by both the team-handler (API) and the
|
|
5
|
-
* Workers portal middleware (enforcement).
|
|
6
|
-
*/
|
|
7
|
-
import type { AccessType, Role } from "./types.js";
|
|
8
|
-
export interface RuleWithPolicy {
|
|
9
|
-
pathPattern: string;
|
|
10
|
-
priority: number;
|
|
11
|
-
id?: string;
|
|
12
|
-
roles: string | null;
|
|
13
|
-
reverse: number;
|
|
14
|
-
enabled?: number;
|
|
15
|
-
}
|
|
16
|
-
export interface AccessResult {
|
|
17
|
-
allowed: boolean;
|
|
18
|
-
reason?: "unauthenticated" | "unauthorized" | "no_matching_rule";
|
|
19
|
-
requiredRoles?: string[];
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Evaluate access for a request path against sorted rules + policies.
|
|
23
|
-
*
|
|
24
|
-
* @param rules - Active rules with inlined policy data (from store.getActiveRulesWithPolicies)
|
|
25
|
-
* @param requestPath - The URL pathname being accessed
|
|
26
|
-
* @param caller - Authenticated caller with role, or null if unauthenticated
|
|
27
|
-
*/
|
|
28
|
-
export declare function evaluateAccess(rules: RuleWithPolicy[], requestPath: string, caller: {
|
|
29
|
-
role: Role;
|
|
30
|
-
} | null): AccessResult;
|
|
31
|
-
/**
|
|
32
|
-
* Convert glob pattern to RegExp.
|
|
33
|
-
* * → matches one path segment (no slashes)
|
|
34
|
-
* ** → matches zero or more path segments (including slashes)
|
|
35
|
-
* :name → matches one path segment (named, for readability)
|
|
36
|
-
*/
|
|
37
|
-
export declare function globToRegex(pattern: string): RegExp;
|
|
38
|
-
export declare function matchPattern(pattern: string, path: string): boolean;
|
|
39
|
-
/**
|
|
40
|
-
* Convert API-level accessType + roles to DB-level roles (JSON) + reverse.
|
|
41
|
-
*/
|
|
42
|
-
export declare function accessTypeToDb(accessType: AccessType, roles?: string[]): {
|
|
43
|
-
roles: string | null;
|
|
44
|
-
reverse: number;
|
|
45
|
-
};
|
|
46
|
-
/**
|
|
47
|
-
* Convert DB-level roles + reverse to API-level accessType + parsed roles.
|
|
48
|
-
*/
|
|
49
|
-
export declare function dbToAccessType(rolesJson: string | null, reverse: number): {
|
|
50
|
-
accessType: AccessType;
|
|
51
|
-
roles?: string[];
|
|
52
|
-
};
|
|
53
|
-
//# sourceMappingURL=access-policy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"access-policy.d.ts","sourceRoot":"","sources":["../src/access-policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAInD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,iBAAiB,GAAG,cAAc,GAAG,kBAAkB,CAAC;IACjE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAID;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EAAE,EACvB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG,IAAI,GAC5B,YAAY,CAmBd;AA+CD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyBnD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnE;AAID;;GAEG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiB3C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,GACd;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAwB9C"}
|
package/dist/access-policy.js
DELETED
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Access policy enforcement logic — evaluates route-level access control.
|
|
3
|
-
*
|
|
4
|
-
* Pure functions, no I/O. Used by both the team-handler (API) and the
|
|
5
|
-
* Workers portal middleware (enforcement).
|
|
6
|
-
*/
|
|
7
|
-
// ─── Evaluation ───────────────────────────────────────────────────────────
|
|
8
|
-
/**
|
|
9
|
-
* Evaluate access for a request path against sorted rules + policies.
|
|
10
|
-
*
|
|
11
|
-
* @param rules - Active rules with inlined policy data (from store.getActiveRulesWithPolicies)
|
|
12
|
-
* @param requestPath - The URL pathname being accessed
|
|
13
|
-
* @param caller - Authenticated caller with role, or null if unauthenticated
|
|
14
|
-
*/
|
|
15
|
-
export function evaluateAccess(rules, requestPath, caller) {
|
|
16
|
-
// 1. Sort rules by priority ascending, 'default' rule last
|
|
17
|
-
const sorted = rules
|
|
18
|
-
.filter((r) => r.enabled !== 0)
|
|
19
|
-
.sort((a, b) => {
|
|
20
|
-
if (a.id === "default")
|
|
21
|
-
return 1;
|
|
22
|
-
if (b.id === "default")
|
|
23
|
-
return -1;
|
|
24
|
-
return a.priority - b.priority;
|
|
25
|
-
});
|
|
26
|
-
// 2. Find first matching rule
|
|
27
|
-
for (const rule of sorted) {
|
|
28
|
-
if (matchPattern(rule.pathPattern, requestPath)) {
|
|
29
|
-
return checkPolicy(rule.roles, rule.reverse, caller);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
// 3. No rule matched → deny (should not happen if default rule exists)
|
|
33
|
-
return { allowed: false, reason: "no_matching_rule" };
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Check a single policy against a caller.
|
|
37
|
-
*/
|
|
38
|
-
function checkPolicy(rolesJson, reverse, caller) {
|
|
39
|
-
const roles = rolesJson !== null ? JSON.parse(rolesJson) : null;
|
|
40
|
-
const isReverse = reverse === 1;
|
|
41
|
-
// Public: roles is NULL and reverse is false
|
|
42
|
-
if (roles === null && !isReverse) {
|
|
43
|
-
return { allowed: true };
|
|
44
|
-
}
|
|
45
|
-
// Any non-public policy requires authentication
|
|
46
|
-
if (!caller) {
|
|
47
|
-
return { allowed: false, reason: "unauthenticated" };
|
|
48
|
-
}
|
|
49
|
-
// Invited-only: empty roles array with reverse=true → any logged-in user
|
|
50
|
-
if (roles !== null && roles.length === 0 && isReverse) {
|
|
51
|
-
return { allowed: true };
|
|
52
|
-
}
|
|
53
|
-
// Role-based check
|
|
54
|
-
if (roles !== null && roles.length > 0) {
|
|
55
|
-
const allowedRoles = isReverse
|
|
56
|
-
? ["owner", "admin", "member", "guest"].filter((r) => !roles.includes(r))
|
|
57
|
-
: roles;
|
|
58
|
-
if (allowedRoles.includes(caller.role)) {
|
|
59
|
-
return { allowed: true };
|
|
60
|
-
}
|
|
61
|
-
return { allowed: false, reason: "unauthorized", requiredRoles: allowedRoles };
|
|
62
|
-
}
|
|
63
|
-
// Fallback: if roles is empty array and reverse is false → no one can access
|
|
64
|
-
return { allowed: false, reason: "unauthorized" };
|
|
65
|
-
}
|
|
66
|
-
// ─── Pattern Matching ─────────────────────────────────────────────────────
|
|
67
|
-
/**
|
|
68
|
-
* Convert glob pattern to RegExp.
|
|
69
|
-
* * → matches one path segment (no slashes)
|
|
70
|
-
* ** → matches zero or more path segments (including slashes)
|
|
71
|
-
* :name → matches one path segment (named, for readability)
|
|
72
|
-
*/
|
|
73
|
-
export function globToRegex(pattern) {
|
|
74
|
-
if (pattern === "*")
|
|
75
|
-
return /^.*$/; // special: match everything
|
|
76
|
-
let regex = "^";
|
|
77
|
-
let i = 0;
|
|
78
|
-
while (i < pattern.length) {
|
|
79
|
-
if (pattern[i] === "*" && pattern[i + 1] === "*") {
|
|
80
|
-
regex += ".*";
|
|
81
|
-
i += 2;
|
|
82
|
-
if (pattern[i] === "/")
|
|
83
|
-
i++; // skip trailing slash after **
|
|
84
|
-
}
|
|
85
|
-
else if (pattern[i] === "*") {
|
|
86
|
-
regex += "[^/]+";
|
|
87
|
-
i++;
|
|
88
|
-
}
|
|
89
|
-
else if (pattern[i] === ":") {
|
|
90
|
-
// Named param: consume until / or end
|
|
91
|
-
regex += "[^/]+";
|
|
92
|
-
i++;
|
|
93
|
-
while (i < pattern.length && pattern[i] !== "/")
|
|
94
|
-
i++;
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
regex += pattern[i].replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
98
|
-
i++;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
regex += "$";
|
|
102
|
-
return new RegExp(regex);
|
|
103
|
-
}
|
|
104
|
-
export function matchPattern(pattern, path) {
|
|
105
|
-
return globToRegex(pattern).test(path);
|
|
106
|
-
}
|
|
107
|
-
// ─── AccessType ↔ DB conversion ──────────────────────────────────────────
|
|
108
|
-
/**
|
|
109
|
-
* Convert API-level accessType + roles to DB-level roles (JSON) + reverse.
|
|
110
|
-
*/
|
|
111
|
-
export function accessTypeToDb(accessType, roles) {
|
|
112
|
-
switch (accessType) {
|
|
113
|
-
case "public":
|
|
114
|
-
return { roles: null, reverse: 0 };
|
|
115
|
-
case "invited":
|
|
116
|
-
return { roles: "[]", reverse: 1 };
|
|
117
|
-
case "owner":
|
|
118
|
-
return { roles: '["owner"]', reverse: 0 };
|
|
119
|
-
case "admin":
|
|
120
|
-
return { roles: '["owner","admin"]', reverse: 0 };
|
|
121
|
-
case "roles":
|
|
122
|
-
return { roles: JSON.stringify(roles ?? []), reverse: 0 };
|
|
123
|
-
case "roles_reverse":
|
|
124
|
-
return { roles: JSON.stringify(roles ?? []), reverse: 1 };
|
|
125
|
-
default:
|
|
126
|
-
return { roles: null, reverse: 0 };
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Convert DB-level roles + reverse to API-level accessType + parsed roles.
|
|
131
|
-
*/
|
|
132
|
-
export function dbToAccessType(rolesJson, reverse) {
|
|
133
|
-
if (rolesJson === null && reverse === 0) {
|
|
134
|
-
return { accessType: "public" };
|
|
135
|
-
}
|
|
136
|
-
const roles = rolesJson !== null ? JSON.parse(rolesJson) : [];
|
|
137
|
-
if (roles.length === 0 && reverse === 1) {
|
|
138
|
-
return { accessType: "invited" };
|
|
139
|
-
}
|
|
140
|
-
// Check for built-in presets
|
|
141
|
-
if (reverse === 0 && roles.length === 1 && roles[0] === "owner") {
|
|
142
|
-
return { accessType: "owner" };
|
|
143
|
-
}
|
|
144
|
-
if (reverse === 0 && roles.length === 2 && roles.includes("owner") && roles.includes("admin")) {
|
|
145
|
-
return { accessType: "admin" };
|
|
146
|
-
}
|
|
147
|
-
// Custom roles
|
|
148
|
-
if (reverse === 1) {
|
|
149
|
-
return { accessType: "roles_reverse", roles };
|
|
150
|
-
}
|
|
151
|
-
return { accessType: "roles", roles };
|
|
152
|
-
}
|
|
153
|
-
//# sourceMappingURL=access-policy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"access-policy.js","sourceRoot":"","sources":["../src/access-policy.ts"],"names":[],"mappings":"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"}
|
package/dist/auth-client.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Consumer-side helper for Auth Worker Service Binding.
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* import { createAuthClient, getCookie } from '@arcblock/did-connect-cloudflare/client';
|
|
6
|
-
* const client = createAuthClient(env.AUTH);
|
|
7
|
-
* const caller = await client.verify(request);
|
|
8
|
-
*/
|
|
9
|
-
import type { AuthRPCInterface, CallerIdentityDTO } from "./auth-rpc-types.js";
|
|
10
|
-
/** Extract a named cookie value from a Request. */
|
|
11
|
-
export declare function getCookie(request: Request, name: string): string | null;
|
|
12
|
-
/** Create a typed client wrapper around an AuthRPC binding. */
|
|
13
|
-
export declare function createAuthClient(binding: AuthRPCInterface): {
|
|
14
|
-
verify(request: Request): Promise<CallerIdentityDTO | null>;
|
|
15
|
-
verifyFull(request: Request): Promise<CallerIdentityDTO | null>;
|
|
16
|
-
resolveIdentity(request: Request, instanceDid?: string): Promise<CallerIdentityDTO | null>;
|
|
17
|
-
/** Return a redirect-to-login or 401 response for unauthenticated requests. */
|
|
18
|
-
unauthorized(request: Request): Response;
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=auth-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-client.d.ts","sourceRoot":"","sources":["../src/auth-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvE;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB;oBAEhC,OAAO,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;wBAKvC,OAAO,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;6BAM1D,OAAO,gBACF,MAAM,GACnB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAMpC,+EAA+E;0BACzD,OAAO,GAAG,QAAQ;EAO3C"}
|