@intentic/keyring 1.343.0 → 1.345.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.
- package/README.md +141 -45
- package/dist/address.d.ts +0 -1
- package/dist/address.d.ts.map +1 -1
- package/dist/address.js +1 -1
- package/dist/address.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +49 -48
- package/dist/app.js.map +1 -1
- package/dist/askpass/answer.d.ts +12 -0
- package/dist/askpass/answer.d.ts.map +1 -0
- package/dist/askpass/answer.js +204 -0
- package/dist/askpass/answer.js.map +1 -0
- package/dist/askpass/askpass.d.ts +6 -0
- package/dist/askpass/askpass.d.ts.map +1 -1
- package/dist/askpass/askpass.js +28 -0
- package/dist/askpass/askpass.js.map +1 -1
- package/dist/audit.d.ts +5 -2
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +15 -2
- package/dist/audit.js.map +1 -1
- package/dist/consent/consent-posix.d.ts +7 -3
- package/dist/consent/consent-posix.d.ts.map +1 -1
- package/dist/consent/consent-posix.js +82 -12
- package/dist/consent/consent-posix.js.map +1 -1
- package/dist/consent/consent-windows.d.ts +3 -1
- package/dist/consent/consent-windows.d.ts.map +1 -1
- package/dist/consent/consent-windows.js +174 -62
- package/dist/consent/consent-windows.js.map +1 -1
- package/dist/consent/consent.d.ts +41 -2
- package/dist/consent/consent.d.ts.map +1 -1
- package/dist/consent/consent.js +7 -5
- package/dist/consent/consent.js.map +1 -1
- package/dist/core.d.ts +3 -30
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +189 -62
- package/dist/core.js.map +1 -1
- package/dist/git-credential/git-credential.d.ts +18 -0
- package/dist/git-credential/git-credential.d.ts.map +1 -0
- package/dist/git-credential/git-credential.js +68 -0
- package/dist/git-credential/git-credential.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/native-host/framing.d.ts +10 -0
- package/dist/native-host/framing.d.ts.map +1 -0
- package/dist/native-host/framing.js +33 -0
- package/dist/native-host/framing.js.map +1 -0
- package/dist/native-host/native-host.d.ts +11 -0
- package/dist/native-host/native-host.d.ts.map +1 -0
- package/dist/native-host/native-host.js +130 -0
- package/dist/native-host/native-host.js.map +1 -0
- package/dist/passwords/access.d.ts +73 -0
- package/dist/passwords/access.d.ts.map +1 -0
- package/dist/passwords/access.js +3 -0
- package/dist/passwords/access.js.map +1 -0
- package/dist/passwords/app-ops.d.ts +18 -0
- package/dist/passwords/app-ops.d.ts.map +1 -0
- package/dist/passwords/app-ops.js +261 -0
- package/dist/passwords/app-ops.js.map +1 -0
- package/dist/passwords/capture.d.ts +35 -0
- package/dist/passwords/capture.d.ts.map +1 -0
- package/dist/passwords/capture.js +306 -0
- package/dist/passwords/capture.js.map +1 -0
- package/dist/passwords/entries.d.ts +20 -0
- package/dist/passwords/entries.d.ts.map +1 -0
- package/dist/passwords/entries.js +57 -0
- package/dist/passwords/entries.js.map +1 -0
- package/dist/passwords/fills.d.ts +10 -0
- package/dist/passwords/fills.d.ts.map +1 -0
- package/dist/passwords/fills.js +87 -0
- package/dist/passwords/fills.js.map +1 -0
- package/dist/passwords/needs.d.ts +11 -0
- package/dist/passwords/needs.d.ts.map +1 -0
- package/dist/passwords/needs.js +232 -0
- package/dist/passwords/needs.js.map +1 -0
- package/dist/passwords/phone.d.ts +19 -0
- package/dist/passwords/phone.d.ts.map +1 -0
- package/dist/passwords/phone.js +125 -0
- package/dist/passwords/phone.js.map +1 -0
- package/dist/protocol.d.ts +1169 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +86 -1
- package/dist/protocol.js.map +1 -1
- package/dist/service/channel.d.ts +10 -3
- package/dist/service/channel.d.ts.map +1 -1
- package/dist/service/channel.js +31 -13
- package/dist/service/channel.js.map +1 -1
- package/dist/service/door.d.ts +45 -4
- package/dist/service/door.d.ts.map +1 -1
- package/dist/service/door.js +31 -2
- package/dist/service/door.js.map +1 -1
- package/dist/service/helper.d.ts +18 -1
- package/dist/service/helper.d.ts.map +1 -1
- package/dist/service/helper.js +68 -28
- package/dist/service/helper.js.map +1 -1
- package/dist/service/linux/install-linux.d.ts +12 -0
- package/dist/service/linux/install-linux.d.ts.map +1 -0
- package/dist/service/linux/install-linux.js +133 -0
- package/dist/service/linux/install-linux.js.map +1 -0
- package/dist/service/linux/paths-linux.d.ts +21 -0
- package/dist/service/linux/paths-linux.d.ts.map +1 -0
- package/dist/service/linux/paths-linux.js +31 -0
- package/dist/service/linux/paths-linux.js.map +1 -0
- package/dist/service/linux/polkit-linux.d.ts +29 -0
- package/dist/service/linux/polkit-linux.d.ts.map +1 -0
- package/dist/service/linux/polkit-linux.js +89 -0
- package/dist/service/linux/polkit-linux.js.map +1 -0
- package/dist/service/linux/service-run-linux.d.ts +4 -0
- package/dist/service/linux/service-run-linux.d.ts.map +1 -0
- package/dist/service/linux/service-run-linux.js +52 -0
- package/dist/service/linux/service-run-linux.js.map +1 -0
- package/dist/service/linux/session-linux.d.ts +4 -0
- package/dist/service/linux/session-linux.d.ts.map +1 -0
- package/dist/service/linux/session-linux.js +13 -0
- package/dist/service/linux/session-linux.js.map +1 -0
- package/dist/service/linux/unit-linux.d.ts +16 -0
- package/dist/service/linux/unit-linux.d.ts.map +1 -0
- package/dist/service/linux/unit-linux.js +67 -0
- package/dist/service/linux/unit-linux.js.map +1 -0
- package/dist/service/platform.d.ts +7 -0
- package/dist/service/platform.d.ts.map +1 -0
- package/dist/service/platform.js +62 -0
- package/dist/service/platform.js.map +1 -0
- package/dist/service/recovery.d.ts +3 -0
- package/dist/service/recovery.d.ts.map +1 -0
- package/dist/service/recovery.js +22 -0
- package/dist/service/recovery.js.map +1 -0
- package/dist/service/remote.d.ts +4 -1
- package/dist/service/remote.d.ts.map +1 -1
- package/dist/service/remote.js +41 -6
- package/dist/service/remote.js.map +1 -1
- package/dist/service/service-key.d.ts +9 -0
- package/dist/service/service-key.d.ts.map +1 -0
- package/dist/service/service-key.js +55 -0
- package/dist/service/service-key.js.map +1 -0
- package/dist/service/service-run.d.ts +20 -2
- package/dist/service/service-run.d.ts.map +1 -1
- package/dist/service/service-run.js +52 -46
- package/dist/service/service-run.js.map +1 -1
- package/dist/service/user.d.ts +8 -0
- package/dist/service/user.d.ts.map +1 -0
- package/dist/service/user.js +39 -0
- package/dist/service/user.js.map +1 -0
- package/dist/service/{acl.d.ts → windows/acl-windows.d.ts} +3 -3
- package/dist/service/windows/acl-windows.d.ts.map +1 -0
- package/dist/service/{acl.js → windows/acl-windows.js} +3 -3
- package/dist/service/windows/acl-windows.js.map +1 -0
- package/dist/service/{install.d.ts → windows/install-windows.d.ts} +4 -2
- package/dist/service/windows/install-windows.d.ts.map +1 -0
- package/dist/service/{install.js → windows/install-windows.js} +13 -12
- package/dist/service/windows/install-windows.js.map +1 -0
- package/dist/service/windows/leftovers-windows.d.ts +8 -0
- package/dist/service/windows/leftovers-windows.d.ts.map +1 -0
- package/dist/service/windows/leftovers-windows.js +44 -0
- package/dist/service/windows/leftovers-windows.js.map +1 -0
- package/dist/service/{paths.d.ts → windows/paths-windows.d.ts} +4 -5
- package/dist/service/windows/paths-windows.d.ts.map +1 -0
- package/dist/service/{paths.js → windows/paths-windows.js} +5 -5
- package/dist/service/windows/paths-windows.js.map +1 -0
- package/dist/service/windows/service-run-windows.d.ts +4 -0
- package/dist/service/windows/service-run-windows.d.ts.map +1 -0
- package/dist/service/windows/service-run-windows.js +46 -0
- package/dist/service/windows/service-run-windows.js.map +1 -0
- package/dist/service/windows/session-windows.d.ts +4 -0
- package/dist/service/windows/session-windows.d.ts.map +1 -0
- package/dist/service/windows/session-windows.js +13 -0
- package/dist/service/windows/session-windows.js.map +1 -0
- package/dist/service/windows/sid-windows.d.ts +3 -0
- package/dist/service/windows/sid-windows.d.ts.map +1 -0
- package/dist/service/{sid.js → windows/sid-windows.js} +2 -2
- package/dist/service/windows/sid-windows.js.map +1 -0
- package/dist/service/{task.d.ts → windows/task-windows.d.ts} +4 -3
- package/dist/service/windows/task-windows.d.ts.map +1 -0
- package/dist/service/{task.js → windows/task-windows.js} +19 -2
- package/dist/service/windows/task-windows.js.map +1 -0
- package/dist/service/wire.d.ts +32 -0
- package/dist/service/wire.d.ts.map +1 -1
- package/dist/service/wire.js +15 -0
- package/dist/service/wire.js.map +1 -1
- package/dist/typing/clipboard.d.ts +13 -0
- package/dist/typing/clipboard.d.ts.map +1 -0
- package/dist/typing/clipboard.js +56 -0
- package/dist/typing/clipboard.js.map +1 -0
- package/dist/typing/index.d.ts.map +1 -1
- package/dist/typing/index.js +2 -1
- package/dist/typing/index.js.map +1 -1
- package/dist/typing/typist.d.ts +3 -1
- package/dist/typing/typist.d.ts.map +1 -1
- package/dist/typing/typist.js +2 -1
- package/dist/typing/typist.js.map +1 -1
- package/dist/vault.d.ts +785 -0
- package/dist/vault.d.ts.map +1 -1
- package/dist/vault.js +24 -2
- package/dist/vault.js.map +1 -1
- package/dist/watch/apps.d.ts +10 -0
- package/dist/watch/apps.d.ts.map +1 -0
- package/dist/watch/apps.js +95 -0
- package/dist/watch/apps.js.map +1 -0
- package/dist/watch/chip.d.ts +52 -0
- package/dist/watch/chip.d.ts.map +1 -0
- package/dist/watch/chip.js +76 -0
- package/dist/watch/chip.js.map +1 -0
- package/dist/watch/lines-child.d.ts +9 -0
- package/dist/watch/lines-child.d.ts.map +1 -0
- package/dist/watch/lines-child.js +34 -0
- package/dist/watch/lines-child.js.map +1 -0
- package/dist/watch/watch-linux.d.ts +6 -0
- package/dist/watch/watch-linux.d.ts.map +1 -0
- package/dist/watch/watch-linux.js +52 -0
- package/dist/watch/watch-linux.js.map +1 -0
- package/dist/watch/watch-windows.d.ts +6 -0
- package/dist/watch/watch-windows.d.ts.map +1 -0
- package/dist/watch/watch-windows.js +110 -0
- package/dist/watch/watch-windows.js.map +1 -0
- package/package.json +5 -5
- package/dist/serve.d.ts +0 -17
- package/dist/serve.d.ts.map +0 -1
- package/dist/serve.js +0 -65
- package/dist/serve.js.map +0 -1
- package/dist/service/acl.d.ts.map +0 -1
- package/dist/service/acl.js.map +0 -1
- package/dist/service/install.d.ts.map +0 -1
- package/dist/service/install.js.map +0 -1
- package/dist/service/paths.d.ts.map +0 -1
- package/dist/service/paths.js.map +0 -1
- package/dist/service/sid.d.ts +0 -3
- package/dist/service/sid.d.ts.map +0 -1
- package/dist/service/sid.js.map +0 -1
- package/dist/service/task.d.ts.map +0 -1
- package/dist/service/task.js.map +0 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { writeFileAtomic } from "@intentic/base/fs";
|
|
2
|
+
import { passphraseConsent, serialConsent } from "../../consent/consent.js";
|
|
3
|
+
import { succeeded } from "../../run.js";
|
|
4
|
+
import { linuxServicePaths } from "./paths-linux.js";
|
|
5
|
+
import { askPolkit, polkitConsent, subjectOf } from "./polkit-linux.js";
|
|
6
|
+
import { remoteChoicePrompt, remotePassphrasePrompt, remoteValuePrompt } from "../remote.js";
|
|
7
|
+
import { ServiceKey } from "../service-key.js";
|
|
8
|
+
import { doorAclArgs } from "./unit-linux.js";
|
|
9
|
+
export const linuxServiceRun = (uid, runner) => {
|
|
10
|
+
const paths = linuxServicePaths(uid);
|
|
11
|
+
const serviceKey = new ServiceKey(paths.serviceKey, paths.vaultDir);
|
|
12
|
+
let helper;
|
|
13
|
+
return {
|
|
14
|
+
vaultDir: paths.vaultDir,
|
|
15
|
+
place: { kind: "unix", path: paths.socket },
|
|
16
|
+
consent: (link) => {
|
|
17
|
+
const recovery = { ...passphraseConsent(remotePassphrasePrompt(link)), askValue: remoteValuePrompt(link), choose: remoteChoicePrompt(link) };
|
|
18
|
+
return serialConsent(polkitConsent({ runner, helper: () => (link.ready ? helper : undefined), serviceKey, recovery }));
|
|
19
|
+
},
|
|
20
|
+
helloCredential: () => Promise.resolve("intentic-keyring"),
|
|
21
|
+
challenge: () => Promise.resolve({ method: "polkit" }),
|
|
22
|
+
proven: async (challenge, proof) => {
|
|
23
|
+
if (challenge.method !== "polkit" || proof.method !== "polkit") {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const subject = await subjectOf(proof.pid, uid);
|
|
27
|
+
if (subject === undefined) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const said = await askPolkit(runner, subject, { title: "Connect Passwords", message: "Passwords on this computer asks you to confirm it is you, once for this sign-in." });
|
|
31
|
+
if (said !== "yes") {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
helper = subject;
|
|
35
|
+
return true;
|
|
36
|
+
},
|
|
37
|
+
beforeWrite: async (file) => await serviceKey.merged(file),
|
|
38
|
+
afterSetup: async (vaultKey) => {
|
|
39
|
+
await serviceKey.adopt(vaultKey);
|
|
40
|
+
},
|
|
41
|
+
publish: async (door, log) => {
|
|
42
|
+
await writeFileAtomic(paths.door, `${JSON.stringify(door)}\n`, 0o600);
|
|
43
|
+
for (const args of doorAclArgs(paths)) {
|
|
44
|
+
const set = await runner({ command: "setfacl", args, timeoutMs: 10_000 });
|
|
45
|
+
if (!succeeded(set)) {
|
|
46
|
+
log(`setfacl ${args.join(" ")} failed (${set.missing ? "setfacl is not installed" : `exit ${String(set.exitCode)}`}): the session helper cannot reach the door`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=service-run-linux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-run-linux.js","sourceRoot":"","sources":["../../../src/service/linux/service-run-linux.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-linux.d.ts","sourceRoot":"","sources":["../../../src/service/linux/session-linux.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAOpD,eAAO,MAAM,YAAY,WAAkB,MAAM,KAAG,OAAO,CAAC,eAAe,CAO1E,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { linuxChoicePrompt, linuxPassphrasePrompt, linuxValuePrompt } from "../../consent/consent-posix.js";
|
|
2
|
+
import { platformTypist } from "../../typing/index.js";
|
|
3
|
+
import { linuxServicePaths } from "./paths-linux.js";
|
|
4
|
+
import { serviceUserId } from "../user.js";
|
|
5
|
+
export const linuxSession = async (runner) => {
|
|
6
|
+
const paths = linuxServicePaths(await serviceUserId(runner, "linux"));
|
|
7
|
+
return {
|
|
8
|
+
doorFile: paths.door,
|
|
9
|
+
noService: `Passwords' service is not running: \`systemctl status ${paths.unitName}\` says why.`,
|
|
10
|
+
hands: { hello: undefined, passphrase: linuxPassphrasePrompt(runner), value: linuxValuePrompt(runner), choose: linuxChoicePrompt(runner), typist: platformTypist(runner) },
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=session-linux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-linux.js","sourceRoot":"","sources":["../../../src/service/linux/session-linux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAE5G,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAK3C,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,MAAc,EAA4B,EAAE;IAC3E,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,OAAO;QACH,QAAQ,EAAE,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,yDAAyD,KAAK,CAAC,QAAQ,cAAc;QAChG,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,qBAAqB,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE;KAC7K,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type LinuxServicePaths } from "./paths-linux.js";
|
|
2
|
+
export declare const unitText: (paths: Pick<LinuxServicePaths, "exe">) => string;
|
|
3
|
+
export declare const policyText: () => string;
|
|
4
|
+
export declare const addServiceUserArgs: () => readonly string[];
|
|
5
|
+
export declare const enableArgs: (paths: Pick<LinuxServicePaths, "unitName">) => readonly string[];
|
|
6
|
+
export declare const restartArgs: (paths: Pick<LinuxServicePaths, "unitName">) => readonly string[];
|
|
7
|
+
export declare const disableArgs: (paths: Pick<LinuxServicePaths, "unitName">) => readonly string[];
|
|
8
|
+
export declare const stopArgs: (paths: Pick<LinuxServicePaths, "unitName">) => readonly string[];
|
|
9
|
+
export declare const doorAclArgs: (paths: Pick<LinuxServicePaths, "uid" | "runDir" | "socket" | "door">) => readonly (readonly string[])[];
|
|
10
|
+
export declare const passwdEntry: (line: string) => {
|
|
11
|
+
readonly uid: number;
|
|
12
|
+
readonly gid: number;
|
|
13
|
+
readonly home: string;
|
|
14
|
+
} | undefined;
|
|
15
|
+
export declare const othersInstalledLinux: (rootNames: readonly string[], uid: string) => boolean;
|
|
16
|
+
//# sourceMappingURL=unit-linux.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-linux.d.ts","sourceRoot":"","sources":["../../../src/service/linux/unit-linux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAA+B,MAAM,kBAAkB,CAAC;AAQvF,eAAO,MAAM,QAAQ,UAAW,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAG,MA+BhE,CAAC;AAMF,eAAO,MAAM,UAAU,QAAO,MAkB7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,SAAS,MAAM,EAAkI,CAAC;AAExL,eAAO,MAAM,UAAU,UAAW,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,KAAG,SAAS,MAAM,EAAyC,CAAC;AACjI,eAAO,MAAM,WAAW,UAAW,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,KAAG,SAAS,MAAM,EAAiC,CAAC;AAC1H,eAAO,MAAM,WAAW,UAAW,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,KAAG,SAAS,MAAM,EAA0C,CAAC;AACnI,eAAO,MAAM,QAAQ,UAAW,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,KAAG,SAAS,MAAM,EAA8B,CAAC;AAIpH,eAAO,MAAM,WAAW,UAAW,IAAI,CAAC,iBAAiB,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,KAAG,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAI9H,CAAC;AAGF,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAIlH,CAAC;AAGF,eAAO,MAAM,oBAAoB,cAAe,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,OAA+F,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { POLKIT_ACTION, SERVICE_USER } from "./paths-linux.js";
|
|
2
|
+
export const unitText = (paths) => `[Unit]
|
|
3
|
+
Description=Passwords for user %i (Intentic)
|
|
4
|
+
Documentation=https://github.com/intentic/intentic/tree/main/_devices/keyring
|
|
5
|
+
After=polkit.service
|
|
6
|
+
|
|
7
|
+
[Service]
|
|
8
|
+
Type=simple
|
|
9
|
+
User=${SERVICE_USER}
|
|
10
|
+
Group=${SERVICE_USER}
|
|
11
|
+
ExecStart=${paths.exe} service run --user %i
|
|
12
|
+
Restart=always
|
|
13
|
+
RestartSec=5
|
|
14
|
+
StateDirectory=intentic-keyring/%i
|
|
15
|
+
StateDirectoryMode=0700
|
|
16
|
+
RuntimeDirectory=intentic-keyring/%i
|
|
17
|
+
RuntimeDirectoryMode=0700
|
|
18
|
+
UMask=0077
|
|
19
|
+
NoNewPrivileges=yes
|
|
20
|
+
ProtectSystem=strict
|
|
21
|
+
ProtectHome=yes
|
|
22
|
+
PrivateTmp=yes
|
|
23
|
+
PrivateDevices=yes
|
|
24
|
+
ProtectKernelTunables=yes
|
|
25
|
+
ProtectKernelModules=yes
|
|
26
|
+
ProtectControlGroups=yes
|
|
27
|
+
RestrictSUIDSGID=yes
|
|
28
|
+
LockPersonality=yes
|
|
29
|
+
|
|
30
|
+
[Install]
|
|
31
|
+
WantedBy=multi-user.target
|
|
32
|
+
`;
|
|
33
|
+
export const policyText = () => `<?xml version="1.0" encoding="UTF-8"?>
|
|
34
|
+
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
|
|
35
|
+
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
|
|
36
|
+
<policyconfig>
|
|
37
|
+
<vendor>Intentic</vendor>
|
|
38
|
+
<vendor_url>https://intentic.dev</vendor_url>
|
|
39
|
+
<action id="${POLKIT_ACTION}">
|
|
40
|
+
<description>Confirm a request to Passwords</description>
|
|
41
|
+
<message>Passwords asks: $(title). $(message)</message>
|
|
42
|
+
<defaults>
|
|
43
|
+
<allow_any>no</allow_any>
|
|
44
|
+
<allow_inactive>no</allow_inactive>
|
|
45
|
+
<allow_active>auth_self</allow_active>
|
|
46
|
+
</defaults>
|
|
47
|
+
<annotate key="org.freedesktop.policykit.owner">unix-user:${SERVICE_USER}</annotate>
|
|
48
|
+
</action>
|
|
49
|
+
</policyconfig>
|
|
50
|
+
`;
|
|
51
|
+
export const addServiceUserArgs = () => ["--system", "--user-group", "--no-create-home", "--home-dir", "/nonexistent", "--shell", "/usr/sbin/nologin", SERVICE_USER];
|
|
52
|
+
export const enableArgs = (paths) => ["enable", "--now", paths.unitName];
|
|
53
|
+
export const restartArgs = (paths) => ["restart", paths.unitName];
|
|
54
|
+
export const disableArgs = (paths) => ["disable", "--now", paths.unitName];
|
|
55
|
+
export const stopArgs = (paths) => ["stop", paths.unitName];
|
|
56
|
+
export const doorAclArgs = (paths) => [
|
|
57
|
+
["-m", `u:${paths.uid}:--x`, paths.runDir],
|
|
58
|
+
["-m", `u:${paths.uid}:rw-`, paths.socket],
|
|
59
|
+
["-m", `u:${paths.uid}:r--`, paths.door],
|
|
60
|
+
];
|
|
61
|
+
export const passwdEntry = (line) => {
|
|
62
|
+
const fields = line.trim().split(":");
|
|
63
|
+
const [uid, gid, home] = [Number(fields[2]), Number(fields[3]), fields[5]];
|
|
64
|
+
return fields.length >= 7 && Number.isInteger(uid) && Number.isInteger(gid) && home !== undefined && home.startsWith("/") ? { uid, gid, home } : undefined;
|
|
65
|
+
};
|
|
66
|
+
export const othersInstalledLinux = (rootNames, uid) => rootNames.some((name) => name.endsWith(".installed") && name !== `${uid}.installed`);
|
|
67
|
+
//# sourceMappingURL=unit-linux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-linux.js","sourceRoot":"","sources":["../../../src/service/linux/unit-linux.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQvF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAqC,EAAU,EAAE,CACtE;;;;;;;OAOG,YAAY;QACX,YAAY;YACR,KAAK,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBpB,CAAC;AAMF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAW,EAAE,CACnC;;;;;;gBAMY,aAAa;;;;;;;;gEAQmC,YAAY;;;CAG3E,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAsB,EAAE,CAAC,CAAC,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC;AAExL,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAA0C,EAAqB,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AACjI,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAA0C,EAAqB,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC1H,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAA0C,EAAqB,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AACnI,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAA0C,EAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAIpH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAoE,EAAkC,EAAE,CAAC;IACjI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IAC1C,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IAC1C,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;CAC3C,CAAC;AAGF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAqF,EAAE;IAC3H,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/J,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,SAA4B,EAAE,GAAW,EAAW,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,GAAG,GAAG,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Runner } from "../run.js";
|
|
2
|
+
export declare const installHere: (runner?: Runner, platform?: NodeJS.Platform) => Promise<object>;
|
|
3
|
+
export declare const uninstallHere: (runner?: Runner, platform?: NodeJS.Platform) => Promise<object>;
|
|
4
|
+
export declare const userIdFits: (user: string, platform?: NodeJS.Platform) => boolean;
|
|
5
|
+
export declare const runServiceHere: (user: string, runner?: Runner, platform?: NodeJS.Platform) => Promise<never>;
|
|
6
|
+
export declare const runSessionHere: (runner?: Runner, platform?: NodeJS.Platform) => Promise<void>;
|
|
7
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/service/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAwBpD,eAAO,MAAM,WAAW,YAAkB,MAAM,aAAyB,MAAM,CAAC,QAAQ,KAAsB,OAAO,CAAC,MAAM,CAS3H,CAAC;AAEF,eAAO,MAAM,aAAa,YAAkB,MAAM,aAAyB,MAAM,CAAC,QAAQ,KAAsB,OAAO,CAAC,MAAM,CAS7H,CAAC;AAGF,eAAO,MAAM,UAAU,SAAU,MAAM,aAAY,MAAM,CAAC,QAAQ,KAAsB,OAAyE,CAAC;AAElK,eAAO,MAAM,cAAc,SAAgB,MAAM,WAAU,MAAM,aAAyB,MAAM,CAAC,QAAQ,KAAsB,OAAO,CAAC,KAAK,CAS3I,CAAC;AAEF,eAAO,MAAM,cAAc,YAAkB,MAAM,aAAyB,MAAM,CAAC,QAAQ,KAAsB,OAAO,CAAC,IAAI,CAW5H,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { realRunner } from "../run.js";
|
|
2
|
+
import { runSession } from "./helper.js";
|
|
3
|
+
import { installLinuxService, uninstallLinuxService } from "./linux/install-linux.js";
|
|
4
|
+
import { installService, uninstallService } from "./windows/install-windows.js";
|
|
5
|
+
import { UID_RE } from "./linux/paths-linux.js";
|
|
6
|
+
import { SID_RE } from "./windows/paths-windows.js";
|
|
7
|
+
import { runService } from "./service-run.js";
|
|
8
|
+
import { linuxServiceRun } from "./linux/service-run-linux.js";
|
|
9
|
+
import { windowsServiceRun } from "./windows/service-run-windows.js";
|
|
10
|
+
import { linuxSession } from "./linux/session-linux.js";
|
|
11
|
+
import { NOT_ON_MAC } from "./user.js";
|
|
12
|
+
import { windowsSession } from "./windows/session-windows.js";
|
|
13
|
+
class ServiceUnsupported extends Error {
|
|
14
|
+
constructor(platform) {
|
|
15
|
+
super(platform === "darwin" ? NOT_ON_MAC : `Passwords' protected service is not built for ${platform}.`);
|
|
16
|
+
this.name = "ServiceUnsupported";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export const installHere = async (runner = realRunner, platform = process.platform) => {
|
|
20
|
+
switch (platform) {
|
|
21
|
+
case "win32":
|
|
22
|
+
return await installService(runner);
|
|
23
|
+
case "linux":
|
|
24
|
+
return await installLinuxService(runner);
|
|
25
|
+
default:
|
|
26
|
+
throw new ServiceUnsupported(platform);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
export const uninstallHere = async (runner = realRunner, platform = process.platform) => {
|
|
30
|
+
switch (platform) {
|
|
31
|
+
case "win32":
|
|
32
|
+
return await uninstallService(runner);
|
|
33
|
+
case "linux":
|
|
34
|
+
return await uninstallLinuxService(runner);
|
|
35
|
+
default:
|
|
36
|
+
throw new ServiceUnsupported(platform);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
export const userIdFits = (user, platform = process.platform) => (platform === "win32" ? SID_RE.test(user) : UID_RE.test(user));
|
|
40
|
+
export const runServiceHere = async (user, runner = realRunner, platform = process.platform) => {
|
|
41
|
+
switch (platform) {
|
|
42
|
+
case "win32":
|
|
43
|
+
return await runService(windowsServiceRun(user, runner), runner);
|
|
44
|
+
case "linux":
|
|
45
|
+
return await runService(linuxServiceRun(user, runner), runner);
|
|
46
|
+
default:
|
|
47
|
+
throw new ServiceUnsupported(platform);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
export const runSessionHere = async (runner = realRunner, platform = process.platform) => {
|
|
51
|
+
switch (platform) {
|
|
52
|
+
case "win32":
|
|
53
|
+
await runSession(windowsSession, runner);
|
|
54
|
+
return;
|
|
55
|
+
case "linux":
|
|
56
|
+
await runSession(linuxSession, runner);
|
|
57
|
+
return;
|
|
58
|
+
default:
|
|
59
|
+
throw new ServiceUnsupported(platform);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/service/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/service/recovery.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,cAAc,YAAY,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,KAAiB,MAI/E,CAAC;AAOF,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAU7C,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
const CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
3
|
+
const GROUPS = 6;
|
|
4
|
+
const GROUP_LENGTH = 5;
|
|
5
|
+
const LENGTH = GROUPS * GROUP_LENGTH;
|
|
6
|
+
const grouped = (characters) => Array.from({ length: GROUPS }, (_unused, index) => characters.slice(index * GROUP_LENGTH, (index + 1) * GROUP_LENGTH)).join("-");
|
|
7
|
+
export const newRecoveryKey = (random = randomBytes) => {
|
|
8
|
+
const bytes = random(LENGTH);
|
|
9
|
+
return grouped(Array.from(bytes, (byte) => CROCKFORD[byte & 31] ?? "0").join(""));
|
|
10
|
+
};
|
|
11
|
+
export const asRecoveryKey = (typed) => {
|
|
12
|
+
const bare = typed
|
|
13
|
+
.toUpperCase()
|
|
14
|
+
.replace(/[\s-]/gu, "")
|
|
15
|
+
.replace(/[IL]/gu, "1")
|
|
16
|
+
.replace(/O/gu, "0");
|
|
17
|
+
if (bare.length !== LENGTH || [...bare].some((character) => !CROCKFORD.includes(character))) {
|
|
18
|
+
return typed;
|
|
19
|
+
}
|
|
20
|
+
return grouped(bare);
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/service/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO1C,MAAM,SAAS,GAAG,kCAAkC,CAAC;AACrD,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;AAErC,MAAM,OAAO,GAAG,CAAC,UAAkB,EAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAGjL,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,GAA6B,WAAW,EAAU,EAAE;IAErF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE;IACnD,MAAM,IAAI,GAAG,KAAK;SACb,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzB,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC1F,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC"}
|
package/dist/service/remote.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import type { HelloDriver, PassphrasePrompt } from "../consent/consent.js";
|
|
2
|
+
import type { ChoicePrompt, HelloDriver, PassphrasePrompt, ValuePrompt } from "../consent/consent.js";
|
|
3
3
|
import type { Typist } from "../typing/typist.js";
|
|
4
4
|
import type { HelperCall } from "./door.js";
|
|
5
5
|
import type { LineSocket } from "./lines.js";
|
|
@@ -15,7 +15,10 @@ export interface HelloPin {
|
|
|
15
15
|
readonly publicKey: string;
|
|
16
16
|
}
|
|
17
17
|
export declare const remoteHello: (link: HelperLink, pin: () => Promise<HelloPin | undefined>) => HelloDriver;
|
|
18
|
+
export declare const RECOVERY_HINT = "Type your recovery key: the one Passwords showed once when it was set up on this computer.";
|
|
18
19
|
export declare const remotePassphrasePrompt: (link: HelperLink) => PassphrasePrompt;
|
|
20
|
+
export declare const remoteValuePrompt: (link: HelperLink) => ValuePrompt;
|
|
21
|
+
export declare const remoteChoicePrompt: (link: HelperLink) => ChoicePrompt;
|
|
19
22
|
export declare const remoteTypist: (link: HelperLink) => Typist;
|
|
20
23
|
export {};
|
|
21
24
|
//# sourceMappingURL=remote.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/service/remote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAe,gBAAgB,
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/service/remote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAgB,YAAY,EAAE,WAAW,EAAe,gBAAgB,EAA6B,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC5J,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAc7C,KAAK,QAAQ,CAAC,CAAC,SAAS,UAAU,IAAI,CAAC,SAAS,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;AAEhF,qBAAa,UAAU;;IAMnB,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAG/B;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAGK,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAoB1G;CACJ;AAID,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B;AAKD,eAAO,MAAM,WAAW,SAAU,UAAU,OAAO,MAAM,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,KAAG,WA6CxF,CAAC;AAGF,eAAO,MAAM,aAAa,+FAA+F,CAAC;AAI1H,eAAO,MAAM,sBAAsB,SACxB,UAAU,KAAG,gBAOnB,CAAC;AAIN,eAAO,MAAM,iBAAiB,SACnB,UAAU,KAAG,WAQnB,CAAC;AAIN,eAAO,MAAM,kBAAkB,SACpB,UAAU,KAAG,YAInB,CAAC;AAEN,eAAO,MAAM,YAAY,SAAU,UAAU,KAAG,MAU9C,CAAC"}
|
package/dist/service/remote.js
CHANGED
|
@@ -2,8 +2,10 @@ import { randomBytes } from "node:crypto";
|
|
|
2
2
|
import { serialLock } from "@intentic/base/async";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { helloSigned } from "./hello-verify.js";
|
|
5
|
-
import {
|
|
5
|
+
import { asRecoveryKey } from "./recovery.js";
|
|
6
|
+
import { AvailableSchema, ChosenSchema, EnrolledSchema, InspectedSchema, SignedSchema, TypedPassphraseSchema, TypedSchema, TypedValueSchema } from "./wire.js";
|
|
6
7
|
const PROMPT_DEADLINE_MS = 130_000;
|
|
8
|
+
const AVAILABLE_DEADLINE_MS = 20_000;
|
|
7
9
|
const TYPING_DEADLINE_MS = 70_000;
|
|
8
10
|
export class HelperLink {
|
|
9
11
|
#helper;
|
|
@@ -37,7 +39,7 @@ export class HelperLink {
|
|
|
37
39
|
});
|
|
38
40
|
}
|
|
39
41
|
}
|
|
40
|
-
const NO_SESSION = "nobody is signed in to
|
|
42
|
+
const NO_SESSION = "nobody is signed in to ask: Passwords' session helper starts at sign-in";
|
|
41
43
|
export const remoteHello = (link, pin) => {
|
|
42
44
|
const sign = async (credential, challenge, title, message) => {
|
|
43
45
|
const reply = await link.call({ call: "sign", credential, challenge, title, message }, SignedSchema, PROMPT_DEADLINE_MS);
|
|
@@ -47,8 +49,25 @@ export const remoteHello = (link, pin) => {
|
|
|
47
49
|
return reply.ok ? { ok: true, value: Buffer.from(reply.signature, "base64") } : { ok: false, cancelled: reply.cancelled, reason: reply.reason };
|
|
48
50
|
};
|
|
49
51
|
return {
|
|
50
|
-
available: async () =>
|
|
51
|
-
|
|
52
|
+
available: async () => {
|
|
53
|
+
if (!link.ready) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if ((await pin()) !== undefined) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return (await link.call({ call: "hello-available" }, AvailableSchema, AVAILABLE_DEADLINE_MS))?.available === true;
|
|
60
|
+
},
|
|
61
|
+
enrol: async (credential, challenge, notice) => {
|
|
62
|
+
if ((await pin()) !== undefined) {
|
|
63
|
+
return { ok: false, cancelled: false, reason: "Passwords keeps the Windows Hello key it was set up with" };
|
|
64
|
+
}
|
|
65
|
+
const reply = await link.call({ call: "enrol", credential, challenge, title: notice.title, message: notice.message }, EnrolledSchema, PROMPT_DEADLINE_MS);
|
|
66
|
+
if (reply === undefined) {
|
|
67
|
+
return { ok: false, cancelled: false, reason: link.ready ? "the session helper did not answer" : NO_SESSION };
|
|
68
|
+
}
|
|
69
|
+
return reply.ok ? { ok: true, value: { signature: Buffer.from(reply.signature, "base64"), publicKey: reply.publicKey } } : reply;
|
|
70
|
+
},
|
|
52
71
|
sign: async (credential, challenge, notice) => await sign(credential, challenge, notice.title, notice.message),
|
|
53
72
|
verify: async (notice) => {
|
|
54
73
|
const pinned = await pin();
|
|
@@ -66,14 +85,30 @@ export const remoteHello = (link, pin) => {
|
|
|
66
85
|
},
|
|
67
86
|
};
|
|
68
87
|
};
|
|
88
|
+
export const RECOVERY_HINT = "Type your recovery key: the one Passwords showed once when it was set up on this computer.";
|
|
69
89
|
export const remotePassphrasePrompt = (link) => async (notice) => {
|
|
70
|
-
const reply = await link.call({ call: "passphrase", title: notice.title, message: notice.message }, TypedPassphraseSchema, PROMPT_DEADLINE_MS);
|
|
90
|
+
const reply = await link.call({ call: "passphrase", title: notice.title, message: `${notice.message}\n\n${RECOVERY_HINT}` }, TypedPassphraseSchema, PROMPT_DEADLINE_MS);
|
|
91
|
+
if (reply === undefined) {
|
|
92
|
+
return { kind: "unavailable", reason: link.ready ? "the session helper did not answer" : NO_SESSION };
|
|
93
|
+
}
|
|
94
|
+
return reply.kind === "answered" ? { kind: "answered", passphrase: asRecoveryKey(reply.passphrase) } : reply;
|
|
95
|
+
};
|
|
96
|
+
export const remoteValuePrompt = (link) => async (notice) => {
|
|
97
|
+
const call = { call: "value", title: notice.title, message: notice.message, remember: notice.remember };
|
|
98
|
+
if (notice.username !== undefined) {
|
|
99
|
+
call.username = notice.username.value === undefined ? {} : { value: notice.username.value };
|
|
100
|
+
}
|
|
101
|
+
const reply = await link.call(call, TypedValueSchema, PROMPT_DEADLINE_MS);
|
|
102
|
+
return reply ?? { kind: "unavailable", reason: link.ready ? "the session helper did not answer" : NO_SESSION };
|
|
103
|
+
};
|
|
104
|
+
export const remoteChoicePrompt = (link) => async (notice) => {
|
|
105
|
+
const reply = await link.call({ call: "choice", title: notice.title, message: notice.message, choices: notice.choices.map(({ id, label }) => ({ id, label })) }, ChosenSchema, PROMPT_DEADLINE_MS);
|
|
71
106
|
return reply ?? { kind: "unavailable", reason: link.ready ? "the session helper did not answer" : NO_SESSION };
|
|
72
107
|
};
|
|
73
108
|
export const remoteTypist = (link) => ({
|
|
74
109
|
inspect: async (place) => {
|
|
75
110
|
const reply = await link.call({ call: "inspect", place }, InspectedSchema, TYPING_DEADLINE_MS);
|
|
76
|
-
return reply ?? { ok: false, reason: link.ready ? "the session helper did not answer" : "no one is signed in to
|
|
111
|
+
return reply ?? { ok: false, reason: link.ready ? "the session helper did not answer" : "no one is signed in to type in" };
|
|
77
112
|
},
|
|
78
113
|
type: async (place, seen, value) => {
|
|
79
114
|
const reply = await link.call({ call: "type", place, seen, value }, TypedSchema, TYPING_DEADLINE_MS);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/service/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/service/remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type VaultFile } from "../vault.js";
|
|
2
|
+
export declare class ServiceKey {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(path: string, dir: string);
|
|
5
|
+
open(): Promise<Buffer | undefined>;
|
|
6
|
+
adopt(vaultKey: Buffer): Promise<boolean>;
|
|
7
|
+
merged(vault: VaultFile): Promise<VaultFile>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=service-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-key.d.ts","sourceRoot":"","sources":["../../src/service/service-key.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,SAAS,EAA6C,MAAM,aAAa,CAAC;AAiB1G,qBAAa,UAAU;;IAKnB,YAAY,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAGpC;IAuBK,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAGxC;IAGK,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ9C;IAGK,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAGjD;CACJ"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { isMissing } from "@intentic/base/errors";
|
|
4
|
+
import { writeSecretFile } from "@intentic/local-agent";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { unwrapPassphrase, WrapSchema, wrapWithPassphrase } from "../vault.js";
|
|
7
|
+
const SERVICE_COST = { N: 2 ** 10, r: 8, p: 1 };
|
|
8
|
+
const ServiceKeyFileSchema = z.object({ secret: z.string().regex(/^[A-Za-z0-9_-]{43}$/u), wrap: WrapSchema.optional() }).strict();
|
|
9
|
+
const sameWrap = (a, b) => a.method === "passphrase" && b.method === "passphrase" && a.salt === b.salt;
|
|
10
|
+
export class ServiceKey {
|
|
11
|
+
#path;
|
|
12
|
+
#dir;
|
|
13
|
+
#file;
|
|
14
|
+
constructor(path, dir) {
|
|
15
|
+
this.#path = path;
|
|
16
|
+
this.#dir = dir;
|
|
17
|
+
}
|
|
18
|
+
async #load() {
|
|
19
|
+
if (this.#file !== undefined) {
|
|
20
|
+
return this.#file;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
this.#file = ServiceKeyFileSchema.parse(JSON.parse(await readFile(this.#path, "utf8")));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (!isMissing(error)) {
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
this.#file = { secret: randomBytes(32).toString("base64url") };
|
|
30
|
+
await this.#save(this.#file);
|
|
31
|
+
}
|
|
32
|
+
return this.#file;
|
|
33
|
+
}
|
|
34
|
+
async #save(file) {
|
|
35
|
+
await writeSecretFile(this.#path, this.#dir, `${JSON.stringify(file)}\n`);
|
|
36
|
+
}
|
|
37
|
+
async open() {
|
|
38
|
+
const file = await this.#load();
|
|
39
|
+
return file.wrap === undefined ? undefined : await unwrapPassphrase([file.wrap], file.secret);
|
|
40
|
+
}
|
|
41
|
+
async adopt(vaultKey) {
|
|
42
|
+
const file = await this.#load();
|
|
43
|
+
if (file.wrap !== undefined) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
this.#file = { ...file, wrap: await wrapWithPassphrase(vaultKey, file.secret, SERVICE_COST) };
|
|
47
|
+
await this.#save(this.#file);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
async merged(vault) {
|
|
51
|
+
const wrap = (await this.#load()).wrap;
|
|
52
|
+
return wrap === undefined || vault.wraps.some((each) => sameWrap(each, wrap)) ? vault : { ...vault, wraps: [...vault.wraps, wrap] };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=service-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-key.js","sourceRoot":"","sources":["../../src/service/service-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
|
|
1
|
+
import { type KeyringPaths } from "../address.js";
|
|
2
|
+
import type { Consent } from "../consent/consent.js";
|
|
3
|
+
import type { Runner } from "../run.js";
|
|
4
|
+
import { type VaultFile } from "../vault.js";
|
|
5
|
+
import { type DoorPlace } from "./channel.js";
|
|
6
|
+
import type { Challenge, DoorFile, Proof } from "./door.js";
|
|
7
|
+
import { HelperLink } from "./remote.js";
|
|
8
|
+
export interface ServiceRun {
|
|
9
|
+
readonly vaultDir: string;
|
|
10
|
+
readonly place: DoorPlace;
|
|
11
|
+
readonly consent: (link: HelperLink, files: KeyringPaths) => Consent;
|
|
12
|
+
readonly helloCredential: (files: KeyringPaths) => Promise<string>;
|
|
13
|
+
readonly challenge: (files: KeyringPaths) => Promise<Challenge>;
|
|
14
|
+
readonly proven: (challenge: Challenge, proof: Proof, files: KeyringPaths) => Promise<boolean>;
|
|
15
|
+
readonly beforeWrite?: (file: VaultFile) => Promise<VaultFile>;
|
|
16
|
+
readonly afterSetup?: (vaultKey: Buffer) => Promise<void>;
|
|
17
|
+
readonly publish: (door: DoorFile, log: (message: string) => void) => Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export declare const provenBy: (run: Pick<ServiceRun, "proven">, files: KeyringPaths, challenge: Challenge, proof: Proof) => Promise<boolean>;
|
|
20
|
+
export declare const runService: (run: ServiceRun, runner: Runner) => Promise<never>;
|
|
3
21
|
//# sourceMappingURL=service-run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-run.d.ts","sourceRoot":"","sources":["../../src/service/service-run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service-run.d.ts","sourceRoot":"","sources":["../../src/service/service-run.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,eAAe,CAAC;AAGhE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAmC,KAAK,SAAS,EAAkB,MAAM,aAAa,CAAC;AAE9F,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAC;AAOvD,MAAM,WAAW,UAAU;IAEvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;IACrE,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnE,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhE,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/F,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAE/D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvF;AAUD,eAAO,MAAM,QAAQ,QAAe,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,YAAY,aAAa,SAAS,SAAS,KAAK,KAAG,OAAO,CAAC,OAAO,CAaxI,CAAC;AAsBF,eAAO,MAAM,UAAU,QAAe,UAAU,UAAU,MAAM,KAAG,OAAO,CAAC,KAAK,CAqC/E,CAAC"}
|