@ozyman42/ozy-cli 0.4.6 → 0.4.7-darwin-x64.0

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.
Files changed (207) hide show
  1. package/multi-call-binary +0 -0
  2. package/package.json +11 -52
  3. package/bin/ozy +0 -191
  4. package/bin/ozy-signing-agent +0 -191
  5. package/bin/ozy-ssh-keygen +0 -191
  6. package/bin/ozy-virtual-security-key +0 -191
  7. package/dist/commands/git/hosts.js +0 -18
  8. package/dist/commands/git/hosts.js.map +0 -1
  9. package/dist/commands/git/index.js +0 -8
  10. package/dist/commands/git/index.js.map +0 -1
  11. package/dist/commands/git/setup.js +0 -145
  12. package/dist/commands/git/setup.js.map +0 -1
  13. package/dist/commands/index.js +0 -13
  14. package/dist/commands/index.js.map +0 -1
  15. package/dist/commands/npm/index.js +0 -7
  16. package/dist/commands/npm/index.js.map +0 -1
  17. package/dist/commands/npm/setup/git-remote.js +0 -66
  18. package/dist/commands/npm/setup/git-remote.js.map +0 -1
  19. package/dist/commands/npm/setup/index.js +0 -168
  20. package/dist/commands/npm/setup/index.js.map +0 -1
  21. package/dist/commands/npm/setup/npm-auth.js +0 -62
  22. package/dist/commands/npm/setup/npm-auth.js.map +0 -1
  23. package/dist/commands/npm/setup/package-json-validate.js +0 -47
  24. package/dist/commands/npm/setup/package-json-validate.js.map +0 -1
  25. package/dist/commands/npm/setup/package-registry.js +0 -20
  26. package/dist/commands/npm/setup/package-registry.js.map +0 -1
  27. package/dist/commands/npm/setup/setup.test.js +0 -95
  28. package/dist/commands/npm/setup/setup.test.js.map +0 -1
  29. package/dist/commands/npm/setup/trusted-publishing.js +0 -84
  30. package/dist/commands/npm/setup/trusted-publishing.js.map +0 -1
  31. package/dist/commands/npm/setup/workflow.js +0 -19
  32. package/dist/commands/npm/setup/workflow.js.map +0 -1
  33. package/dist/commands/ssh/get-sk-credential.js +0 -104
  34. package/dist/commands/ssh/get-sk-credential.js.map +0 -1
  35. package/dist/commands/ssh/index.js +0 -7
  36. package/dist/commands/ssh/index.js.map +0 -1
  37. package/dist/commands/upgrade.js +0 -81
  38. package/dist/commands/upgrade.js.map +0 -1
  39. package/dist/common/command.js +0 -15
  40. package/dist/common/command.js.map +0 -1
  41. package/dist/common/constants.js +0 -25
  42. package/dist/common/constants.js.map +0 -1
  43. package/dist/common/effective-modules-extensions.js +0 -13
  44. package/dist/common/effective-modules-extensions.js.map +0 -1
  45. package/dist/common/log.js +0 -4
  46. package/dist/common/log.js.map +0 -1
  47. package/dist/common/render-caller-tree.js +0 -20
  48. package/dist/common/render-caller-tree.js.map +0 -1
  49. package/dist/entrypoints/ozy-signing-agent.js +0 -48
  50. package/dist/entrypoints/ozy-signing-agent.js.map +0 -1
  51. package/dist/entrypoints/ozy-ssh-keygen.js +0 -9
  52. package/dist/entrypoints/ozy-ssh-keygen.js.map +0 -1
  53. package/dist/entrypoints/ozy-virtual-security-key.js +0 -18
  54. package/dist/entrypoints/ozy-virtual-security-key.js.map +0 -1
  55. package/dist/entrypoints/ozy.js +0 -3
  56. package/dist/entrypoints/ozy.js.map +0 -1
  57. package/dist/index.js +0 -2
  58. package/dist/index.js.map +0 -1
  59. package/dist/internal/thing.js +0 -4
  60. package/dist/internal/thing.js.map +0 -1
  61. package/dist/modules/cli/agent-client/impl.js +0 -109
  62. package/dist/modules/cli/agent-client/impl.js.map +0 -1
  63. package/dist/modules/cli/agent-client/interface.js +0 -11
  64. package/dist/modules/cli/agent-client/interface.js.map +0 -1
  65. package/dist/modules/cli/git/impl.js +0 -124
  66. package/dist/modules/cli/git/impl.js.map +0 -1
  67. package/dist/modules/cli/git/interface.js +0 -3
  68. package/dist/modules/cli/git/interface.js.map +0 -1
  69. package/dist/modules/cli/git/submodule/fix.js +0 -257
  70. package/dist/modules/cli/git/submodule/fix.js.map +0 -1
  71. package/dist/modules/cli/git/submodule/git-state.js +0 -154
  72. package/dist/modules/cli/git/submodule/git-state.js.map +0 -1
  73. package/dist/modules/cli/git/submodule/gitmodules.js +0 -113
  74. package/dist/modules/cli/git/submodule/gitmodules.js.map +0 -1
  75. package/dist/modules/cli/git/submodule/printer.js +0 -232
  76. package/dist/modules/cli/git/submodule/printer.js.map +0 -1
  77. package/dist/modules/cli/git/submodule/resolve-git-dir.js +0 -16
  78. package/dist/modules/cli/git/submodule/resolve-git-dir.js.map +0 -1
  79. package/dist/modules/cli/github/impl.js +0 -137
  80. package/dist/modules/cli/github/impl.js.map +0 -1
  81. package/dist/modules/cli/github/interface.js +0 -2
  82. package/dist/modules/cli/github/interface.js.map +0 -1
  83. package/dist/modules/cli/index.js +0 -9
  84. package/dist/modules/cli/index.js.map +0 -1
  85. package/dist/modules/common/crypto/impl.js +0 -133
  86. package/dist/modules/common/crypto/impl.js.map +0 -1
  87. package/dist/modules/common/crypto/interface.js +0 -2
  88. package/dist/modules/common/crypto/interface.js.map +0 -1
  89. package/dist/modules/common/index.js +0 -10
  90. package/dist/modules/common/index.js.map +0 -1
  91. package/dist/modules/common/kep-map-store/impl.js +0 -42
  92. package/dist/modules/common/kep-map-store/impl.js.map +0 -1
  93. package/dist/modules/common/kep-map-store/interface.js +0 -2
  94. package/dist/modules/common/kep-map-store/interface.js.map +0 -1
  95. package/dist/modules/common/os-platform/caller-info.js +0 -132
  96. package/dist/modules/common/os-platform/caller-info.js.map +0 -1
  97. package/dist/modules/common/os-platform/impl.js +0 -87
  98. package/dist/modules/common/os-platform/impl.js.map +0 -1
  99. package/dist/modules/common/os-platform/interface.js +0 -2
  100. package/dist/modules/common/os-platform/interface.js.map +0 -1
  101. package/dist/modules/common/os-platform/virtual-hid/index.js +0 -12
  102. package/dist/modules/common/os-platform/virtual-hid/index.js.map +0 -1
  103. package/dist/modules/common/os-platform/virtual-hid/linux.js +0 -5
  104. package/dist/modules/common/os-platform/virtual-hid/linux.js.map +0 -1
  105. package/dist/modules/common/os-platform/virtual-hid/mac.js +0 -119
  106. package/dist/modules/common/os-platform/virtual-hid/mac.js.map +0 -1
  107. package/dist/modules/common/os-platform/virtual-hid/windows.js +0 -5
  108. package/dist/modules/common/os-platform/virtual-hid/windows.js.map +0 -1
  109. package/dist/modules/common/ssh-config/impl.js +0 -116
  110. package/dist/modules/common/ssh-config/impl.js.map +0 -1
  111. package/dist/modules/common/ssh-config/interface.js +0 -10
  112. package/dist/modules/common/ssh-config/interface.js.map +0 -1
  113. package/dist/modules/ssh-agent/index.js +0 -8
  114. package/dist/modules/ssh-agent/index.js.map +0 -1
  115. package/dist/modules/ssh-agent/session/impl.js +0 -265
  116. package/dist/modules/ssh-agent/session/impl.js.map +0 -1
  117. package/dist/modules/ssh-agent/session/interface-rpc.js +0 -20
  118. package/dist/modules/ssh-agent/session/interface-rpc.js.map +0 -1
  119. package/dist/modules/ssh-agent/session/interface.js +0 -32
  120. package/dist/modules/ssh-agent/session/interface.js.map +0 -1
  121. package/dist/modules/ssh-agent/session/passkey-prf-page.js +0 -204
  122. package/dist/modules/ssh-agent/session/passkey-prf-page.js.map +0 -1
  123. package/dist/modules/ssh-agent/session/prf-flow.js +0 -103
  124. package/dist/modules/ssh-agent/session/prf-flow.js.map +0 -1
  125. package/dist/modules/ssh-agent/ssh-agent/impl.js +0 -117
  126. package/dist/modules/ssh-agent/ssh-agent/impl.js.map +0 -1
  127. package/dist/modules/ssh-agent/ssh-agent/interface.js +0 -2
  128. package/dist/modules/ssh-agent/ssh-agent/interface.js.map +0 -1
  129. package/dist/scripts/build.js +0 -412
  130. package/dist/scripts/build.js.map +0 -1
  131. package/dist/scripts/check-npm-version.js +0 -8
  132. package/dist/scripts/check-npm-version.js.map +0 -1
  133. package/dist/scripts/kill-existing-agent.js +0 -21
  134. package/dist/scripts/kill-existing-agent.js.map +0 -1
  135. package/dist/scripts/publish.js +0 -46
  136. package/dist/scripts/publish.js.map +0 -1
  137. package/src/commands/git/hosts.ts +0 -20
  138. package/src/commands/git/index.ts +0 -9
  139. package/src/commands/git/setup.ts +0 -182
  140. package/src/commands/index.ts +0 -15
  141. package/src/commands/npm/index.ts +0 -8
  142. package/src/commands/npm/setup/git-remote.ts +0 -78
  143. package/src/commands/npm/setup/index.ts +0 -189
  144. package/src/commands/npm/setup/npm-auth.ts +0 -58
  145. package/src/commands/npm/setup/package-json-validate.ts +0 -68
  146. package/src/commands/npm/setup/package-registry.ts +0 -24
  147. package/src/commands/npm/setup/publish-workflow.yml +0 -35
  148. package/src/commands/npm/setup/setup.test.ts +0 -117
  149. package/src/commands/npm/setup/trusted-publishing.ts +0 -106
  150. package/src/commands/npm/setup/workflow.ts +0 -20
  151. package/src/commands/ssh/get-sk-credential.ts +0 -110
  152. package/src/commands/ssh/index.ts +0 -8
  153. package/src/commands/upgrade.ts +0 -90
  154. package/src/common/command.ts +0 -16
  155. package/src/common/constants.ts +0 -26
  156. package/src/common/effective-modules-extensions.ts +0 -24
  157. package/src/common/log.ts +0 -3
  158. package/src/common/render-caller-tree.ts +0 -22
  159. package/src/entrypoints/ozy-signing-agent.ts +0 -48
  160. package/src/entrypoints/ozy-ssh-keygen.ts +0 -10
  161. package/src/entrypoints/ozy-virtual-security-key.ts +0 -21
  162. package/src/entrypoints/ozy.ts +0 -2
  163. package/src/index.ts +0 -1
  164. package/src/internal/thing.ts +0 -3
  165. package/src/modules/cli/agent-client/impl.ts +0 -152
  166. package/src/modules/cli/agent-client/interface.ts +0 -17
  167. package/src/modules/cli/git/impl.ts +0 -133
  168. package/src/modules/cli/git/interface.ts +0 -23
  169. package/src/modules/cli/git/submodule/fix.ts +0 -298
  170. package/src/modules/cli/git/submodule/git-state.ts +0 -217
  171. package/src/modules/cli/git/submodule/gitmodules.ts +0 -126
  172. package/src/modules/cli/git/submodule/printer.ts +0 -256
  173. package/src/modules/cli/git/submodule/resolve-git-dir.ts +0 -14
  174. package/src/modules/cli/github/impl.ts +0 -169
  175. package/src/modules/cli/github/interface.ts +0 -29
  176. package/src/modules/cli/index.ts +0 -16
  177. package/src/modules/common/crypto/impl.ts +0 -173
  178. package/src/modules/common/crypto/interface.ts +0 -20
  179. package/src/modules/common/index.ts +0 -19
  180. package/src/modules/common/kep-map-store/impl.ts +0 -47
  181. package/src/modules/common/kep-map-store/interface.ts +0 -9
  182. package/src/modules/common/os-platform/caller-info.ts +0 -152
  183. package/src/modules/common/os-platform/impl.ts +0 -86
  184. package/src/modules/common/os-platform/interface.ts +0 -16
  185. package/src/modules/common/os-platform/virtual-hid/index.ts +0 -12
  186. package/src/modules/common/os-platform/virtual-hid/linux.ts +0 -7
  187. package/src/modules/common/os-platform/virtual-hid/mac.ts +0 -150
  188. package/src/modules/common/os-platform/virtual-hid/windows.ts +0 -7
  189. package/src/modules/common/ssh-config/impl.ts +0 -130
  190. package/src/modules/common/ssh-config/interface.ts +0 -33
  191. package/src/modules/ssh-agent/index.ts +0 -13
  192. package/src/modules/ssh-agent/session/agent-notes.md +0 -210
  193. package/src/modules/ssh-agent/session/design.md +0 -2
  194. package/src/modules/ssh-agent/session/html-refactor.md +0 -23
  195. package/src/modules/ssh-agent/session/impl.ts +0 -328
  196. package/src/modules/ssh-agent/session/interface-rpc.ts +0 -24
  197. package/src/modules/ssh-agent/session/interface.ts +0 -62
  198. package/src/modules/ssh-agent/session/passkey-prf-page.ts +0 -224
  199. package/src/modules/ssh-agent/session/prf-flow.ts +0 -152
  200. package/src/modules/ssh-agent/ssh-agent/impl.ts +0 -136
  201. package/src/modules/ssh-agent/ssh-agent/interface.ts +0 -9
  202. package/src/scripts/build.ts +0 -506
  203. package/src/scripts/check-npm-version.ts +0 -7
  204. package/src/scripts/command-launcher.js.ejs +0 -168
  205. package/src/scripts/kill-existing-agent.ts +0 -22
  206. package/src/scripts/publish.ts +0 -47
  207. package/src/scripts/windows-bin-shims.md +0 -1104
