@veilio-inc/cli 0.9.2 → 0.11.1
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 +101 -23
- package/dist/args.d.ts +8 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +14 -0
- package/dist/args.js.map +1 -1
- package/dist/client/blocks.d.ts.map +1 -1
- package/dist/client/blocks.js +2 -1
- package/dist/client/blocks.js.map +1 -1
- package/dist/client/fingerprint.d.ts +7 -0
- package/dist/client/fingerprint.d.ts.map +1 -0
- package/dist/client/fingerprint.js +25 -0
- package/dist/client/fingerprint.js.map +1 -0
- package/dist/client/maps.d.ts.map +1 -1
- package/dist/client/maps.js +32 -8
- package/dist/client/maps.js.map +1 -1
- package/dist/client/team-key-bootstrap.d.ts +4 -0
- package/dist/client/team-key-bootstrap.d.ts.map +1 -1
- package/dist/client/team-key-bootstrap.js +13 -1
- package/dist/client/team-key-bootstrap.js.map +1 -1
- package/dist/client/wording.d.ts +3 -1
- package/dist/client/wording.d.ts.map +1 -1
- package/dist/client/wording.js +23 -2
- package/dist/client/wording.js.map +1 -1
- package/dist/client/wrap-judge.d.ts +30 -0
- package/dist/client/wrap-judge.d.ts.map +1 -0
- package/dist/client/wrap-judge.js +59 -0
- package/dist/client/wrap-judge.js.map +1 -0
- package/dist/cloud-commands.d.ts +21 -1
- package/dist/cloud-commands.d.ts.map +1 -1
- package/dist/cloud-commands.js +344 -5
- package/dist/cloud-commands.js.map +1 -1
- package/dist/cloud.d.ts +8 -2
- package/dist/cloud.d.ts.map +1 -1
- package/dist/cloud.js +9 -2
- package/dist/cloud.js.map +1 -1
- package/dist/commands.d.ts +3 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +35 -10
- package/dist/commands.js.map +1 -1
- package/dist/flags.d.ts +14 -0
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +40 -0
- package/dist/flags.js.map +1 -1
- package/dist/git-index.d.ts +8 -0
- package/dist/git-index.d.ts.map +1 -0
- package/dist/git-index.js +161 -0
- package/dist/git-index.js.map +1 -0
- package/dist/hashed-bases.d.ts +6 -1
- package/dist/hashed-bases.d.ts.map +1 -1
- package/dist/hashed-bases.js +16 -3
- package/dist/hashed-bases.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -19
- package/dist/index.js.map +1 -1
- package/dist/key-pins.d.ts +46 -0
- package/dist/key-pins.d.ts.map +1 -0
- package/dist/key-pins.js +165 -0
- package/dist/key-pins.js.map +1 -0
- package/dist/reservations.d.ts +6 -4
- package/dist/reservations.d.ts.map +1 -1
- package/dist/reservations.js +19 -21
- package/dist/reservations.js.map +1 -1
- package/dist/staged-blobs.d.ts +21 -0
- package/dist/staged-blobs.d.ts.map +1 -0
- package/dist/staged-blobs.js +150 -0
- package/dist/staged-blobs.js.map +1 -0
- package/dist/store.d.ts +39 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +243 -24
- package/dist/store.js.map +1 -1
- package/dist/team-unlock.d.ts +36 -0
- package/dist/team-unlock.d.ts.map +1 -1
- package/dist/team-unlock.js +25 -1
- package/dist/team-unlock.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// What git tracks, read from the index file itself (spec 085 R1).
|
|
2
|
+
//
|
|
3
|
+
// The CLI and the MCP server spawn no process (offline.test.ts, MCP
|
|
4
|
+
// purity.test.ts), and running git in a cloned repository would run that
|
|
5
|
+
// repository's own config (core.fsmonitor and the like). So the store asks
|
|
6
|
+
// the index directly. Anything this reader does not fully understand - no
|
|
7
|
+
// .git, no index, an unknown version, a split index, a short or odd file - is
|
|
8
|
+
// `null`: unknown, which the store treats as "not tracked", as it did before.
|
|
9
|
+
import { closeSync, openSync, readFileSync, readSync, statSync } from 'node:fs';
|
|
10
|
+
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
11
|
+
/** Each index file as last parsed, while its inode, mtime, ctime, size and
|
|
12
|
+
* trailing checksum are unchanged: one parse per process, not per read. */
|
|
13
|
+
const parsed = new Map();
|
|
14
|
+
/** The git checkout holding `from`, and what its index lists; null when unknown. */
|
|
15
|
+
export function trackedPaths(from) {
|
|
16
|
+
try {
|
|
17
|
+
const found = findGitDir(resolve(from));
|
|
18
|
+
if (!found)
|
|
19
|
+
return null;
|
|
20
|
+
const index = join(found.gitDir, 'index');
|
|
21
|
+
const st = statSync(index);
|
|
22
|
+
const stamp = `${st.ino}:${st.mtimeMs}:${st.ctimeMs}:${st.size}:${trailer(index, st.size)}`;
|
|
23
|
+
let hit = parsed.get(index);
|
|
24
|
+
if (hit?.stamp !== stamp) {
|
|
25
|
+
hit = { stamp, paths: readIndex(readFileSync(index), hashSize(found)) };
|
|
26
|
+
parsed.set(index, hit);
|
|
27
|
+
}
|
|
28
|
+
return hit.paths && { root: found.root, paths: hit.paths };
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** The index's last 32 bytes: its checksum (20 bytes for SHA-1, 32 for
|
|
35
|
+
* SHA-256), which changes with any change to the content. */
|
|
36
|
+
function trailer(path, size) {
|
|
37
|
+
const fd = openSync(path, 'r');
|
|
38
|
+
try {
|
|
39
|
+
const buf = Buffer.alloc(Math.min(32, size));
|
|
40
|
+
readSync(fd, buf, 0, buf.length, size - buf.length);
|
|
41
|
+
return buf.toString('hex');
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
closeSync(fd);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function findGitDir(start) {
|
|
48
|
+
for (let dir = start;; dir = dirname(dir)) {
|
|
49
|
+
const dotGit = join(dir, '.git');
|
|
50
|
+
const st = statOrNull(dotGit);
|
|
51
|
+
if (st?.isDirectory())
|
|
52
|
+
return { root: dir, gitDir: dotGit, commonDir: dotGit };
|
|
53
|
+
if (st?.isFile()) {
|
|
54
|
+
// A worktree or submodule: `gitdir: <path>`, and the shared config in its commondir.
|
|
55
|
+
const m = /^gitdir: *(.+?)\s*$/m.exec(readFileSync(dotGit, 'utf8'));
|
|
56
|
+
if (!m)
|
|
57
|
+
return null;
|
|
58
|
+
const gitDir = isAbsolute(m[1]) ? m[1] : resolve(dir, m[1]);
|
|
59
|
+
let commonDir = gitDir;
|
|
60
|
+
try {
|
|
61
|
+
const c = readFileSync(join(gitDir, 'commondir'), 'utf8').trim();
|
|
62
|
+
commonDir = isAbsolute(c) ? c : resolve(gitDir, c);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// no commondir: a submodule, whose config is its own
|
|
66
|
+
}
|
|
67
|
+
return { root: dir, gitDir, commonDir };
|
|
68
|
+
}
|
|
69
|
+
if (dirname(dir) === dir)
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function statOrNull(path) {
|
|
74
|
+
try {
|
|
75
|
+
return statSync(path);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** 20 for SHA-1, 32 for a repository made with `--object-format=sha256`. */
|
|
82
|
+
function hashSize(found) {
|
|
83
|
+
try {
|
|
84
|
+
const config = readFileSync(join(found.commonDir, 'config'), 'utf8');
|
|
85
|
+
return /^\s*objectformat\s*=\s*sha256\s*$/im.test(config) ? 32 : 20;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return 20;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Index versions 2, 3 and 4 (git's index-format.txt). Null on anything else. */
|
|
92
|
+
function readIndex(buf, hash) {
|
|
93
|
+
if (buf.length < 12 + hash || buf.toString('latin1', 0, 4) !== 'DIRC')
|
|
94
|
+
return null;
|
|
95
|
+
const version = buf.readUInt32BE(4);
|
|
96
|
+
if (version < 2 || version > 4)
|
|
97
|
+
return null;
|
|
98
|
+
const count = buf.readUInt32BE(8);
|
|
99
|
+
const end = buf.length - hash;
|
|
100
|
+
const paths = new Set();
|
|
101
|
+
let at = 12;
|
|
102
|
+
let previous = Buffer.alloc(0);
|
|
103
|
+
for (let i = 0; i < count; i++) {
|
|
104
|
+
// ctime, mtime, dev, ino, mode, uid, gid, size (40 bytes), the object id, flags.
|
|
105
|
+
const flagsAt = at + 40 + hash;
|
|
106
|
+
if (flagsAt + 2 > end)
|
|
107
|
+
return null;
|
|
108
|
+
const flags = buf.readUInt16BE(flagsAt);
|
|
109
|
+
let nameAt = flagsAt + 2;
|
|
110
|
+
if (flags & 0x4000) {
|
|
111
|
+
if (version < 3)
|
|
112
|
+
return null;
|
|
113
|
+
nameAt += 2;
|
|
114
|
+
}
|
|
115
|
+
let name;
|
|
116
|
+
if (version === 4) {
|
|
117
|
+
// A varint of bytes to drop from the previous path, then the rest, NUL-ended.
|
|
118
|
+
let drop = 0;
|
|
119
|
+
let byte;
|
|
120
|
+
let k = nameAt;
|
|
121
|
+
do {
|
|
122
|
+
if (k >= end)
|
|
123
|
+
return null;
|
|
124
|
+
byte = buf[k++];
|
|
125
|
+
drop = (drop << 7) | (byte & 0x7f);
|
|
126
|
+
if (byte & 0x80)
|
|
127
|
+
drop++;
|
|
128
|
+
} while (byte & 0x80);
|
|
129
|
+
if (drop > previous.length)
|
|
130
|
+
return null;
|
|
131
|
+
const nul = buf.indexOf(0, k);
|
|
132
|
+
if (nul === -1 || nul >= end)
|
|
133
|
+
return null;
|
|
134
|
+
name = Buffer.concat([previous.subarray(0, previous.length - drop), buf.subarray(k, nul)]);
|
|
135
|
+
at = nul + 1;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const nul = buf.indexOf(0, nameAt);
|
|
139
|
+
if (nul === -1 || nul >= end)
|
|
140
|
+
return null;
|
|
141
|
+
name = buf.subarray(nameAt, nul);
|
|
142
|
+
// Each entry is padded with 1-8 NULs to a multiple of 8 bytes.
|
|
143
|
+
at = at + ((nameAt - at + name.length + 8) & ~7);
|
|
144
|
+
}
|
|
145
|
+
previous = name;
|
|
146
|
+
paths.add(name.toString('utf8').toLowerCase());
|
|
147
|
+
}
|
|
148
|
+
// Extensions: a split index ("link") keeps entries in another file, so this
|
|
149
|
+
// list would be partial. Anything malformed here is unknown too.
|
|
150
|
+
while (at < end) {
|
|
151
|
+
if (at + 8 > end)
|
|
152
|
+
return null;
|
|
153
|
+
const sig = buf.toString('latin1', at, at + 4);
|
|
154
|
+
const size = buf.readUInt32BE(at + 4);
|
|
155
|
+
if (sig === 'link' || sig === 'sdir')
|
|
156
|
+
return null;
|
|
157
|
+
at += 8 + size;
|
|
158
|
+
}
|
|
159
|
+
return at === end ? paths : null;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=git-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-index.js","sourceRoot":"","sources":["../src/git-index.ts"],"names":[],"mappings":"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"}
|
package/dist/hashed-bases.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import type { Credential } from './credential.js';
|
|
2
2
|
/** The base as the server sees it: `__H_<16 hex>__` for a rule's base. */
|
|
3
3
|
export declare function wireBase(base: string, teamKey: Uint8Array): string;
|
|
4
|
-
/** The raw team keys
|
|
4
|
+
/** The raw team keys a rule's name may be hashed under, newest first: none
|
|
5
|
+
* unless the newest is confirmed (`writeKeyOf`), and never one that is not
|
|
6
|
+
* (spec 080 item 7a) - a hash under a key the server made tells it the name. */
|
|
5
7
|
export declare function teamKeyBytes(credential: Pick<Credential, 'instance' | 'account'>, home: string | undefined, teamId: string): Uint8Array[];
|
|
6
8
|
/** The newest team key version this machine holds for `teamId`. */
|
|
7
9
|
export declare function teamKeyVersion(credential: Pick<Credential, 'instance' | 'account'>, home: string | undefined, teamId: string): number | undefined;
|
|
10
|
+
/** The team to name when a rule's name may not be hashed because the newest
|
|
11
|
+
* key is not confirmed; null when it may, or when nothing is unlocked. */
|
|
12
|
+
export declare function teamKeyUnconfirmed(credential: Pick<Credential, 'instance' | 'account'>, home: string | undefined, teamId: string): string | null;
|
|
8
13
|
/** Whether a base the server served (a reservation's) is `base`: as written,
|
|
9
14
|
* or its hash under any held key version - one reserved before a rotation
|
|
10
15
|
* carries the old key's hash. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashed-bases.d.ts","sourceRoot":"","sources":["../src/hashed-bases.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"hashed-bases.d.ts","sourceRoot":"","sources":["../src/hashed-bases.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAIjD,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAIlE;AAED;;iFAEiF;AACjF,wBAAgB,YAAY,CAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC,EACpD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GACb,UAAU,EAAE,CAEd;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAC5B,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC,EACpD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAEpB;AAwBD;2EAC2E;AAC3E,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC,EACpD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAOf;AAED;;kCAEkC;AAClC,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAE3F"}
|
package/dist/hashed-bases.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
// Everything on this machine - the map, reserved.json - keeps the real base.
|
|
6
6
|
import { createHmac } from 'node:crypto';
|
|
7
7
|
import { fromBase64, isEngineBase } from '@veilio-inc/engine';
|
|
8
|
-
import { readTeamUnlock } from './team-unlock.js';
|
|
8
|
+
import { readTeamUnlock, writeKeyOf } from './team-unlock.js';
|
|
9
|
+
import { printable } from './reservations.js';
|
|
9
10
|
/** The base as the server sees it: `__H_<16 hex>__` for a rule's base. */
|
|
10
11
|
export function wireBase(base, teamKey) {
|
|
11
12
|
if (isEngineBase(base))
|
|
@@ -13,7 +14,9 @@ export function wireBase(base, teamKey) {
|
|
|
13
14
|
const mac = createHmac('sha256', teamKey).update(base, 'utf8').digest('hex');
|
|
14
15
|
return `__H_${mac.slice(0, 16).toUpperCase()}__`;
|
|
15
16
|
}
|
|
16
|
-
/** The raw team keys
|
|
17
|
+
/** The raw team keys a rule's name may be hashed under, newest first: none
|
|
18
|
+
* unless the newest is confirmed (`writeKeyOf`), and never one that is not
|
|
19
|
+
* (spec 080 item 7a) - a hash under a key the server made tells it the name. */
|
|
17
20
|
export function teamKeyBytes(credential, home, teamId) {
|
|
18
21
|
return heldKeys(credential, home, teamId).map((k) => k.raw);
|
|
19
22
|
}
|
|
@@ -23,10 +26,12 @@ export function teamKeyVersion(credential, home, teamId) {
|
|
|
23
26
|
}
|
|
24
27
|
function heldKeys(credential, home, teamId) {
|
|
25
28
|
const unlock = readTeamUnlock({ instance: credential.instance, account: credential.account }, home);
|
|
26
|
-
if (!unlock || unlock.teamId !== teamId)
|
|
29
|
+
if (!unlock || unlock.teamId !== teamId || !writeKeyOf(unlock))
|
|
27
30
|
return [];
|
|
28
31
|
const out = [];
|
|
29
32
|
for (const k of unlock.keys) {
|
|
33
|
+
if (!k.writable)
|
|
34
|
+
continue;
|
|
30
35
|
try {
|
|
31
36
|
out.push({ version: k.version, raw: fromBase64(k.key) });
|
|
32
37
|
}
|
|
@@ -36,6 +41,14 @@ function heldKeys(credential, home, teamId) {
|
|
|
36
41
|
}
|
|
37
42
|
return out.sort((a, b) => b.version - a.version);
|
|
38
43
|
}
|
|
44
|
+
/** The team to name when a rule's name may not be hashed because the newest
|
|
45
|
+
* key is not confirmed; null when it may, or when nothing is unlocked. */
|
|
46
|
+
export function teamKeyUnconfirmed(credential, home, teamId) {
|
|
47
|
+
const unlock = readTeamUnlock({ instance: credential.instance, account: credential.account }, home);
|
|
48
|
+
if (!unlock || unlock.teamId !== teamId || writeKeyOf(unlock))
|
|
49
|
+
return null;
|
|
50
|
+
return printable(unlock.teamName ?? unlock.teamId);
|
|
51
|
+
}
|
|
39
52
|
/** Whether a base the server served (a reservation's) is `base`: as written,
|
|
40
53
|
* or its hash under any held key version - one reserved before a rotation
|
|
41
54
|
* carries the old key's hash. */
|
package/dist/hashed-bases.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashed-bases.js","sourceRoot":"","sources":["../src/hashed-bases.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,wEAAwE;AACxE,6EAA6E;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"hashed-bases.js","sourceRoot":"","sources":["../src/hashed-bases.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAE/E,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAE/E,OAAO,EAQL,KAAK,EAAE,EACR,MAAM,eAAe,CAAA;AA6BtB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,OAAO,EAAE,CAAA;AAElB,6EAA6E;AAC7E,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB3E;AAED;;;GAGG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2FnE"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { needsAction, parseArgs, UsageError } from './args.js';
|
|
3
3
|
import { feedSecret } from './secret-input.js';
|
|
4
|
-
import { EXIT_ERROR, HELP, runMap, runRestore, runScan, runScrub } from './commands.js';
|
|
4
|
+
import { EXIT_ERROR, EXIT_FINDINGS, HELP, runMap, runRestore, runScan, runScrub, } from './commands.js';
|
|
5
5
|
import { commandHelp } from './flags.js';
|
|
6
|
-
import { runLogin, runLogout, runWhoami, runMapsList, runMapsPull, runMapsPush, runMapsRm, runMapsUpdate, runTeamUnlock, runTeamLock, runVaultUnlock, runVaultLock, runProjectsList, runProjectsUse, runRulesPull, teamLayerFor, teamNamespaceForScrub, } from './cloud-commands.js';
|
|
7
|
-
import { resolveMapPath } from './store.js';
|
|
6
|
+
import { runLogin, runLogout, runWhoami, runMapsList, runMapsPull, runMapsPush, runMapsRm, runMapsUpdate, runTeamUnlock, runTeamLock, runTeamTrust, runKeysFingerprint, runVaultUnlock, runVaultLock, runProjectsList, runProjectsUse, runRulesPull, teamLayerFor, teamNamespaceForScrub, } from './cloud-commands.js';
|
|
7
|
+
import { resolveMapPath, StoreRefusal } from './store.js';
|
|
8
8
|
import { guardHint } from './guard-hint.js';
|
|
9
9
|
import { createInterface } from 'node:readline';
|
|
10
10
|
import { realpathSync } from 'node:fs';
|
|
@@ -88,9 +88,11 @@ export async function run(args, io) {
|
|
|
88
88
|
case 'team': {
|
|
89
89
|
switch (args.teamAction) {
|
|
90
90
|
case 'unlock':
|
|
91
|
-
return await runTeamUnlock(io, args.days ?? undefined, resolveMapPath(args.mapPath, io.cwd));
|
|
91
|
+
return await runTeamUnlock(io, args.days ?? undefined, resolveMapPath(args.mapPath, io.cwd), args.forgetRefused);
|
|
92
92
|
case 'lock':
|
|
93
93
|
return runTeamLock(io);
|
|
94
|
+
case 'trust':
|
|
95
|
+
return await runTeamTrust(args.files[0] ?? null, args.files[1] ?? null, io);
|
|
94
96
|
default:
|
|
95
97
|
io.stderr(`veilio: ${needsAction('team')}\n`);
|
|
96
98
|
return EXIT_ERROR;
|
|
@@ -107,6 +109,11 @@ export async function run(args, io) {
|
|
|
107
109
|
return EXIT_ERROR;
|
|
108
110
|
}
|
|
109
111
|
}
|
|
112
|
+
case 'keys':
|
|
113
|
+
if (args.keysAction === 'fingerprint')
|
|
114
|
+
return await runKeysFingerprint(io);
|
|
115
|
+
io.stderr(`veilio: ${needsAction('keys')}\n`);
|
|
116
|
+
return EXIT_ERROR;
|
|
110
117
|
case 'projects':
|
|
111
118
|
if (args.projectsAction === 'use')
|
|
112
119
|
return await runProjectsUse(args.files[0] ?? null, io);
|
|
@@ -120,7 +127,8 @@ export async function run(args, io) {
|
|
|
120
127
|
}
|
|
121
128
|
catch (err) {
|
|
122
129
|
io.stderr(`veilio: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
123
|
-
|
|
130
|
+
// A store refused for what it is (tracked, a link) stops the pipeline like a finding.
|
|
131
|
+
return err instanceof StoreRefusal ? EXIT_FINDINGS : EXIT_ERROR;
|
|
124
132
|
}
|
|
125
133
|
}
|
|
126
134
|
// A piped/scripted session (no TTY) commonly delivers every line in ONE data
|
|
@@ -231,20 +239,21 @@ function readSecret(label) {
|
|
|
231
239
|
stdin.on('data', onData);
|
|
232
240
|
});
|
|
233
241
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
242
|
+
/** Stdin as it arrives (`scan --blobs`: git's blob stream holds any byte). */
|
|
243
|
+
async function* readStdinBytes() {
|
|
244
|
+
// A TTY with no piped input would hang forever waiting for EOF. Fail with
|
|
245
|
+
// usage guidance instead of appearing to freeze.
|
|
246
|
+
if (process.stdin.isTTY)
|
|
247
|
+
throw new Error('no input — pass a file or pipe to stdin');
|
|
248
|
+
for await (const chunk of process.stdin)
|
|
249
|
+
yield chunk;
|
|
250
|
+
}
|
|
251
|
+
/** Stdin as text: its bytes, decoded as UTF-8. */
|
|
252
|
+
async function readStdin() {
|
|
253
|
+
const chunks = [];
|
|
254
|
+
for await (const chunk of readStdinBytes())
|
|
255
|
+
chunks.push(chunk);
|
|
256
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
248
257
|
}
|
|
249
258
|
/**
|
|
250
259
|
* Was this file run as a program, or imported?
|
|
@@ -279,6 +288,7 @@ if (invokedAsProgram()) {
|
|
|
279
288
|
const io = {
|
|
280
289
|
cwd: process.cwd(),
|
|
281
290
|
stdin: readStdin,
|
|
291
|
+
stdinBytes: readStdinBytes,
|
|
282
292
|
stdout: (text) => process.stdout.write(text),
|
|
283
293
|
stderr: (text) => process.stderr.write(text),
|
|
284
294
|
prompt: readLine,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAA;AAC/E,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAA;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const KEY_PINS_FILE = "key-pins.json";
|
|
2
|
+
export interface KeyPin {
|
|
3
|
+
/** The confirmed public key, base64. */
|
|
4
|
+
current: string;
|
|
5
|
+
/** Earlier confirmed keys of the same person, so what they granted with
|
|
6
|
+
* those stays trusted after an honest key reset. */
|
|
7
|
+
history: string[];
|
|
8
|
+
/** ISO-8601. */
|
|
9
|
+
confirmedAt: string;
|
|
10
|
+
}
|
|
11
|
+
/** By granter user id, or `key:<publicKey>` for a granter with no account. */
|
|
12
|
+
export type KeyPins = Record<string, KeyPin>;
|
|
13
|
+
interface Binding {
|
|
14
|
+
instance: string;
|
|
15
|
+
account: string;
|
|
16
|
+
}
|
|
17
|
+
/** key-pins.json exists and is not one this CLI can read: never overwritten,
|
|
18
|
+
* since confirmations a person made are in there. */
|
|
19
|
+
export declare class KeyPinsDamaged extends Error {
|
|
20
|
+
readonly path: string;
|
|
21
|
+
constructor(path: string);
|
|
22
|
+
}
|
|
23
|
+
export declare function keyPinsPath(home?: string): string;
|
|
24
|
+
/** This instance and account's pins. A damaged entry is left out. */
|
|
25
|
+
export declare function readPins(binding: Binding, home?: string): KeyPins;
|
|
26
|
+
/** The pin for `identity`, only if one was recorded under exactly that. */
|
|
27
|
+
export declare function pinOf(pins: KeyPins, identity: string): KeyPin | undefined;
|
|
28
|
+
/** The keys a pin accepts: the current one, then the earlier ones. */
|
|
29
|
+
export declare function confirmedKeys(pin: KeyPin | undefined): string[];
|
|
30
|
+
/** Record `publicKey` as confirmed for `identity`, keeping any earlier one. */
|
|
31
|
+
export declare function confirmPin(binding: Binding, identity: string, publicKey: string, home?: string, now?: Date): void;
|
|
32
|
+
/** This account's blocked version for `teamId`, or undefined. Throws
|
|
33
|
+
* `KeyPinsDamaged` when it cannot be known: the caller then writes nothing. */
|
|
34
|
+
export declare function blockedMark(binding: Binding, teamId: string, home?: string): number | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Settle the blocked version for `teamId` against what is stored NOW, in one
|
|
37
|
+
* read-change-write: first `clearUpTo` drops the mark only if it is still at
|
|
38
|
+
* most that (the value this run read - a raise another unlock made since is
|
|
39
|
+
* kept), then `raise` keeps the higher of the two. The mark it leaves.
|
|
40
|
+
*/
|
|
41
|
+
export declare function settleBlockedMark(binding: Binding, teamId: string, change: {
|
|
42
|
+
clearUpTo?: number;
|
|
43
|
+
raise?: number;
|
|
44
|
+
}, home?: string): number | undefined;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=key-pins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-pins.d.ts","sourceRoot":"","sources":["../src/key-pins.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,aAAa,kBAAkB,CAAA;AAE5C,MAAM,WAAW,MAAM;IACrB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf;yDACqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE5C,UAAU,OAAO;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAkBD;sDACsD;AACtD,qBAAa,cAAe,SAAQ,KAAK;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAGlC;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAE5D;AAsCD,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,MAAkB,GAAG,OAAO,CAQ5E;AAED,2EAA2E;AAC3E,wBAAgB,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzE;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAE/D;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,MAAkB,EACxB,GAAG,GAAE,IAAiB,GACrB,IAAI,CAON;AAED;gFACgF;AAChF,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAAkB,GACvB,MAAM,GAAG,SAAS,CAUpB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,IAAI,GAAE,MAAkB,GACvB,MAAM,GAAG,SAAS,CAapB"}
|
package/dist/key-pins.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// The teammate keys this member confirmed by fingerprint, on this device
|
|
2
|
+
// (spec 080 item 7a; the web app's keyPinning.ts and its research R-011).
|
|
3
|
+
//
|
|
4
|
+
// A team key's wrap names the key it was made with, and decrypting it proves
|
|
5
|
+
// only that whoever holds that key made it - so a server could make one with
|
|
6
|
+
// its own key and label it as a teammate's. A pin is what a person checked
|
|
7
|
+
// outside Veilio: `veilio team trust` writes one after the fingerprints were
|
|
8
|
+
// compared. Nothing here is ever sent to the server, encrypted or not: a pin
|
|
9
|
+
// the server could read or replace would protect against nothing.
|
|
10
|
+
//
|
|
11
|
+
// Unlike the web app's, every pin here is confirmed: the CLI never records a
|
|
12
|
+
// first sighting, so there is no `auto` kind to tell apart.
|
|
13
|
+
import { chmodSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
14
|
+
import { dirname, join } from 'node:path';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import { STORE_DIR } from '@veilio-inc/engine';
|
|
17
|
+
export const KEY_PINS_FILE = 'key-pins.json';
|
|
18
|
+
/** key-pins.json exists and is not one this CLI can read: never overwritten,
|
|
19
|
+
* since confirmations a person made are in there. */
|
|
20
|
+
export class KeyPinsDamaged extends Error {
|
|
21
|
+
path;
|
|
22
|
+
constructor(path) {
|
|
23
|
+
super(`${path} is damaged`);
|
|
24
|
+
this.path = path;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function keyPinsPath(home = homedir()) {
|
|
28
|
+
return join(home, STORE_DIR, KEY_PINS_FILE);
|
|
29
|
+
}
|
|
30
|
+
function isPin(p) {
|
|
31
|
+
if (typeof p !== 'object' || p === null)
|
|
32
|
+
return false;
|
|
33
|
+
const pin = p;
|
|
34
|
+
return (typeof pin.current === 'string' &&
|
|
35
|
+
pin.current !== '' &&
|
|
36
|
+
Array.isArray(pin.history) &&
|
|
37
|
+
pin.history.every((k) => typeof k === 'string') &&
|
|
38
|
+
typeof pin.confirmedAt === 'string');
|
|
39
|
+
}
|
|
40
|
+
/** The file, or null when it exists and is not one this CLI wrote. */
|
|
41
|
+
function readFile(home) {
|
|
42
|
+
let text;
|
|
43
|
+
try {
|
|
44
|
+
text = readFileSync(keyPinsPath(home), 'utf8');
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
// Only a file that is not there is "none yet". One that cannot be read
|
|
48
|
+
// (a directory, another owner, an I/O error) still holds what a person
|
|
49
|
+
// confirmed: damaged, so nothing replaces it.
|
|
50
|
+
if (err.code === 'ENOENT')
|
|
51
|
+
return { v: 1, scopes: [] };
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const parsed = JSON.parse(text);
|
|
56
|
+
if (parsed?.v === 1 && Array.isArray(parsed.scopes))
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// not JSON
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
65
|
+
/** This instance and account's pins. A damaged entry is left out. */
|
|
66
|
+
export function readPins(binding, home = homedir()) {
|
|
67
|
+
const file = readFile(home);
|
|
68
|
+
const scope = file ? findScope(file, binding) : undefined;
|
|
69
|
+
// No prototype: a granter id is the server's word, and `__proto__` or
|
|
70
|
+
// `constructor` must be a key like any other, never Object's own.
|
|
71
|
+
const pins = Object.create(null);
|
|
72
|
+
for (const [id, pin] of Object.entries(scope?.pins ?? {}))
|
|
73
|
+
if (isPin(pin))
|
|
74
|
+
pins[id] = pin;
|
|
75
|
+
return pins;
|
|
76
|
+
}
|
|
77
|
+
/** The pin for `identity`, only if one was recorded under exactly that. */
|
|
78
|
+
export function pinOf(pins, identity) {
|
|
79
|
+
return Object.hasOwn(pins, identity) ? pins[identity] : undefined;
|
|
80
|
+
}
|
|
81
|
+
/** The keys a pin accepts: the current one, then the earlier ones. */
|
|
82
|
+
export function confirmedKeys(pin) {
|
|
83
|
+
return pin ? [pin.current, ...pin.history] : [];
|
|
84
|
+
}
|
|
85
|
+
/** Record `publicKey` as confirmed for `identity`, keeping any earlier one. */
|
|
86
|
+
export function confirmPin(binding, identity, publicKey, home = homedir(), now = new Date()) {
|
|
87
|
+
update(binding, home, (scope) => {
|
|
88
|
+
const held = pinOf(scope.pins, identity);
|
|
89
|
+
const before = isPin(held) ? held : undefined;
|
|
90
|
+
const history = confirmedKeys(before).filter((k) => k !== publicKey);
|
|
91
|
+
scope.pins[identity] = { current: publicKey, history, confirmedAt: now.toISOString() };
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** This account's blocked version for `teamId`, or undefined. Throws
|
|
95
|
+
* `KeyPinsDamaged` when it cannot be known: the caller then writes nothing. */
|
|
96
|
+
export function blockedMark(binding, teamId, home = homedir()) {
|
|
97
|
+
const file = readFile(home);
|
|
98
|
+
if (!file)
|
|
99
|
+
throw new KeyPinsDamaged(keyPinsPath(home));
|
|
100
|
+
const scope = findScope(file, binding);
|
|
101
|
+
if (!scope || scope.blocked === undefined)
|
|
102
|
+
return undefined;
|
|
103
|
+
if (!isRecord(scope.blocked))
|
|
104
|
+
throw new KeyPinsDamaged(keyPinsPath(home));
|
|
105
|
+
if (!Object.hasOwn(scope.blocked, teamId))
|
|
106
|
+
return undefined;
|
|
107
|
+
const mark = scope.blocked[teamId];
|
|
108
|
+
if (typeof mark !== 'number')
|
|
109
|
+
throw new KeyPinsDamaged(keyPinsPath(home));
|
|
110
|
+
return mark;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Settle the blocked version for `teamId` against what is stored NOW, in one
|
|
114
|
+
* read-change-write: first `clearUpTo` drops the mark only if it is still at
|
|
115
|
+
* most that (the value this run read - a raise another unlock made since is
|
|
116
|
+
* kept), then `raise` keeps the higher of the two. The mark it leaves.
|
|
117
|
+
*/
|
|
118
|
+
export function settleBlockedMark(binding, teamId, change, home = homedir()) {
|
|
119
|
+
let left;
|
|
120
|
+
update(binding, home, (scope) => {
|
|
121
|
+
const blocked = scope.blocked;
|
|
122
|
+
let mark = Object.hasOwn(blocked, teamId) ? blocked[teamId] : undefined;
|
|
123
|
+
if (change.clearUpTo !== undefined && mark !== undefined && mark <= change.clearUpTo)
|
|
124
|
+
mark = undefined;
|
|
125
|
+
if (change.raise !== undefined)
|
|
126
|
+
mark = Math.max(mark ?? change.raise, change.raise);
|
|
127
|
+
if (mark === undefined)
|
|
128
|
+
delete blocked[teamId];
|
|
129
|
+
else
|
|
130
|
+
blocked[teamId] = mark;
|
|
131
|
+
left = mark;
|
|
132
|
+
});
|
|
133
|
+
return left;
|
|
134
|
+
}
|
|
135
|
+
function findScope(file, binding) {
|
|
136
|
+
return file.scopes.find((s) => s?.instance === binding.instance && s?.account === binding.account);
|
|
137
|
+
}
|
|
138
|
+
/** Read, change this account's scope, write back atomically at 0600. A damaged
|
|
139
|
+
* file, or a damaged scope of this account, is refused and left as it is. */
|
|
140
|
+
function update(binding, home, change) {
|
|
141
|
+
const file = readFile(home);
|
|
142
|
+
let scope = file ? findScope(file, binding) : undefined;
|
|
143
|
+
if (!file ||
|
|
144
|
+
(scope && !isRecord(scope.pins)) ||
|
|
145
|
+
(scope?.blocked !== undefined &&
|
|
146
|
+
!(isRecord(scope.blocked) && Object.values(scope.blocked).every((m) => typeof m === 'number'))))
|
|
147
|
+
throw new KeyPinsDamaged(keyPinsPath(home));
|
|
148
|
+
if (!scope) {
|
|
149
|
+
scope = { instance: binding.instance, account: binding.account, pins: {} };
|
|
150
|
+
file.scopes.push(scope);
|
|
151
|
+
}
|
|
152
|
+
// No prototype: ids are the server's words (`__proto__` is a key here).
|
|
153
|
+
scope.pins = Object.assign(Object.create(null), scope.pins);
|
|
154
|
+
scope.blocked = Object.assign(Object.create(null), scope.blocked);
|
|
155
|
+
change(scope);
|
|
156
|
+
const path = keyPinsPath(home);
|
|
157
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
158
|
+
// Written beside, then renamed over: a crash mid-write must not leave a
|
|
159
|
+
// half file that reads as "no pins" and silently drops every confirmation.
|
|
160
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
161
|
+
writeFileSync(tmp, `${JSON.stringify(file, null, 2)}\n`, { mode: 0o600 });
|
|
162
|
+
chmodSync(tmp, 0o600);
|
|
163
|
+
renameSync(tmp, path);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=key-pins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-pins.js","sourceRoot":"","sources":["../src/key-pins.ts"],"names":[],"mappings":"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"}
|