@vess-id/vess 0.0.0-dev-20260917031855 → 0.0.0-dev-20261006103529
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/dist/cli/reset.d.ts.map +1 -1
- package/dist/cli/reset.js +6 -3
- package/dist/cli/reset.js.map +1 -1
- package/dist/cli/telemetry-setup.d.ts +2 -2
- package/dist/cli/telemetry-setup.d.ts.map +1 -1
- package/dist/cli/telemetry-setup.js +17 -10
- package/dist/cli/telemetry-setup.js.map +1 -1
- package/dist/config/paths.d.ts +1 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +3 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/identity/dpapi.d.ts +18 -0
- package/dist/identity/dpapi.d.ts.map +1 -0
- package/dist/identity/dpapi.js +97 -0
- package/dist/identity/dpapi.js.map +1 -0
- package/dist/identity/key-manager.d.ts +23 -1
- package/dist/identity/key-manager.d.ts.map +1 -1
- package/dist/identity/key-manager.js +82 -68
- package/dist/identity/key-manager.js.map +1 -1
- package/dist/identity/secret-store.d.ts +27 -0
- package/dist/identity/secret-store.d.ts.map +1 -0
- package/dist/identity/secret-store.js +113 -0
- package/dist/identity/secret-store.js.map +1 -0
- package/package.json +2 -2
package/dist/cli/reset.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAMD,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAMD,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDxE"}
|
package/dist/cli/reset.js
CHANGED
|
@@ -53,6 +53,7 @@ async function runReset(options = {}) {
|
|
|
53
53
|
log(' - Daemon OS service (auto-start)');
|
|
54
54
|
log(` - Config, policy, wallet: ${paths.baseDir}`);
|
|
55
55
|
log(' - Root key & session token from OS Keychain');
|
|
56
|
+
log(` - Telemetry API key (OS Keychain, or ${paths.secretsDir} on Linux)`);
|
|
56
57
|
log('');
|
|
57
58
|
const confirmed = await promptConfirm('Are you sure? (y/N) ');
|
|
58
59
|
if (!confirmed) {
|
|
@@ -76,10 +77,11 @@ async function runReset(options = {}) {
|
|
|
76
77
|
await service_manager_1.ServiceManager.uninstall();
|
|
77
78
|
}
|
|
78
79
|
// 3. Delete keys from OS Keychain
|
|
79
|
-
log('Cleaning Keychain entries...');
|
|
80
|
-
const km = new key_manager_1.KeyManager();
|
|
80
|
+
log('Cleaning Keychain entries (and the telemetry API key file)...');
|
|
81
|
+
const km = new key_manager_1.KeyManager({ secretsDir: paths.secretsDir });
|
|
81
82
|
km.deleteRootKey();
|
|
82
83
|
km.deleteSessionToken();
|
|
84
|
+
km.deleteTelemetryApiKey();
|
|
83
85
|
// 4. Delete agent keys listed in wallet.db (best-effort)
|
|
84
86
|
deleteAgentKeysFromDb(paths, km);
|
|
85
87
|
// 5. Remove ~/.vess directory
|
|
@@ -98,6 +100,7 @@ function deleteAgentKeysFromDb(paths, km) {
|
|
|
98
100
|
return;
|
|
99
101
|
try {
|
|
100
102
|
// Dynamic import to avoid hard failure if db is corrupt
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
101
104
|
const Database = require('better-sqlite3');
|
|
102
105
|
const db = new Database(paths.walletDb, { readonly: true });
|
|
103
106
|
const rows = db
|
|
@@ -116,7 +119,7 @@ function deleteAgentKeysFromDb(paths, km) {
|
|
|
116
119
|
}
|
|
117
120
|
}
|
|
118
121
|
function promptConfirm(message) {
|
|
119
|
-
return new Promise(
|
|
122
|
+
return new Promise(resolve => {
|
|
120
123
|
if (!process.stdin.isTTY) {
|
|
121
124
|
resolve(false);
|
|
122
125
|
return;
|
package/dist/cli/reset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,
|
|
1
|
+
{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export interface TelemetrySetupOptions {
|
|
2
2
|
/**
|
|
3
|
-
* 発行された送信専用の API
|
|
3
|
+
* 発行された送信専用の API キー。Linux は 0600 のファイル、それ以外はキーチェーンに保存する。
|
|
4
4
|
*
|
|
5
|
-
* 省略すると、環境変数 →
|
|
5
|
+
* 省略すると、環境変数 → 保存済みの鍵の順で探す。設定を作り直す
|
|
6
6
|
* だけの再実行で、キーを発行し直させないため。**空文字を渡した場合は
|
|
7
7
|
* 探しに行かない** — 打ち間違いなので、黙って別の鍵を使うと何が使われたのかが
|
|
8
8
|
* 分からなくなる。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-setup.d.ts","sourceRoot":"","sources":["../../src/cli/telemetry-setup.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"telemetry-setup.d.ts","sourceRoot":"","sources":["../../src/cli/telemetry-setup.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DrF"}
|
|
@@ -72,10 +72,16 @@ async function runTelemetrySetup(options) {
|
|
|
72
72
|
// 鍵の保存を先に済ませる。設定だけ書けて鍵が入らないと、送信は始まるのに
|
|
73
73
|
// 401 で落ち続ける状態になり、原因が見えにくい。
|
|
74
74
|
//
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
// 保存済みの鍵を読んだときは書き戻さない。ただし保存形式が古い場合は保存し直す。
|
|
76
|
+
// 環境変数 AIDENTITY_TELEMETRY_API_KEY で渡された鍵は保存する。環境変数はこの実行の
|
|
77
|
+
// シェルにしか無いので、保存しないと次のセッションから送信が 401 で失敗し続ける
|
|
78
|
+
const keyManager = new key_manager_1.KeyManager();
|
|
79
|
+
if (resolved.source !== 'stored' || keyManager.telemetryApiKeyNeedsRestore()) {
|
|
80
|
+
keyManager.storeTelemetryApiKey(resolved.key);
|
|
81
|
+
// 保存し直しても古い形式のままなら、より安全な形で保存できなかったということ
|
|
82
|
+
if (keyManager.telemetryApiKeyNeedsRestore()) {
|
|
83
|
+
process.stderr.write('警告: API キーを暗号化して保存できなかったため、平文 (権限 600) で保存しました。\n');
|
|
84
|
+
}
|
|
79
85
|
}
|
|
80
86
|
if (fs.existsSync(settingsPath)) {
|
|
81
87
|
backup(settingsPath);
|
|
@@ -116,9 +122,9 @@ function resolveKey(argument) {
|
|
|
116
122
|
const fromEnv = process.env[otel_headers_1.TELEMETRY_API_KEY_ENV]?.trim();
|
|
117
123
|
if (fromEnv)
|
|
118
124
|
return { key: fromEnv, source: 'env' };
|
|
119
|
-
const
|
|
120
|
-
if (
|
|
121
|
-
return { key:
|
|
125
|
+
const stored = new key_manager_1.KeyManager().getTelemetryApiKey()?.trim();
|
|
126
|
+
if (stored)
|
|
127
|
+
return { key: stored, source: 'stored' };
|
|
122
128
|
throw new Error('No API key found on this machine.\n' +
|
|
123
129
|
'Issue one in the aidentity console (AI 利用状況 → 端末の接続 → キーを発行),\n' +
|
|
124
130
|
'then run: vess usage connect --key <key>');
|
|
@@ -199,15 +205,16 @@ function writeSettings(settingsPath, settings) {
|
|
|
199
205
|
}
|
|
200
206
|
function report(options) {
|
|
201
207
|
const { settingsPath, endpoint, replaced, keySource, inheritedEndpoint } = options;
|
|
208
|
+
const keyLocation = new key_manager_1.KeyManager().telemetryApiKeyLocation();
|
|
202
209
|
const lines = [
|
|
203
210
|
'テレメトリの送信設定を書き込みました。',
|
|
204
211
|
` 設定ファイル: ${settingsPath}`,
|
|
205
212
|
// 黙って送信先が変わるのが一番危ない。引き継いだのかどうかを見せる
|
|
206
213
|
` 送信先: ${endpoint}${inheritedEndpoint ? ' (いまの設定から引き継ぎ)' : ''}`,
|
|
207
214
|
// 🔴 有効性は確かめていない。失効した鍵でも設定は書ける
|
|
208
|
-
keySource === '
|
|
209
|
-
?
|
|
210
|
-
:
|
|
215
|
+
keySource === 'stored'
|
|
216
|
+
? ` API キー: 保存済みのものを使いました (${keyLocation}。有効かどうかは確かめていません)`
|
|
217
|
+
: ` API キー: ${keyLocation} に保存しました`,
|
|
211
218
|
];
|
|
212
219
|
if (replaced) {
|
|
213
220
|
lines.push(` 切り替え前: ${replaced} (退避ファイルに残しています)`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-setup.js","sourceRoot":"","sources":["../../src/cli/telemetry-setup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,
|
|
1
|
+
{"version":3,"file":"telemetry-setup.js","sourceRoot":"","sources":["../../src/cli/telemetry-setup.ts"],"names":[],"mappings":"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"}
|
package/dist/config/paths.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAGA,qBAAa,SAAS;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAI5B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAGA,qBAAa,SAAS;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAI5B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
|
package/dist/config/paths.js
CHANGED
package/dist/config/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4B;AAC5B,uCAAwB;AAExB,MAAa,SAAS;IACX,OAAO,CAAQ;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4B;AAC5B,uCAAwB;AAExB,MAAa,SAAS;IACX,OAAO,CAAQ;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAC3C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;CACF;AA1BD,8BA0BC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** DPAPI の操作。入力も出力も base64。失敗したら null。 */
|
|
2
|
+
export type DpapiRunner = (operation: 'Protect' | 'Unprotect', inputBase64: string) => string | null;
|
|
3
|
+
/** WSL で Windows のプログラムを起動できるか。連携が無効ならこのファイルが無い。 */
|
|
4
|
+
export declare function isWslWithInterop(): boolean;
|
|
5
|
+
/** 値を Windows ユーザーに結びついた DPAPI で暗号化し、`dpapi:v1:<base64>` の形で扱う。 */
|
|
6
|
+
export declare class DpapiCodec {
|
|
7
|
+
private readonly run;
|
|
8
|
+
constructor(run: DpapiRunner);
|
|
9
|
+
isEncoded(stored: string): boolean;
|
|
10
|
+
encode(value: string): string | null;
|
|
11
|
+
decode(stored: string): string | null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* WSL から Windows PowerShell 5.1 で DPAPI を呼ぶ。
|
|
15
|
+
* 秘密は標準入力 (base64) で渡し、コマンドラインに載せない。標準入力の BOM 等は base64 以外として捨てる。
|
|
16
|
+
*/
|
|
17
|
+
export declare const runPowershellDpapi: DpapiRunner;
|
|
18
|
+
//# sourceMappingURL=dpapi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpapi.d.ts","sourceRoot":"","sources":["../../src/identity/dpapi.ts"],"names":[],"mappings":"AAGA,0CAA0C;AAC1C,MAAM,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;AAQpG,oDAAoD;AACpD,wBAAgB,gBAAgB,IAAI,OAAO,CAI1C;AAED,mEAAmE;AACnE,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,WAAW;IAE7C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIlC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKpC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAItC;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,WA2BhC,CAAA"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runPowershellDpapi = exports.DpapiCodec = void 0;
|
|
37
|
+
exports.isWslWithInterop = isWslWithInterop;
|
|
38
|
+
const child_process_1 = require("child_process");
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const DPAPI_PREFIX = 'dpapi:v1:';
|
|
41
|
+
const BASE64 = /^[A-Za-z0-9+/]+=*$/;
|
|
42
|
+
// 他のアプリが DPAPI で暗号化した値と取り違えないための固定値
|
|
43
|
+
const ENTROPY = 'com.vess.telemetry-api-key';
|
|
44
|
+
const POWERSHELL_FALLBACK = '/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe';
|
|
45
|
+
/** WSL で Windows のプログラムを起動できるか。連携が無効ならこのファイルが無い。 */
|
|
46
|
+
function isWslWithInterop() {
|
|
47
|
+
return ['/proc/sys/fs/binfmt_misc/WSLInterop', '/proc/sys/fs/binfmt_misc/WSLInterop-late'].some(p => fs.existsSync(p));
|
|
48
|
+
}
|
|
49
|
+
/** 値を Windows ユーザーに結びついた DPAPI で暗号化し、`dpapi:v1:<base64>` の形で扱う。 */
|
|
50
|
+
class DpapiCodec {
|
|
51
|
+
run;
|
|
52
|
+
constructor(run) {
|
|
53
|
+
this.run = run;
|
|
54
|
+
}
|
|
55
|
+
isEncoded(stored) {
|
|
56
|
+
return stored.startsWith(DPAPI_PREFIX);
|
|
57
|
+
}
|
|
58
|
+
encode(value) {
|
|
59
|
+
const out = this.run('Protect', Buffer.from(value, 'utf-8').toString('base64'));
|
|
60
|
+
return out ? DPAPI_PREFIX + out : null;
|
|
61
|
+
}
|
|
62
|
+
decode(stored) {
|
|
63
|
+
const out = this.run('Unprotect', stored.slice(DPAPI_PREFIX.length));
|
|
64
|
+
return out ? Buffer.from(out, 'base64').toString('utf-8') : null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.DpapiCodec = DpapiCodec;
|
|
68
|
+
/**
|
|
69
|
+
* WSL から Windows PowerShell 5.1 で DPAPI を呼ぶ。
|
|
70
|
+
* 秘密は標準入力 (base64) で渡し、コマンドラインに載せない。標準入力の BOM 等は base64 以外として捨てる。
|
|
71
|
+
*/
|
|
72
|
+
const runPowershellDpapi = (operation, inputBase64) => {
|
|
73
|
+
const script = "$ErrorActionPreference='Stop';Add-Type -AssemblyName System.Security;" +
|
|
74
|
+
`$e=[Text.Encoding]::UTF8.GetBytes('${ENTROPY}');` +
|
|
75
|
+
"$i=[Convert]::FromBase64String(([Console]::In.ReadToEnd() -replace '[^A-Za-z0-9+/=]',''));" +
|
|
76
|
+
`$o=[Security.Cryptography.ProtectedData]::${operation}($i,$e,'CurrentUser');` +
|
|
77
|
+
'[Console]::Out.Write([Convert]::ToBase64String($o))';
|
|
78
|
+
for (const exe of ['powershell.exe', POWERSHELL_FALLBACK]) {
|
|
79
|
+
const result = (0, child_process_1.spawnSync)(exe, ['-NoLogo', '-NoProfile', '-NonInteractive', '-Command', script], {
|
|
80
|
+
input: inputBase64,
|
|
81
|
+
encoding: 'utf-8',
|
|
82
|
+
timeout: 10_000,
|
|
83
|
+
windowsHide: true,
|
|
84
|
+
// 9P 越しの作業ディレクトリは遅く、消えていると起動に失敗する
|
|
85
|
+
cwd: fs.existsSync('/mnt/c') ? '/mnt/c' : undefined,
|
|
86
|
+
});
|
|
87
|
+
if (result.error?.code === 'ENOENT')
|
|
88
|
+
continue;
|
|
89
|
+
if (result.error || result.status !== 0)
|
|
90
|
+
return null;
|
|
91
|
+
const out = (result.stdout ?? '').trim();
|
|
92
|
+
return BASE64.test(out) ? out : null;
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
};
|
|
96
|
+
exports.runPowershellDpapi = runPowershellDpapi;
|
|
97
|
+
//# sourceMappingURL=dpapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpapi.js","sourceRoot":"","sources":["../../src/identity/dpapi.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,4CAIC;AAjBD,iDAAyC;AACzC,uCAAwB;AAKxB,MAAM,YAAY,GAAG,WAAW,CAAA;AAChC,MAAM,MAAM,GAAG,oBAAoB,CAAA;AACnC,oCAAoC;AACpC,MAAM,OAAO,GAAG,4BAA4B,CAAA;AAC5C,MAAM,mBAAmB,GAAG,+DAA+D,CAAA;AAE3F,oDAAoD;AACpD,SAAgB,gBAAgB;IAC9B,OAAO,CAAC,qCAAqC,EAAE,0CAA0C,CAAC,CAAC,IAAI,CAC7F,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CACtB,CAAA;AACH,CAAC;AAED,mEAAmE;AACnE,MAAa,UAAU;IACQ;IAA7B,YAA6B,GAAgB;QAAhB,QAAG,GAAH,GAAG,CAAa;IAAG,CAAC;IAEjD,SAAS,CAAC,MAAc;QACtB,OAAO,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC/E,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;QACpE,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAClE,CAAC;CACF;AAhBD,gCAgBC;AAED;;;GAGG;AACI,MAAM,kBAAkB,GAAgB,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE;IACxE,MAAM,MAAM,GACV,uEAAuE;QACvE,sCAAsC,OAAO,KAAK;QAClD,4FAA4F;QAC5F,6CAA6C,SAAS,wBAAwB;QAC9E,qDAAqD,CAAA;IAEvD,KAAK,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAA,yBAAS,EACtB,GAAG,EACH,CAAC,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,CAAC,EAChE;YACE,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,IAAI;YACjB,kCAAkC;YAClC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACpD,CACF,CAAA;QACD,IAAK,MAAM,CAAC,KAA2C,EAAE,IAAI,KAAK,QAAQ;YAAE,SAAQ;QACpF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACpD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACxC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IACtC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AA3BY,QAAA,kBAAkB,sBA2B9B"}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
|
+
import { type DpapiRunner } from './dpapi';
|
|
2
|
+
export interface KeyManagerOptions {
|
|
3
|
+
/** 既定は process.platform。 */
|
|
4
|
+
platform?: NodeJS.Platform;
|
|
5
|
+
/** ファイルに置く秘密の値のディレクトリ。既定は ~/.vess/secrets。 */
|
|
6
|
+
secretsDir?: string;
|
|
7
|
+
/** WSL で Windows 連携が使えるか。既定は実環境から判定する。 */
|
|
8
|
+
wsl?: boolean;
|
|
9
|
+
/** DPAPI の呼び出し。既定は powershell.exe。 */
|
|
10
|
+
dpapi?: DpapiRunner;
|
|
11
|
+
}
|
|
1
12
|
export declare class KeyManager {
|
|
13
|
+
private readonly platform;
|
|
14
|
+
private readonly keychain;
|
|
15
|
+
private readonly files;
|
|
16
|
+
private readonly wsl;
|
|
17
|
+
private readonly dpapi;
|
|
18
|
+
constructor(options?: KeyManagerOptions);
|
|
2
19
|
static getKeychainRef(keyType: 'root' | 'agent', projectId?: string, clientName?: string): string;
|
|
3
|
-
private createEntry;
|
|
4
20
|
storeRootKey(privateKeyJwk: string): void;
|
|
5
21
|
getRootKey(): string | null;
|
|
6
22
|
deleteRootKey(): void;
|
|
@@ -13,6 +29,12 @@ export declare class KeyManager {
|
|
|
13
29
|
storeTelemetryApiKey(apiKey: string): void;
|
|
14
30
|
getTelemetryApiKey(): string | null;
|
|
15
31
|
deleteTelemetryApiKey(): void;
|
|
32
|
+
/** 保存済みの鍵を storeTelemetryApiKey で保存し直すと、より安全な形になるとき true。 */
|
|
33
|
+
telemetryApiKeyNeedsRestore(): boolean;
|
|
34
|
+
/** 送信用 API キーの保存先。利用者への表示用。 */
|
|
35
|
+
telemetryApiKeyLocation(): string;
|
|
36
|
+
/** WSL で、平文のファイル、またはキーチェーンにだけ鍵があるとき true。 */
|
|
37
|
+
private isUnencryptedOnWsl;
|
|
16
38
|
private envAccount;
|
|
17
39
|
storeEnvSecret(profile: string, key: string, value: string): void;
|
|
18
40
|
getEnvSecret(profile: string, key: string): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-manager.d.ts","sourceRoot":"","sources":["../../src/identity/key-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"key-manager.d.ts","sourceRoot":"","sources":["../../src/identity/key-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAoD,KAAK,WAAW,EAAE,MAAM,SAAS,CAAA;AAM5F,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,sCAAsC;IACtC,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,OAAO,GAAE,iBAAsB;IAO3C,MAAM,CAAC,cAAc,CACnB,OAAO,EAAE,MAAM,GAAG,OAAO,EACzB,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM;IAOT,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAIzC,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,aAAa,IAAI,IAAI;IAIrB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAIjF,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIjE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAI3D,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAItC,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,kBAAkB,IAAI,IAAI;IAa1B,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAY1C,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAqBnC,qBAAqB,IAAI,IAAI;IAO7B,6DAA6D;IAC7D,2BAA2B,IAAI,OAAO;IAItC,+BAA+B;IAC/B,uBAAuB,IAAI,MAAM;IASjC,6CAA6C;IAC7C,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,UAAU;IAIlB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAGpD"}
|
|
@@ -1,77 +1,55 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.KeyManager = void 0;
|
|
4
|
-
const
|
|
4
|
+
const paths_1 = require("../config/paths");
|
|
5
|
+
const dpapi_1 = require("./dpapi");
|
|
6
|
+
const secret_store_1 = require("./secret-store");
|
|
5
7
|
const SERVICE_NAME = 'com.vess';
|
|
8
|
+
const TELEMETRY_API_KEY_ACCOUNT = 'telemetry-api-key';
|
|
6
9
|
class KeyManager {
|
|
10
|
+
platform;
|
|
11
|
+
keychain = new secret_store_1.KeychainStore(SERVICE_NAME);
|
|
12
|
+
files;
|
|
13
|
+
wsl;
|
|
14
|
+
dpapi;
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.platform = options.platform ?? process.platform;
|
|
17
|
+
this.files = new secret_store_1.FileStore(options.secretsDir ?? new paths_1.VessPaths().secretsDir);
|
|
18
|
+
this.wsl = this.platform === 'linux' && (options.wsl ?? (0, dpapi_1.isWslWithInterop)());
|
|
19
|
+
this.dpapi = new dpapi_1.DpapiCodec(options.dpapi ?? dpapi_1.runPowershellDpapi);
|
|
20
|
+
}
|
|
7
21
|
static getKeychainRef(keyType, projectId, clientName) {
|
|
8
22
|
if (keyType === 'root') {
|
|
9
23
|
return `${SERVICE_NAME}.root-key`;
|
|
10
24
|
}
|
|
11
25
|
return `${SERVICE_NAME}.agent.${projectId}.${clientName}`;
|
|
12
26
|
}
|
|
13
|
-
createEntry(account) {
|
|
14
|
-
return new keyring_1.Entry(SERVICE_NAME, account);
|
|
15
|
-
}
|
|
16
27
|
storeRootKey(privateKeyJwk) {
|
|
17
|
-
this.
|
|
28
|
+
this.keychain.set('root-key', privateKeyJwk);
|
|
18
29
|
}
|
|
19
30
|
getRootKey() {
|
|
20
|
-
|
|
21
|
-
return this.createEntry('root-key').getPassword();
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
31
|
+
return this.keychain.get('root-key');
|
|
26
32
|
}
|
|
27
33
|
deleteRootKey() {
|
|
28
|
-
|
|
29
|
-
this.createEntry('root-key').deletePassword();
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
// Key doesn't exist, ignore
|
|
33
|
-
}
|
|
34
|
+
this.keychain.delete('root-key');
|
|
34
35
|
}
|
|
35
36
|
storeAgentKey(projectId, clientName, privateKeyJwk) {
|
|
36
|
-
|
|
37
|
-
this.createEntry(account).setPassword(privateKeyJwk);
|
|
37
|
+
this.keychain.set(`agent.${projectId}.${clientName}`, privateKeyJwk);
|
|
38
38
|
}
|
|
39
39
|
getAgentKey(projectId, clientName) {
|
|
40
|
-
|
|
41
|
-
const account = `agent.${projectId}.${clientName}`;
|
|
42
|
-
return this.createEntry(account).getPassword();
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
40
|
+
return this.keychain.get(`agent.${projectId}.${clientName}`);
|
|
47
41
|
}
|
|
48
42
|
deleteAgentKey(projectId, clientName) {
|
|
49
|
-
|
|
50
|
-
const account = `agent.${projectId}.${clientName}`;
|
|
51
|
-
this.createEntry(account).deletePassword();
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
// Key doesn't exist, ignore
|
|
55
|
-
}
|
|
43
|
+
this.keychain.delete(`agent.${projectId}.${clientName}`);
|
|
56
44
|
}
|
|
57
45
|
storeSessionToken(token) {
|
|
58
|
-
this.
|
|
46
|
+
this.keychain.set('session-token', token);
|
|
59
47
|
}
|
|
60
48
|
getSessionToken() {
|
|
61
|
-
|
|
62
|
-
return this.createEntry('session-token').getPassword();
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
49
|
+
return this.keychain.get('session-token');
|
|
67
50
|
}
|
|
68
51
|
deleteSessionToken() {
|
|
69
|
-
|
|
70
|
-
this.createEntry('session-token').deletePassword();
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// Token doesn't exist, ignore
|
|
74
|
-
}
|
|
52
|
+
this.keychain.delete('session-token');
|
|
75
53
|
}
|
|
76
54
|
// ── Telemetry API key ──
|
|
77
55
|
//
|
|
@@ -79,47 +57,83 @@ class KeyManager {
|
|
|
79
57
|
// key has to be readable by `vess otel-headers` on every export. Keeping it
|
|
80
58
|
// here rather than in each agent's settings file is the point: those files are
|
|
81
59
|
// plaintext and show up in the agents' own config dumps.
|
|
60
|
+
// Linux は Secret Service が無いとキーチェーンが再起動で消えるため 0600 ファイルに置く。
|
|
61
|
+
// WSL では Windows の DPAPI で暗号化してから置く。暗号化は保存時だけ行い、読み出しでは復号だけする。
|
|
82
62
|
storeTelemetryApiKey(apiKey) {
|
|
83
|
-
this.
|
|
63
|
+
if (this.platform === 'linux') {
|
|
64
|
+
const encoded = this.wsl ? this.dpapi.encode(apiKey) : null;
|
|
65
|
+
// 暗号化できなければ平文で置く。送信を止めないことを優先する
|
|
66
|
+
this.files.set(TELEMETRY_API_KEY_ACCOUNT, encoded ?? apiKey);
|
|
67
|
+
// 古い鍵を残すと、並行する読み出しの移行処理が新しい鍵を上書きしうる
|
|
68
|
+
this.keychain.delete(TELEMETRY_API_KEY_ACCOUNT);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.keychain.set(TELEMETRY_API_KEY_ACCOUNT, apiKey);
|
|
72
|
+
}
|
|
84
73
|
}
|
|
85
74
|
getTelemetryApiKey() {
|
|
75
|
+
if (this.platform !== 'linux') {
|
|
76
|
+
return this.keychain.get(TELEMETRY_API_KEY_ACCOUNT);
|
|
77
|
+
}
|
|
78
|
+
// 手で編集されたファイルの末尾改行をヘッダーに混ぜない
|
|
79
|
+
const fromFile = this.files.get(TELEMETRY_API_KEY_ACCOUNT)?.trim();
|
|
80
|
+
if (fromFile)
|
|
81
|
+
return this.dpapi.isEncoded(fromFile) ? this.dpapi.decode(fromFile) : fromFile;
|
|
82
|
+
// ファイル保存より前にキーチェーンへ入れた端末。消える前にファイルへ移す
|
|
83
|
+
const legacy = this.keychain.get(TELEMETRY_API_KEY_ACCOUNT);
|
|
84
|
+
if (legacy === null)
|
|
85
|
+
return null;
|
|
86
86
|
try {
|
|
87
|
-
|
|
87
|
+
this.files.set(TELEMETRY_API_KEY_ACCOUNT, legacy);
|
|
88
|
+
this.keychain.delete(TELEMETRY_API_KEY_ACCOUNT);
|
|
88
89
|
}
|
|
89
90
|
catch {
|
|
90
|
-
|
|
91
|
+
// 移せなくても今回の読み出しは返す。次の読み出しでまた試す
|
|
91
92
|
}
|
|
93
|
+
return legacy;
|
|
92
94
|
}
|
|
93
95
|
deleteTelemetryApiKey() {
|
|
94
|
-
|
|
95
|
-
this.
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
if (this.platform === 'linux') {
|
|
97
|
+
this.files.delete(TELEMETRY_API_KEY_ACCOUNT);
|
|
98
|
+
}
|
|
99
|
+
this.keychain.delete(TELEMETRY_API_KEY_ACCOUNT);
|
|
100
|
+
}
|
|
101
|
+
/** 保存済みの鍵を storeTelemetryApiKey で保存し直すと、より安全な形になるとき true。 */
|
|
102
|
+
telemetryApiKeyNeedsRestore() {
|
|
103
|
+
return this.isUnencryptedOnWsl();
|
|
104
|
+
}
|
|
105
|
+
/** 送信用 API キーの保存先。利用者への表示用。 */
|
|
106
|
+
telemetryApiKeyLocation() {
|
|
107
|
+
if (this.platform !== 'linux')
|
|
108
|
+
return 'OS のキーチェーン';
|
|
109
|
+
const location = this.files.pathOf(TELEMETRY_API_KEY_ACCOUNT);
|
|
110
|
+
if (!this.wsl)
|
|
111
|
+
return location;
|
|
112
|
+
return this.isUnencryptedOnWsl()
|
|
113
|
+
? `${location} (暗号化なし)`
|
|
114
|
+
: `${location} (Windows の DPAPI で暗号化)`;
|
|
115
|
+
}
|
|
116
|
+
/** WSL で、平文のファイル、またはキーチェーンにだけ鍵があるとき true。 */
|
|
117
|
+
isUnencryptedOnWsl() {
|
|
118
|
+
if (this.platform !== 'linux' || !this.wsl)
|
|
119
|
+
return false;
|
|
120
|
+
const fromFile = this.files.get(TELEMETRY_API_KEY_ACCOUNT)?.trim();
|
|
121
|
+
if (fromFile)
|
|
122
|
+
return !this.dpapi.isEncoded(fromFile);
|
|
123
|
+
return this.keychain.get(TELEMETRY_API_KEY_ACCOUNT) !== null;
|
|
100
124
|
}
|
|
101
125
|
// ── Env secret storage (vess://env/<profile>/<key>) ──
|
|
102
126
|
envAccount(profile, key) {
|
|
103
127
|
return `env.${profile}.${key}`;
|
|
104
128
|
}
|
|
105
129
|
storeEnvSecret(profile, key, value) {
|
|
106
|
-
this.
|
|
130
|
+
this.keychain.set(this.envAccount(profile, key), value);
|
|
107
131
|
}
|
|
108
132
|
getEnvSecret(profile, key) {
|
|
109
|
-
|
|
110
|
-
return this.createEntry(this.envAccount(profile, key)).getPassword();
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
133
|
+
return this.keychain.get(this.envAccount(profile, key));
|
|
115
134
|
}
|
|
116
135
|
deleteEnvSecret(profile, key) {
|
|
117
|
-
|
|
118
|
-
this.createEntry(this.envAccount(profile, key)).deletePassword();
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
// Secret doesn't exist, ignore
|
|
122
|
-
}
|
|
136
|
+
this.keychain.delete(this.envAccount(profile, key));
|
|
123
137
|
}
|
|
124
138
|
}
|
|
125
139
|
exports.KeyManager = KeyManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-manager.js","sourceRoot":"","sources":["../../src/identity/key-manager.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"key-manager.js","sourceRoot":"","sources":["../../src/identity/key-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** 秘密の値の保存先。account は保存先の中での名前。 */
|
|
2
|
+
export interface SecretStore {
|
|
3
|
+
get(account: string): string | null;
|
|
4
|
+
set(account: string, value: string): void;
|
|
5
|
+
delete(account: string): void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* OS のキーチェーン (macOS Keychain / Windows 資格情報マネージャー / Linux Secret Service)。
|
|
9
|
+
* 🔴 Linux で Secret Service が無いとカーネルのメモリ (keyutils) に黙って切り替わり、再起動で消える。
|
|
10
|
+
*/
|
|
11
|
+
export declare class KeychainStore implements SecretStore {
|
|
12
|
+
private readonly service;
|
|
13
|
+
constructor(service: string);
|
|
14
|
+
get(account: string): string | null;
|
|
15
|
+
set(account: string, value: string): void;
|
|
16
|
+
delete(account: string): void;
|
|
17
|
+
}
|
|
18
|
+
/** `<dir>/<account>` に平文で置く。ディレクトリは 0700、ファイルは 0600。 */
|
|
19
|
+
export declare class FileStore implements SecretStore {
|
|
20
|
+
private readonly dir;
|
|
21
|
+
constructor(dir: string);
|
|
22
|
+
pathOf(account: string): string;
|
|
23
|
+
get(account: string): string | null;
|
|
24
|
+
set(account: string, value: string): void;
|
|
25
|
+
delete(account: string): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=secret-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-store.d.ts","sourceRoot":"","sources":["../../src/identity/secret-store.ts"],"names":[],"mappings":"AAKA,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACnC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED;;;GAGG;AACH,qBAAa,aAAc,YAAW,WAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE5C,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQnC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAO9B;AAID,wDAAwD;AACxD,qBAAa,SAAU,YAAW,WAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAExC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAO/B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQnC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG9B"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.FileStore = exports.KeychainStore = void 0;
|
|
37
|
+
const crypto_1 = require("crypto");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const keyring_1 = require("@napi-rs/keyring");
|
|
41
|
+
/**
|
|
42
|
+
* OS のキーチェーン (macOS Keychain / Windows 資格情報マネージャー / Linux Secret Service)。
|
|
43
|
+
* 🔴 Linux で Secret Service が無いとカーネルのメモリ (keyutils) に黙って切り替わり、再起動で消える。
|
|
44
|
+
*/
|
|
45
|
+
class KeychainStore {
|
|
46
|
+
service;
|
|
47
|
+
constructor(service) {
|
|
48
|
+
this.service = service;
|
|
49
|
+
}
|
|
50
|
+
get(account) {
|
|
51
|
+
try {
|
|
52
|
+
return new keyring_1.Entry(this.service, account).getPassword();
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
set(account, value) {
|
|
59
|
+
new keyring_1.Entry(this.service, account).setPassword(value);
|
|
60
|
+
}
|
|
61
|
+
delete(account) {
|
|
62
|
+
try {
|
|
63
|
+
new keyring_1.Entry(this.service, account).deletePassword();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Doesn't exist, ignore
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.KeychainStore = KeychainStore;
|
|
71
|
+
const ACCOUNT_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
72
|
+
/** `<dir>/<account>` に平文で置く。ディレクトリは 0700、ファイルは 0600。 */
|
|
73
|
+
class FileStore {
|
|
74
|
+
dir;
|
|
75
|
+
constructor(dir) {
|
|
76
|
+
this.dir = dir;
|
|
77
|
+
}
|
|
78
|
+
pathOf(account) {
|
|
79
|
+
if (!ACCOUNT_PATTERN.test(account)) {
|
|
80
|
+
throw new Error(`Invalid secret name: "${account}"`);
|
|
81
|
+
}
|
|
82
|
+
return path.join(this.dir, account);
|
|
83
|
+
}
|
|
84
|
+
get(account) {
|
|
85
|
+
try {
|
|
86
|
+
return fs.readFileSync(this.pathOf(account), 'utf-8');
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
set(account, value) {
|
|
93
|
+
const target = this.pathOf(account);
|
|
94
|
+
fs.mkdirSync(this.dir, { recursive: true, mode: 0o700 });
|
|
95
|
+
// mkdir の mode は umask を受け、既存ディレクトリには効かない
|
|
96
|
+
fs.chmodSync(this.dir, 0o700);
|
|
97
|
+
// 一時ファイルは毎回新規に作る (wx)。既存ファイルやリンクを経由すると 0600 が効かない
|
|
98
|
+
const tmp = `${target}.${process.pid}.${(0, crypto_1.randomBytes)(6).toString('hex')}.tmp`;
|
|
99
|
+
try {
|
|
100
|
+
fs.writeFileSync(tmp, value, { encoding: 'utf-8', mode: 0o600, flag: 'wx' });
|
|
101
|
+
fs.renameSync(tmp, target);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
fs.rmSync(tmp, { force: true });
|
|
105
|
+
throw err;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
delete(account) {
|
|
109
|
+
fs.rmSync(this.pathOf(account), { force: true });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.FileStore = FileStore;
|
|
113
|
+
//# sourceMappingURL=secret-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-store.js","sourceRoot":"","sources":["../../src/identity/secret-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vess-id/vess",
|
|
3
|
-
"version": "0.0.0-dev-
|
|
3
|
+
"version": "0.0.0-dev-20261006103529",
|
|
4
4
|
"description": "VESS local AI agent runtime — manages agent identity, permissions, and execution boundaries",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"better-sqlite3": "^11.10.0",
|
|
16
16
|
"commander": "^12.1.0",
|
|
17
17
|
"zod": "^3.25.76",
|
|
18
|
-
"@vess-id/ai-identity": "0.0.0-dev-
|
|
18
|
+
"@vess-id/ai-identity": "0.0.0-dev-20261006103529"
|
|
19
19
|
},
|
|
20
20
|
"optionalDependencies": {
|
|
21
21
|
"node-mac-auth": "^1.1.0"
|