@tk_wfl/o2n-core 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAOzE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAQzE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD"}
@@ -1,33 +1,29 @@
1
- import { promises as fs } from 'node:fs';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- function credentialsPath() {
5
- return path.join(os.homedir(), '.o2n', 'credentials.json');
6
- }
1
+ import { atomicWriteHomeStateFile, readHomeStateFile, removeHomeStateFile, } from './local-state-io.js';
7
2
  /**
8
3
  * `o2n login`(OAuth)で取得したトークンをホームディレクトリ配下に保存する(vault内には保存しない)。
9
4
  * CLI・MCPサーバーの両方から共有される(NOTION_TOKEN環境変数が無い場合のフォールバック用)。
10
5
  */
11
6
  export async function saveCredentials(data) {
12
- const p = credentialsPath();
13
- await fs.mkdir(path.dirname(p), { recursive: true });
14
- await fs.writeFile(p, JSON.stringify(data, null, 2), { mode: 0o600 });
7
+ await atomicWriteHomeStateFile('credentials.json', JSON.stringify(data, null, 2));
15
8
  }
16
9
  export async function loadCredentials() {
17
10
  try {
18
- const raw = await fs.readFile(credentialsPath(), 'utf-8');
11
+ const raw = await readHomeStateFile('credentials.json');
19
12
  return JSON.parse(raw);
20
13
  }
21
- catch {
14
+ catch (error) {
15
+ if (error.code !== 'ENOENT')
16
+ throw error;
22
17
  return null;
23
18
  }
24
19
  }
25
20
  export async function clearCredentials() {
26
21
  try {
27
- await fs.unlink(credentialsPath());
22
+ await removeHomeStateFile('credentials.json');
28
23
  }
29
- catch {
30
- // 既に無ければ何もしない
24
+ catch (error) {
25
+ if (error.code !== 'ENOENT')
26
+ throw error;
31
27
  }
32
28
  }
33
29
  //# sourceMappingURL=credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,SAAS,eAAe;IACtB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAuB;IAC3D,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAQ7B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAuB;IAC3D,MAAM,wBAAwB,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACtE,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -12,4 +12,5 @@ export * from './report.js';
12
12
  export * from './credentials.js';
13
13
  export * from './vault-guard.js';
14
14
  export * from './schemas.js';
15
+ export * from './local-state-io.js';
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -12,4 +12,5 @@ export * from './report.js';
12
12
  export * from './credentials.js';
13
13
  export * from './vault-guard.js';
14
14
  export * from './schemas.js';
15
+ export * from './local-state-io.js';
15
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,38 @@
1
+ export type VaultStateFileName = 'plan.json' | 'report.md' | 'state.json';
2
+ export type HomeStateFileName = 'credentials.json' | 'state-signing-key';
3
+ export declare class LocalStateSecurityError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ export interface NoFollowReadOptions {
7
+ noFollowFlag?: number;
8
+ testHooks?: {
9
+ afterParentOpen?: (parentPath: string) => Promise<void>;
10
+ beforeDirectoryModeTighten?: (directoryPath: string) => Promise<void>;
11
+ };
12
+ }
13
+ export interface HomeStateReadOptions extends NoFollowReadOptions {
14
+ expectedUid?: number;
15
+ expectedFileUid?: number;
16
+ }
17
+ export interface AtomicWriteTestContext {
18
+ temporaryPath: string;
19
+ destinationPath: string;
20
+ parentPath: string;
21
+ }
22
+ export interface AtomicWriteOptions {
23
+ testHooks?: {
24
+ afterTemporaryOpen?: (context: AtomicWriteTestContext) => Promise<void>;
25
+ beforeTemporaryValidation?: (context: AtomicWriteTestContext) => Promise<void>;
26
+ afterRename?: (context: AtomicWriteTestContext) => Promise<void>;
27
+ beforeDirectoryModeTighten?: (directoryPath: string) => Promise<void>;
28
+ };
29
+ }
30
+ export declare function readVaultStateFile(vaultPath: string, fileName: VaultStateFileName, options?: NoFollowReadOptions): Promise<string>;
31
+ export declare function atomicWriteVaultStateFile(vaultPath: string, fileName: VaultStateFileName, content: string, options?: AtomicWriteOptions): Promise<void>;
32
+ export declare function readHomeStateFile(fileName: HomeStateFileName, options?: HomeStateReadOptions): Promise<string>;
33
+ export declare function atomicWriteHomeStateFile(fileName: HomeStateFileName, content: string, options?: AtomicWriteOptions): Promise<void>;
34
+ export declare function removeHomeStateFile(fileName: HomeStateFileName): Promise<void>;
35
+ export declare function readRegularFileNoFollow(filePath: string, options?: NoFollowReadOptions): Promise<string>;
36
+ export declare function validateTrustedDirectoryAncestry(directoryPath: string, expectedUid?: number): Promise<void>;
37
+ export declare function atomicWriteRegularFileNoFollow(filePath: string, content: string, options?: AtomicWriteOptions): Promise<void>;
38
+ //# sourceMappingURL=local-state-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-state-io.d.ts","sourceRoot":"","sources":["../src/local-state-io.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC;AAC1E,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAsBzE,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAkBD,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE;QACV,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,0BAA0B,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACvE,CAAC;CACH;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE;QACV,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACxE,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/E,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACjE,0BAA0B,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACvE,CAAC;CACH;AAmpBD,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpF;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,wBAAsB,gCAAgC,CACpD,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAWf"}
@@ -0,0 +1,637 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { constants, promises as fs } from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ const NOFOLLOW = constants.O_NOFOLLOW ?? 0;
6
+ const DIRECTORY = constants.O_DIRECTORY ?? 0;
7
+ /**
8
+ * Windows対応: fs.Stats.mode はWindows上ではPOSIXのowner/group/otherを区別せず
9
+ * 常に同一ビットを複製して返す(Node.js公式ドキュメント)ため、group/other書込み
10
+ * ビットのチェックや0600/0700への厳密一致要求はWindows上では常に失敗し、
11
+ * ツール自体が一切使用不能になる。Windowsではこれらのビット単位チェックには
12
+ * 検証上の意味がないため、win32上ではPOSIX権限ビットの一致要求のみをスキップする
13
+ * (symlink/所有者/ancestryの検証は影響を受けず、win32でも引き続き有効)。
14
+ */
15
+ function enforcePosixMode() {
16
+ return process.platform !== 'win32';
17
+ }
18
+ function modeMatches(stat, mode) {
19
+ if (!enforcePosixMode())
20
+ return true;
21
+ return (stat.mode & 0o777) === mode;
22
+ }
23
+ export class LocalStateSecurityError extends Error {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = 'LocalStateSecurityError';
27
+ }
28
+ }
29
+ function securityError(targetPath, reason) {
30
+ return new LocalStateSecurityError(`${targetPath}: ${reason}`);
31
+ }
32
+ function isEnoent(error) {
33
+ return error.code === 'ENOENT';
34
+ }
35
+ function fileType(stat) {
36
+ return stat.mode & constants.S_IFMT;
37
+ }
38
+ function currentUserId(expectedUid) {
39
+ if (expectedUid !== undefined)
40
+ return expectedUid;
41
+ const processWithUid = process;
42
+ const uid = processWithUid.geteuid?.() ?? processWithUid.getuid?.();
43
+ if (uid === undefined) {
44
+ // Windowsには geteuid/getuid が存在しない。Node.jsのfs.stat()もWindows上では
45
+ // uid/gidを常に0として返すため、所有者IDを0固定として扱えばこの後の
46
+ // assertSecureOwner等の比較は自然に整合する(Windowsでは所有者検証という
47
+ // 概念自体がPOSIXほど意味を持たないため、fail-closedで全機能を止めるのではなく
48
+ // Node標準のuid=0規約に合わせてフォールバックする)。
49
+ if (process.platform === 'win32')
50
+ return 0;
51
+ throw new LocalStateSecurityError('現在ユーザーの所有者IDを検証できない環境です');
52
+ }
53
+ return uid;
54
+ }
55
+ function assertSecureOwner(targetPath, stat, expectedUid) {
56
+ if (stat.uid !== expectedUid) {
57
+ throw securityError(targetPath, '現在ユーザーが所有していません');
58
+ }
59
+ }
60
+ function assertNoGroupOtherWrite(targetPath, stat) {
61
+ if (!enforcePosixMode())
62
+ return;
63
+ if ((stat.mode & 0o022) !== 0) {
64
+ throw securityError(targetPath, 'group/other書込み権限が設定されています');
65
+ }
66
+ }
67
+ function assertTrustedDirectory(targetPath, stat, effectiveUid, requireCurrentOwner) {
68
+ if (!stat.isDirectory())
69
+ throw securityError(targetPath, '通常のディレクトリではありません');
70
+ const ownedByCurrentUser = stat.uid === effectiveUid;
71
+ const ownedByRoot = stat.uid === 0;
72
+ if (!ownedByCurrentUser && !ownedByRoot) {
73
+ throw securityError(targetPath, '信頼できないユーザーが所有するancestorです');
74
+ }
75
+ if (requireCurrentOwner && !ownedByCurrentUser) {
76
+ throw securityError(targetPath, 'sticky root配下は現在ユーザー所有である必要があります');
77
+ }
78
+ const groupOrOtherWritable = enforcePosixMode() && (stat.mode & 0o022) !== 0;
79
+ const rootOwnedSticky = ownedByRoot && (stat.mode & 0o1000) !== 0;
80
+ if (groupOrOtherWritable && !rootOwnedSticky) {
81
+ throw securityError(targetPath, '信頼できないwritable ancestorです');
82
+ }
83
+ return requireCurrentOwner || rootOwnedSticky;
84
+ }
85
+ function assertSecretFile(targetPath, stat, expectedUid) {
86
+ if (!stat.isFile() || stat.nlink !== 1) {
87
+ throw securityError(targetPath, '単一リンクの通常ファイルではありません');
88
+ }
89
+ assertSecureOwner(targetPath, stat, expectedUid);
90
+ if (enforcePosixMode() && (stat.mode & 0o077) !== 0) {
91
+ throw securityError(targetPath, '秘密ファイルの権限が0600相当ではありません');
92
+ }
93
+ }
94
+ function assertSameEntry(targetPath, before, opened, after) {
95
+ const expectedType = fileType(before);
96
+ if (before.dev !== opened.dev
97
+ || before.ino !== opened.ino
98
+ || opened.dev !== after.dev
99
+ || opened.ino !== after.ino
100
+ || fileType(opened) !== expectedType
101
+ || fileType(after) !== expectedType) {
102
+ throw securityError(targetPath, 'I/O中にファイルシステムentryが置き換えられました');
103
+ }
104
+ }
105
+ async function openDirectory(directoryPath, options) {
106
+ if (options.create) {
107
+ try {
108
+ await fs.mkdir(directoryPath, { mode: options.mode });
109
+ }
110
+ catch (error) {
111
+ if (error.code !== 'EEXIST')
112
+ throw error;
113
+ }
114
+ }
115
+ const before = await fs.lstat(directoryPath);
116
+ if (before.isSymbolicLink())
117
+ throw securityError(directoryPath, 'シンボリックリンクは使用できません');
118
+ if (!before.isDirectory())
119
+ throw securityError(directoryPath, '通常のディレクトリではありません');
120
+ const canonicalPath = await fs.realpath(directoryPath);
121
+ if (options.canonicalParent && path.dirname(canonicalPath) !== options.canonicalParent) {
122
+ throw securityError(directoryPath, '許可されたディレクトリの外部を参照しています');
123
+ }
124
+ const noFollowFlag = options.noFollowFlag ?? NOFOLLOW;
125
+ const handle = await fs.open(directoryPath, constants.O_RDONLY | DIRECTORY | noFollowFlag);
126
+ try {
127
+ const opened = await handle.stat();
128
+ const after = await fs.lstat(directoryPath);
129
+ if (after.isSymbolicLink() || !opened.isDirectory() || !after.isDirectory()) {
130
+ throw securityError(directoryPath, '通常のディレクトリではありません');
131
+ }
132
+ assertSameEntry(directoryPath, before, opened, after);
133
+ if (await fs.realpath(directoryPath) !== canonicalPath) {
134
+ throw securityError(directoryPath, 'I/O中にディレクトリの参照先が変化しました');
135
+ }
136
+ let afterStickyRoot;
137
+ if (options.trustUid !== undefined) {
138
+ const openedAfterSticky = assertTrustedDirectory(directoryPath, opened, options.trustUid, options.requireCurrentOwner ?? false);
139
+ const pathAfterSticky = assertTrustedDirectory(directoryPath, after, options.trustUid, options.requireCurrentOwner ?? false);
140
+ afterStickyRoot = openedAfterSticky || pathAfterSticky;
141
+ }
142
+ if (options.ownerUid !== undefined) {
143
+ assertSecureOwner(directoryPath, opened, options.ownerUid);
144
+ }
145
+ if (options.forbidGroupOtherWrite) {
146
+ assertNoGroupOtherWrite(directoryPath, opened);
147
+ }
148
+ if (options.tightenMode
149
+ && !modeMatches(opened, options.tightenMode.targetMode)) {
150
+ assertSecureOwner(directoryPath, opened, options.tightenMode.effectiveUid);
151
+ assertNoGroupOtherWrite(directoryPath, opened);
152
+ assertSecureOwner(directoryPath, after, options.tightenMode.effectiveUid);
153
+ assertNoGroupOtherWrite(directoryPath, after);
154
+ await options.tightenMode.beforeTighten?.(directoryPath);
155
+ const beforeTighten = await handle.stat();
156
+ const beforeTightenPath = await fs.lstat(directoryPath);
157
+ assertSameEntry(directoryPath, opened, beforeTighten, beforeTightenPath);
158
+ if (opened.nlink !== beforeTighten.nlink
159
+ || beforeTighten.nlink !== beforeTightenPath.nlink) {
160
+ throw securityError(directoryPath, 'mode移行前にdirectory link数が変化しました');
161
+ }
162
+ assertSecureOwner(directoryPath, beforeTighten, options.tightenMode.effectiveUid);
163
+ assertNoGroupOtherWrite(directoryPath, beforeTighten);
164
+ await handle.chmod(options.tightenMode.targetMode);
165
+ const tightened = await handle.stat();
166
+ const tightenedPath = await fs.lstat(directoryPath);
167
+ assertSameEntry(directoryPath, opened, tightened, tightenedPath);
168
+ if (opened.nlink !== tightened.nlink || tightened.nlink !== tightenedPath.nlink) {
169
+ throw securityError(directoryPath, 'mode移行中にdirectory link数が変化しました');
170
+ }
171
+ assertSecureOwner(directoryPath, tightened, options.tightenMode.effectiveUid);
172
+ assertSecureOwner(directoryPath, tightenedPath, options.tightenMode.effectiveUid);
173
+ if (!modeMatches(tightened, options.tightenMode.targetMode)
174
+ || !modeMatches(tightenedPath, options.tightenMode.targetMode)) {
175
+ throw securityError(directoryPath, 'legacy directory modeを安全に縮小できませんでした');
176
+ }
177
+ if (options.trustUid !== undefined) {
178
+ assertTrustedDirectory(directoryPath, tightenedPath, options.trustUid, options.requireCurrentOwner ?? false);
179
+ }
180
+ }
181
+ const secured = await handle.stat();
182
+ if (options.trustUid !== undefined) {
183
+ afterStickyRoot = afterStickyRoot || assertTrustedDirectory(directoryPath, secured, options.trustUid, options.requireCurrentOwner ?? false);
184
+ }
185
+ if (options.ownerUid !== undefined) {
186
+ assertSecureOwner(directoryPath, secured, options.ownerUid);
187
+ }
188
+ if (options.forbidGroupOtherWrite) {
189
+ assertNoGroupOtherWrite(directoryPath, secured);
190
+ }
191
+ if (options.mode !== undefined && !modeMatches(secured, options.mode)) {
192
+ throw securityError(directoryPath, '要求されたdirectory権限を設定できません');
193
+ }
194
+ return {
195
+ path: directoryPath,
196
+ canonicalPath,
197
+ handle,
198
+ dev: opened.dev,
199
+ ino: opened.ino,
200
+ ownerUid: options.ownerUid,
201
+ forbidGroupOtherWrite: options.forbidGroupOtherWrite,
202
+ trustUid: options.trustUid,
203
+ requireCurrentOwner: options.requireCurrentOwner,
204
+ afterStickyRoot,
205
+ noFollowFlag,
206
+ };
207
+ }
208
+ catch (error) {
209
+ await handle.close();
210
+ throw error;
211
+ }
212
+ }
213
+ async function openDirectoryTree(directoryPath, options) {
214
+ const noFollowFlag = options.noFollowFlag ?? NOFOLLOW;
215
+ const resolvedDirectory = path.resolve(directoryPath);
216
+ const filesystemRoot = path.parse(resolvedDirectory).root;
217
+ const relativePath = path.relative(filesystemRoot, resolvedDirectory);
218
+ if (path.isAbsolute(relativePath) || relativePath.startsWith(`..${path.sep}`)) {
219
+ throw securityError(directoryPath, 'filesystem root外のパスは使用できません');
220
+ }
221
+ const segments = relativePath.split(path.sep).filter(Boolean);
222
+ let directory = await openDirectory(filesystemRoot, {
223
+ create: false,
224
+ noFollowFlag,
225
+ trustUid: options.effectiveUid,
226
+ });
227
+ try {
228
+ for (const [index, segment] of segments.entries()) {
229
+ await assertDirectoryUnchanged(directory);
230
+ const childPath = path.join(directory.canonicalPath, segment);
231
+ let created = false;
232
+ if (options.createMissing) {
233
+ try {
234
+ await fs.mkdir(childPath, { mode: 0o700 });
235
+ created = true;
236
+ }
237
+ catch (error) {
238
+ if (error.code !== 'EEXIST')
239
+ throw error;
240
+ }
241
+ }
242
+ const isFinal = index === segments.length - 1;
243
+ const requireCurrentOwner = Boolean(directory.afterStickyRoot
244
+ || created
245
+ || (isFinal && options.finalRequireCurrentOwner));
246
+ const child = await openDirectory(childPath, {
247
+ create: false,
248
+ canonicalParent: directory.canonicalPath,
249
+ noFollowFlag,
250
+ mode: created ? 0o700 : undefined,
251
+ trustUid: options.effectiveUid,
252
+ requireCurrentOwner,
253
+ tightenMode: isFinal && !created && options.finalMode !== undefined
254
+ ? {
255
+ targetMode: options.finalMode,
256
+ effectiveUid: options.effectiveUid,
257
+ beforeTighten: options.beforeDirectoryModeTighten,
258
+ }
259
+ : undefined,
260
+ });
261
+ try {
262
+ await assertDirectoryUnchanged(directory);
263
+ await directory.handle.close();
264
+ directory = child;
265
+ }
266
+ catch (error) {
267
+ await child.handle.close();
268
+ throw error;
269
+ }
270
+ }
271
+ directory.finalMode = options.finalMode;
272
+ directory.finalRequireCurrentOwner = options.finalRequireCurrentOwner;
273
+ return directory;
274
+ }
275
+ catch (error) {
276
+ await directory.handle.close();
277
+ throw error;
278
+ }
279
+ }
280
+ async function assertDirectoryUnchanged(directory) {
281
+ const current = await fs.lstat(directory.path);
282
+ if (current.isSymbolicLink()
283
+ || !current.isDirectory()
284
+ || current.dev !== directory.dev
285
+ || current.ino !== directory.ino) {
286
+ throw securityError(directory.path, 'I/O中にディレクトリが置き換えられました');
287
+ }
288
+ if (directory.ownerUid !== undefined) {
289
+ assertSecureOwner(directory.path, current, directory.ownerUid);
290
+ }
291
+ if (directory.forbidGroupOtherWrite) {
292
+ assertNoGroupOtherWrite(directory.path, current);
293
+ }
294
+ if (directory.trustUid !== undefined) {
295
+ assertTrustedDirectory(directory.path, current, directory.trustUid, directory.requireCurrentOwner ?? false);
296
+ }
297
+ }
298
+ async function assertTrustedAncestryUnchanged(directory) {
299
+ await assertDirectoryUnchanged(directory);
300
+ if (directory.trustUid === undefined)
301
+ return;
302
+ const reopened = await openDirectoryTree(directory.path, {
303
+ createMissing: false,
304
+ noFollowFlag: directory.noFollowFlag,
305
+ effectiveUid: directory.trustUid,
306
+ finalMode: directory.finalMode,
307
+ finalRequireCurrentOwner: directory.finalRequireCurrentOwner,
308
+ });
309
+ try {
310
+ if (reopened.dev !== directory.dev || reopened.ino !== directory.ino) {
311
+ throw securityError(directory.path, 'ancestor再検証中に最終directoryが置き換えられました');
312
+ }
313
+ }
314
+ finally {
315
+ await reopened.handle.close();
316
+ }
317
+ }
318
+ async function openVaultStateDirectory(vaultPath, create, noFollowFlag, beforeDirectoryModeTighten) {
319
+ const effectiveUid = currentUserId();
320
+ const vaultDirectory = await openDirectoryTree(path.resolve(vaultPath), {
321
+ createMissing: false,
322
+ noFollowFlag,
323
+ effectiveUid,
324
+ });
325
+ try {
326
+ const stateDirectory = await openDirectoryTree(path.join(vaultDirectory.canonicalPath, '.o2n'), {
327
+ createMissing: create,
328
+ noFollowFlag,
329
+ effectiveUid,
330
+ finalMode: 0o700,
331
+ beforeDirectoryModeTighten,
332
+ });
333
+ try {
334
+ await assertDirectoryUnchanged(vaultDirectory);
335
+ await assertTrustedAncestryUnchanged(stateDirectory);
336
+ return stateDirectory;
337
+ }
338
+ catch (error) {
339
+ await stateDirectory.handle.close();
340
+ throw error;
341
+ }
342
+ }
343
+ finally {
344
+ await vaultDirectory.handle.close();
345
+ }
346
+ }
347
+ async function openHomeStateDirectory(create, noFollowFlag, expectedUid, beforeDirectoryModeTighten) {
348
+ const ownerUid = currentUserId(expectedUid);
349
+ const homeDirectory = await openDirectoryTree(path.resolve(os.homedir()), {
350
+ createMissing: false,
351
+ noFollowFlag,
352
+ effectiveUid: ownerUid,
353
+ finalRequireCurrentOwner: true,
354
+ });
355
+ try {
356
+ const directory = await openDirectoryTree(path.join(homeDirectory.canonicalPath, '.o2n'), {
357
+ createMissing: create,
358
+ noFollowFlag,
359
+ effectiveUid: ownerUid,
360
+ finalMode: 0o700,
361
+ finalRequireCurrentOwner: true,
362
+ beforeDirectoryModeTighten,
363
+ });
364
+ try {
365
+ await assertDirectoryUnchanged(homeDirectory);
366
+ directory.ownerUid = ownerUid;
367
+ directory.forbidGroupOtherWrite = true;
368
+ await assertTrustedAncestryUnchanged(directory);
369
+ return directory;
370
+ }
371
+ catch (error) {
372
+ await directory.handle.close();
373
+ throw error;
374
+ }
375
+ }
376
+ finally {
377
+ await homeDirectory.handle.close();
378
+ }
379
+ }
380
+ async function assertRegularDestination(filePath) {
381
+ try {
382
+ const stat = await fs.lstat(filePath);
383
+ if (stat.isSymbolicLink())
384
+ throw securityError(filePath, 'シンボリックリンクは使用できません');
385
+ if (!stat.isFile())
386
+ throw securityError(filePath, '通常ファイルではありません');
387
+ }
388
+ catch (error) {
389
+ if (!isEnoent(error))
390
+ throw error;
391
+ }
392
+ }
393
+ async function tightenLegacyVaultFileMode(filePath, handle, opened, atPath, effectiveUid) {
394
+ if (modeMatches(opened, 0o600) && modeMatches(atPath, 0o600))
395
+ return;
396
+ if (!opened.isFile() || opened.nlink !== 1 || !atPath.isFile() || atPath.nlink !== 1) {
397
+ throw securityError(filePath, 'legacy vault fileが単一リンクの通常ファイルではありません');
398
+ }
399
+ assertSecureOwner(filePath, opened, effectiveUid);
400
+ assertSecureOwner(filePath, atPath, effectiveUid);
401
+ assertNoGroupOtherWrite(filePath, opened);
402
+ assertNoGroupOtherWrite(filePath, atPath);
403
+ await handle.chmod(0o600);
404
+ const tightened = await handle.stat();
405
+ const tightenedPath = await fs.lstat(filePath);
406
+ assertSameEntry(filePath, opened, tightened, tightenedPath);
407
+ assertSecureOwner(filePath, tightened, effectiveUid);
408
+ assertSecureOwner(filePath, tightenedPath, effectiveUid);
409
+ if (!modeMatches(tightened, 0o600) || !modeMatches(tightenedPath, 0o600)) {
410
+ throw securityError(filePath, 'legacy vault file modeを安全に縮小できませんでした');
411
+ }
412
+ }
413
+ async function readFromDirectory(directory, fileName, noFollowFlag = NOFOLLOW, secretOwnerUid, legacyModeOwnerUid) {
414
+ const filePath = path.join(directory.path, fileName);
415
+ await assertTrustedAncestryUnchanged(directory);
416
+ const before = await fs.lstat(filePath);
417
+ if (before.isSymbolicLink())
418
+ throw securityError(filePath, 'シンボリックリンクは使用できません');
419
+ if (!before.isFile())
420
+ throw securityError(filePath, '通常ファイルではありません');
421
+ const handle = await fs.open(filePath, constants.O_RDONLY | noFollowFlag);
422
+ try {
423
+ const opened = await handle.stat();
424
+ const afterOpen = await fs.lstat(filePath);
425
+ if (afterOpen.isSymbolicLink() || !opened.isFile() || !afterOpen.isFile()) {
426
+ throw securityError(filePath, '通常ファイルではありません');
427
+ }
428
+ assertSameEntry(filePath, before, opened, afterOpen);
429
+ if (legacyModeOwnerUid !== undefined) {
430
+ await tightenLegacyVaultFileMode(filePath, handle, opened, afterOpen, legacyModeOwnerUid);
431
+ }
432
+ if (secretOwnerUid !== undefined) {
433
+ assertSecretFile(filePath, opened, secretOwnerUid);
434
+ assertSecretFile(filePath, afterOpen, secretOwnerUid);
435
+ }
436
+ await assertTrustedAncestryUnchanged(directory);
437
+ const content = await handle.readFile('utf-8');
438
+ const afterRead = await fs.lstat(filePath);
439
+ if (afterRead.isSymbolicLink() || !afterRead.isFile()) {
440
+ throw securityError(filePath, 'I/O中にファイルが置き換えられました');
441
+ }
442
+ assertSameEntry(filePath, before, opened, afterRead);
443
+ if (secretOwnerUid !== undefined) {
444
+ assertSecretFile(filePath, afterRead, secretOwnerUid);
445
+ }
446
+ await assertTrustedAncestryUnchanged(directory);
447
+ return content;
448
+ }
449
+ finally {
450
+ await handle.close();
451
+ }
452
+ }
453
+ function assertSingleLinkIdentity(targetPath, expected, actual) {
454
+ if (!expected.isFile()
455
+ || !actual.isFile()
456
+ || expected.nlink !== 1
457
+ || actual.nlink !== 1
458
+ || expected.dev !== actual.dev
459
+ || expected.ino !== actual.ino
460
+ || fileType(expected) !== fileType(actual)) {
461
+ throw securityError(targetPath, '単一リンクの検証済み通常ファイルと一致しません');
462
+ }
463
+ }
464
+ function assertAtomicFilePolicy(directory, targetPath, stat, mode) {
465
+ if (!stat.isFile() || stat.nlink !== 1) {
466
+ throw securityError(targetPath, '単一リンクの通常ファイルではありません');
467
+ }
468
+ if (directory.ownerUid !== undefined) {
469
+ assertSecureOwner(targetPath, stat, directory.ownerUid);
470
+ }
471
+ if (!modeMatches(stat, mode)) {
472
+ throw securityError(targetPath, 'atomicファイルの権限が要求値と一致しません');
473
+ }
474
+ }
475
+ async function verifyRenamedDestination(directory, destination, expected, mode) {
476
+ await assertTrustedAncestryUnchanged(directory);
477
+ const before = await fs.lstat(destination);
478
+ if (before.isSymbolicLink())
479
+ throw securityError(destination, 'シンボリックリンクは使用できません');
480
+ assertSingleLinkIdentity(destination, expected, before);
481
+ assertAtomicFilePolicy(directory, destination, before, mode);
482
+ const handle = await fs.open(destination, constants.O_RDONLY | NOFOLLOW);
483
+ try {
484
+ const opened = await handle.stat();
485
+ const after = await fs.lstat(destination);
486
+ assertSingleLinkIdentity(destination, expected, opened);
487
+ assertSingleLinkIdentity(destination, expected, after);
488
+ assertAtomicFilePolicy(directory, destination, opened, mode);
489
+ assertAtomicFilePolicy(directory, destination, after, mode);
490
+ assertSameEntry(destination, before, opened, after);
491
+ await assertTrustedAncestryUnchanged(directory);
492
+ }
493
+ finally {
494
+ await handle.close();
495
+ }
496
+ }
497
+ async function atomicWriteToDirectory(directory, fileName, content, mode, options = {}) {
498
+ const destination = path.join(directory.path, fileName);
499
+ await assertTrustedAncestryUnchanged(directory);
500
+ await assertRegularDestination(destination);
501
+ const temporary = path.join(directory.path, `.${fileName}.tmp-${process.pid}-${randomBytes(8).toString('hex')}`);
502
+ const hookContext = {
503
+ temporaryPath: temporary,
504
+ destinationPath: destination,
505
+ parentPath: directory.path,
506
+ };
507
+ let temporaryIdentity;
508
+ const handle = await fs.open(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | NOFOLLOW, mode);
509
+ try {
510
+ await options.testHooks?.afterTemporaryOpen?.(hookContext);
511
+ await handle.chmod(mode);
512
+ await options.testHooks?.beforeTemporaryValidation?.(hookContext);
513
+ const opened = await handle.stat();
514
+ temporaryIdentity = opened;
515
+ const atPath = await fs.lstat(temporary);
516
+ assertSingleLinkIdentity(temporary, opened, atPath);
517
+ assertAtomicFilePolicy(directory, temporary, opened, mode);
518
+ assertAtomicFilePolicy(directory, temporary, atPath, mode);
519
+ await assertTrustedAncestryUnchanged(directory);
520
+ await handle.writeFile(content, 'utf-8');
521
+ await handle.sync();
522
+ const afterWrite = await handle.stat();
523
+ const afterWritePath = await fs.lstat(temporary);
524
+ assertSingleLinkIdentity(temporary, opened, afterWrite);
525
+ assertSingleLinkIdentity(temporary, opened, afterWritePath);
526
+ assertAtomicFilePolicy(directory, temporary, afterWrite, mode);
527
+ assertAtomicFilePolicy(directory, temporary, afterWritePath, mode);
528
+ await assertTrustedAncestryUnchanged(directory);
529
+ }
530
+ finally {
531
+ await handle.close();
532
+ }
533
+ if (!temporaryIdentity) {
534
+ throw securityError(temporary, '一時ファイルのidentityを取得できませんでした');
535
+ }
536
+ await assertTrustedAncestryUnchanged(directory);
537
+ await assertRegularDestination(destination);
538
+ const beforeRename = await fs.lstat(temporary);
539
+ assertSingleLinkIdentity(temporary, temporaryIdentity, beforeRename);
540
+ await fs.rename(temporary, destination);
541
+ await options.testHooks?.afterRename?.(hookContext);
542
+ await verifyRenamedDestination(directory, destination, temporaryIdentity, mode);
543
+ await directory.handle.sync();
544
+ }
545
+ export async function readVaultStateFile(vaultPath, fileName, options = {}) {
546
+ const noFollowFlag = options.noFollowFlag ?? NOFOLLOW;
547
+ const directory = await openVaultStateDirectory(vaultPath, false, noFollowFlag, options.testHooks?.beforeDirectoryModeTighten);
548
+ try {
549
+ return await readFromDirectory(directory, fileName, noFollowFlag, undefined, directory.trustUid);
550
+ }
551
+ finally {
552
+ await directory.handle.close();
553
+ }
554
+ }
555
+ export async function atomicWriteVaultStateFile(vaultPath, fileName, content, options = {}) {
556
+ const directory = await openVaultStateDirectory(vaultPath, true, undefined, options.testHooks?.beforeDirectoryModeTighten);
557
+ try {
558
+ await atomicWriteToDirectory(directory, fileName, content, 0o600, options);
559
+ }
560
+ finally {
561
+ await directory.handle.close();
562
+ }
563
+ }
564
+ export async function readHomeStateFile(fileName, options = {}) {
565
+ const noFollowFlag = options.noFollowFlag ?? NOFOLLOW;
566
+ const ownerUid = currentUserId(options.expectedUid);
567
+ const fileOwnerUid = currentUserId(options.expectedFileUid);
568
+ const directory = await openHomeStateDirectory(false, noFollowFlag, ownerUid, options.testHooks?.beforeDirectoryModeTighten);
569
+ try {
570
+ return await readFromDirectory(directory, fileName, noFollowFlag, fileOwnerUid);
571
+ }
572
+ finally {
573
+ await directory.handle.close();
574
+ }
575
+ }
576
+ export async function atomicWriteHomeStateFile(fileName, content, options = {}) {
577
+ const directory = await openHomeStateDirectory(true, undefined, undefined, options.testHooks?.beforeDirectoryModeTighten);
578
+ try {
579
+ await atomicWriteToDirectory(directory, fileName, content, 0o600, options);
580
+ }
581
+ finally {
582
+ await directory.handle.close();
583
+ }
584
+ }
585
+ export async function removeHomeStateFile(fileName) {
586
+ const directory = await openHomeStateDirectory(false);
587
+ try {
588
+ const filePath = path.join(directory.path, fileName);
589
+ const stat = await fs.lstat(filePath);
590
+ if (stat.isSymbolicLink())
591
+ throw securityError(filePath, 'シンボリックリンクは使用できません');
592
+ if (!stat.isFile())
593
+ throw securityError(filePath, '通常ファイルではありません');
594
+ await assertTrustedAncestryUnchanged(directory);
595
+ await fs.unlink(filePath);
596
+ }
597
+ finally {
598
+ await directory.handle.close();
599
+ }
600
+ }
601
+ export async function readRegularFileNoFollow(filePath, options = {}) {
602
+ const resolvedPath = path.resolve(filePath);
603
+ const noFollowFlag = options.noFollowFlag ?? NOFOLLOW;
604
+ const directory = await openDirectoryTree(path.dirname(resolvedPath), {
605
+ createMissing: false,
606
+ noFollowFlag,
607
+ effectiveUid: currentUserId(),
608
+ });
609
+ try {
610
+ await options.testHooks?.afterParentOpen?.(directory.path);
611
+ return await readFromDirectory(directory, path.basename(resolvedPath), noFollowFlag);
612
+ }
613
+ finally {
614
+ await directory.handle.close();
615
+ }
616
+ }
617
+ export async function validateTrustedDirectoryAncestry(directoryPath, expectedUid) {
618
+ const directory = await openDirectoryTree(directoryPath, {
619
+ createMissing: false,
620
+ effectiveUid: currentUserId(expectedUid),
621
+ });
622
+ await directory.handle.close();
623
+ }
624
+ export async function atomicWriteRegularFileNoFollow(filePath, content, options = {}) {
625
+ const resolvedPath = path.resolve(filePath);
626
+ const directory = await openDirectoryTree(path.dirname(resolvedPath), {
627
+ createMissing: true,
628
+ effectiveUid: currentUserId(),
629
+ });
630
+ try {
631
+ await atomicWriteToDirectory(directory, path.basename(resolvedPath), content, 0o600, options);
632
+ }
633
+ finally {
634
+ await directory.handle.close();
635
+ }
636
+ }
637
+ //# sourceMappingURL=local-state-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-state-io.js","sourceRoot":"","sources":["../src/local-state-io.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1E,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAUD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,eAAe,CAGrF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CA6BtF;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7G"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG1E,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAUD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,eAAe,CAGrF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CA6BtF;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7G"}
package/dist/report.js CHANGED
@@ -1,6 +1,6 @@
1
- import { promises as fs } from 'node:fs';
2
1
  import path from 'node:path';
3
2
  import { stateDir } from './state.js';
3
+ import { atomicWriteVaultStateFile } from './local-state-io.js';
4
4
  export function reportPath(vaultPath) {
5
5
  return path.join(stateDir(vaultPath), 'report.md');
6
6
  }
@@ -44,8 +44,6 @@ export function renderReportMarkdown(report, state) {
44
44
  return lines.join('\n');
45
45
  }
46
46
  export async function writeReport(vaultPath, report, state) {
47
- const dir = stateDir(vaultPath);
48
- await fs.mkdir(dir, { recursive: true });
49
- await fs.writeFile(reportPath(vaultPath), renderReportMarkdown(report, state), 'utf-8');
47
+ await atomicWriteVaultStateFile(vaultPath, 'report.md', renderReportMarkdown(report, state));
50
48
  }
51
49
  //# sourceMappingURL=report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,cAAc,GAA4C;IAC9D,OAAO,EAAE,MAAM;IACf,eAAe,EAAE,QAAQ;IACzB,cAAc,EAAE,WAAW;IAC3B,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAgB,EAAE,OAAsB;IAClE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAC1F,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAuB,EAAE,KAAgB;IAC5E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IACtF,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAA8B,EAAE,CAAC;QAChF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACpE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,KAAK,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;QACpE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,MAAuB,EAAE,KAAgB;IAC5F,MAAM,yBAAyB,CAC7B,SAAS,EACT,WAAW,EACX,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CACpC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG/E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAWD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE9C;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnD;AA4BD,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IAKnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAX3B,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,UAAU,CAAuB;IAEzC,OAAO;WAWM,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IAiD5G,IAAI,QAAQ,IAAI,SAAS,CAExB;IAED,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIhD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIhD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1D,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAItD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,OAAO,CAAC,OAAO;YAMD,QAAQ;CAUvB;AA0CD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAIzF"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS/E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAWD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE9C;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnD;AAwBD,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IAKnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAX3B,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,UAAU,CAAuB;IAEzC,OAAO;WAWM,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IAgD5G,IAAI,QAAQ,IAAI,SAAS,CAExB;IAED,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIhD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIhD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1D,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAItD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,OAAO,CAAC,OAAO;YAMD,QAAQ;CAUvB;AA0CD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAIzF"}
package/dist/state.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { createHash, createHmac, randomBytes } from 'node:crypto';
2
2
  import { promises as fs } from 'node:fs';
3
- import os from 'node:os';
4
3
  import path from 'node:path';
5
4
  import { parseStateFile } from './schemas.js';
5
+ import { atomicWriteHomeStateFile, atomicWriteVaultStateFile, readHomeStateFile, readVaultStateFile, } from './local-state-io.js';
6
6
  export function contentHash(content) {
7
7
  return 'sha256:' + createHash('sha256').update(content, 'utf-8').digest('hex');
8
8
  }
@@ -24,19 +24,17 @@ export function stateDir(vaultPath) {
24
24
  export function statePath(vaultPath) {
25
25
  return path.join(stateDir(vaultPath), 'state.json');
26
26
  }
27
- function signingKeyPath() {
28
- return path.join(os.homedir(), '.o2n', 'state-signing-key');
29
- }
30
27
  async function loadOrCreateSigningKey(readOnly) {
31
28
  try {
32
- return await fs.readFile(signingKeyPath(), 'utf-8');
29
+ return await readHomeStateFile('state-signing-key');
33
30
  }
34
31
  catch (err) {
35
- if (err.code !== 'ENOENT' || readOnly)
32
+ if (err.code !== 'ENOENT')
33
+ throw err;
34
+ if (readOnly)
36
35
  return null;
37
36
  const key = randomBytes(32).toString('hex');
38
- await fs.mkdir(path.dirname(signingKeyPath()), { recursive: true });
39
- await fs.writeFile(signingKeyPath(), key, { mode: 0o600 });
37
+ await atomicWriteHomeStateFile('state-signing-key', key);
40
38
  return key;
41
39
  }
42
40
  }
@@ -81,9 +79,8 @@ export class StateStore {
81
79
  const readOnly = opts.readOnly ?? false;
82
80
  const canonicalVaultPath = await fs.realpath(vaultPath);
83
81
  const signingKey = await loadOrCreateSigningKey(readOnly);
84
- const p = statePath(vaultPath);
85
82
  try {
86
- const raw = await fs.readFile(p, 'utf-8');
83
+ const raw = await readVaultStateFile(vaultPath, 'state.json');
87
84
  const data = parseStateFile(JSON.parse(raw));
88
85
  validateStateBinding(data, {
89
86
  parentPageId,
@@ -158,14 +155,10 @@ export class StateStore {
158
155
  return this.writeChain;
159
156
  }
160
157
  async writeNow() {
161
- const dir = stateDir(this.vaultPath);
162
- await fs.mkdir(dir, { recursive: true });
163
- const tmp = statePath(this.vaultPath) + `.tmp-${process.pid}`;
164
158
  if (this.signingKey) {
165
159
  this.data.signature = signState(this.data, this.signingKey);
166
160
  }
167
- await fs.writeFile(tmp, JSON.stringify(this.data, null, 2), 'utf-8');
168
- await fs.rename(tmp, statePath(this.vaultPath));
161
+ await atomicWriteVaultStateFile(this.vaultPath, 'state.json', JSON.stringify(this.data, null, 2));
169
162
  }
170
163
  }
171
164
  function validateStateBinding(data, opts) {
package/dist/state.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tk_wfl/o2n-core",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "Obsidian vaultをNotionへ移行するo2nのコアロジック(scanner/converter/migrator/state)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,13 +30,15 @@
30
30
  "provenance": true
31
31
  },
32
32
  "scripts": {
33
+ "clean": "node ../../scripts/clean-dist.mjs",
34
+ "prebuild": "npm run clean",
33
35
  "build": "tsc -p tsconfig.json",
34
36
  "prepublishOnly": "npm run build",
35
37
  "typecheck": "tsc -p tsconfig.json --noEmit"
36
38
  },
37
39
  "dependencies": {
38
40
  "@11ty/gray-matter": "^2.1.0",
39
- "@notionhq/client": "^2.3.0",
41
+ "@notionhq/client": "^5.23.2",
40
42
  "p-queue": "^9.3.1",
41
43
  "zod": "^4.4.3"
42
44
  },