@intentic/keyring 0.0.0-stage → 1.338.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 (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -2
  3. package/dist/address.d.ts +14 -0
  4. package/dist/address.d.ts.map +1 -0
  5. package/dist/address.js +17 -0
  6. package/dist/address.js.map +1 -0
  7. package/dist/app.d.ts +3 -0
  8. package/dist/app.d.ts.map +1 -0
  9. package/dist/app.js +100 -0
  10. package/dist/app.js.map +1 -0
  11. package/dist/askpass/askpass-run.d.ts +7 -0
  12. package/dist/askpass/askpass-run.d.ts.map +1 -0
  13. package/dist/askpass/askpass-run.js +25 -0
  14. package/dist/askpass/askpass-run.js.map +1 -0
  15. package/dist/askpass/askpass.d.ts +9 -0
  16. package/dist/askpass/askpass.d.ts.map +1 -0
  17. package/dist/askpass/askpass.js +70 -0
  18. package/dist/askpass/askpass.js.map +1 -0
  19. package/dist/askpass-cli.d.ts +3 -0
  20. package/dist/askpass-cli.d.ts.map +1 -0
  21. package/dist/askpass-cli.js +4 -0
  22. package/dist/askpass-cli.js.map +1 -0
  23. package/dist/audit.d.ts +18 -0
  24. package/dist/audit.d.ts.map +1 -0
  25. package/dist/audit.js +14 -0
  26. package/dist/audit.js.map +1 -0
  27. package/dist/backends.d.ts +19 -0
  28. package/dist/backends.d.ts.map +1 -0
  29. package/dist/backends.js +97 -0
  30. package/dist/backends.js.map +1 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +11 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/client.d.ts +10 -0
  36. package/dist/client.d.ts.map +1 -0
  37. package/dist/client.js +59 -0
  38. package/dist/client.js.map +1 -0
  39. package/dist/consent/consent-posix.d.ts +6 -0
  40. package/dist/consent/consent-posix.d.ts.map +1 -0
  41. package/dist/consent/consent-posix.js +57 -0
  42. package/dist/consent/consent-posix.js.map +1 -0
  43. package/dist/consent/consent-windows.d.ts +5 -0
  44. package/dist/consent/consent-windows.d.ts.map +1 -0
  45. package/dist/consent/consent-windows.js +244 -0
  46. package/dist/consent/consent-windows.js.map +1 -0
  47. package/dist/consent/consent.d.ts +67 -0
  48. package/dist/consent/consent.d.ts.map +1 -0
  49. package/dist/consent/consent.js +89 -0
  50. package/dist/consent/consent.js.map +1 -0
  51. package/dist/core.d.ts +61 -0
  52. package/dist/core.d.ts.map +1 -0
  53. package/dist/core.js +882 -0
  54. package/dist/core.js.map +1 -0
  55. package/dist/index.d.ts +8 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +8 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/keyring-fetch.d.ts +4 -0
  60. package/dist/keyring-fetch.d.ts.map +1 -0
  61. package/dist/keyring-fetch.js +20 -0
  62. package/dist/keyring-fetch.js.map +1 -0
  63. package/dist/keys.d.ts +27 -0
  64. package/dist/keys.d.ts.map +1 -0
  65. package/dist/keys.js +55 -0
  66. package/dist/keys.js.map +1 -0
  67. package/dist/policy.d.ts +71 -0
  68. package/dist/policy.d.ts.map +1 -0
  69. package/dist/policy.js +170 -0
  70. package/dist/policy.js.map +1 -0
  71. package/dist/powershell.d.ts +22 -0
  72. package/dist/powershell.d.ts.map +1 -0
  73. package/dist/powershell.js +53 -0
  74. package/dist/powershell.js.map +1 -0
  75. package/dist/protocol.d.ts +923 -0
  76. package/dist/protocol.d.ts.map +1 -0
  77. package/dist/protocol.js +125 -0
  78. package/dist/protocol.js.map +1 -0
  79. package/dist/run.d.ts +20 -0
  80. package/dist/run.d.ts.map +1 -0
  81. package/dist/run.js +34 -0
  82. package/dist/run.js.map +1 -0
  83. package/dist/seal.d.ts +3 -0
  84. package/dist/seal.d.ts.map +1 -0
  85. package/dist/seal.js +3 -0
  86. package/dist/seal.js.map +1 -0
  87. package/dist/serve.d.ts +17 -0
  88. package/dist/serve.d.ts.map +1 -0
  89. package/dist/serve.js +65 -0
  90. package/dist/serve.js.map +1 -0
  91. package/dist/server.d.ts +9 -0
  92. package/dist/server.d.ts.map +1 -0
  93. package/dist/server.js +77 -0
  94. package/dist/server.js.map +1 -0
  95. package/dist/service/acl.d.ts +9 -0
  96. package/dist/service/acl.d.ts.map +1 -0
  97. package/dist/service/acl.js +25 -0
  98. package/dist/service/acl.js.map +1 -0
  99. package/dist/service/channel.d.ts +17 -0
  100. package/dist/service/channel.d.ts.map +1 -0
  101. package/dist/service/channel.js +64 -0
  102. package/dist/service/channel.js.map +1 -0
  103. package/dist/service/door.d.ts +89 -0
  104. package/dist/service/door.d.ts.map +1 -0
  105. package/dist/service/door.js +28 -0
  106. package/dist/service/door.js.map +1 -0
  107. package/dist/service/hello-verify.d.ts +2 -0
  108. package/dist/service/hello-verify.d.ts.map +1 -0
  109. package/dist/service/hello-verify.js +10 -0
  110. package/dist/service/hello-verify.js.map +1 -0
  111. package/dist/service/helper.d.ts +3 -0
  112. package/dist/service/helper.d.ts.map +1 -0
  113. package/dist/service/helper.js +117 -0
  114. package/dist/service/helper.js.map +1 -0
  115. package/dist/service/install.d.ts +10 -0
  116. package/dist/service/install.d.ts.map +1 -0
  117. package/dist/service/install.js +77 -0
  118. package/dist/service/install.js.map +1 -0
  119. package/dist/service/lines.d.ts +13 -0
  120. package/dist/service/lines.d.ts.map +1 -0
  121. package/dist/service/lines.js +89 -0
  122. package/dist/service/lines.js.map +1 -0
  123. package/dist/service/paths.d.ts +19 -0
  124. package/dist/service/paths.d.ts.map +1 -0
  125. package/dist/service/paths.js +27 -0
  126. package/dist/service/paths.js.map +1 -0
  127. package/dist/service/remote.d.ts +21 -0
  128. package/dist/service/remote.d.ts.map +1 -0
  129. package/dist/service/remote.js +83 -0
  130. package/dist/service/remote.js.map +1 -0
  131. package/dist/service/service-run.d.ts +3 -0
  132. package/dist/service/service-run.d.ts.map +1 -0
  133. package/dist/service/service-run.js +77 -0
  134. package/dist/service/service-run.js.map +1 -0
  135. package/dist/service/sid.d.ts +3 -0
  136. package/dist/service/sid.d.ts.map +1 -0
  137. package/dist/service/sid.js +10 -0
  138. package/dist/service/sid.js.map +1 -0
  139. package/dist/service/task.d.ts +11 -0
  140. package/dist/service/task.d.ts.map +1 -0
  141. package/dist/service/task.js +38 -0
  142. package/dist/service/task.js.map +1 -0
  143. package/dist/service/wire.d.ts +53 -0
  144. package/dist/service/wire.d.ts.map +1 -0
  145. package/dist/service/wire.js +17 -0
  146. package/dist/service/wire.js.map +1 -0
  147. package/dist/typing/android.d.ts +14 -0
  148. package/dist/typing/android.d.ts.map +1 -0
  149. package/dist/typing/android.js +117 -0
  150. package/dist/typing/android.js.map +1 -0
  151. package/dist/typing/index.d.ts +9 -0
  152. package/dist/typing/index.d.ts.map +1 -0
  153. package/dist/typing/index.js +21 -0
  154. package/dist/typing/index.js.map +1 -0
  155. package/dist/typing/linux.d.ts +6 -0
  156. package/dist/typing/linux.d.ts.map +1 -0
  157. package/dist/typing/linux.js +72 -0
  158. package/dist/typing/linux.js.map +1 -0
  159. package/dist/typing/mac.d.ts +5 -0
  160. package/dist/typing/mac.d.ts.map +1 -0
  161. package/dist/typing/mac.js +40 -0
  162. package/dist/typing/mac.js.map +1 -0
  163. package/dist/typing/typist.d.ts +32 -0
  164. package/dist/typing/typist.d.ts.map +1 -0
  165. package/dist/typing/typist.js +9 -0
  166. package/dist/typing/typist.js.map +1 -0
  167. package/dist/typing/windows.d.ts +4 -0
  168. package/dist/typing/windows.d.ts.map +1 -0
  169. package/dist/typing/windows.js +200 -0
  170. package/dist/typing/windows.js.map +1 -0
  171. package/dist/vault.d.ts +530 -0
  172. package/dist/vault.d.ts.map +1 -0
  173. package/dist/vault.js +188 -0
  174. package/dist/vault.js.map +1 -0
  175. package/dist/version.d.ts +2 -0
  176. package/dist/version.d.ts.map +1 -0
  177. package/dist/version.js +10 -0
  178. package/dist/version.js.map +1 -0
  179. package/package.json +56 -3
@@ -0,0 +1,72 @@
1
+ import { readlink } from "node:fs/promises";
2
+ import { basenameOf } from "../policy.js";
3
+ import { succeeded } from "../run.js";
4
+ import { noTypist } from "./typist.js";
5
+ const TIMEOUT_MS = 10_000;
6
+ const typingTimeout = (value) => TIMEOUT_MS + value.length * 50;
7
+ export const linuxSession = (env) => {
8
+ const wayland = env["XDG_SESSION_TYPE"] === "wayland" || ((env["WAYLAND_DISPLAY"] ?? "") !== "" && (env["DISPLAY"] ?? "") === "");
9
+ if (wayland) {
10
+ return "wayland";
11
+ }
12
+ return (env["DISPLAY"] ?? "") === "" ? "none" : "x11";
13
+ };
14
+ const activeWindow = async (runner) => {
15
+ const answer = await runner({ command: "xdotool", args: ["getactivewindow"], timeoutMs: TIMEOUT_MS });
16
+ const id = answer.stdout.trim();
17
+ return succeeded(answer) && /^\d+$/u.test(id) ? id : undefined;
18
+ };
19
+ const x11Typist = (runner, exeOf) => ({
20
+ inspect: async () => {
21
+ const window = await activeWindow(runner);
22
+ if (window === undefined) {
23
+ return { ok: false, reason: "xdotool could not name the active window: is xdotool installed, and is this an X11 session?" };
24
+ }
25
+ const pidAnswer = await runner({ command: "xdotool", args: ["getwindowpid", window], timeoutMs: TIMEOUT_MS });
26
+ const owner = pidAnswer.stdout.trim();
27
+ const path = succeeded(pidAnswer) && /^\d+$/u.test(owner) ? await exeOf(owner) : "";
28
+ return { ok: true, seen: { focus: { program: path === "" ? "" : basenameOf(path), path, field: "unknown" }, handle: window } };
29
+ },
30
+ type: async (_place, seen, value) => {
31
+ if ((await activeWindow(runner)) !== seen.handle) {
32
+ return { ok: false, reason: "The focus moved to another window before typing began; nothing was typed.", partly: false };
33
+ }
34
+ const typed = await runner({ command: "xdotool", args: ["type", "--clearmodifiers", "--file", "-"], input: value, timeoutMs: typingTimeout(value) });
35
+ if (!succeeded(typed)) {
36
+ return { ok: false, reason: "xdotool could not type; some of the value may have gone in.", partly: true };
37
+ }
38
+ const after = await activeWindow(runner);
39
+ return after === seen.handle
40
+ ? { ok: true }
41
+ : { ok: false, reason: "The focus moved to another window while typing: some of the value may have gone there.", partly: true };
42
+ },
43
+ });
44
+ const waylandTypist = (runner) => ({
45
+ inspect: () => Promise.resolve({ ok: true, seen: { focus: { program: "", path: "", field: "unknown" }, handle: "wayland" } }),
46
+ type: async (_place, _seen, value) => {
47
+ const typed = await runner({ command: "wtype", args: ["-"], input: value, timeoutMs: typingTimeout(value) });
48
+ if (typed.missing) {
49
+ return { ok: false, reason: "wtype is not installed: install it to type into Wayland windows.", partly: false };
50
+ }
51
+ return succeeded(typed) ? { ok: true } : { ok: false, reason: "wtype could not type; some of the value may have gone in.", partly: true };
52
+ },
53
+ });
54
+ const procExe = async (pid) => {
55
+ try {
56
+ return await readlink(`/proc/${pid}/exe`);
57
+ }
58
+ catch {
59
+ return "";
60
+ }
61
+ };
62
+ export const linuxTypist = (runner, env = process.env, exeOf = procExe) => {
63
+ switch (linuxSession(env)) {
64
+ case "x11":
65
+ return x11Typist(runner, exeOf);
66
+ case "wayland":
67
+ return waylandTypist(runner);
68
+ case "none":
69
+ return noTypist("There is no desktop session to type into (neither DISPLAY nor WAYLAND_DISPLAY is set).");
70
+ }
71
+ };
72
+ //# sourceMappingURL=linux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux.js","sourceRoot":"","sources":["../../src/typing/linux.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type Runner } from "../run.js";
2
+ import type { Typist } from "./typist.js";
3
+ export declare const keystrokeScript: (pid: string, value: string) => string;
4
+ export declare const macTypist: (runner: Runner) => Typist;
5
+ //# sourceMappingURL=mac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mac.d.ts","sourceRoot":"","sources":["../../src/typing/mac.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAA0B,MAAM,EAAE,MAAM,aAAa,CAAC;AAqBlE,eAAO,MAAM,eAAe,QAAS,MAAM,SAAS,MAAM,KAAG,MAO7C,CAAC;AAEjB,eAAO,MAAM,SAAS,WAAY,MAAM,KAAG,MAmBzC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ import { basenameOf } from "../policy.js";
3
+ import { succeeded } from "../run.js";
4
+ const TIMEOUT_MS = 15_000;
5
+ const FRONTMOST = [
6
+ `tell application "System Events"`,
7
+ `set p to first application process whose frontmost is true`,
8
+ `return (unix id of p as text) & linefeed & POSIX path of (application file of p)`,
9
+ `end tell`,
10
+ ].join("\n");
11
+ const FrontmostSchema = z.object({ pid: z.string().regex(/^\d+$/u), path: z.string() });
12
+ const appleScriptText = (text) => `"${text.replace(/\\/gu, "\\\\").replace(/"/gu, '\\"')}"`;
13
+ export const keystrokeScript = (pid, value) => [
14
+ `tell application "System Events"`,
15
+ `set p to first application process whose frontmost is true`,
16
+ `if (unix id of p as text) is not "${pid}" then error "moved"`,
17
+ `keystroke ${appleScriptText(value)}`,
18
+ `end tell`,
19
+ ].join("\n");
20
+ export const macTypist = (runner) => ({
21
+ inspect: async () => {
22
+ const answer = await runner({ command: "osascript", args: ["-"], input: FRONTMOST, timeoutMs: TIMEOUT_MS });
23
+ const [pid, path] = answer.stdout.trim().split("\n");
24
+ const front = FrontmostSchema.safeParse({ pid, path: path?.replace(/\/$/u, "") });
25
+ if (!succeeded(answer) || !front.success) {
26
+ return { ok: false, reason: "System Events did not name the frontmost app: allow the keyring under Privacy & Security, Accessibility." };
27
+ }
28
+ return { ok: true, seen: { focus: { program: basenameOf(front.data.path), path: front.data.path, field: "unknown" }, handle: front.data.pid } };
29
+ },
30
+ type: async (_place, seen, value) => {
31
+ const typed = await runner({ command: "osascript", args: ["-"], input: keystrokeScript(seen.handle, value), timeoutMs: TIMEOUT_MS + value.length * 50 });
32
+ if (succeeded(typed)) {
33
+ return { ok: true };
34
+ }
35
+ return /moved/u.test(typed.stderr)
36
+ ? { ok: false, reason: "The focus moved to another app before typing began; nothing was typed.", partly: false }
37
+ : { ok: false, reason: "System Events could not type: allow the keyring under Privacy & Security, Accessibility.", partly: false };
38
+ },
39
+ });
40
+ //# sourceMappingURL=mac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mac.js","sourceRoot":"","sources":["../../src/typing/mac.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Focus } from "../policy.js";
2
+ export type Place = {
3
+ readonly kind: "window";
4
+ } | {
5
+ readonly kind: "android";
6
+ readonly serial: string;
7
+ };
8
+ export interface Seen {
9
+ readonly focus: Focus;
10
+ readonly handle: string;
11
+ }
12
+ export type Inspected = {
13
+ readonly ok: true;
14
+ readonly seen: Seen;
15
+ } | {
16
+ readonly ok: false;
17
+ readonly reason: string;
18
+ };
19
+ export type Typed = {
20
+ readonly ok: true;
21
+ } | {
22
+ readonly ok: false;
23
+ readonly reason: string;
24
+ readonly partly: boolean;
25
+ };
26
+ export interface Typist {
27
+ readonly inspect: (place: Place) => Promise<Inspected>;
28
+ readonly type: (place: Place, seen: Seen, value: string) => Promise<Typed>;
29
+ }
30
+ export declare const noTypist: (why: string) => Typist;
31
+ export declare const typistFor: (window: Typist, android: Typist) => Typist;
32
+ //# sourceMappingURL=typist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typist.d.ts","sourceRoot":"","sources":["../../src/typing/typist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAO1C,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAKxG,MAAM,WAAW,IAAI;IACjB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErH,MAAM,MAAM,KAAK,GACX;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAErB;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,MAAM;IACnB,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;CAC9E;AAGD,eAAO,MAAM,QAAQ,QAAS,MAAM,KAAG,MAGrC,CAAC;AAGH,eAAO,MAAM,SAAS,WAAY,MAAM,WAAW,MAAM,KAAG,MAG1D,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const noTypist = (why) => ({
2
+ inspect: () => Promise.resolve({ ok: false, reason: why }),
3
+ type: () => Promise.resolve({ ok: false, reason: why, partly: false }),
4
+ });
5
+ export const typistFor = (window, android) => ({
6
+ inspect: async (place) => await (place.kind === "window" ? window : android).inspect(place),
7
+ type: async (place, seen, value) => await (place.kind === "window" ? window : android).type(place, seen, value),
8
+ });
9
+ //# sourceMappingURL=typist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typist.js","sourceRoot":"","sources":["../../src/typing/typist.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,CAAC;IAC9C,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC1D,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;CACzE,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,OAAe,EAAU,EAAE,CAAC,CAAC;IACnE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3F,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;CAClH,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Runner } from "../run.js";
2
+ import type { Typist } from "./typist.js";
3
+ export declare const windowsTypist: (runner: Runner) => Typist;
4
+ //# sourceMappingURL=windows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../../src/typing/windows.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAA0B,MAAM,EAAE,MAAM,aAAa,CAAC;AA6LlE,eAAO,MAAM,aAAa,WAAY,MAAM,KAAG,MA6B7C,CAAC"}
@@ -0,0 +1,200 @@
1
+ import { z } from "zod";
2
+ import { basenameOf } from "../policy.js";
3
+ import { CSHARP_JSON, runPowerShell } from "../powershell.js";
4
+ const HELPER = String.raw `
5
+ using System;
6
+ using System.Runtime.InteropServices;
7
+ using System.Text;
8
+ using System.Threading;
9
+ using System.Windows.Automation;
10
+
11
+ ${CSHARP_JSON}
12
+
13
+ public static class KeyringTypist {
14
+ [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow();
15
+ [DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(IntPtr window, out uint processId);
16
+ [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr OpenProcess(uint access, bool inherit, uint processId);
17
+ [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] static extern bool QueryFullProcessImageName(IntPtr process, uint flags, StringBuilder name, ref uint size);
18
+ [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr handle);
19
+ [DllImport("user32.dll", SetLastError = true)] static extern uint SendInput(uint count, INPUT[] inputs, int size);
20
+
21
+ [StructLayout(LayoutKind.Sequential)] public struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; }
22
+ [StructLayout(LayoutKind.Sequential)] public struct MOUSEINPUT { public int dx; public int dy; public uint mouseData; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; }
23
+ // The union is as large as its largest member, the mouse's: SendInput refuses an INPUT of the wrong size.
24
+ [StructLayout(LayoutKind.Explicit)] public struct INPUTUNION { [FieldOffset(0)] public MOUSEINPUT mi; [FieldOffset(0)] public KEYBDINPUT ki; }
25
+ [StructLayout(LayoutKind.Sequential)] public struct INPUT { public uint type; public INPUTUNION u; }
26
+
27
+ const uint INPUT_KEYBOARD = 1;
28
+ const uint KEYEVENTF_KEYUP = 0x0002;
29
+ const uint KEYEVENTF_UNICODE = 0x0004;
30
+ const ushort VK_RETURN = 0x0D;
31
+ const ushort VK_TAB = 0x09;
32
+ const uint PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;
33
+
34
+ static string ImagePath(uint processId) {
35
+ IntPtr process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, processId);
36
+ if (process == IntPtr.Zero) return "";
37
+ try {
38
+ StringBuilder name = new StringBuilder(1024);
39
+ uint size = (uint)name.Capacity;
40
+ return QueryFullProcessImageName(process, 0, name, ref size) ? name.ToString(0, (int)size) : "";
41
+ } finally { CloseHandle(process); }
42
+ }
43
+
44
+ static string ForegroundPath() {
45
+ uint processId;
46
+ GetWindowThreadProcessId(GetForegroundWindow(), out processId);
47
+ return ImagePath(processId);
48
+ }
49
+
50
+ static string ElementId(AutomationElement element) {
51
+ int[] id = element.GetRuntimeId();
52
+ if (id == null) return "";
53
+ string[] parts = new string[id.Length];
54
+ for (int i = 0; i < id.Length; i++) parts[i] = id[i].ToString();
55
+ return string.Join(".", parts);
56
+ }
57
+
58
+ public static string Inspect() {
59
+ IntPtr window = GetForegroundWindow();
60
+ if (window == IntPtr.Zero) return "{\"ok\":false,\"reason\":\"no window holds the keyboard's focus\"}";
61
+ uint processId;
62
+ GetWindowThreadProcessId(window, out processId);
63
+ string path = ImagePath(processId);
64
+ bool password = false;
65
+ bool known = false;
66
+ string element = "";
67
+ string control = "";
68
+ try {
69
+ AutomationElement focused = AutomationElement.FocusedElement;
70
+ if (focused != null && focused.Current.ProcessId == (int)processId) {
71
+ password = focused.Current.IsPassword;
72
+ control = focused.Current.ControlType.ProgrammaticName;
73
+ element = ElementId(focused);
74
+ known = true;
75
+ }
76
+ } catch (Exception) { } // allow(silent-catch): a window that does not answer UI Automation leaves the field unknown, which policy treats as not a password field
77
+ StringBuilder b = new StringBuilder("{\"ok\":true");
78
+ b.Append(",\"window\":").Append(window.ToInt64());
79
+ b.Append(",\"path\":").Append(KeyringJson.Str(path));
80
+ b.Append(",\"field\":").Append(KeyringJson.Str(!known ? "unknown" : password ? "password" : "text"));
81
+ b.Append(",\"control\":").Append(KeyringJson.Str(control));
82
+ b.Append(",\"element\":").Append(KeyringJson.Str(element));
83
+ return b.Append('}').ToString();
84
+ }
85
+
86
+ static INPUT Key(ushort vk, ushort scan, uint flags) {
87
+ INPUT input = new INPUT();
88
+ input.type = INPUT_KEYBOARD;
89
+ input.u.ki.wVk = vk;
90
+ input.u.ki.wScan = scan;
91
+ input.u.ki.dwFlags = flags;
92
+ return input;
93
+ }
94
+
95
+ static bool Still(IntPtr window, string element) {
96
+ if (GetForegroundWindow() != window) return false;
97
+ if (element == "") return true;
98
+ // allow(silent-catch): an element UI Automation can no longer read is not the field the typing started in, so typing stops.
99
+ try { return ElementId(AutomationElement.FocusedElement) == element; } catch (Exception) { return false; }
100
+ }
101
+
102
+ static string Stopped(string why, int typed, int total) {
103
+ return "{\"ok\":false,\"reason\":" + KeyringJson.Str(why) + ",\"typed\":" + typed + ",\"total\":" + total + ",\"now\":" + KeyringJson.Str(ForegroundPath()) + "}";
104
+ }
105
+
106
+ public static string Type(long windowHandle, string element, string text) {
107
+ IntPtr window = new IntPtr(windowHandle);
108
+ if (!Still(window, element)) return Stopped("moved", 0, text.Length);
109
+ int size = Marshal.SizeOf(typeof(INPUT));
110
+ int typed = 0;
111
+ for (int i = 0; i < text.Length; i++) {
112
+ char c = text[i];
113
+ INPUT[] inputs;
114
+ int units = 1;
115
+ if (c == '\r' || c == '\n') {
116
+ if (c == '\r' && i + 1 < text.Length && text[i + 1] == '\n') { i++; units = 2; }
117
+ inputs = new INPUT[] { Key(VK_RETURN, 0, 0), Key(VK_RETURN, 0, KEYEVENTF_KEYUP) };
118
+ } else if (c == '\t') {
119
+ inputs = new INPUT[] { Key(VK_TAB, 0, 0), Key(VK_TAB, 0, KEYEVENTF_KEYUP) };
120
+ } else if (char.IsHighSurrogate(c) && i + 1 < text.Length && char.IsLowSurrogate(text[i + 1])) {
121
+ // A character past the BMP is its two UTF-16 units, pressed in order and released after.
122
+ char low = text[++i];
123
+ units = 2;
124
+ inputs = new INPUT[] { Key(0, c, KEYEVENTF_UNICODE), Key(0, low, KEYEVENTF_UNICODE), Key(0, c, KEYEVENTF_UNICODE | KEYEVENTF_KEYUP), Key(0, low, KEYEVENTF_UNICODE | KEYEVENTF_KEYUP) };
125
+ } else {
126
+ inputs = new INPUT[] { Key(0, c, KEYEVENTF_UNICODE), Key(0, c, KEYEVENTF_UNICODE | KEYEVENTF_KEYUP) };
127
+ }
128
+ if (SendInput((uint)inputs.Length, inputs, size) != (uint)inputs.Length) return Stopped("blocked", typed, text.Length);
129
+ typed += units;
130
+ Thread.Sleep(4);
131
+ if (!Still(window, element)) return Stopped("moved", typed, text.Length);
132
+ }
133
+ return "{\"ok\":true,\"typed\":" + typed + ",\"total\":" + text.Length + "}";
134
+ }
135
+ }
136
+ `;
137
+ const SCRIPT = `
138
+ $ErrorActionPreference = 'Stop'
139
+ try {
140
+ Add-Type -AssemblyName UIAutomationClient, UIAutomationTypes
141
+ Add-Type -IgnoreWarnings -ReferencedAssemblies UIAutomationClient, UIAutomationTypes, WindowsBase -TypeDefinition @'
142
+ ${HELPER}
143
+ '@
144
+ if ($KeyringInput.op -eq 'inspect') {
145
+ [Console]::Out.WriteLine('intentic-keyring>' + [KeyringTypist]::Inspect())
146
+ } else {
147
+ [Console]::Out.WriteLine('intentic-keyring>' + [KeyringTypist]::Type([long]$KeyringInput.window, [string]$KeyringInput.element, [string]$KeyringInput.value))
148
+ }
149
+ } catch {
150
+ [Console]::Out.WriteLine('intentic-keyring>' + (@{ ok = $false; reason = 'failed'; error = $_.Exception.Message } | ConvertTo-Json -Compress))
151
+ }
152
+ `;
153
+ const TIMEOUT_MS = 60_000;
154
+ const InspectSchema = z.discriminatedUnion("ok", [
155
+ z.object({ ok: z.literal(true), window: z.number(), path: z.string(), field: z.enum(["password", "text", "unknown"]), control: z.string(), element: z.string() }),
156
+ z.object({ ok: z.literal(false), reason: z.string(), error: z.string().optional() }),
157
+ ]);
158
+ const TypeSchema = z.discriminatedUnion("ok", [
159
+ z.object({ ok: z.literal(true), typed: z.number(), total: z.number() }),
160
+ z.object({ ok: z.literal(false), reason: z.string(), typed: z.number().optional(), total: z.number().optional(), now: z.string().optional(), error: z.string().optional() }),
161
+ ]);
162
+ const HANDLE = /^(?<window>-?\d+)\/(?<element>[\d.]*)$/u;
163
+ const stoppedReason = (answer) => {
164
+ const now = answer.now === undefined || answer.now === "" ? "another window" : basenameOf(answer.now);
165
+ const where = answer.typed === undefined || answer.typed === 0 ? "nothing was typed" : `${String(answer.typed)} of ${String(answer.total ?? "?")} characters went in before it stopped`;
166
+ switch (answer.reason) {
167
+ case "moved":
168
+ return `The focus moved to ${now} while typing; ${where}.`;
169
+ case "blocked":
170
+ return `Windows refused the keystrokes (a window running as administrator takes none from a program that is not); ${where}.`;
171
+ default:
172
+ return `The typing helper failed${answer.error === undefined ? "" : `: ${answer.error.slice(0, 200)}`}.`;
173
+ }
174
+ };
175
+ export const windowsTypist = (runner) => ({
176
+ inspect: async () => {
177
+ const ran = await runPowerShell(runner, { script: SCRIPT, input: { op: "inspect" }, timeoutMs: TIMEOUT_MS }, InspectSchema);
178
+ if (!ran.ok) {
179
+ return { ok: false, reason: ran.reason };
180
+ }
181
+ const answer = ran.answer;
182
+ if (!answer.ok) {
183
+ return { ok: false, reason: answer.error ?? answer.reason };
184
+ }
185
+ return { ok: true, seen: { focus: { program: basenameOf(answer.path), path: answer.path, field: answer.field }, handle: `${String(answer.window)}/${answer.element}` } };
186
+ },
187
+ type: async (_place, seen, value) => {
188
+ const handle = HANDLE.exec(seen.handle);
189
+ if (handle?.groups?.["window"] === undefined) {
190
+ return { ok: false, reason: "The window to type into was not one this typist inspected.", partly: false };
191
+ }
192
+ const ran = await runPowerShell(runner, { script: SCRIPT, input: { op: "type", window: handle.groups["window"], element: handle.groups["element"] ?? "", value }, timeoutMs: TIMEOUT_MS + value.length * 50 }, TypeSchema);
193
+ if (!ran.ok) {
194
+ return { ok: false, reason: ran.reason, partly: true };
195
+ }
196
+ const answer = ran.answer;
197
+ return answer.ok ? { ok: true } : { ok: false, reason: stoppedReason(answer), partly: (answer.typed ?? 0) > 0 };
198
+ },
199
+ });
200
+ //# sourceMappingURL=windows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows.js","sourceRoot":"","sources":["../../src/typing/windows.ts"],"names":[],"mappings":"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"}