@polardbx/pxbaas 0.1.0-beta.3 → 0.1.0-beta.5
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 +40 -8
- 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 +12 -0
- package/dist/app/preflight.d.ts.map +1 -1
- package/dist/app/preflight.js +30 -17
- package/dist/app/preflight.js.map +1 -1
- package/dist/cli/root.d.ts.map +1 -1
- package/dist/cli/root.js +3 -0
- package/dist/cli/root.js.map +1 -1
- package/dist/commands/app/index.d.ts.map +1 -1
- package/dist/commands/app/index.js +398 -46
- package/dist/commands/app/index.js.map +1 -1
- package/dist/commands/completion/index.d.ts.map +1 -1
- package/dist/commands/completion/index.js +5 -1
- package/dist/commands/completion/index.js.map +1 -1
- package/dist/commands/data/index.d.ts +52 -0
- package/dist/commands/data/index.d.ts.map +1 -1
- package/dist/commands/data/index.js +201 -39
- package/dist/commands/data/index.js.map +1 -1
- package/dist/commands/db/index.d.ts +14 -0
- package/dist/commands/db/index.d.ts.map +1 -1
- package/dist/commands/db/index.js +126 -28
- package/dist/commands/db/index.js.map +1 -1
- package/dist/commands/functions/new.d.ts +4 -0
- package/dist/commands/functions/new.d.ts.map +1 -1
- package/dist/commands/functions/new.js +24 -9
- package/dist/commands/functions/new.js.map +1 -1
- package/dist/commands/login/index.d.ts.map +1 -1
- package/dist/commands/login/index.js +15 -30
- package/dist/commands/login/index.js.map +1 -1
- package/dist/commands/profile/import-env.d.ts +7 -2
- package/dist/commands/profile/import-env.d.ts.map +1 -1
- package/dist/commands/profile/import-env.js +141 -16
- package/dist/commands/profile/import-env.js.map +1 -1
- package/dist/commands/profile/index.d.ts.map +1 -1
- package/dist/commands/profile/index.js +13 -1
- package/dist/commands/profile/index.js.map +1 -1
- package/dist/commands/storage/index.d.ts.map +1 -1
- package/dist/commands/storage/index.js +209 -7
- package/dist/commands/storage/index.js.map +1 -1
- 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.js +19 -0
- package/dist/commands/whoami/index.js.map +1 -1
- package/dist/credentials/credential-store.d.ts +30 -1
- package/dist/credentials/credential-store.d.ts.map +1 -1
- package/dist/credentials/credential-store.js +114 -12
- package/dist/credentials/credential-store.js.map +1 -1
- package/dist/credentials/env-file.d.ts +48 -7
- package/dist/credentials/env-file.d.ts.map +1 -1
- package/dist/credentials/env-file.js +91 -16
- package/dist/credentials/env-file.js.map +1 -1
- package/dist/credentials/jwt-introspect.d.ts +7 -0
- package/dist/credentials/jwt-introspect.d.ts.map +1 -1
- package/dist/credentials/jwt-introspect.js.map +1 -1
- package/dist/credentials/masker.d.ts +3 -0
- package/dist/credentials/masker.d.ts.map +1 -1
- package/dist/credentials/masker.js +3 -0
- package/dist/credentials/masker.js.map +1 -1
- package/dist/credentials/profile.d.ts +12 -0
- package/dist/credentials/profile.d.ts.map +1 -1
- package/dist/credentials/profile.js +23 -0
- package/dist/credentials/profile.js.map +1 -1
- package/dist/credentials/tty-guard.d.ts +10 -0
- package/dist/credentials/tty-guard.d.ts.map +1 -1
- package/dist/credentials/tty-guard.js +32 -0
- package/dist/credentials/tty-guard.js.map +1 -1
- package/dist/main.js +21 -2
- package/dist/main.js.map +1 -1
- 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 +2 -2
- package/skills/pxbaas-app-spec/references/runtime-contract.md +1 -1
- package/skills/pxbaas-cli/SKILL.md +14 -5
- package/skills/pxbaas-cli/references/auth-and-credentials.md +19 -3
- package/skills/pxbaas-cli/references/data-postgrest.md +4 -3
- package/skills/pxbaas-cli/references/db-and-meta.md +5 -0
- package/skills/pxbaas-cli/references/safety-and-two-phase.md +42 -13
- package/skills/pxbaas-cli/references/tenant-admin.md +122 -0
- package/skills/pxbaas-cli/references/troubleshooting.md +4 -1
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Env-file 解析 - 从 Supabase/BaaS 惯例的 .env 文件里提取登录所需字段
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 单租户实例取 SUPABASE_ANON_KEY / SUPABASE_SERVICE_ROLE_KEY;多租户实例
|
|
5
|
+
* (MULTI_TENANT_MODE=true)取 DEFAULT_TENANT_ID + TENANT_ANON_KEY /
|
|
6
|
+
* TENANT_SERVICE_ROLE_KEY —— 离线包 gen-client-env.sh 产出的多租户 client.env
|
|
7
|
+
* 同时带全局键与租户级键,而全局键访问租户资源会被 Kong 的全局凭证护栏挡掉,
|
|
8
|
+
* 所以落库的一律是租户级凭据;文件里的 GLOBAL_* 只报告存在、不导入。
|
|
7
9
|
*
|
|
8
10
|
* 不引入 dotenv 依赖:项目内的 env 文件均为简单 KEY=VALUE 格式。
|
|
9
11
|
*/
|
|
12
|
+
/**
|
|
13
|
+
* 多租户 env 文件缺少租户级凭据时抛出。
|
|
14
|
+
*
|
|
15
|
+
* 单独成类是为了让调用方(profile import 的失败分支)能**判别**这种情况并给出
|
|
16
|
+
* 分流指引,而不是只对着一段自然语言做字符串匹配。
|
|
17
|
+
*/
|
|
18
|
+
export class TenantCredentialGapError extends Error {
|
|
19
|
+
missing;
|
|
20
|
+
constructor(message, missing) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = 'TenantCredentialGapError';
|
|
23
|
+
this.missing = missing;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
10
26
|
/**
|
|
11
27
|
* 解析 env 文件文本为键值对。
|
|
12
28
|
*
|
|
@@ -60,6 +76,13 @@ const SERVICE_VARS = [
|
|
|
60
76
|
'SERVICE_ROLE_KEY',
|
|
61
77
|
'GLOBAL_SERVICE_ROLE_KEY',
|
|
62
78
|
];
|
|
79
|
+
const TENANT_ID_VARS = ['DEFAULT_TENANT_ID'];
|
|
80
|
+
const TENANT_ANON_VARS = ['TENANT_ANON_KEY'];
|
|
81
|
+
const TENANT_SERVICE_VARS = ['TENANT_SERVICE_ROLE_KEY'];
|
|
82
|
+
const GLOBAL_KEY_VARS = ['GLOBAL_ANON_KEY', 'GLOBAL_SERVICE_ROLE_KEY'];
|
|
83
|
+
/** 实例管理面凭据:默认不导入,见 EnvLoginFields.skippedAdminKeys。 */
|
|
84
|
+
const ADMIN_USERNAME_VARS = ['DASHBOARD_USERNAME'];
|
|
85
|
+
const ADMIN_PASSWORD_VARS = ['DASHBOARD_PASSWORD'];
|
|
63
86
|
function pickWithSource(env, keys) {
|
|
64
87
|
for (const k of keys) {
|
|
65
88
|
const v = env[k];
|
|
@@ -70,31 +93,60 @@ function pickWithSource(env, keys) {
|
|
|
70
93
|
return undefined;
|
|
71
94
|
}
|
|
72
95
|
/**
|
|
73
|
-
* 从解析后的 env
|
|
96
|
+
* 从解析后的 env 中提取登录字段(单租户或多租户)。
|
|
74
97
|
*
|
|
75
98
|
* @param env parseEnvText 的结果
|
|
76
99
|
* @param options.intranet 为 true 时优先使用内网入口 SUPABASE_INTRANET_URL
|
|
77
|
-
* @throws Error
|
|
100
|
+
* @throws Error 缺少必需字段(多租户即缺租户级凭据)时抛出可直接展示的错误
|
|
78
101
|
*/
|
|
79
102
|
export function resolveLoginFromEnv(env, options = {}) {
|
|
80
|
-
// 多租户:暂不支持(global keys 不能直接访问租户资源)
|
|
81
103
|
const mtRaw = (env.MULTI_TENANT_MODE ?? '').trim().toLowerCase();
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
104
|
+
const isMultiTenant = mtRaw === 'true' || mtRaw === '1' || mtRaw === 'yes';
|
|
105
|
+
// 多租户:只有租户级凭据能访问租户资源(全局键会命中 Kong 的全局凭证护栏 403),
|
|
106
|
+
// 因此改写取值来源;全局键仅记录「存在但未导入」。
|
|
107
|
+
let anonVars = ANON_VARS;
|
|
108
|
+
let serviceVars = SERVICE_VARS;
|
|
109
|
+
let tenantId;
|
|
110
|
+
let tenantIdSource;
|
|
111
|
+
let skippedGlobalKeys;
|
|
112
|
+
if (isMultiTenant) {
|
|
113
|
+
const tenantIdHit = pickWithSource(env, TENANT_ID_VARS);
|
|
114
|
+
const tenantAnonHit = pickWithSource(env, TENANT_ANON_VARS);
|
|
115
|
+
const tenantServiceHit = pickWithSource(env, TENANT_SERVICE_VARS);
|
|
116
|
+
const missingTenant = [];
|
|
117
|
+
if (!tenantIdHit)
|
|
118
|
+
missingTenant.push(`tenant id (${TENANT_ID_VARS.join(' | ')})`);
|
|
119
|
+
if (!tenantAnonHit)
|
|
120
|
+
missingTenant.push(`tenant anon key (${TENANT_ANON_VARS.join(' | ')})`);
|
|
121
|
+
if (!tenantServiceHit) {
|
|
122
|
+
missingTenant.push(`tenant service role key (${TENANT_SERVICE_VARS.join(' | ')})`);
|
|
123
|
+
}
|
|
124
|
+
if (missingTenant.length > 0) {
|
|
125
|
+
throw new TenantCredentialGapError('Multi-tenant instances are not supported by `profile import` unless the env file ' +
|
|
126
|
+
`carries tenant-level credentials. This file is missing: ${missingTenant.join('; ')}. ` +
|
|
127
|
+
'Regenerate client.env with tenant keys, or use `pxbaas login --tenant-id <id> ' +
|
|
128
|
+
'--anon-key-stdin --service-key-stdin` with per-tenant keys instead.', missingTenant);
|
|
129
|
+
}
|
|
130
|
+
tenantId = tenantIdHit.value;
|
|
131
|
+
tenantIdSource = tenantIdHit.source;
|
|
132
|
+
anonVars = TENANT_ANON_VARS;
|
|
133
|
+
serviceVars = TENANT_SERVICE_VARS;
|
|
134
|
+
const presentGlobal = GLOBAL_KEY_VARS.filter((k) => (env[k] ?? '').trim() !== '');
|
|
135
|
+
if (presentGlobal.length > 0) {
|
|
136
|
+
skippedGlobalKeys = presentGlobal;
|
|
137
|
+
}
|
|
86
138
|
}
|
|
87
139
|
const endpointVars = options.intranet ? ENDPOINT_VARS_INTRANET : ENDPOINT_VARS;
|
|
88
140
|
const endpointHit = pickWithSource(env, endpointVars);
|
|
89
|
-
const anonHit = pickWithSource(env,
|
|
90
|
-
const serviceHit = pickWithSource(env,
|
|
141
|
+
const anonHit = pickWithSource(env, anonVars);
|
|
142
|
+
const serviceHit = pickWithSource(env, serviceVars);
|
|
91
143
|
const missing = [];
|
|
92
144
|
if (!endpointHit)
|
|
93
145
|
missing.push(`endpoint (${endpointVars.join(' | ')})`);
|
|
94
146
|
if (!anonHit)
|
|
95
|
-
missing.push(`anon key (${
|
|
147
|
+
missing.push(`anon key (${anonVars.join(' | ')})`);
|
|
96
148
|
if (!serviceHit)
|
|
97
|
-
missing.push(`service role key (${
|
|
149
|
+
missing.push(`service role key (${serviceVars.join(' | ')})`);
|
|
98
150
|
if (missing.length > 0) {
|
|
99
151
|
throw new Error(`Env file is missing required variable(s): ${missing.join('; ')}`);
|
|
100
152
|
}
|
|
@@ -102,17 +154,40 @@ export function resolveLoginFromEnv(env, options = {}) {
|
|
|
102
154
|
if (!/^https?:\/\//.test(endpoint)) {
|
|
103
155
|
throw new Error(`Endpoint from ${endpointHit.source} must start with http:// or https:// (got: ${endpoint})`);
|
|
104
156
|
}
|
|
157
|
+
// 管理凭据默认不外吸:只报告"存在",由调用方决定是否显式导入(--with-admin)。
|
|
158
|
+
const presentAdmin = [...ADMIN_USERNAME_VARS, ...ADMIN_PASSWORD_VARS].filter((k) => (env[k] ?? '').trim() !== '');
|
|
105
159
|
return {
|
|
106
160
|
endpoint,
|
|
107
161
|
anonKey: anonHit.value,
|
|
108
162
|
serviceRoleKey: serviceHit.value,
|
|
109
|
-
tenantId
|
|
110
|
-
mode: 'single-tenant',
|
|
163
|
+
tenantId,
|
|
164
|
+
mode: isMultiTenant ? 'multi-tenant' : 'single-tenant',
|
|
111
165
|
sources: {
|
|
112
166
|
endpoint: endpointHit.source,
|
|
113
167
|
anonKey: anonHit.source,
|
|
114
168
|
serviceRoleKey: serviceHit.source,
|
|
169
|
+
tenantId: tenantIdSource,
|
|
115
170
|
},
|
|
171
|
+
skippedGlobalKeys,
|
|
172
|
+
skippedAdminKeys: presentAdmin.length > 0 ? presentAdmin : undefined,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 从 env 中提取实例管理凭据(dashboard Basic Auth)。
|
|
177
|
+
*
|
|
178
|
+
* 返回 undefined 表示文件里没有成对的管理凭据 —— 调用方**不应**因此报错:
|
|
179
|
+
* 它们只在管理员显式 `--with-admin` 或临时能力探测时才被读取。
|
|
180
|
+
* 只出现一半(有 user 无 password)视为不可用,避免半套凭据落库。
|
|
181
|
+
*/
|
|
182
|
+
export function resolveAdminFromEnv(env) {
|
|
183
|
+
const username = pickWithSource(env, ADMIN_USERNAME_VARS);
|
|
184
|
+
const password = pickWithSource(env, ADMIN_PASSWORD_VARS);
|
|
185
|
+
if (!username || !password)
|
|
186
|
+
return undefined;
|
|
187
|
+
return {
|
|
188
|
+
username: username.value,
|
|
189
|
+
password: password.value,
|
|
190
|
+
sources: { username: username.source, password: password.source },
|
|
116
191
|
};
|
|
117
192
|
}
|
|
118
193
|
//# sourceMappingURL=env-file.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-file.js","sourceRoot":"","sources":["../../src/credentials/env-file.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"env-file.js","sourceRoot":"","sources":["../../src/credentials/env-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,13 @@ export interface IntrospectedJwt {
|
|
|
14
14
|
payload: JwtPayload;
|
|
15
15
|
isExpired: boolean;
|
|
16
16
|
expiresIn: number;
|
|
17
|
+
/**
|
|
18
|
+
* 裸指纹:sha256 前8 + 后4,形如 `6ee48f23...a477`,**不带** `sha256:` 前缀。
|
|
19
|
+
*
|
|
20
|
+
* 契约(分层,勿在其中一层"顺手"补前缀,否则展示层会变成 `sha256:sha256:`):
|
|
21
|
+
* 内层解析只产出裸值;展示层 `computeFingerprint()`(./masker.ts,whoami /
|
|
22
|
+
* instance / provision 用它)统一加 `sha256:` 前缀。
|
|
23
|
+
*/
|
|
17
24
|
fingerprint: string;
|
|
18
25
|
}
|
|
19
26
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-introspect.d.ts","sourceRoot":"","sources":["../../src/credentials/jwt-introspect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAanD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAkB3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAatD"}
|
|
1
|
+
{"version":3,"file":"jwt-introspect.d.ts","sourceRoot":"","sources":["../../src/credentials/jwt-introspect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAanD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAkB3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAatD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-introspect.js","sourceRoot":"","sources":["../../src/credentials/jwt-introspect.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"jwt-introspect.js","sourceRoot":"","sources":["../../src/credentials/jwt-introspect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAe,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa;IAC/C,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;IACpC,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC;IAEjC,0BAA0B;IAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9D,OAAO;QACL,OAAO;QACP,SAAS;QACT,SAAS;QACT,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,GAAG,GAAG,EAAE;YAAE,OAAO,WAAW,GAAG,OAAO,CAAC;QAC3C,IAAI,GAAG,GAAG,IAAI;YAAE,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;QAC9D,IAAI,GAAG,GAAG,KAAK;YAAE,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACjE,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;IACnD,CAAC;IAED,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,cAAc,SAAS,GAAG,CAAC;IACtD,IAAI,SAAS,GAAG,IAAI;QAAE,OAAO,cAAc,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC;IACzE,IAAI,SAAS,GAAG,KAAK;QAAE,OAAO,cAAc,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;IAC5E,OAAO,cAAc,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC;AACxD,CAAC"}
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* 计算密钥指纹:sha256 前8字符 + 后4字符
|
|
6
6
|
* 格式:sha256:abcd1234...ef56
|
|
7
|
+
*
|
|
8
|
+
* 这是**展示层**的唯一加前缀处(whoami / instance / provision 直接输出它)。
|
|
9
|
+
* `introspectJwt().fingerprint` 返回的是同一指纹的裸值,前缀只在这里加一次。
|
|
7
10
|
*/
|
|
8
11
|
export declare function computeFingerprint(key: string): string;
|
|
9
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masker.d.ts","sourceRoot":"","sources":["../../src/credentials/masker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH
|
|
1
|
+
{"version":3,"file":"masker.d.ts","sourceRoot":"","sources":["../../src/credentials/masker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ9D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C"}
|
|
@@ -5,6 +5,9 @@ import { createHash } from 'node:crypto';
|
|
|
5
5
|
/**
|
|
6
6
|
* 计算密钥指纹:sha256 前8字符 + 后4字符
|
|
7
7
|
* 格式:sha256:abcd1234...ef56
|
|
8
|
+
*
|
|
9
|
+
* 这是**展示层**的唯一加前缀处(whoami / instance / provision 直接输出它)。
|
|
10
|
+
* `introspectJwt().fingerprint` 返回的是同一指纹的裸值,前缀只在这里加一次。
|
|
8
11
|
*/
|
|
9
12
|
export function computeFingerprint(key) {
|
|
10
13
|
const hash = createHash('sha256').update(key).digest('hex');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masker.js","sourceRoot":"","sources":["../../src/credentials/masker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC
|
|
1
|
+
{"version":3,"file":"masker.js","sourceRoot":"","sources":["../../src/credentials/masker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,UAAU,WAAW,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -17,6 +17,11 @@ export interface BaasProfile {
|
|
|
17
17
|
zeroInstanceId?: string;
|
|
18
18
|
/** Zero instance expiry (ISO 8601), only when source === 'zero'. */
|
|
19
19
|
expiresAt?: string;
|
|
20
|
+
/**
|
|
21
|
+
* 该 profile 是否绑定了平台管理凭据(dashboard Basic Auth)。仅是标记:口令本身
|
|
22
|
+
* 存在凭据存储的独立账目里,数据面命令读不到它。
|
|
23
|
+
*/
|
|
24
|
+
adminCapable?: boolean;
|
|
20
25
|
createdAt: string;
|
|
21
26
|
updatedAt: string;
|
|
22
27
|
}
|
|
@@ -29,6 +34,13 @@ interface ProfilesStore {
|
|
|
29
34
|
export declare function setCliProfileOverrideGlobal(profileName: string | undefined): void;
|
|
30
35
|
/** 读取进程级 profile 覆盖(供测试/诊断)。 */
|
|
31
36
|
export declare function getCliProfileOverrideGlobal(): string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* 判断被调用的命令是否会创建/覆盖 `--profile` 指定的 profile。
|
|
39
|
+
*
|
|
40
|
+
* @param commandPath 完整命令路径(如 `['profile','import']`),不含程序名。
|
|
41
|
+
* 只比叶子名会让将来任何同名子命令误获放行,故必须传完整路径。
|
|
42
|
+
*/
|
|
43
|
+
export declare function isProfileCreatingCommand(commandPath: readonly string[]): boolean;
|
|
32
44
|
export declare class ProfileManager {
|
|
33
45
|
private homeDir;
|
|
34
46
|
private cliProfileOverride?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/credentials/profile.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,cAAc,CAAC;AAE3D,yGAAyG;AACzG,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,uEAAuE;IACvE,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACvC;AAYD,uDAAuD;AACvD,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEjF;AAED,gCAAgC;AAChC,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,SAAS,CAEhE;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,KAAK,CAA8B;gBAE/B,OAAO,CAAC,EAAE,MAAM;IAI5B;;;OAGG;IACH,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK5D,oCAAoC;IACpC,OAAO,KAAK,2BAA2B,GAEtC;IAED;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;IA2BpC;;OAEG;YACW,IAAI;IAYlB;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAsCtD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAK5C;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAK3D;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7C;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAiBpD"}
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/credentials/profile.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,cAAc,CAAC;AAE3D,yGAAyG;AACzG,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,uEAAuE;IACvE,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACvC;AAYD,uDAAuD;AACvD,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEjF;AAED,gCAAgC;AAChC,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,SAAS,CAEhE;AAgBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAMhF;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,KAAK,CAA8B;gBAE/B,OAAO,CAAC,EAAE,MAAM;IAI5B;;;OAGG;IACH,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK5D,oCAAoC;IACpC,OAAO,KAAK,2BAA2B,GAEtC;IAED;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;IA2BpC;;OAEG;YACW,IAAI;IAYlB;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAsCtD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAK5C;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAK3D;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7C;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAiBpD"}
|
|
@@ -22,6 +22,29 @@ export function setCliProfileOverrideGlobal(profileName) {
|
|
|
22
22
|
export function getCliProfileOverrideGlobal() {
|
|
23
23
|
return processCliProfileOverride;
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* 会「写入 --profile 所指 profile」的命令,按完整命令路径匹配。
|
|
27
|
+
*
|
|
28
|
+
* 对这些命令来说,profile 名不存在恰恰是前提(它们正要创建它),所以 main.ts 的
|
|
29
|
+
* preAction 钩子不能对其做存在性硬校验;其余命令一律保持响亮失败,否则就退回了
|
|
30
|
+
* `--profile` 曾被静默忽略、写操作跨实例误落的旧缺陷。
|
|
31
|
+
*/
|
|
32
|
+
const PROFILE_CREATING_COMMANDS = [
|
|
33
|
+
['login'],
|
|
34
|
+
['profile', 'import'],
|
|
35
|
+
// `tenant login` 可以把管理凭据绑定到一个尚不存在的 profile(管理员常在新机器上先做这一步)
|
|
36
|
+
['tenant', 'login'],
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* 判断被调用的命令是否会创建/覆盖 `--profile` 指定的 profile。
|
|
40
|
+
*
|
|
41
|
+
* @param commandPath 完整命令路径(如 `['profile','import']`),不含程序名。
|
|
42
|
+
* 只比叶子名会让将来任何同名子命令误获放行,故必须传完整路径。
|
|
43
|
+
*/
|
|
44
|
+
export function isProfileCreatingCommand(commandPath) {
|
|
45
|
+
return PROFILE_CREATING_COMMANDS.some((candidate) => candidate.length === commandPath.length &&
|
|
46
|
+
candidate.every((segment, index) => segment === commandPath[index]));
|
|
47
|
+
}
|
|
25
48
|
export class ProfileManager {
|
|
26
49
|
homeDir;
|
|
27
50
|
cliProfileOverride; // --profile flag
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/credentials/profile.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/credentials/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,16 @@
|
|
|
8
8
|
* @throws Error 如果非 TTY 环境
|
|
9
9
|
*/
|
|
10
10
|
export declare function assertTty(isTTY?: boolean, ciEnv?: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* 从 stdin 按行读取密钥/口令类输入。
|
|
13
|
+
*
|
|
14
|
+
* 存在的理由:敏感值绝不能走 argv(会进 shell history 与进程列表)。login 与
|
|
15
|
+
* tenant login 都需要"两行管道输入",此前各自实现了一份,统一到这里。
|
|
16
|
+
*
|
|
17
|
+
* @param expected 期望的行数
|
|
18
|
+
* @param label 报错里对各行内容的说明(保持调用方的既有文案可辨识)
|
|
19
|
+
*/
|
|
20
|
+
export declare function readStdinLines(expected: number, label: string): Promise<string[]>;
|
|
11
21
|
/**
|
|
12
22
|
* 断言命令行参数中不包含密钥参数
|
|
13
23
|
* 防止通过 argv 传递密钥(会出现在 shell history 中)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tty-guard.d.ts","sourceRoot":"","sources":["../../src/credentials/tty-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAkB/D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"tty-guard.d.ts","sourceRoot":"","sources":["../../src/credentials/tty-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAkB/D;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBvF;AACD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsBpD"}
|
|
@@ -21,6 +21,34 @@ export function assertTty(isTTY, ciEnv) {
|
|
|
21
21
|
'Use --anon-key-stdin and --service-key-stdin for non-interactive input.');
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* 从 stdin 按行读取密钥/口令类输入。
|
|
26
|
+
*
|
|
27
|
+
* 存在的理由:敏感值绝不能走 argv(会进 shell history 与进程列表)。login 与
|
|
28
|
+
* tenant login 都需要"两行管道输入",此前各自实现了一份,统一到这里。
|
|
29
|
+
*
|
|
30
|
+
* @param expected 期望的行数
|
|
31
|
+
* @param label 报错里对各行内容的说明(保持调用方的既有文案可辨识)
|
|
32
|
+
*/
|
|
33
|
+
export async function readStdinLines(expected, label) {
|
|
34
|
+
const data = await new Promise((resolvePromise, rejectPromise) => {
|
|
35
|
+
let buffer = '';
|
|
36
|
+
process.stdin.setEncoding('utf8');
|
|
37
|
+
process.stdin.on('readable', () => {
|
|
38
|
+
let chunk;
|
|
39
|
+
while ((chunk = process.stdin.read()) !== null) {
|
|
40
|
+
buffer += chunk;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
process.stdin.on('end', () => resolvePromise(buffer));
|
|
44
|
+
process.stdin.on('error', rejectPromise);
|
|
45
|
+
});
|
|
46
|
+
const lines = data.split('\n').map((line) => line.trim());
|
|
47
|
+
if (lines.length < expected) {
|
|
48
|
+
throw new Error(`Expected ${expected} lines from stdin: ${label}`);
|
|
49
|
+
}
|
|
50
|
+
return lines;
|
|
51
|
+
}
|
|
24
52
|
/**
|
|
25
53
|
* 断言命令行参数中不包含密钥参数
|
|
26
54
|
* 防止通过 argv 传递密钥(会出现在 shell history 中)
|
|
@@ -33,6 +61,10 @@ export function assertNoKeyArgs(argv) {
|
|
|
33
61
|
'--anon-key',
|
|
34
62
|
'--service-key',
|
|
35
63
|
'--token',
|
|
64
|
+
// 平台管理凭据同样不得进 argv(会留在 shell history 与进程列表里)
|
|
65
|
+
'--dashboard-user',
|
|
66
|
+
'--dashboard-password',
|
|
67
|
+
'--admin-password',
|
|
36
68
|
];
|
|
37
69
|
for (const arg of argv) {
|
|
38
70
|
// 检查 --anon-key=value 或 --anon-key value 形式
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tty-guard.js","sourceRoot":"","sources":["../../src/credentials/tty-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAe,EAAE,KAAc;IACvD,mBAAmB;IACnB,MAAM,WAAW,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IACtE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,mDAAmD;YACnD,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED,aAAa;IACb,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9D,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,sDAAsD;YACtD,yEAAyE,CAC1E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,MAAM,aAAa,GAAG;QACpB,YAAY;QACZ,eAAe;QACf,SAAS;
|
|
1
|
+
{"version":3,"file":"tty-guard.js","sourceRoot":"","sources":["../../src/credentials/tty-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAe,EAAE,KAAc;IACvD,mBAAmB;IACnB,MAAM,WAAW,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IACtE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,mDAAmD;YACnD,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED,aAAa;IACb,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9D,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,sDAAsD;YACtD,yEAAyE,CAC1E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,KAAa;IAClE,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACvE,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;YAChC,IAAI,KAAoB,CAAC;YACzB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,sBAAsB,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,MAAM,aAAa,GAAG;QACpB,YAAY;QACZ,eAAe;QACf,SAAS;QACT,6CAA6C;QAC7C,kBAAkB;QAClB,sBAAsB;QACtB,kBAAkB;KACnB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,4CAA4C;QAC5C,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;YACtC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CACb,8CAA8C,GAAG,KAAK;oBACtD,OAAO,SAAS,kCAAkC,CACnD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/main.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { program } from 'commander';
|
|
3
3
|
import { registerCommands } from './cli/root.js';
|
|
4
|
-
import { ProfileManager, setCliProfileOverrideGlobal } from './credentials/profile.js';
|
|
4
|
+
import { ProfileManager, isProfileCreatingCommand, setCliProfileOverrideGlobal, } from './credentials/profile.js';
|
|
5
|
+
import { resolvePackageVersion } from './version.js';
|
|
5
6
|
// Global options
|
|
6
7
|
program
|
|
7
8
|
.name('pxbaas')
|
|
8
9
|
.description('PolarDB-X BaaS CLI')
|
|
9
|
-
.
|
|
10
|
+
// Read from package.json at runtime: a hardcoded string here reported
|
|
11
|
+
// `0.0.0-dev` for every build, so `--version` could never identify a release.
|
|
12
|
+
.version(resolvePackageVersion())
|
|
10
13
|
.option('--json', 'Output in JSON format')
|
|
11
14
|
.option('--profile <name>', 'Use specific profile')
|
|
12
15
|
.option('--debug', 'Enable debug output');
|
|
@@ -25,6 +28,15 @@ const declareProfileOption = (cmd) => {
|
|
|
25
28
|
cmd.commands.forEach(declareProfileOption);
|
|
26
29
|
};
|
|
27
30
|
declareProfileOption(program);
|
|
31
|
+
/** Full command path of the action command (e.g. ['profile','import']), program name excluded. */
|
|
32
|
+
const commandPathOf = (actionCommand) => {
|
|
33
|
+
const parts = [];
|
|
34
|
+
for (let c = actionCommand; c && c !== program; c = c.parent) {
|
|
35
|
+
if (c.name())
|
|
36
|
+
parts.unshift(c.name());
|
|
37
|
+
}
|
|
38
|
+
return parts;
|
|
39
|
+
};
|
|
28
40
|
// Resolve --profile once, before any command runs: validate it exists (fail loudly
|
|
29
41
|
// instead of silently falling back to the current profile) and publish it as a
|
|
30
42
|
// process-wide override. Never persisted — `profile ls` current marker is untouched.
|
|
@@ -32,6 +44,13 @@ program.hook('preAction', async (_thisCommand, actionCommand) => {
|
|
|
32
44
|
const requested = (actionCommand.opts().profile ?? program.opts().profile);
|
|
33
45
|
if (!requested)
|
|
34
46
|
return;
|
|
47
|
+
// `login` / `profile import` write the named profile, so an unknown name is their
|
|
48
|
+
// precondition, not an error. Still publish the override: the command must read and
|
|
49
|
+
// write that exact profile rather than whatever happens to be current.
|
|
50
|
+
if (isProfileCreatingCommand(commandPathOf(actionCommand))) {
|
|
51
|
+
setCliProfileOverrideGlobal(requested);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
35
54
|
const manager = new ProfileManager();
|
|
36
55
|
const known = await manager.listProfiles();
|
|
37
56
|
if (!known.some((p) => p.name === requested)) {
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAW,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 租户交付包(tenant access bundle)。
|
|
3
|
+
*
|
|
4
|
+
* 解决的问题:管理员在 CLI 里拿到了新租户的密钥之后,怎么把它交给"另一个真人"。
|
|
5
|
+
* 交付物是一份**规范 env 文件**,格式与 `pxbaas profile import` 的多租户输入契约逐字
|
|
6
|
+
* 对齐(credentials/env-file.ts 的 TENANT_* 分支),所以收件人不需要手改任何字段名。
|
|
7
|
+
*
|
|
8
|
+
* 三条硬纪律:
|
|
9
|
+
* 1. **字段白名单**。bundle 内容由本模块**逐字段显式拼装**,因此结构上不可能包含
|
|
10
|
+
* `jwt_secret`(租户签名母密钥)、`DASHBOARD_*`(实例管理口令)或 `GLOBAL_*`
|
|
11
|
+
* (平台全局密钥)。这不是"记得过滤",而是根本没有把它们写进去的入口。
|
|
12
|
+
* 2. **明文只落 0600 文件,绝不进 stdout / `--json` / 日志**。终端上只出现指纹。
|
|
13
|
+
* 3. **不留存于内存之外**:调用方拿到 keys 后要么写钥匙串,要么交给本模块写文件。
|
|
14
|
+
*/
|
|
15
|
+
export declare const BUNDLE_VERSION = 1;
|
|
16
|
+
export interface BundleInput {
|
|
17
|
+
tenantId: string;
|
|
18
|
+
/** Kong 网关地址;必须已是网关,不能是 Studio 端口。 */
|
|
19
|
+
endpoint: string;
|
|
20
|
+
anonKey: string;
|
|
21
|
+
serviceRoleKey: string;
|
|
22
|
+
/** 同 VPC 使用者可加内网入口,导入时用 --intranet 优先。 */
|
|
23
|
+
intranetEndpoint?: string;
|
|
24
|
+
issuedBy?: string;
|
|
25
|
+
/** 供注释头标注有效期语义(当前平台签发约 10 年且不可撤销)。 */
|
|
26
|
+
generatedAt?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface HandoffRecord {
|
|
29
|
+
tenantId: string;
|
|
30
|
+
endpoint: string;
|
|
31
|
+
generatedAt: string;
|
|
32
|
+
anonFingerprint: string;
|
|
33
|
+
serviceFingerprint: string;
|
|
34
|
+
bundlePath: string;
|
|
35
|
+
/** 交付包整文件 sha256,用于收件人比对"拿到的是不是同一份"。 */
|
|
36
|
+
bundleSha256: string;
|
|
37
|
+
issuedBy?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface WriteBundleResult {
|
|
40
|
+
path: string;
|
|
41
|
+
bytes: number;
|
|
42
|
+
record: HandoffRecord;
|
|
43
|
+
instructions: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 渲染交付包文本。只输出这 5(+1)个变量:
|
|
47
|
+
* MULTI_TENANT_MODE / SUPABASE_URL / DEFAULT_TENANT_ID / TENANT_ANON_KEY /
|
|
48
|
+
* TENANT_SERVICE_ROLE_KEY(可选 SUPABASE_INTRANET_URL)。
|
|
49
|
+
*/
|
|
50
|
+
export declare function renderBundle(input: BundleInput): string;
|
|
51
|
+
/**
|
|
52
|
+
* 写交付包。目标已存在时**必须**显式 `overwrite`,否则拒绝 —— 不静默覆盖别人的接入包。
|
|
53
|
+
*/
|
|
54
|
+
export declare function writeBundle(file: string, input: BundleInput, options?: {
|
|
55
|
+
overwrite?: boolean;
|
|
56
|
+
homeDir?: string;
|
|
57
|
+
}): Promise<WriteBundleResult>;
|
|
58
|
+
/** 可直接复制转发给使用者的交接说明(不含任何密钥值)。 */
|
|
59
|
+
export declare function renderInstructions(record: HandoffRecord): string;
|
|
60
|
+
export declare function listHandoffs(homeDir?: string): Promise<HandoffRecord[]>;
|
|
61
|
+
/**
|
|
62
|
+
* 签发台账:只记指纹与文件哈希,**不含任何明文密钥**。0600。
|
|
63
|
+
* 泄露事件回溯时这是唯一能回答"我发过哪些包、对应哪个租户"的记录。
|
|
64
|
+
*/
|
|
65
|
+
export declare function appendHandoffRecord(record: HandoffRecord, homeDir?: string): Promise<void>;
|
|
66
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/tenant/bundle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA0BvD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACtD,OAAO,CAAC,iBAAiB,CAAC,CA+B5B;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAgBhE;AAID,wBAAsB,YAAY,CAChC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,EAAE,CAAC,CAY1B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAcf"}
|