@clize/clize 0.7.7 → 0.7.8

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.
@@ -1,408 +0,0 @@
1
- // ============================================================
2
- // clize 控制面 Worker(Phase 2 托管后端 / Phase 3 账户)
3
- // CLI / MCP ──(Authorization: Bearer <clize API key>)──▶ 这里
4
- // ├─ 鉴权:key 的 sha256 → api_keys → 租户 id
5
- // ├─ ctx = createCloudContext(Workers Secrets = clize 的 infra 凭证, tenantId, D1Store)
6
- // └─ 同一套 core(域名/邮箱/handle)→ 资源开在 clize 账号、按 tenant 隔离
7
- // 用户永不接触 CF / token / global key。
8
- // ============================================================
9
- import { createCloudContext } from "../context.js";
10
- import { D1Store } from "../state/d1-store.js";
11
- import * as domainsCore from "../core/domains.js";
12
- import * as handleCore from "../core/handle.js";
13
- import * as emailCore from "../core/email.js";
14
- import * as addressesCore from "../core/addresses.js";
15
- import * as billingCore from "../core/billing.js";
16
- import * as sitesCore from "../core/sites.js";
17
- import { createCheckoutSession, verifyStripeEvent } from "./stripe.js";
18
- import { ClizeError } from "../lib/errors.js";
19
- const json = (body, status = 200) => new Response(JSON.stringify(body, null, 2), {
20
- status,
21
- headers: { "content-type": "application/json; charset=utf-8" },
22
- });
23
- async function sha256hex(s) {
24
- const buf = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(s));
25
- return [...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, "0")).join("");
26
- }
27
- // 公开 client_id(非机密,可入码);client secret 永远走 env.GITHUB_CLIENT_SECRET。
28
- const GITHUB_CLIENT_ID = "Ov23ligBHSxiJ2SHwtGu";
29
- // 允许跨源调 API 的来源:线上 clize.ai;本地 localhost/127.0.0.1(任意端口,便于预览)。
30
- function isAllowedOrigin(origin) {
31
- try {
32
- const h = new URL(origin).hostname;
33
- return h === "clize.ai" || h === "www.clize.ai" || h === "localhost" || h === "127.0.0.1";
34
- }
35
- catch {
36
- return false;
37
- }
38
- }
39
- // dashboard 在 clize.ai、API 在 *.workers.dev → 跨源。按来源回 CORS 头(命中才回)。
40
- function corsHeadersFor(req) {
41
- const origin = req.headers.get("origin") || "";
42
- if (!isAllowedOrigin(origin))
43
- return {};
44
- return {
45
- "access-control-allow-origin": origin,
46
- "access-control-allow-methods": "GET, POST, OPTIONS",
47
- "access-control-allow-headers": "authorization, content-type, x-admin-key",
48
- "access-control-max-age": "86400",
49
- vary: "origin",
50
- };
51
- }
52
- // 运营端鉴权(任一通过即可):
53
- // ① 共享密钥:X-Admin-Key 匹配 worker secret ADMIN_KEY(脚本 / 后备)。
54
- // ② 账号制:Authorization: Bearer <clize key>,其租户 github_id 在 ADMIN_GITHUB_IDS
55
- // (逗号分隔)允许名单内 —— 让指定 GitHub 账号用 dashboard 登录态直接当 admin。
56
- async function isAdmin(req, env) {
57
- const k = req.headers.get("x-admin-key") || "";
58
- if (env.ADMIN_KEY && k === String(env.ADMIN_KEY))
59
- return true;
60
- const allow = String(env.ADMIN_GITHUB_IDS || "")
61
- .split(",")
62
- .map((s) => s.trim())
63
- .filter(Boolean);
64
- if (!allow.length)
65
- return false;
66
- const auth = req.headers.get("authorization") || "";
67
- const key = auth.startsWith("Bearer ") ? auth.slice(7).trim() : "";
68
- if (!key)
69
- return false;
70
- const store = new D1Store(env.DB);
71
- const tid = await store.tenantForKeyHash(await sha256hex(key));
72
- if (!tid)
73
- return false;
74
- const t = await store.getTenant(tid);
75
- return !!(t && t.githubId && allow.includes(t.githubId));
76
- }
77
- // GitHub 用户(access token)→ 按 github_id 找/建租户 → 发一个 clize key。
78
- // /v1/auth/github(CLI:已有 token)与 /v1/auth/github/web(web:先用 code 换 token)共用。
79
- async function githubTokenToKey(store, githubToken) {
80
- const ghRes = await fetch("https://api.github.com/user", {
81
- headers: {
82
- authorization: `Bearer ${githubToken}`,
83
- "user-agent": "clize",
84
- accept: "application/vnd.github+json",
85
- },
86
- });
87
- if (!ghRes.ok)
88
- return { ok: false, status: 401, error: "GitHub 鉴权失败(token 无效)" };
89
- const gh = (await ghRes.json());
90
- if (!gh.id)
91
- return { ok: false, status: 401, error: "GitHub 用户解析失败" };
92
- const ghId = String(gh.id);
93
- const now = new Date().toISOString();
94
- let tid = await store.tenantByGithubId(ghId);
95
- const isNew = !tid;
96
- if (!tid) {
97
- tid = "t_" + crypto.randomUUID().replace(/-/g, "").slice(0, 16);
98
- await store.upsertTenant({
99
- id: tid,
100
- githubId: ghId,
101
- plan: "free",
102
- status: "active",
103
- monthlySpendLimitUsd: null,
104
- outboundProvider: "cloudflare",
105
- dryRun: false,
106
- createdAt: now,
107
- updatedAt: now,
108
- });
109
- }
110
- const apiKey = "clize_" +
111
- [...crypto.getRandomValues(new Uint8Array(24))]
112
- .map((b) => b.toString(16).padStart(2, "0"))
113
- .join("");
114
- await store.insertApiKey(await sha256hex(apiKey), tid, "github:" + (gh.login ?? ""));
115
- return { ok: true, tenantId: tid, apiKey, githubLogin: gh.login, isNew };
116
- }
117
- export default {
118
- async fetch(req, env, exec) {
119
- const cors = corsHeadersFor(req);
120
- // 跨源预检:浏览器在带 Authorization 的请求前先发 OPTIONS,直接放行。
121
- if (req.method === "OPTIONS")
122
- return new Response(null, { status: 204, headers: cors });
123
- const res = await route(req, env, exec);
124
- for (const [k, v] of Object.entries(cors))
125
- res.headers.set(k, v);
126
- return res;
127
- },
128
- };
129
- async function route(req, env, exec) {
130
- try {
131
- const url = new URL(req.url);
132
- const path = url.pathname.replace(/\/+$/, "") || "/";
133
- if (path === "/" || path === "/health")
134
- return json({ service: "clize-control-plane", ok: true });
135
- // ---- 公开:自助注册 → 开租户 + 发一个 API key(明文只回显一次)----
136
- // 默认关闭:匿名 signup 是 bot 刷租户的口子。开户改走 GitHub 登录
137
- //(网页 /app 或 CLI `clize login`)。需临时开放时设 worker var SIGNUP_OPEN=true。
138
- if (path === "/v1/signup" && req.method === "POST") {
139
- if (String(env.SIGNUP_OPEN) !== "true")
140
- return json({ error: "公开注册已关闭,请用 GitHub 登录开户:网页 clize.ai/app,或 CLI `clize login`。" }, 403);
141
- const { email } = (await req.json().catch(() => ({})));
142
- const s = new D1Store(env.DB);
143
- const now = new Date().toISOString();
144
- const tid = "t_" + crypto.randomUUID().replace(/-/g, "").slice(0, 16);
145
- const apiKey = "clize_" +
146
- [...crypto.getRandomValues(new Uint8Array(24))]
147
- .map((b) => b.toString(16).padStart(2, "0"))
148
- .join("");
149
- await s.upsertTenant({
150
- id: tid,
151
- email,
152
- plan: "free",
153
- status: "active",
154
- monthlySpendLimitUsd: null,
155
- outboundProvider: "cloudflare",
156
- dryRun: false,
157
- createdAt: now,
158
- updatedAt: now,
159
- });
160
- await s.insertApiKey(await sha256hex(apiKey), tid, "signup");
161
- return json({
162
- tenantId: tid,
163
- apiKey,
164
- message: "保存好这个 key(只显示这一次)。CLI:clize login --api <url> --token <key>",
165
- });
166
- }
167
- // ---- GitHub OAuth 登录:验 github token → 按 github_id 找/建租户 → 发 key ----
168
- // 身份 = GitHub(外部强验证);key 成可重发凭证,丢了重新授权即找回同一租户。
169
- if (path === "/v1/auth/github" && req.method === "POST") {
170
- const { githubToken } = (await req.json().catch(() => ({})));
171
- if (!githubToken)
172
- return json({ error: "缺 githubToken" }, 400);
173
- const r = await githubTokenToKey(new D1Store(env.DB), githubToken);
174
- if (!r.ok)
175
- return json({ error: r.error }, r.status);
176
- return json({
177
- tenantId: r.tenantId,
178
- apiKey: r.apiKey,
179
- githubLogin: r.githubLogin,
180
- isNew: r.isNew,
181
- message: r.isNew ? "已创建账户并登录(GitHub)。" : "已登录(GitHub),找回原账户。",
182
- });
183
- }
184
- // ---- GitHub Web OAuth(dashboard 用):code → access_token → 复用上面的发 key 逻辑 ----
185
- // client secret 走 worker secret(GITHUB_CLIENT_SECRET),绝不入码/回显。
186
- if (path === "/v1/auth/github/web" && req.method === "POST") {
187
- if (!env.GITHUB_CLIENT_SECRET)
188
- return json({ error: "web OAuth 未配置(缺 GITHUB_CLIENT_SECRET)" }, 503);
189
- const { code, redirectUri } = (await req.json().catch(() => ({})));
190
- if (!code)
191
- return json({ error: "缺 code" }, 400);
192
- const tokRes = await fetch("https://github.com/login/oauth/access_token", {
193
- method: "POST",
194
- headers: { accept: "application/json", "content-type": "application/json" },
195
- body: JSON.stringify({
196
- client_id: GITHUB_CLIENT_ID,
197
- client_secret: String(env.GITHUB_CLIENT_SECRET),
198
- code,
199
- redirect_uri: redirectUri,
200
- }),
201
- });
202
- const tok = (await tokRes.json().catch(() => ({})));
203
- if (!tok.access_token)
204
- return json({ error: "GitHub code 交换失败", detail: tok.error_description || tok.error }, 401);
205
- const r = await githubTokenToKey(new D1Store(env.DB), tok.access_token);
206
- if (!r.ok)
207
- return json({ error: r.error }, r.status);
208
- return json({
209
- tenantId: r.tenantId,
210
- apiKey: r.apiKey,
211
- githubLogin: r.githubLogin,
212
- isNew: r.isNew,
213
- });
214
- }
215
- // ---- 管理员:给某租户手动充值(加额度;真实支付通道后面接)----
216
- if (path === "/v1/admin/recharge" && req.method === "POST") {
217
- if (!(await isAdmin(req, env)))
218
- return json({ error: "管理员鉴权失败(需有效 ADMIN_KEY 或 admin 账号)" }, 401);
219
- const body = (await req.json().catch(() => ({})));
220
- if (!body.tenantId || !(Number(body.amountUsd) > 0))
221
- return json({ error: "需 tenantId + 正数 amountUsd" }, 400);
222
- const detail = { by: "admin" };
223
- if (body.note)
224
- detail.note = String(body.note).slice(0, 200);
225
- const r = await new D1Store(env.DB).creditBalance(body.tenantId, Number(body.amountUsd), {
226
- action: "recharge",
227
- detail,
228
- });
229
- return json({
230
- tenantId: body.tenantId,
231
- creditedUsd: Number(body.amountUsd),
232
- balanceUsd: r.balanceAfter,
233
- });
234
- }
235
- // ---- 运营端总览:全局聚合 + 全租户列表(含余额)----
236
- if (path === "/v1/admin/overview" && req.method === "GET") {
237
- if (!(await isAdmin(req, env)))
238
- return json({ error: "管理员鉴权失败(需有效 ADMIN_KEY 或 admin 账号)" }, 401);
239
- const s = new D1Store(env.DB);
240
- const [totals, tenants] = await Promise.all([s.adminTotals(), s.listAllTenants()]);
241
- return json({ ...totals, tenants });
242
- }
243
- // ---- 运营端:单租户详情 + 最近流水(充值前后核对用)----
244
- if (path === "/v1/admin/tenant" && req.method === "GET") {
245
- if (!(await isAdmin(req, env)))
246
- return json({ error: "管理员鉴权失败(需有效 ADMIN_KEY 或 admin 账号)" }, 401);
247
- const id = url.searchParams.get("id") || "";
248
- if (!id)
249
- return json({ error: "需 id" }, 400);
250
- const s = new D1Store(env.DB);
251
- const tenant = await s.getTenant(id);
252
- if (!tenant)
253
- return json({ error: `未找到租户 ${id}` }, 404);
254
- const [ledger, identities] = await Promise.all([
255
- s.listLedger(id, 50),
256
- s.listIdentities(id),
257
- ]);
258
- return json({
259
- tenant: { ...tenant, balanceUsd: (await s.getBalanceUsd(id)) ?? 0 },
260
- domainCount: identities.length,
261
- domains: identities.map((i) => i.domain),
262
- ledger,
263
- });
264
- }
265
- // ---- Stripe webhook(公开:靠签名验真,不走 clize key)----
266
- if (path === "/v1/stripe/webhook" && req.method === "POST") {
267
- if (!env.STRIPE_WEBHOOK_SECRET)
268
- return json({ error: "webhook 未配置" }, 503);
269
- const raw = await req.text();
270
- const evt = await verifyStripeEvent(raw, req.headers.get("stripe-signature") || "", String(env.STRIPE_WEBHOOK_SECRET));
271
- if (!evt)
272
- return json({ error: "签名验证失败" }, 400);
273
- if (evt.type === "checkout.session.completed") {
274
- const s = evt.data.object;
275
- const tid = s.metadata?.tenantId;
276
- const amt = Number(s.metadata?.amountUsd);
277
- if (tid && amt > 0 && s.payment_status === "paid") {
278
- const store = new D1Store(env.DB);
279
- // 幂等:同一 event 只入账一次(Stripe 会重试)。
280
- if (await store.recordEventOnce(evt.id))
281
- await store.creditBalance(tid, amt, {
282
- action: "recharge",
283
- detail: { by: "stripe", sessionId: s.id },
284
- });
285
- }
286
- }
287
- return json({ received: true });
288
- }
289
- // ---- 充值完成回跳页(Stripe success/cancel 跳这)----
290
- if (path === "/v1/recharge/done") {
291
- const okp = url.searchParams.get("ok") === "1";
292
- return new Response(`<!doctype html><meta charset=utf-8><title>Clize</title><body style="font-family:system-ui;background:#0e1018;color:#cfd6e0;display:grid;place-items:center;height:100vh;margin:0"><div style="text-align:center"><h2>${okp ? "✅ 支付完成" : "已取消"}</h2><p>${okp ? "余额到账中(几秒)。回到终端跑 <code>clize balance</code> 查看。" : "未扣款。可重新 <code>clize recharge</code>。"}</p></div></body>`, { headers: { "content-type": "text/html; charset=utf-8" } });
293
- }
294
- // ---- 鉴权:Bearer <clize key> → sha256 → 租户 ----
295
- const auth = req.headers.get("authorization") || "";
296
- const key = auth.startsWith("Bearer ") ? auth.slice(7).trim() : "";
297
- if (!key)
298
- return json({ error: "缺少 Authorization: Bearer <clize API key>" }, 401);
299
- const store = new D1Store(env.DB);
300
- const keyHash = await sha256hex(key);
301
- const tenantId = await store.tenantForKeyHash(keyHash);
302
- if (!tenantId)
303
- return json({ error: "无效或已吊销的 API key" }, 401);
304
- exec.waitUntil(store.touchKey(keyHash));
305
- const ctx = createCloudContext({
306
- env: env,
307
- tenantId,
308
- store,
309
- });
310
- // ---- 路由(全用 fs-free 的 core)----
311
- const readJson = async () => (await req.json().catch(() => ({})));
312
- if (path === "/v1/whoami") {
313
- // 给 dashboard 一个 isAdmin 标志(租户 github_id 在 ADMIN_GITHUB_IDS 内)→ 显示 admin 入口。
314
- const allow = String(env.ADMIN_GITHUB_IDS || "")
315
- .split(",")
316
- .map((s) => s.trim())
317
- .filter(Boolean);
318
- const t = allow.length ? await store.getTenant(tenantId) : undefined;
319
- const admin = !!(t && t.githubId && allow.includes(t.githubId));
320
- return json({ tenantId, isAdmin: admin });
321
- }
322
- if (path === "/v1/status")
323
- return json(await domainsCore.workspaceStatus(ctx));
324
- if (path === "/v1/context")
325
- return json(await addressesCore.addressContext(ctx, url.searchParams.get("address") || undefined));
326
- if (path === "/v1/domain/list")
327
- return json(await domainsCore.listDomains(ctx));
328
- if (path === "/v1/audit")
329
- return json(await domainsCore.auditLog(ctx, Number(url.searchParams.get("limit") || "20")));
330
- if (path === "/v1/balance")
331
- return json(await billingCore.balance(ctx));
332
- if (path === "/v1/recharge/session" && req.method === "POST") {
333
- if (!env.STRIPE_SECRET_KEY)
334
- return json({ error: "支付未配置(缺 STRIPE_SECRET_KEY)" }, 503);
335
- const { amountUsd, returnUrl } = await readJson();
336
- const amt = Number(amountUsd);
337
- if (!(amt > 0))
338
- return json({ error: "需正数 amountUsd" }, 400);
339
- // 充值完成后跳回地址:仅当是受信来源(clize.ai/本地)才采用,避免被当成开放重定向。
340
- let safeReturn;
341
- try {
342
- if (returnUrl && isAllowedOrigin(new URL(returnUrl).origin))
343
- safeReturn = returnUrl;
344
- }
345
- catch {
346
- /* returnUrl 非法 → 忽略,回退到默认 done 页 */
347
- }
348
- const session = await createCheckoutSession(String(env.STRIPE_SECRET_KEY), {
349
- tenantId,
350
- amountUsd: amt,
351
- baseUrl: url.origin,
352
- returnUrl: safeReturn,
353
- });
354
- return json({
355
- checkoutUrl: session.url,
356
- amountUsd: amt,
357
- message: "在浏览器打开 checkoutUrl 完成支付;付款后余额自动到账(clize balance 查看)。",
358
- });
359
- }
360
- if (path === "/v1/domain/search" && req.method === "POST") {
361
- const body = await readJson();
362
- const list = body.domains ?? (body.domain ? [body.domain] : []);
363
- return json(await domainsCore.searchDomains(ctx, list));
364
- }
365
- if (path === "/v1/domain/buy" && req.method === "POST") {
366
- const body = await readJson();
367
- if (!body.confirm)
368
- return json({
369
- quote: await domainsCore.searchDomains(ctx, [body.domain]),
370
- message: "这是报价。confirm=true 才真注册(从余额扣费,余额不足会拦)。",
371
- });
372
- return json(await domainsCore.registerDomain(ctx, body.domain, { autoRenew: body.autoRenew }));
373
- }
374
- if (path === "/v1/claim" && req.method === "POST") {
375
- const { slug } = await readJson();
376
- return json(await handleCore.claimHandle(ctx, slug));
377
- }
378
- if (path === "/v1/deploy" && req.method === "POST") {
379
- const body = await readJson();
380
- if (!body.domain || !Array.isArray(body.files) || !body.files.length)
381
- return json({ error: "需 domain + files[]" }, 400);
382
- // 校验该 handle 属于本租户(防跨租户部署到别人的站)
383
- const owned = await store.getIdentity(tenantId, body.domain.toLowerCase());
384
- if (!owned)
385
- return json({ error: `${body.domain} 不属于你或未 claim;先 clize claim <slug>` }, 403);
386
- return json(await sitesCore.deployFilesToHandle(ctx, body.domain, body.files));
387
- }
388
- if (path === "/v1/email/inbox")
389
- return json(await emailCore.checkInbox(ctx, url.searchParams.get("domain") || "", Number(url.searchParams.get("limit") || "30")));
390
- if (path === "/v1/email/show")
391
- return json(await emailCore.getMessage(ctx, url.searchParams.get("domain") || "", url.searchParams.get("id") || ""));
392
- if (path === "/v1/email/thread")
393
- return json(await emailCore.emailThread(ctx, url.searchParams.get("domain") || "", url.searchParams.get("contact") || ""));
394
- if (path === "/v1/email/send" && req.method === "POST") {
395
- const m = await readJson();
396
- if (!m.confirm)
397
- return json({ draft: m, message: "📨 草稿,未发送。confirm=true 才真发。" });
398
- return json(await emailCore.sendEmail(ctx, m));
399
- }
400
- return json({ error: `未知路由 ${req.method} ${path}` }, 404);
401
- }
402
- catch (e) {
403
- // 业务错误(如余额不足 402)映射到对应状态码;其余 500。
404
- const status = e instanceof ClizeError ? e.status : 500;
405
- return json({ error: e instanceof Error ? e.message : String(e) }, status);
406
- }
407
- }
408
- //# sourceMappingURL=worker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/server/worker.ts"],"names":[],"mappings":"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"}