@polardbx/pxbaas 0.0.0-stage → 0.1.0-beta.10
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/README.md +223 -2
- package/bin/pxbaas.js +13 -0
- package/dist/app/local-index.d.ts +70 -0
- package/dist/app/local-index.d.ts.map +1 -0
- package/dist/app/local-index.js +140 -0
- package/dist/app/local-index.js.map +1 -0
- package/dist/app/preflight.d.ts +61 -0
- package/dist/app/preflight.d.ts.map +1 -0
- package/dist/app/preflight.js +115 -0
- package/dist/app/preflight.js.map +1 -0
- package/dist/app/spec-lint.d.ts +45 -0
- package/dist/app/spec-lint.d.ts.map +1 -0
- package/dist/app/spec-lint.js +423 -0
- package/dist/app/spec-lint.js.map +1 -0
- package/dist/app/templates.d.ts +167 -0
- package/dist/app/templates.d.ts.map +1 -0
- package/dist/app/templates.js +151 -0
- package/dist/app/templates.js.map +1 -0
- package/dist/cli/help-guides.d.ts +17 -0
- package/dist/cli/help-guides.d.ts.map +1 -0
- package/dist/cli/help-guides.js +132 -0
- package/dist/cli/help-guides.js.map +1 -0
- package/dist/cli/root.d.ts +3 -0
- package/dist/cli/root.d.ts.map +1 -0
- package/dist/cli/root.js +75 -0
- package/dist/cli/root.js.map +1 -0
- package/dist/commands/app/index.d.ts +8 -0
- package/dist/commands/app/index.d.ts.map +1 -0
- package/dist/commands/app/index.js +1907 -0
- package/dist/commands/app/index.js.map +1 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +198 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/completion/index.d.ts +3 -0
- package/dist/commands/completion/index.d.ts.map +1 -0
- package/dist/commands/completion/index.js +14 -0
- package/dist/commands/completion/index.js.map +1 -0
- package/dist/commands/data/index.d.ts +55 -0
- package/dist/commands/data/index.d.ts.map +1 -0
- package/dist/commands/data/index.js +407 -0
- package/dist/commands/data/index.js.map +1 -0
- package/dist/commands/db/index.d.ts +29 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +500 -0
- package/dist/commands/db/index.js.map +1 -0
- package/dist/commands/doctor/index.d.ts +3 -0
- package/dist/commands/doctor/index.d.ts.map +1 -0
- package/dist/commands/doctor/index.js +305 -0
- package/dist/commands/doctor/index.js.map +1 -0
- package/dist/commands/functions/delete.d.ts +3 -0
- package/dist/commands/functions/delete.d.ts.map +1 -0
- package/dist/commands/functions/delete.js +55 -0
- package/dist/commands/functions/delete.js.map +1 -0
- package/dist/commands/functions/deploy.d.ts +3 -0
- package/dist/commands/functions/deploy.d.ts.map +1 -0
- package/dist/commands/functions/deploy.js +118 -0
- package/dist/commands/functions/deploy.js.map +1 -0
- package/dist/commands/functions/index.d.ts +3 -0
- package/dist/commands/functions/index.d.ts.map +1 -0
- package/dist/commands/functions/index.js +15 -0
- package/dist/commands/functions/index.js.map +1 -0
- package/dist/commands/functions/list.d.ts +6 -0
- package/dist/commands/functions/list.d.ts.map +1 -0
- package/dist/commands/functions/list.js +63 -0
- package/dist/commands/functions/list.js.map +1 -0
- package/dist/commands/functions/new.d.ts +7 -0
- package/dist/commands/functions/new.d.ts.map +1 -0
- package/dist/commands/functions/new.js +72 -0
- package/dist/commands/functions/new.js.map +1 -0
- package/dist/commands/gen/index.d.ts +3 -0
- package/dist/commands/gen/index.d.ts.map +1 -0
- package/dist/commands/gen/index.js +323 -0
- package/dist/commands/gen/index.js.map +1 -0
- package/dist/commands/guide/index.d.ts +8 -0
- package/dist/commands/guide/index.d.ts.map +1 -0
- package/dist/commands/guide/index.js +20 -0
- package/dist/commands/guide/index.js.map +1 -0
- package/dist/commands/instance/index.d.ts +8 -0
- package/dist/commands/instance/index.d.ts.map +1 -0
- package/dist/commands/instance/index.js +481 -0
- package/dist/commands/instance/index.js.map +1 -0
- package/dist/commands/login/index.d.ts +3 -0
- package/dist/commands/login/index.d.ts.map +1 -0
- package/dist/commands/login/index.js +145 -0
- package/dist/commands/login/index.js.map +1 -0
- package/dist/commands/logout/index.d.ts +3 -0
- package/dist/commands/logout/index.d.ts.map +1 -0
- package/dist/commands/logout/index.js +41 -0
- package/dist/commands/logout/index.js.map +1 -0
- package/dist/commands/profile/import-env.d.ts +18 -0
- package/dist/commands/profile/import-env.d.ts.map +1 -0
- package/dist/commands/profile/import-env.js +206 -0
- package/dist/commands/profile/import-env.js.map +1 -0
- package/dist/commands/profile/index.d.ts +3 -0
- package/dist/commands/profile/index.d.ts.map +1 -0
- package/dist/commands/profile/index.js +124 -0
- package/dist/commands/profile/index.js.map +1 -0
- package/dist/commands/rest/index.d.ts +3 -0
- package/dist/commands/rest/index.d.ts.map +1 -0
- package/dist/commands/rest/index.js +102 -0
- package/dist/commands/rest/index.js.map +1 -0
- package/dist/commands/skill/index.d.ts +11 -0
- package/dist/commands/skill/index.d.ts.map +1 -0
- package/dist/commands/skill/index.js +228 -0
- package/dist/commands/skill/index.js.map +1 -0
- package/dist/commands/status/index.d.ts +3 -0
- package/dist/commands/status/index.d.ts.map +1 -0
- package/dist/commands/status/index.js +59 -0
- package/dist/commands/status/index.js.map +1 -0
- package/dist/commands/storage/index.d.ts +3 -0
- package/dist/commands/storage/index.d.ts.map +1 -0
- package/dist/commands/storage/index.js +400 -0
- package/dist/commands/storage/index.js.map +1 -0
- package/dist/commands/tenant/index.d.ts +19 -0
- package/dist/commands/tenant/index.d.ts.map +1 -0
- package/dist/commands/tenant/index.js +667 -0
- package/dist/commands/tenant/index.js.map +1 -0
- package/dist/commands/whoami/index.d.ts +3 -0
- package/dist/commands/whoami/index.d.ts.map +1 -0
- package/dist/commands/whoami/index.js +101 -0
- package/dist/commands/whoami/index.js.map +1 -0
- package/dist/credentials/commit.d.ts +38 -0
- package/dist/credentials/commit.d.ts.map +1 -0
- package/dist/credentials/commit.js +57 -0
- package/dist/credentials/commit.js.map +1 -0
- package/dist/credentials/credential-store.d.ts +86 -0
- package/dist/credentials/credential-store.d.ts.map +1 -0
- package/dist/credentials/credential-store.js +282 -0
- package/dist/credentials/credential-store.js.map +1 -0
- package/dist/credentials/env-file.d.ts +85 -0
- package/dist/credentials/env-file.d.ts.map +1 -0
- package/dist/credentials/env-file.js +193 -0
- package/dist/credentials/env-file.js.map +1 -0
- package/dist/credentials/formatter.d.ts +39 -0
- package/dist/credentials/formatter.d.ts.map +1 -0
- package/dist/credentials/formatter.js +79 -0
- package/dist/credentials/formatter.js.map +1 -0
- package/dist/credentials/index.d.ts +13 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +13 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/jwt-introspect.d.ts +39 -0
- package/dist/credentials/jwt-introspect.d.ts.map +1 -0
- package/dist/credentials/jwt-introspect.js +64 -0
- package/dist/credentials/jwt-introspect.js.map +1 -0
- package/dist/credentials/masker.d.ts +23 -0
- package/dist/credentials/masker.d.ts.map +1 -0
- package/dist/credentials/masker.js +40 -0
- package/dist/credentials/masker.js.map +1 -0
- package/dist/credentials/profile.d.ts +95 -0
- package/dist/credentials/profile.d.ts.map +1 -0
- package/dist/credentials/profile.js +207 -0
- package/dist/credentials/profile.js.map +1 -0
- package/dist/credentials/tenant-guard.d.ts +16 -0
- package/dist/credentials/tenant-guard.d.ts.map +1 -0
- package/dist/credentials/tenant-guard.js +53 -0
- package/dist/credentials/tenant-guard.js.map +1 -0
- package/dist/credentials/tty-guard.d.ts +29 -0
- package/dist/credentials/tty-guard.d.ts.map +1 -0
- package/dist/credentials/tty-guard.js +79 -0
- package/dist/credentials/tty-guard.js.map +1 -0
- package/dist/db/apply-schema.d.ts +144 -0
- package/dist/db/apply-schema.d.ts.map +1 -0
- package/dist/db/apply-schema.js +359 -0
- package/dist/db/apply-schema.js.map +1 -0
- package/dist/db/introspect.d.ts +54 -0
- package/dist/db/introspect.d.ts.map +1 -0
- package/dist/db/introspect.js +140 -0
- package/dist/db/introspect.js.map +1 -0
- package/dist/db/sql-file.d.ts +104 -0
- package/dist/db/sql-file.d.ts.map +1 -0
- package/dist/db/sql-file.js +584 -0
- package/dist/db/sql-file.js.map +1 -0
- package/dist/instance/provision.d.ts +89 -0
- package/dist/instance/provision.d.ts.map +1 -0
- package/dist/instance/provision.js +139 -0
- package/dist/instance/provision.js.map +1 -0
- package/dist/instance/zero-store.d.ts +47 -0
- package/dist/instance/zero-store.d.ts.map +1 -0
- package/dist/instance/zero-store.js +91 -0
- package/dist/instance/zero-store.js.map +1 -0
- package/dist/instance/zero-whitelist.d.ts +39 -0
- package/dist/instance/zero-whitelist.d.ts.map +1 -0
- package/dist/instance/zero-whitelist.js +67 -0
- package/dist/instance/zero-whitelist.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +69 -0
- package/dist/main.js.map +1 -0
- package/dist/skill/agents-md.d.ts +25 -0
- package/dist/skill/agents-md.d.ts.map +1 -0
- package/dist/skill/agents-md.js +62 -0
- package/dist/skill/agents-md.js.map +1 -0
- package/dist/skill/assets.d.ts +38 -0
- package/dist/skill/assets.d.ts.map +1 -0
- package/dist/skill/assets.js +111 -0
- package/dist/skill/assets.js.map +1 -0
- package/dist/skill/hint.d.ts +39 -0
- package/dist/skill/hint.d.ts.map +1 -0
- package/dist/skill/hint.js +109 -0
- package/dist/skill/hint.js.map +1 -0
- package/dist/skill/hosts.d.ts +45 -0
- package/dist/skill/hosts.d.ts.map +1 -0
- package/dist/skill/hosts.js +96 -0
- package/dist/skill/hosts.js.map +1 -0
- package/dist/skill/installer.d.ts +100 -0
- package/dist/skill/installer.d.ts.map +1 -0
- package/dist/skill/installer.js +241 -0
- package/dist/skill/installer.js.map +1 -0
- package/dist/skill/ownership.d.ts +35 -0
- package/dist/skill/ownership.d.ts.map +1 -0
- package/dist/skill/ownership.js +52 -0
- package/dist/skill/ownership.js.map +1 -0
- package/dist/tenant/bundle.d.ts +66 -0
- package/dist/tenant/bundle.d.ts.map +1 -0
- package/dist/tenant/bundle.js +132 -0
- package/dist/tenant/bundle.js.map +1 -0
- package/dist/tenant/guide.d.ts +50 -0
- package/dist/tenant/guide.d.ts.map +1 -0
- package/dist/tenant/guide.js +152 -0
- package/dist/tenant/guide.js.map +1 -0
- package/dist/tenant/probe.d.ts +65 -0
- package/dist/tenant/probe.d.ts.map +1 -0
- package/dist/tenant/probe.js +159 -0
- package/dist/tenant/probe.js.map +1 -0
- package/dist/tenant/verify.d.ts +37 -0
- package/dist/tenant/verify.d.ts.map +1 -0
- package/dist/tenant/verify.js +132 -0
- package/dist/tenant/verify.js.map +1 -0
- package/dist/version.d.ts +29 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +65 -0
- package/dist/version.js.map +1 -0
- package/package.json +63 -3
- package/skills/pxbaas-app-spec/SKILL.md +165 -0
- package/skills/pxbaas-app-spec/references/deploy-options.md +158 -0
- package/skills/pxbaas-app-spec/references/guardrails-pitfalls.md +89 -0
- package/skills/pxbaas-app-spec/references/runtime-contract.md +151 -0
- package/skills/pxbaas-app-spec/references/ssr-session.md +121 -0
- package/skills/pxbaas-app-spec/references/templates-examples.md +311 -0
- package/skills/pxbaas-cli/SKILL.md +186 -0
- package/skills/pxbaas-cli/references/api-reference.md +68 -0
- package/skills/pxbaas-cli/references/app-deploy.md +186 -0
- package/skills/pxbaas-cli/references/auth-and-credentials.md +116 -0
- package/skills/pxbaas-cli/references/data-postgrest.md +101 -0
- package/skills/pxbaas-cli/references/db-and-meta.md +102 -0
- package/skills/pxbaas-cli/references/edge-functions.md +71 -0
- package/skills/pxbaas-cli/references/multi-tenant-apps.md +138 -0
- package/skills/pxbaas-cli/references/provision.md +101 -0
- package/skills/pxbaas-cli/references/safety-and-two-phase.md +78 -0
- package/skills/pxbaas-cli/references/storage.md +61 -0
- package/skills/pxbaas-cli/references/tenant-admin.md +122 -0
- package/skills/pxbaas-cli/references/troubleshooting.md +76 -0
- package/templates/webapp/api/index.ts +55 -0
- package/templates/webapp/csr-bff/README.md +81 -0
- package/templates/webapp/csr-bff/backend/index.ts +168 -0
- package/templates/webapp/csr-bff/db/rls.json +13 -0
- package/templates/webapp/csr-bff/db/schema.sql +49 -0
- package/templates/webapp/csr-bff/frontend/dist/admin.html +101 -0
- package/templates/webapp/csr-bff/frontend/dist/article.html +44 -0
- package/templates/webapp/csr-bff/frontend/dist/blog.js +206 -0
- package/templates/webapp/csr-bff/frontend/dist/blogger.html +53 -0
- package/templates/webapp/csr-bff/frontend/dist/index.html +70 -0
- package/templates/webapp/csr-bff/frontend/dist/login.html +56 -0
- package/templates/webapp/csr-bff/frontend/dist/profile.html +59 -0
- package/templates/webapp/csr-bff/frontend/dist/signup.html +78 -0
- package/templates/webapp/csr-bff/frontend/dist/style.css +27 -0
- package/templates/webapp/manifest.json +419 -0
- package/templates/webapp/mpa/about.html +29 -0
- package/templates/webapp/mpa/app.js +42 -0
- package/templates/webapp/mpa/index.html +42 -0
- package/templates/webapp/mpa/index.ts +60 -0
- package/templates/webapp/mpa/style.css +42 -0
- package/templates/webapp/react-vite/frontend/index.html +12 -0
- package/templates/webapp/react-vite/frontend/package-lock.json +1826 -0
- package/templates/webapp/react-vite/frontend/package.json +23 -0
- package/templates/webapp/react-vite/frontend/src/App.tsx +34 -0
- package/templates/webapp/react-vite/frontend/src/main.tsx +13 -0
- package/templates/webapp/react-vite/frontend/src/style.css +46 -0
- package/templates/webapp/react-vite/frontend/tsconfig.json +20 -0
- package/templates/webapp/react-vite/frontend/vite.config.ts +10 -0
- package/templates/webapp/react-vite-hono/backend/index.ts +38 -0
- package/templates/webapp/react-vite-hono/frontend/index.html +12 -0
- package/templates/webapp/react-vite-hono/frontend/package-lock.json +1826 -0
- package/templates/webapp/react-vite-hono/frontend/package.json +23 -0
- package/templates/webapp/react-vite-hono/frontend/src/App.tsx +47 -0
- package/templates/webapp/react-vite-hono/frontend/src/main.tsx +13 -0
- package/templates/webapp/react-vite-hono/frontend/src/style.css +66 -0
- package/templates/webapp/react-vite-hono/frontend/tsconfig.json +20 -0
- package/templates/webapp/react-vite-hono/frontend/vite.config.ts +10 -0
- package/templates/webapp/spa/index.ts +119 -0
- package/templates/webapp/ssr-auth/backend/index.ts +133 -0
- package/templates/webapp/ssr-auth/frontend/dist/index.html +15 -0
- package/templates/webapp/ssr-blog/README.md +111 -0
- package/templates/webapp/ssr-blog/backend/index.ts +764 -0
- package/templates/webapp/ssr-blog/db/rls.json +13 -0
- package/templates/webapp/ssr-blog/db/schema.sql +51 -0
- package/templates/webapp/ssr-blog/frontend/dist/index.html +39 -0
- package/templates/webapp/ssr-frameworks/README.md +64 -0
- package/templates/webapp/ssr-frameworks/backend/index.ts +241 -0
- package/templates/webapp/ssr-frameworks/frontend/dist/index.html +31 -0
- package/templates/webapp/ssr-hono/backend/index.ts +111 -0
- package/templates/webapp/ssr-hono/frontend/dist/index.html +12 -0
- package/templates/webapp/ssr-shop/README.md +80 -0
- package/templates/webapp/ssr-shop/backend/index.ts +491 -0
- package/templates/webapp/ssr-shop/db/rls.json +16 -0
- package/templates/webapp/ssr-shop/db/schema.sql +90 -0
- package/templates/webapp/ssr-shop/frontend/dist/index.html +12 -0
- package/templates/webapp/vanilla-static/frontend/dist/app.js +6 -0
- package/templates/webapp/vanilla-static/frontend/dist/index.html +19 -0
- package/templates/webapp/vanilla-static/frontend/dist/style.css +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/tenant/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/whoami/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa5D"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { CredentialStore, ProfileManager, introspectJwt, computeFingerprint, formatExpiry, formatError, } from '../../credentials/index.js';
|
|
2
|
+
export function registerWhoamiCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command('whoami')
|
|
5
|
+
.description('Display current profile, endpoint, tenant, role, and key fingerprints')
|
|
6
|
+
.action(async () => {
|
|
7
|
+
try {
|
|
8
|
+
await handleWhoami(program);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
12
|
+
console.error(formatError(message));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/** 该 profile 是否绑定了实例管理凭据;只回报掩码用户名与口令指纹。 */
|
|
18
|
+
async function describeAdmin(store, profileName) {
|
|
19
|
+
const admin = await store.getAdminCredentials(profileName);
|
|
20
|
+
if (!admin)
|
|
21
|
+
return { available: false };
|
|
22
|
+
return {
|
|
23
|
+
available: true,
|
|
24
|
+
userMasked: admin.username.length <= 2 ? '**' : `${admin.username.slice(0, 2)}***${admin.username.slice(-1)}`,
|
|
25
|
+
passwordFingerprint: computeFingerprint(admin.password),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async function handleWhoami(program) {
|
|
29
|
+
const profileManager = new ProfileManager();
|
|
30
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
31
|
+
if (!currentProfile) {
|
|
32
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
33
|
+
}
|
|
34
|
+
const credentialStore = new CredentialStore();
|
|
35
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
36
|
+
if (!credentials) {
|
|
37
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
38
|
+
}
|
|
39
|
+
// 解析 JWT(只解码,不验证签名)
|
|
40
|
+
const anonJwt = await introspectJwt(credentials.anonKey);
|
|
41
|
+
const serviceJwt = await introspectJwt(credentials.serviceRoleKey);
|
|
42
|
+
const output = {
|
|
43
|
+
profile: currentProfile.name,
|
|
44
|
+
endpoint: currentProfile.endpoint,
|
|
45
|
+
tenantId: currentProfile.tenantId || '(single-tenant)',
|
|
46
|
+
mode: currentProfile.mode,
|
|
47
|
+
anonKey: {
|
|
48
|
+
fingerprint: computeFingerprint(credentials.anonKey),
|
|
49
|
+
role: anonJwt.payload.role,
|
|
50
|
+
tenantId: anonJwt.payload.tenant_id || '(none)',
|
|
51
|
+
expiry: formatExpiry(anonJwt.expiresIn),
|
|
52
|
+
isExpired: anonJwt.isExpired,
|
|
53
|
+
},
|
|
54
|
+
serviceKey: {
|
|
55
|
+
fingerprint: computeFingerprint(credentials.serviceRoleKey),
|
|
56
|
+
role: serviceJwt.payload.role,
|
|
57
|
+
tenantId: serviceJwt.payload.tenant_id || '(none)',
|
|
58
|
+
expiry: formatExpiry(serviceJwt.expiresIn),
|
|
59
|
+
isExpired: serviceJwt.isExpired,
|
|
60
|
+
},
|
|
61
|
+
storedAt: credentials.storedAt,
|
|
62
|
+
// 管理身份只是"能否打开租户管理面"的标记;口令本身永不出现在输出里。
|
|
63
|
+
platformAdmin: await describeAdmin(credentialStore, currentProfile.name),
|
|
64
|
+
};
|
|
65
|
+
if (program.opts().json) {
|
|
66
|
+
console.log(JSON.stringify(output, null, 2));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log(`Profile: ${output.profile}`);
|
|
70
|
+
console.log(`Endpoint: ${output.endpoint}`);
|
|
71
|
+
console.log(`Tenant ID: ${output.tenantId}`);
|
|
72
|
+
console.log(`Mode: ${output.mode}`);
|
|
73
|
+
console.log();
|
|
74
|
+
console.log(`Anon Key:`);
|
|
75
|
+
console.log(` Fingerprint: ${output.anonKey.fingerprint}`);
|
|
76
|
+
console.log(` Role: ${output.anonKey.role}`);
|
|
77
|
+
console.log(` Tenant ID: ${output.anonKey.tenantId}`);
|
|
78
|
+
console.log(` Expiry: ${output.anonKey.expiry}`);
|
|
79
|
+
if (output.anonKey.isExpired) {
|
|
80
|
+
console.log(` Status: ⚠️ EXPIRED`);
|
|
81
|
+
}
|
|
82
|
+
console.log();
|
|
83
|
+
console.log(`Service Key:`);
|
|
84
|
+
console.log(` Fingerprint: ${output.serviceKey.fingerprint}`);
|
|
85
|
+
console.log(` Role: ${output.serviceKey.role}`);
|
|
86
|
+
console.log(` Tenant ID: ${output.serviceKey.tenantId}`);
|
|
87
|
+
console.log(` Expiry: ${output.serviceKey.expiry}`);
|
|
88
|
+
if (output.serviceKey.isExpired) {
|
|
89
|
+
console.log(` Status: ⚠️ EXPIRED`);
|
|
90
|
+
}
|
|
91
|
+
console.log();
|
|
92
|
+
if (output.platformAdmin.available) {
|
|
93
|
+
console.log(`Platform admin: bound (user=${output.platformAdmin.userMasked}, password=${output.platformAdmin.passwordFingerprint})`);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log(`Platform admin: not bound (run "pxbaas tenant login" only if you operate this instance)`);
|
|
97
|
+
}
|
|
98
|
+
console.log(`Stored at: ${output.storedAt}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/whoami/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 凭据落库共享逻辑 - login(交互/stdin)与 profile import(env 文件)复用。
|
|
3
|
+
*
|
|
4
|
+
* 统一执行:JWT 解析 → 过期校验 → 租户一致性校验 → 写 profile → 切为当前 → 写凭据。
|
|
5
|
+
* 只返回指纹,绝不回传明文密钥。
|
|
6
|
+
*/
|
|
7
|
+
import { ProfileManager, type ProfileMode } from './profile.js';
|
|
8
|
+
import { CredentialStore } from './credential-store.js';
|
|
9
|
+
export interface CommitInput {
|
|
10
|
+
profileName: string;
|
|
11
|
+
endpoint: string;
|
|
12
|
+
anonKey: string;
|
|
13
|
+
serviceRoleKey: string;
|
|
14
|
+
/** 多租户模式必填;单租户留空。 */
|
|
15
|
+
tenantId?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 可选依赖注入:默认落到真实 ~/.baas;单测可传入 temp-dir 支撑的实例做隔离。
|
|
19
|
+
*/
|
|
20
|
+
export interface CommitDeps {
|
|
21
|
+
profileManager?: ProfileManager;
|
|
22
|
+
credentialStore?: CredentialStore;
|
|
23
|
+
}
|
|
24
|
+
export interface CommitResult {
|
|
25
|
+
profileName: string;
|
|
26
|
+
endpoint: string;
|
|
27
|
+
tenantId?: string;
|
|
28
|
+
mode: ProfileMode;
|
|
29
|
+
anonKeyFingerprint: string;
|
|
30
|
+
serviceKeyFingerprint: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 校验并持久化一份 profile + 凭据。
|
|
34
|
+
*
|
|
35
|
+
* @throws Error 密钥过期、或 profile 与 JWT 的 tenant_id 不一致时抛出。
|
|
36
|
+
*/
|
|
37
|
+
export declare function commitProfileCredentials(input: CommitInput, deps?: CommitDeps): Promise<CommitResult>;
|
|
38
|
+
//# sourceMappingURL=commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/credentials/commit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAoB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKxD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,YAAY,CAAC,CA8CvB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 凭据落库共享逻辑 - login(交互/stdin)与 profile import(env 文件)复用。
|
|
3
|
+
*
|
|
4
|
+
* 统一执行:JWT 解析 → 过期校验 → 租户一致性校验 → 写 profile → 切为当前 → 写凭据。
|
|
5
|
+
* 只返回指纹,绝不回传明文密钥。
|
|
6
|
+
*/
|
|
7
|
+
import { ProfileManager } from './profile.js';
|
|
8
|
+
import { CredentialStore } from './credential-store.js';
|
|
9
|
+
import { introspectJwt } from './jwt-introspect.js';
|
|
10
|
+
import { validateTenantConsistency } from './tenant-guard.js';
|
|
11
|
+
import { computeFingerprint } from './masker.js';
|
|
12
|
+
/**
|
|
13
|
+
* 校验并持久化一份 profile + 凭据。
|
|
14
|
+
*
|
|
15
|
+
* @throws Error 密钥过期、或 profile 与 JWT 的 tenant_id 不一致时抛出。
|
|
16
|
+
*/
|
|
17
|
+
export async function commitProfileCredentials(input, deps = {}) {
|
|
18
|
+
const anonJwt = await introspectJwt(input.anonKey);
|
|
19
|
+
const serviceJwt = await introspectJwt(input.serviceRoleKey);
|
|
20
|
+
// 过期凭据不可用:拒绝登录而非保存坏凭据(否则后续每条命令都 401,且难排查)。
|
|
21
|
+
if (anonJwt.isExpired) {
|
|
22
|
+
throw new Error('Anon key is expired. Please provide a valid (non-expired) key.');
|
|
23
|
+
}
|
|
24
|
+
if (serviceJwt.isExpired) {
|
|
25
|
+
throw new Error('Service role key is expired. Please provide a valid (non-expired) key.');
|
|
26
|
+
}
|
|
27
|
+
const mode = input.tenantId ? 'multi-tenant' : 'single-tenant';
|
|
28
|
+
const now = new Date().toISOString();
|
|
29
|
+
const profile = {
|
|
30
|
+
name: input.profileName,
|
|
31
|
+
endpoint: input.endpoint,
|
|
32
|
+
tenantId: input.tenantId,
|
|
33
|
+
mode,
|
|
34
|
+
createdAt: now,
|
|
35
|
+
updatedAt: now,
|
|
36
|
+
};
|
|
37
|
+
// 校验 profile 与两把 key 的 tenant_id 一致
|
|
38
|
+
validateTenantConsistency(profile, anonJwt, serviceJwt);
|
|
39
|
+
const profileManager = deps.profileManager ?? new ProfileManager();
|
|
40
|
+
await profileManager.setProfile(profile);
|
|
41
|
+
await profileManager.useProfile(input.profileName);
|
|
42
|
+
const credentialStore = deps.credentialStore ?? new CredentialStore();
|
|
43
|
+
await credentialStore.setCredentials(input.profileName, {
|
|
44
|
+
anonKey: input.anonKey,
|
|
45
|
+
serviceRoleKey: input.serviceRoleKey,
|
|
46
|
+
storedAt: now,
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
profileName: input.profileName,
|
|
50
|
+
endpoint: input.endpoint,
|
|
51
|
+
tenantId: input.tenantId,
|
|
52
|
+
mode,
|
|
53
|
+
anonKeyFingerprint: computeFingerprint(input.anonKey),
|
|
54
|
+
serviceKeyFingerprint: computeFingerprint(input.serviceRoleKey),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/credentials/commit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAsC,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA4BjD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAkB,EAClB,OAAmB,EAAE;IAErB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE7D,2CAA2C;IAC3C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,IAAI,GAAgB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC;IAC5E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,OAAO,GAAgB;QAC3B,IAAI,EAAE,KAAK,CAAC,WAAW;QACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI;QACJ,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;IAEF,oCAAoC;IACpC,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAExD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,cAAc,EAAE,CAAC;IACnE,MAAM,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEnD,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,eAAe,EAAE,CAAC;IACtE,MAAM,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE;QACtD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,QAAQ,EAAE,GAAG;KACd,CAAC,CAAC;IAEH,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI;QACJ,kBAAkB,EAAE,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;QACrD,qBAAqB,EAAE,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC;KAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 凭据存储系统 - keytar (OS keychain) + 0600 文件双轨
|
|
3
|
+
*/
|
|
4
|
+
export interface StoredCredentials {
|
|
5
|
+
anonKey: string;
|
|
6
|
+
serviceRoleKey: string;
|
|
7
|
+
storedAt: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 平台管理凭据(dashboard Basic Auth)。与数据面两把键**分账存储**:
|
|
11
|
+
* 只有 `pxbaas tenant` 管理命令会读它,数据面命令永远拿不到它。
|
|
12
|
+
*/
|
|
13
|
+
export interface StoredAdminCredentials {
|
|
14
|
+
username: string;
|
|
15
|
+
password: string;
|
|
16
|
+
storedAt: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 凭据存储管理器
|
|
20
|
+
*
|
|
21
|
+
* 存储策略:
|
|
22
|
+
* 1. 优先使用 keytar (OS keychain: macOS Keychain, Windows Credential Manager, Linux Secret Service)
|
|
23
|
+
* 2. keytar 不可用时回退到 ~/.baas/credentials.json (权限 0600)
|
|
24
|
+
*/
|
|
25
|
+
export declare class CredentialStore {
|
|
26
|
+
private homeDir;
|
|
27
|
+
private keytarAvailable;
|
|
28
|
+
constructor(homeDir?: string);
|
|
29
|
+
/**
|
|
30
|
+
* 检测 keytar 是否可用(要求四个方法齐备,见 loadKeytar)
|
|
31
|
+
*/
|
|
32
|
+
private checkKeytar;
|
|
33
|
+
private keytar;
|
|
34
|
+
/**
|
|
35
|
+
* 确保 ~/.baas 目录存在且权限正确
|
|
36
|
+
*/
|
|
37
|
+
private ensureHomeDir;
|
|
38
|
+
/**
|
|
39
|
+
* 获取凭据文件路径
|
|
40
|
+
*/
|
|
41
|
+
private getCredentialsFilePath;
|
|
42
|
+
/**
|
|
43
|
+
* 读取凭据文件
|
|
44
|
+
*/
|
|
45
|
+
private readCredentialsFile;
|
|
46
|
+
/**
|
|
47
|
+
* 写入凭据文件(权限 0600)
|
|
48
|
+
*/
|
|
49
|
+
private writeCredentialsFile;
|
|
50
|
+
/**
|
|
51
|
+
* 获取指定 profile 的凭据
|
|
52
|
+
*/
|
|
53
|
+
getCredentials(profileName: string): Promise<StoredCredentials | null>;
|
|
54
|
+
/**
|
|
55
|
+
* 设置指定 profile 的凭据
|
|
56
|
+
*/
|
|
57
|
+
setCredentials(profileName: string, credentials: StoredCredentials): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* 删除指定 profile 的凭据
|
|
60
|
+
*/
|
|
61
|
+
deleteCredentials(profileName: string): Promise<boolean>;
|
|
62
|
+
/**
|
|
63
|
+
* 删除一个 profile 的**全部**敏感项(租户密钥 + 管理凭据)。
|
|
64
|
+
*
|
|
65
|
+
* `profile rm` 必须走这里:只删 profiles.json 里的条目会把明文密钥留在钥匙串或
|
|
66
|
+
* credentials.json 里成为孤儿——既删不掉也审计不到。返回各本账是否真的删过。
|
|
67
|
+
*/
|
|
68
|
+
deleteAllForProfile(profileName: string): Promise<{
|
|
69
|
+
credentialsRemoved: boolean;
|
|
70
|
+
adminRemoved: boolean;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* 列出所有有凭据的 profile
|
|
74
|
+
*/
|
|
75
|
+
listStoredProfiles(): Promise<string[]>;
|
|
76
|
+
/**
|
|
77
|
+
* 读取指定 profile 的平台管理凭据(无则 null)。
|
|
78
|
+
* 与 getCredentials 同构,但账号前缀独立,互不串读。
|
|
79
|
+
*/
|
|
80
|
+
getAdminCredentials(profileName: string): Promise<StoredAdminCredentials | null>;
|
|
81
|
+
/** 写入指定 profile 的平台管理凭据。 */
|
|
82
|
+
setAdminCredentials(profileName: string, credentials: StoredAdminCredentials): Promise<void>;
|
|
83
|
+
/** 删除指定 profile 的平台管理凭据。 */
|
|
84
|
+
deleteAdminCredentials(profileName: string): Promise<boolean>;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=credential-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/credentials/credential-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8CD;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAwB;gBAEnC,OAAO,CAAC,EAAE,MAAM;IAI5B;;OAEG;YACW,WAAW;YAkBX,MAAM;IAIpB;;OAEG;YACW,aAAa;IAM3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAI9B;;OAEG;YACW,mBAAmB;IAqBjC;;OAEG;YACW,oBAAoB;IAUlC;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAsB5E;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxF;;OAEG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB9D;;;;;OAKG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,kBAAkB,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;IAO/G;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA6B7C;;;OAGG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAoBtF,4BAA4B;IACtB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBlG,4BAA4B;IACtB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAsBpE"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 凭据存储系统 - keytar (OS keychain) + 0600 文件双轨
|
|
3
|
+
*/
|
|
4
|
+
import { mkdir, readFile, writeFile, chmod } from 'node:fs/promises';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
const KEYTAR_SERVICE = 'pxbaas-cli';
|
|
9
|
+
const CREDENTIAL_ACCOUNT_PREFIX = 'credentials/';
|
|
10
|
+
const ADMIN_ACCOUNT_PREFIX = 'admin/';
|
|
11
|
+
/**
|
|
12
|
+
* 加载 keytar 的可调用形态。
|
|
13
|
+
*
|
|
14
|
+
* 为什么不直接 `const keytar = await import('keytar')`:keytar 是 CJS 原生模块,
|
|
15
|
+
* Node 的 cjs-module-lexer 只会把它**能静态识别到**的赋值暴露成 ESM 命名导出。实测
|
|
16
|
+
* (本机 node v25)命名导出只有 `getPassword`,`setPassword` / `deletePassword` /
|
|
17
|
+
* `findCredentials` 全是 undefined —— 于是旧代码出现了一组极隐蔽的失效:
|
|
18
|
+
* - checkKeytar() 探 `getPassword` ⇒ 成功 ⇒ 宣称"钥匙串可用";
|
|
19
|
+
* - setCredentials() 调 `setPassword` ⇒ TypeError ⇒ 被 catch 吞掉 ⇒ 静默落文件;
|
|
20
|
+
* - deleteCredentials()/listStoredProfiles() 同理只留一行 warning。
|
|
21
|
+
* 结果就是"声称存进 OS 钥匙串,实际全部躺在 ~/.baas/credentials.json"。
|
|
22
|
+
* 这里统一取 `default`(真实模块对象),并校验四个方法都在,缺任何一个都判定
|
|
23
|
+
* 钥匙串不可用 —— 宁可明确回退,也不要"探测说行、写的时候不行"。
|
|
24
|
+
*/
|
|
25
|
+
async function loadKeytar() {
|
|
26
|
+
const mod = (await import('keytar'));
|
|
27
|
+
const candidate = (mod.default ?? mod);
|
|
28
|
+
const required = ['getPassword', 'setPassword', 'deletePassword', 'findCredentials'];
|
|
29
|
+
for (const name of required) {
|
|
30
|
+
if (typeof candidate[name] !== 'function') {
|
|
31
|
+
throw new Error(`keytar.${name} is not a function (native module surface incomplete)`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return candidate;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 凭据存储管理器
|
|
38
|
+
*
|
|
39
|
+
* 存储策略:
|
|
40
|
+
* 1. 优先使用 keytar (OS keychain: macOS Keychain, Windows Credential Manager, Linux Secret Service)
|
|
41
|
+
* 2. keytar 不可用时回退到 ~/.baas/credentials.json (权限 0600)
|
|
42
|
+
*/
|
|
43
|
+
export class CredentialStore {
|
|
44
|
+
homeDir;
|
|
45
|
+
keytarAvailable = null;
|
|
46
|
+
constructor(homeDir) {
|
|
47
|
+
this.homeDir = homeDir ?? join(homedir(), '.baas');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 检测 keytar 是否可用(要求四个方法齐备,见 loadKeytar)
|
|
51
|
+
*/
|
|
52
|
+
async checkKeytar() {
|
|
53
|
+
if (this.keytarAvailable !== null) {
|
|
54
|
+
return this.keytarAvailable;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const keytar = await loadKeytar();
|
|
58
|
+
// 尝试一个简单的操作来验证 keytar 工作正常
|
|
59
|
+
await keytar.getPassword('pxbaas-cli-test', 'test');
|
|
60
|
+
this.keytarAvailable = true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
this.keytarAvailable = false;
|
|
64
|
+
console.warn('Warning: keytar unavailable, falling back to file storage (~/.baas/credentials.json)');
|
|
65
|
+
}
|
|
66
|
+
return this.keytarAvailable;
|
|
67
|
+
}
|
|
68
|
+
async keytar() {
|
|
69
|
+
return loadKeytar();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 确保 ~/.baas 目录存在且权限正确
|
|
73
|
+
*/
|
|
74
|
+
async ensureHomeDir() {
|
|
75
|
+
if (!existsSync(this.homeDir)) {
|
|
76
|
+
await mkdir(this.homeDir, { mode: 0o700, recursive: true });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 获取凭据文件路径
|
|
81
|
+
*/
|
|
82
|
+
getCredentialsFilePath() {
|
|
83
|
+
return join(this.homeDir, 'credentials.json');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 读取凭据文件
|
|
87
|
+
*/
|
|
88
|
+
async readCredentialsFile() {
|
|
89
|
+
const filePath = this.getCredentialsFilePath();
|
|
90
|
+
if (!existsSync(filePath)) {
|
|
91
|
+
return { version: 1, credentials: {} };
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const content = await readFile(filePath, 'utf-8');
|
|
95
|
+
const data = JSON.parse(content);
|
|
96
|
+
if (data.version !== 1) {
|
|
97
|
+
throw new Error(`Unsupported credentials file version: ${data.version}`);
|
|
98
|
+
}
|
|
99
|
+
return data;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
throw new Error(`Failed to read credentials file: ${err instanceof Error ? err.message : String(err)}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 写入凭据文件(权限 0600)
|
|
107
|
+
*/
|
|
108
|
+
async writeCredentialsFile(data) {
|
|
109
|
+
await this.ensureHomeDir();
|
|
110
|
+
const filePath = this.getCredentialsFilePath();
|
|
111
|
+
const content = JSON.stringify(data, null, 2);
|
|
112
|
+
await writeFile(filePath, content, { mode: 0o600 });
|
|
113
|
+
await chmod(filePath, 0o600); // 确保权限正确
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 获取指定 profile 的凭据
|
|
117
|
+
*/
|
|
118
|
+
async getCredentials(profileName) {
|
|
119
|
+
const useKeytar = await this.checkKeytar();
|
|
120
|
+
if (useKeytar) {
|
|
121
|
+
try {
|
|
122
|
+
const keytar = await this.keytar();
|
|
123
|
+
const stored = await keytar.getPassword(KEYTAR_SERVICE, `credentials/${profileName}`);
|
|
124
|
+
if (stored) {
|
|
125
|
+
return JSON.parse(stored);
|
|
126
|
+
}
|
|
127
|
+
// keytar 没有存储该 profile 的凭据,回退到文件存储
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
console.warn(`Warning: keytar read failed, falling back to file: ${err instanceof Error ? err.message : String(err)}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// 回退到文件存储
|
|
134
|
+
const data = await this.readCredentialsFile();
|
|
135
|
+
return data.credentials[profileName] ?? null;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 设置指定 profile 的凭据
|
|
139
|
+
*/
|
|
140
|
+
async setCredentials(profileName, credentials) {
|
|
141
|
+
const useKeytar = await this.checkKeytar();
|
|
142
|
+
if (useKeytar) {
|
|
143
|
+
try {
|
|
144
|
+
const keytar = await this.keytar();
|
|
145
|
+
const stored = JSON.stringify(credentials);
|
|
146
|
+
await keytar.setPassword(KEYTAR_SERVICE, `credentials/${profileName}`, stored);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
console.warn(`Warning: keytar write failed, falling back to file: ${err instanceof Error ? err.message : String(err)}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// 回退到文件存储
|
|
154
|
+
const data = await this.readCredentialsFile();
|
|
155
|
+
data.credentials[profileName] = credentials;
|
|
156
|
+
await this.writeCredentialsFile(data);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 删除指定 profile 的凭据
|
|
160
|
+
*/
|
|
161
|
+
async deleteCredentials(profileName) {
|
|
162
|
+
const useKeytar = await this.checkKeytar();
|
|
163
|
+
let deleted = false;
|
|
164
|
+
if (useKeytar) {
|
|
165
|
+
try {
|
|
166
|
+
const keytar = await this.keytar();
|
|
167
|
+
deleted = await keytar.deletePassword(KEYTAR_SERVICE, `credentials/${profileName}`);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
console.warn(`Warning: keytar delete failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// 也从文件存储中删除
|
|
174
|
+
const data = await this.readCredentialsFile();
|
|
175
|
+
if (data.credentials[profileName]) {
|
|
176
|
+
delete data.credentials[profileName];
|
|
177
|
+
await this.writeCredentialsFile(data);
|
|
178
|
+
deleted = true;
|
|
179
|
+
}
|
|
180
|
+
return deleted;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* 删除一个 profile 的**全部**敏感项(租户密钥 + 管理凭据)。
|
|
184
|
+
*
|
|
185
|
+
* `profile rm` 必须走这里:只删 profiles.json 里的条目会把明文密钥留在钥匙串或
|
|
186
|
+
* credentials.json 里成为孤儿——既删不掉也审计不到。返回各本账是否真的删过。
|
|
187
|
+
*/
|
|
188
|
+
async deleteAllForProfile(profileName) {
|
|
189
|
+
return {
|
|
190
|
+
credentialsRemoved: await this.deleteCredentials(profileName),
|
|
191
|
+
adminRemoved: await this.deleteAdminCredentials(profileName),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* 列出所有有凭据的 profile
|
|
196
|
+
*/
|
|
197
|
+
async listStoredProfiles() {
|
|
198
|
+
const useKeytar = await this.checkKeytar();
|
|
199
|
+
const profiles = new Set();
|
|
200
|
+
if (useKeytar) {
|
|
201
|
+
try {
|
|
202
|
+
const keytar = await this.keytar();
|
|
203
|
+
const credentials = await keytar.findCredentials(KEYTAR_SERVICE);
|
|
204
|
+
for (const cred of credentials) {
|
|
205
|
+
if (cred.account.startsWith(CREDENTIAL_ACCOUNT_PREFIX)) {
|
|
206
|
+
const profileName = cred.account.slice(CREDENTIAL_ACCOUNT_PREFIX.length);
|
|
207
|
+
profiles.add(profileName);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
console.warn(`Warning: keytar list failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// 也从文件存储中读取
|
|
216
|
+
const data = await this.readCredentialsFile();
|
|
217
|
+
for (const profileName of Object.keys(data.credentials)) {
|
|
218
|
+
profiles.add(profileName);
|
|
219
|
+
}
|
|
220
|
+
return Array.from(profiles);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* 读取指定 profile 的平台管理凭据(无则 null)。
|
|
224
|
+
* 与 getCredentials 同构,但账号前缀独立,互不串读。
|
|
225
|
+
*/
|
|
226
|
+
async getAdminCredentials(profileName) {
|
|
227
|
+
const useKeytar = await this.checkKeytar();
|
|
228
|
+
if (useKeytar) {
|
|
229
|
+
try {
|
|
230
|
+
const keytar = await this.keytar();
|
|
231
|
+
const stored = await keytar.getPassword(KEYTAR_SERVICE, `${ADMIN_ACCOUNT_PREFIX}${profileName}`);
|
|
232
|
+
if (stored) {
|
|
233
|
+
return JSON.parse(stored);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
console.warn(`Warning: keytar admin read failed, falling back to file: ${err instanceof Error ? err.message : String(err)}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const data = await this.readCredentialsFile();
|
|
241
|
+
return data.admins?.[profileName] ?? null;
|
|
242
|
+
}
|
|
243
|
+
/** 写入指定 profile 的平台管理凭据。 */
|
|
244
|
+
async setAdminCredentials(profileName, credentials) {
|
|
245
|
+
const useKeytar = await this.checkKeytar();
|
|
246
|
+
if (useKeytar) {
|
|
247
|
+
try {
|
|
248
|
+
const keytar = await this.keytar();
|
|
249
|
+
await keytar.setPassword(KEYTAR_SERVICE, `${ADMIN_ACCOUNT_PREFIX}${profileName}`, JSON.stringify(credentials));
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
console.warn(`Warning: keytar admin write failed, falling back to file: ${err instanceof Error ? err.message : String(err)}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const data = await this.readCredentialsFile();
|
|
257
|
+
data.admins = { ...(data.admins ?? {}), [profileName]: credentials };
|
|
258
|
+
await this.writeCredentialsFile(data);
|
|
259
|
+
}
|
|
260
|
+
/** 删除指定 profile 的平台管理凭据。 */
|
|
261
|
+
async deleteAdminCredentials(profileName) {
|
|
262
|
+
const useKeytar = await this.checkKeytar();
|
|
263
|
+
let deleted = false;
|
|
264
|
+
if (useKeytar) {
|
|
265
|
+
try {
|
|
266
|
+
const keytar = await this.keytar();
|
|
267
|
+
deleted = await keytar.deletePassword(KEYTAR_SERVICE, `${ADMIN_ACCOUNT_PREFIX}${profileName}`);
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
console.warn(`Warning: keytar admin delete failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const data = await this.readCredentialsFile();
|
|
274
|
+
if (data.admins?.[profileName]) {
|
|
275
|
+
delete data.admins[profileName];
|
|
276
|
+
await this.writeCredentialsFile(data);
|
|
277
|
+
deleted = true;
|
|
278
|
+
}
|
|
279
|
+
return deleted;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=credential-store.js.map
|