@@ -1,133 +0,0 @@
1
- import { Effect, pipe } from "effect";
2
- import { implementing } from "effective-modules";
3
- import { commonModules } from "@/modules/common";
4
- import bs58 from "bs58";
5
- import friendlyWords from "friendly-words";
6
- import { sign as cryptoSign, createPrivateKey, createPublicKey } from "node:crypto";
7
- import { FUTURE_TOOL_NAME } from "@/common/constants";
8
- function toBase64url(bytes) {
9
- return Buffer.from(bytes).toString("base64url");
10
- }
11
- function fromBase64url(str) {
12
- return new Uint8Array(Buffer.from(str, "base64url"));
13
- }
14
- function u32(n) {
15
- const b = Buffer.allocUnsafe(4);
16
- b.writeUInt32BE(n, 0);
17
- return b;
18
- }
19
- function sshString(s) {
20
- return Buffer.concat([u32(s.length), s]);
21
- }
22
- // PKCS#8 DER header for Ed25519
23
- const PKCS8_ED25519_HEADER = Buffer.from("302e020100300506032b657004220420", "hex");
24
- export class CredentialId {
25
- base58;
26
- base64;
27
- raw;
28
- humanReadableName;
29
- static fromBase64(base64) {
30
- const base58 = bs58.encode(fromBase64url(base64));
31
- return new this(base58);
32
- }
33
- constructor(base58) {
34
- this.base58 = base58;
35
- this.raw = bs58.decode(base58);
36
- this.base64 = toBase64url(this.raw);
37
- // Extract three non-overlapping bit windows: 11 + 11 + 12 = 34 bits from bytes 0-4
38
- const b = this.raw;
39
- const adj1Idx = ((b[0] << 3) | (b[1] >> 5)) % friendlyWords.predicates.length;
40
- const adj2Idx = (((b[1] & 0x1F) << 6) | (b[2] >> 2)) % friendlyWords.predicates.length;
41
- const nounIdx = (((b[2] & 0x3) << 10) | (b[3] << 2) | (b[4] >> 6)) % friendlyWords.objects.length;
42
- this.humanReadableName = [
43
- FUTURE_TOOL_NAME,
44
- friendlyWords.predicates[adj1Idx],
45
- friendlyWords.predicates[adj2Idx],
46
- friendlyWords.objects[nounIdx]
47
- ].join("-");
48
- }
49
- }
50
- export class SSHPubkey {
51
- wire;
52
- keyType;
53
- authorizedKey;
54
- constructor(wire) {
55
- this.wire = wire;
56
- const len = wire.readUInt32BE(0);
57
- this.keyType = wire.subarray(4, 4 + len).toString("utf8");
58
- this.authorizedKey = `${this.keyType} ${wire.toString("base64")}`;
59
- }
60
- static fromWire(wire) {
61
- return new SSHPubkey(wire);
62
- }
63
- static fromAuthorizedKey(s) {
64
- return new SSHPubkey(Buffer.from(s.split(" ")[1], "base64"));
65
- }
66
- }
67
- export class SSHKeyPair {
68
- pubkey;
69
- pemPrivateKey;
70
- constructor(pubkey, pemPrivateKey) {
71
- this.pubkey = pubkey;
72
- this.pemPrivateKey = pemPrivateKey;
73
- }
74
- sign(data) {
75
- return cryptoSign(null, data, createPrivateKey(this.pemPrivateKey));
76
- }
77
- static fromSeed(seed, context) {
78
- return Effect.tryPromise({
79
- try: async () => {
80
- const hkdfKey = await crypto.subtle.importKey("raw", seed, "HKDF", false, ["deriveBits"]);
81
- const bits = await crypto.subtle.deriveBits({ name: "HKDF", hash: "SHA-256", salt: new Uint8Array(32), info: new TextEncoder().encode(context) }, hkdfKey, 256);
82
- return SSHKeyPair.build(new Uint8Array(bits));
83
- },
84
- catch: (e) => String(e),
85
- });
86
- }
87
- static build(seed) {
88
- const der = Buffer.concat([PKCS8_ED25519_HEADER, Buffer.from(seed)]);
89
- const priv = createPrivateKey({ key: der, format: "der", type: "pkcs8" });
90
- const spki = createPublicKey(priv).export({ type: "spki", format: "der" });
91
- const pubBytes = Buffer.from(spki.subarray(-32));
92
- const keyTypeBuf = Buffer.from("ssh-ed25519");
93
- const wire = Buffer.concat([sshString(keyTypeBuf), sshString(pubBytes)]);
94
- const pemPrivateKey = priv.export({ type: "pkcs8", format: "pem" });
95
- return new SSHKeyPair(SSHPubkey.fromWire(wire), pemPrivateKey);
96
- }
97
- }
98
- const { Crypto } = commonModules;
99
- export class CryptoImpl extends implementing(Crypto) {
100
- *getRandomChallenge() {
101
- return toBase64url(crypto.getRandomValues(new Uint8Array(16)));
102
- }
103
- *createECDHKey() {
104
- const keyPair = yield* Effect.tryPromise({
105
- try: () => crypto.subtle.generateKey({ name: "ECDH", namedCurve: "P-256" }, true, ["deriveBits"]),
106
- catch: (e) => e.toString(),
107
- });
108
- const agentPubKeyRaw = yield* Effect.tryPromise({
109
- try: () => crypto.subtle.exportKey("raw", keyPair.publicKey),
110
- catch: (e) => e.toString(),
111
- });
112
- const pubkey = toBase64url(new Uint8Array(agentPubKeyRaw));
113
- return {
114
- base64Pubkey: pubkey,
115
- keyPair,
116
- };
117
- }
118
- *decrypt({ cipherText, iv, hkdfInfo, receiverKey, senderPubkey }) {
119
- return yield* pipe(Effect.tryPromise(async () => {
120
- const browserPubKey = await crypto.subtle.importKey("raw", fromBase64url(senderPubkey), { name: "ECDH", namedCurve: "P-256" }, false, []);
121
- const sharedBits = await crypto.subtle.deriveBits({ name: "ECDH", public: browserPubKey }, receiverKey.privateKey, 256);
122
- const hkdfKey = await crypto.subtle.importKey("raw", sharedBits, "HKDF", false, ["deriveKey"]);
123
- const aesKey = await crypto.subtle.deriveKey({
124
- name: "HKDF", hash: "SHA-256",
125
- salt: new Uint8Array(32),
126
- info: new TextEncoder().encode(hkdfInfo),
127
- }, hkdfKey, { name: "AES-GCM", length: 256 }, false, ["decrypt"]);
128
- const decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv: fromBase64url(iv) }, aesKey, fromBase64url(cipherText));
129
- return new Uint8Array(decrypted);
130
- }), Effect.catchTag("UnknownError", err => Effect.fail(err.message)));
131
- }
132
- }
133
- //# sourceMappingURL=impl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"impl.js","sourceRoot":"","sources":["../../../../../../../src/modules/common/crypto/impl.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import {} from "effective-modules";
2
- //# sourceMappingURL=interface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../../../../../src/modules/common/crypto/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,mBAAmB,CAAC"}
@@ -1,10 +0,0 @@
1
- import { interfaces } from "effective-modules";
2
- export var CommonModules;
3
- (function (CommonModules) {
4
- CommonModules["OSPlatform"] = "OSPlatform";
5
- CommonModules["KeyMapStore"] = "KeyMapStore";
6
- CommonModules["Crypto"] = "Crypto";
7
- CommonModules["SSHConfig"] = "SSHConfig";
8
- })(CommonModules || (CommonModules = {}));
9
- export const commonModules = interfaces(CommonModules);
10
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/modules/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM/C,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,0CAAyB,CAAA;IACzB,4CAA2B,CAAA;IAC3B,kCAAiB,CAAA;IACjB,wCAAuB,CAAA;AACzB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAKpC,aAAa,CAAC,CAAC"}
@@ -1,42 +0,0 @@
1
- import { Effect, Option, pipe } from "effect";
2
- import { effunct, implementing } from "effective-modules";
3
- import { commonModules } from "..";
4
- import {} from "./interface";
5
- import { SSHPubkey, CredentialId } from "@/modules/common/crypto/impl";
6
- import { CRED_ID_COMMENT_PREFIX, FUTURE_TOOL_NAME } from "@/common/constants";
7
- export class KeyMapStoreImpl extends implementing(commonModules.KeyMapStore).uses(commonModules.SSHConfig) {
8
- *listToolPubkeyFiles() {
9
- const files = yield* effunct(this.dependencies.SSHConfig.listPubkeyFiles)();
10
- return files.filter(f => f.name.startsWith(`${FUTURE_TOOL_NAME}-`));
11
- }
12
- *listPubkeys() {
13
- const files = yield* effunct(this.listToolPubkeyFiles)();
14
- return files.map(({ content }) => {
15
- const pubkeyAuth = content.split(' ').slice(0, 2).join(' ');
16
- return SSHPubkey.fromAuthorizedKey(pubkeyAuth);
17
- });
18
- }
19
- *getCredentialByPubkey(pubkey) {
20
- const files = yield* effunct(this.listToolPubkeyFiles)();
21
- const match = files.find(({ content }) => {
22
- const pubkeyAuth = content.split(' ').slice(0, 2).join(' ');
23
- return pubkeyAuth === pubkey.authorizedKey;
24
- });
25
- if (!match)
26
- return Option.none();
27
- const parts = match.content.split(' ');
28
- const comment = parts[2];
29
- if (!comment || !comment.startsWith(CRED_ID_COMMENT_PREFIX))
30
- return yield* Effect.fail(`InvalidPubkeyFileError: file for pubkey ${pubkey.authorizedKey} has no valid credentialId comment`);
31
- return Option.some(comment.slice(CRED_ID_COMMENT_PREFIX.length));
32
- }
33
- *addKey(pubkey, credentialId) {
34
- const name = new CredentialId(credentialId).humanReadableName;
35
- yield* pipe(effunct(this.dependencies.SSHConfig.writePubkey)({
36
- name,
37
- comment: Option.some(`${CRED_ID_COMMENT_PREFIX}${credentialId}`),
38
- pubkey,
39
- }), Effect.asVoid);
40
- }
41
- }
42
- //# sourceMappingURL=impl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"impl.js","sourceRoot":"","sources":["../../../../../../../src/modules/common/kep-map-store/impl.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { Option } from "effect";
2
- //# sourceMappingURL=interface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../../../../../src/modules/common/kep-map-store/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC"}
@@ -1,132 +0,0 @@
1
- import { dlopen, FFIType } from "bun:ffi";
2
- import { execSync } from "node:child_process";
3
- import { readFileSync, readlinkSync } from "node:fs";
4
- import { Option } from "effect";
5
- const isMacOS = process.platform === 'darwin';
6
- // ---- FFI: getsockopt ----
7
- const SOL_LOCAL = 0; // macOS: SOL_LOCAL (sys/un.h)
8
- const LOCAL_PEERPID = 2; // macOS: LOCAL_PEERPID (sys/un.h)
9
- const SOL_SOCKET_LINUX = 1; // Linux: SOL_SOCKET
10
- const SO_PEERCRED_LINUX = 17; // Linux: SO_PEERCRED
11
- let _getsockopt;
12
- function getsockoptSymbol() {
13
- if (!_getsockopt) {
14
- const libName = isMacOS ? 'libSystem.B.dylib' : 'libc.so.6';
15
- const lib = dlopen(libName, {
16
- getsockopt: {
17
- args: [FFIType.int, FFIType.int, FFIType.int, FFIType.ptr, FFIType.ptr],
18
- returns: FFIType.int,
19
- },
20
- });
21
- _getsockopt = lib.symbols['getsockopt'];
22
- }
23
- return _getsockopt;
24
- }
25
- function getPeerPidFromFd(fd) {
26
- const getsockopt = getsockoptSymbol();
27
- if (isMacOS) {
28
- const pidBuf = new Uint8Array(4);
29
- const lenBuf = new Uint32Array([4]);
30
- const ret = getsockopt(fd, SOL_LOCAL, LOCAL_PEERPID, pidBuf, lenBuf);
31
- if (ret !== 0)
32
- throw new Error(`getsockopt(LOCAL_PEERPID) failed with ret=${ret}`);
33
- return new DataView(pidBuf.buffer).getInt32(0, true);
34
- }
35
- else {
36
- // Linux: struct ucred { pid_t pid; uid_t uid; gid_t gid; } = 12 bytes
37
- const credBuf = new Uint8Array(12);
38
- const lenBuf = new Uint32Array([12]);
39
- const ret = getsockopt(fd, SOL_SOCKET_LINUX, SO_PEERCRED_LINUX, credBuf, lenBuf);
40
- if (ret !== 0)
41
- throw new Error(`getsockopt(SO_PEERCRED) failed with ret=${ret}`);
42
- return new DataView(credBuf.buffer).getInt32(0, true);
43
- }
44
- }
45
- function getProcessInfoMacOS(pid) {
46
- let psOut;
47
- try {
48
- psOut = execSync(`ps -p ${pid} -o ppid= -o args=`, { encoding: 'utf-8' }).trim();
49
- }
50
- catch {
51
- throw new Error(`PID ${pid} exited before caller info could be read`);
52
- }
53
- const firstSpace = psOut.indexOf(' ');
54
- if (firstSpace < 0)
55
- throw new Error(`Unexpected ps output for PID ${pid}: "${psOut}"`);
56
- const ppid = parseInt(psOut.slice(0, firstSpace).trim(), 10);
57
- const command = psOut.slice(firstSpace + 1).trim();
58
- // lsof exits non-zero on macOS when it hits permission errors on other fds even if it
59
- // successfully located the cwd entry, so we check output regardless of exit code.
60
- const lsofResult = Bun.spawnSync(['lsof', '-a', '-p', String(pid), '-d', 'cwd', '-Fn']);
61
- const lsofOut = lsofResult.stdout.toString().trim();
62
- const cwdLine = lsofOut.split('\n').find(l => l.startsWith('n'));
63
- const cwd = cwdLine ? Option.some(cwdLine.slice(1)) : Option.none();
64
- return { ppid, command, cwd };
65
- }
66
- function getProcessInfoLinux(pid) {
67
- const rawCmdline = readFileSync(`/proc/${pid}/cmdline`);
68
- const command = rawCmdline.toString().replace(/\0+$/, '').split('\0').join(' ');
69
- if (!command)
70
- throw new Error(`Empty cmdline for PID ${pid}`);
71
- let cwd;
72
- try {
73
- cwd = Option.some(readlinkSync(`/proc/${pid}/cwd`));
74
- }
75
- catch {
76
- cwd = Option.none();
77
- }
78
- const status = readFileSync(`/proc/${pid}/status`, 'utf-8');
79
- const ppidMatch = status.match(/^PPid:\s+(\d+)/m);
80
- if (!ppidMatch)
81
- throw new Error(`No PPid in /proc/${pid}/status`);
82
- const ppid = parseInt(ppidMatch[1], 10);
83
- return { ppid, command, cwd };
84
- }
85
- function getProcessInfoWindows(pid) {
86
- const infoOut = execSync(`powershell -NoProfile -Command "` +
87
- `$p = Get-WmiObject Win32_Process -Filter 'ProcessId=${pid}'; ` +
88
- `if ($p) { Write-Output \\\"$($p.ParentProcessId)|$($p.CommandLine)\\\" }"`, { encoding: 'utf-8' }).trim();
89
- if (!infoOut)
90
- throw new Error(`WMI returned no result for PID ${pid}`);
91
- const pipeIdx = infoOut.indexOf('|');
92
- if (pipeIdx < 0)
93
- throw new Error(`Unexpected WMI output for PID ${pid}: "${infoOut}"`);
94
- const ppid = parseInt(infoOut.slice(0, pipeIdx), 10);
95
- const command = infoOut.slice(pipeIdx + 1);
96
- return { ppid, command, cwd: Option.none() };
97
- }
98
- // ---- Chain walking ----
99
- function walkChain(initialPid, getInfo) {
100
- const chain = [];
101
- let pid = initialPid;
102
- const visited = new Set();
103
- let isFirst = true;
104
- while (pid > 0 && !visited.has(pid)) {
105
- visited.add(pid);
106
- let info;
107
- try {
108
- info = getInfo(pid);
109
- }
110
- catch (e) {
111
- if (isFirst)
112
- throw e;
113
- break;
114
- }
115
- chain.push({ pid, command: info.command, directory: info.cwd });
116
- pid = info.ppid;
117
- isFirst = false;
118
- }
119
- // Reverse so chain[0] = oldest ancestor, chain[N-1] = direct caller.
120
- // This matches the display logic in passkey-prf-page.ts which skips the common
121
- // ancestor prefix to show the relevant tail (git, ssh, etc.).
122
- return chain.reverse();
123
- }
124
- // ---- Public API ----
125
- export function resolveCallerChainUnix(fd) {
126
- const pid = getPeerPidFromFd(fd);
127
- return walkChain(pid, isMacOS ? getProcessInfoMacOS : getProcessInfoLinux);
128
- }
129
- export function resolveCallerChainWindows(remotePid) {
130
- return walkChain(remotePid, getProcessInfoWindows);
131
- }
132
- //# sourceMappingURL=caller-info.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"caller-info.js","sourceRoot":"","sources":["../../../../../../../src/modules/common/os-platform/caller-info.ts"],"names":[],"mappings":"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"}
@@ -1,87 +0,0 @@
1
- import { Effect } from "effect";
2
- import { writeFileSync, existsSync, unlinkSync } from "node:fs";
3
- import * as net from "node:net";
4
- import { effunct, implementing } from "effective-modules";
5
- import { resolveCallerChainUnix, resolveCallerChainWindows } from "./caller-info";
6
- import { commonModules } from "@/modules/common";
7
- import { registerVirtualHID } from "./virtual-hid";
8
- import { log } from "@/common/log";
9
- const openCmd = process.platform === 'darwin' ? 'open'
10
- : process.platform === 'linux' ? 'xdg-open'
11
- : 'start';
12
- const isWindows = process.platform === 'win32';
13
- function openBrowserWindow(url) {
14
- return Effect.sync(() => { Bun.spawnSync([openCmd, url]); });
15
- }
16
- function writeRestrictedFile(path, content) {
17
- return Effect.try({
18
- try: () => {
19
- if (isWindows) {
20
- writeFileSync(path, content);
21
- const result = Bun.spawnSync(['icacls', path, '/inheritance:r', '/grant:r', `${process.env['USERNAME']}:(R,W)`]);
22
- if (result.exitCode !== 0)
23
- throw new Error(`icacls failed with exit code ${result.exitCode}`);
24
- }
25
- else {
26
- writeFileSync(path, content, { mode: 0o600 });
27
- }
28
- },
29
- catch: (e) => `Failed to write restricted file ${path}: ${e instanceof Error ? e.message : String(e)}`,
30
- });
31
- }
32
- function makeConnectionHandler(onData, resolveChain) {
33
- return (socket) => {
34
- let callerChain;
35
- try {
36
- callerChain = resolveChain(socket);
37
- }
38
- catch (e) {
39
- log(`[socket-server] ERROR: Failed to get caller info — closing connection. Reason: ${e instanceof Error ? e.message : String(e)}`);
40
- socket.destroy();
41
- return;
42
- }
43
- socket.on('data', async (data) => {
44
- try {
45
- socket.write(await Effect.runPromise(effunct(onData)(data, callerChain)));
46
- }
47
- catch (e) {
48
- log(`[socket-server] ERROR in onData: ${e instanceof Error ? e.message : String(e)}`);
49
- socket.destroy();
50
- }
51
- });
52
- };
53
- }
54
- export class OSPlatformImpl extends implementing(commonModules.OSPlatform) {
55
- openBrowserWindow(url) { return openBrowserWindow(url); }
56
- writeRestrictedFile(path, content) { return writeRestrictedFile(path, content); }
57
- *startSocketServer(socketPath, onData) {
58
- return yield* Effect.try({
59
- try: () => {
60
- if (existsSync(socketPath))
61
- unlinkSync(socketPath);
62
- if (isWindows) {
63
- const pipePath = `\\\\.\\pipe\\${socketPath.replace(/[/\\:]/g, '-')}`;
64
- const server = net.createServer(makeConnectionHandler(onData, (socket) => {
65
- const remotePid = socket._handle?.remotePid;
66
- if (remotePid == null)
67
- throw new Error('socket._handle.remotePid unavailable on this Windows/Bun version');
68
- return resolveCallerChainWindows(remotePid);
69
- }));
70
- server.listen(pipePath);
71
- }
72
- else {
73
- const server = net.createServer(makeConnectionHandler(onData, (socket) => {
74
- const fd = socket._handle?.fd;
75
- if (fd == null)
76
- throw new Error('socket._handle.fd unavailable — cannot resolve peer PID');
77
- return resolveCallerChainUnix(fd);
78
- }));
79
- server.listen(socketPath);
80
- }
81
- },
82
- catch: (e) => `Failed to start socket server at ${socketPath}: ${e instanceof Error ? e.message : String(e)}`,
83
- });
84
- }
85
- registerVirtualHID(onMessage) { return registerVirtualHID(onMessage); }
86
- }
87
- //# sourceMappingURL=impl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"impl.js","sourceRoot":"","sources":["../../../../../../../src/modules/common/os-platform/impl.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { Effect } from "effect";
2
- //# sourceMappingURL=interface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../../../../../src/modules/common/os-platform/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC"}
@@ -1,12 +0,0 @@
1
- import { Effect } from "effect";
2
- import { registerVirtualHIDMac } from "./mac";
3
- import { registerVirtualHIDLinux } from "./linux";
4
- import { registerVirtualHIDWindows } from "./windows";
5
- export function registerVirtualHID(onMessage) {
6
- if (process.platform === 'darwin')
7
- return registerVirtualHIDMac(onMessage);
8
- if (process.platform === 'win32')
9
- return registerVirtualHIDWindows(onMessage);
10
- return registerVirtualHIDLinux(onMessage);
11
- }
12
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../src/modules/common/os-platform/virtual-hid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAChC,SAAkD;IAElD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC9E,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,5 +0,0 @@
1
- import { Effect } from "effect";
2
- export function registerVirtualHIDLinux(_onMessage) {
3
- return Effect.fail('registerVirtualHID is not yet supported on Linux');
4
- }
5
- //# sourceMappingURL=linux.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"linux.js","sourceRoot":"","sources":["../../../../../../../../src/modules/common/os-platform/virtual-hid/linux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,UAAU,uBAAuB,CACrC,UAAmD;IAEnD,OAAO,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;AACzE,CAAC"}
@@ -1,119 +0,0 @@
1
- import { Effect, Option, pipe } from "effect";
2
- import { JSCallback, dlopen, FFIType, ptr, toArrayBuffer } from "bun:ffi";
3
- // FIDO Alliance usage page (0xF1D0), 64-byte in/out reports, no report IDs
4
- const FIDO2_HID_DESCRIPTOR = new Uint8Array([
5
- 0x06, 0xD0, 0xF1, // Usage Page (FIDO Alliance 0xF1D0, little-endian)
6
- 0x09, 0x01, // Usage (U2F HID Authenticator Device)
7
- 0xA1, 0x01, // Collection (Application)
8
- 0x09, 0x20, // Usage (Input report data)
9
- 0x15, 0x00, // Logical Minimum (0)
10
- 0x26, 0xFF, 0x00, // Logical Maximum (255)
11
- 0x75, 0x08, // Report Size (8 bits)
12
- 0x95, 0x40, // Report Count (64)
13
- 0x81, 0x02, // Input (Data, Variable, Absolute)
14
- 0x09, 0x21, // Usage (Output report data)
15
- 0x15, 0x00, // Logical Minimum (0)
16
- 0x26, 0xFF, 0x00, // Logical Maximum (255)
17
- 0x75, 0x08, // Report Size (8 bits)
18
- 0x95, 0x40, // Report Count (64)
19
- 0x91, 0x02, // Output (Data, Variable, Absolute)
20
- 0xC0, // End Collection
21
- ]);
22
- const kIOHIDReportTypeOutput = 1;
23
- const kIOReturnSuccess = 0;
24
- const kCFStringEncodingUTF8 = 0x08000100;
25
- const kCFPropertyListImmutable = 0;
26
- // Kept at module scope to prevent GC while the virtual device is running
27
- let _vhidCallback = null;
28
- _vhidCallback;
29
- const fromPtr = (label, p) => pipe(Option.fromNullishOr(p), Effect.fromOption, Effect.mapError(() => `${label} returned NULL`));
30
- // Build the device properties as an XML plist. CFPropertyListCreateWithData parses this
31
- // into a fully-initialized CFDictionary (with correct hash/equal callbacks), avoiding
32
- // the need to pass raw CFDictionaryKeyCallBacks structs via FFI.
33
- function buildDevicePropertiesPlist() {
34
- const descriptorB64 = Buffer.from(FIDO2_HID_DESCRIPTOR).toString('base64');
35
- const xml = [
36
- '<?xml version="1.0" encoding="UTF-8"?>',
37
- '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
38
- '<plist version="1.0">',
39
- '<dict>',
40
- ' <key>ReportDescriptor</key>',
41
- ` <data>${descriptorB64}</data>`,
42
- ' <key>VendorID</key>',
43
- ' <integer>4617</integer>', // 0x1209 - pid.codes open-source VID
44
- ' <key>ProductID</key>',
45
- ' <integer>1</integer>',
46
- ' <key>VersionNumber</key>',
47
- ' <integer>256</integer>', // 0x0100
48
- ' <key>Product</key>',
49
- ' <string>Ozy Virtual FIDO2 Key</string>',
50
- '</dict>',
51
- '</plist>',
52
- ].join('\n');
53
- return new TextEncoder().encode(xml);
54
- }
55
- export function registerVirtualHIDMac(onMessage) {
56
- return Effect.gen(function* () {
57
- console.log('[vhid] loading frameworks');
58
- const IOKit = yield* Effect.try({
59
- try: () => dlopen('/System/Library/Frameworks/IOKit.framework/IOKit', {
60
- IOHIDUserDeviceCreate: { args: [FFIType.ptr, FFIType.ptr], returns: FFIType.ptr },
61
- IOHIDUserDeviceRegisterSetReportCallback: { args: [FFIType.ptr, FFIType.ptr, FFIType.ptr], returns: FFIType.void },
62
- IOHIDUserDeviceScheduleWithRunLoop: { args: [FFIType.ptr, FFIType.ptr, FFIType.ptr], returns: FFIType.void },
63
- IOHIDUserDeviceHandleReport: { args: [FFIType.ptr, FFIType.ptr, FFIType.i64], returns: FFIType.i32 },
64
- }),
65
- catch: (e) => `Failed to load IOKit: ${e}`,
66
- });
67
- const CF = yield* Effect.try({
68
- try: () => dlopen('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation', {
69
- CFRunLoopGetCurrent: { args: [], returns: FFIType.ptr },
70
- CFRunLoopRunInMode: { args: [FFIType.ptr, FFIType.f64, FFIType.bool], returns: FFIType.i32 },
71
- CFStringCreateWithCString: { args: [FFIType.ptr, FFIType.ptr, FFIType.u32], returns: FFIType.ptr },
72
- CFDataCreate: { args: [FFIType.ptr, FFIType.ptr, FFIType.i64], returns: FFIType.ptr },
73
- CFPropertyListCreateWithData: { args: [FFIType.ptr, FFIType.ptr, FFIType.u64, FFIType.ptr, FFIType.ptr], returns: FFIType.ptr },
74
- CFRelease: { args: [FFIType.ptr], returns: FFIType.void },
75
- }),
76
- catch: (e) => `Failed to load CoreFoundation: ${e}`,
77
- });
78
- console.log('[vhid] frameworks loaded');
79
- const encoder = new TextEncoder();
80
- const makeCFString = (s) =>
81
- // TextEncoder gives a Uint8Array with its own ArrayBuffer (byteOffset=0, pool-safe)
82
- fromPtr(`CFStringCreateWithCString("${s}")`, CF.symbols.CFStringCreateWithCString(null, ptr(encoder.encode(s + '\0')), kCFStringEncodingUTF8));
83
- const makeCFData = (data) => fromPtr('CFDataCreate', CF.symbols.CFDataCreate(null, ptr(data), BigInt(data.length)));
84
- console.log('[vhid] building device properties plist');
85
- const plistBytes = buildDevicePropertiesPlist();
86
- const plistData = yield* makeCFData(plistBytes);
87
- const dict = yield* fromPtr('CFPropertyListCreateWithData', CF.symbols.CFPropertyListCreateWithData(null, plistData, BigInt(kCFPropertyListImmutable), null, null));
88
- CF.symbols.CFRelease(plistData);
89
- console.log('[vhid] device properties dict =', dict);
90
- console.log('[vhid] creating IOHIDUserDevice');
91
- const device = yield* fromPtr('IOHIDUserDeviceCreate', IOKit.symbols.IOHIDUserDeviceCreate(null, dict));
92
- CF.symbols.CFRelease(dict);
93
- console.log('[vhid] IOHIDUserDeviceCreate =', device);
94
- const callback = yield* Effect.try({
95
- try: () => new JSCallback((_refcon, _result, _sender, type, _reportID, report, reportLength) => {
96
- if (type !== kIOHIDReportTypeOutput)
97
- return kIOReturnSuccess;
98
- const incoming = Buffer.from(toArrayBuffer(report, 0, reportLength));
99
- console.log(`[vhid] received ${incoming.length} bytes: ${incoming.toString('hex')}`);
100
- Effect.runPromise(onMessage(incoming)).then(response => {
101
- const responseBuf = new Uint8Array(64);
102
- response.copy(Buffer.from(responseBuf.buffer), 0, 0, Math.min(response.length, 64));
103
- IOKit.symbols.IOHIDUserDeviceHandleReport(device, ptr(responseBuf), BigInt(responseBuf.length));
104
- }).catch(() => { });
105
- return kIOReturnSuccess;
106
- }, { returns: 'i32', args: ['ptr', 'i32', 'ptr', 'i32', 'u32', 'ptr', 'i64'] }),
107
- catch: (e) => `Failed to create JSCallback: ${e}`,
108
- });
109
- _vhidCallback = callback;
110
- IOKit.symbols.IOHIDUserDeviceRegisterSetReportCallback(device, callback.ptr, null);
111
- const runLoop = CF.symbols.CFRunLoopGetCurrent();
112
- const runLoopMode = yield* makeCFString('kCFRunLoopDefaultMode');
113
- IOKit.symbols.IOHIDUserDeviceScheduleWithRunLoop(device, runLoop, runLoopMode);
114
- console.log('[vhid] virtual FIDO2 device active, pumping run loop');
115
- // Pump CFRunLoop from Bun's libuv event loop without blocking
116
- setInterval(() => CF.symbols.CFRunLoopRunInMode(runLoopMode, 0.0, false), 10);
117
- });
118
- }
119
- //# sourceMappingURL=mac.js.map