@modelprofile.com/authswitch 6.2.0 → 6.4.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 (50) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/authority-contract.d.ts +142 -0
  3. package/dist_ts/authority-contract.js +3 -0
  4. package/dist_ts/authority-runtime-contract.d.ts +32 -0
  5. package/dist_ts/authority-runtime-contract.js +2 -0
  6. package/dist_ts/classes.authoritybroker.d.ts +73 -0
  7. package/dist_ts/classes.authoritybroker.js +548 -0
  8. package/dist_ts/classes.authorityclient.d.ts +34 -0
  9. package/dist_ts/classes.authorityclient.js +200 -0
  10. package/dist_ts/classes.authoritydaemon.d.ts +26 -0
  11. package/dist_ts/classes.authoritydaemon.js +249 -0
  12. package/dist_ts/classes.authoritydatabase.d.ts +94 -0
  13. package/dist_ts/classes.authoritydatabase.js +736 -0
  14. package/dist_ts/classes.authorityframing.d.ts +8 -0
  15. package/dist_ts/classes.authorityframing.js +22 -0
  16. package/dist_ts/classes.authoritymodels.d.ts +215 -0
  17. package/dist_ts/classes.authoritymodels.js +818 -0
  18. package/dist_ts/classes.authoritysecrets.d.ts +9 -0
  19. package/dist_ts/classes.authoritysecrets.js +30 -0
  20. package/dist_ts/classes.authorityservice.d.ts +28 -0
  21. package/dist_ts/classes.authorityservice.js +71 -0
  22. package/dist_ts/classes.cli.d.ts +56 -0
  23. package/dist_ts/classes.cli.js +238 -63
  24. package/dist_ts/classes.codexpreuse.js +2 -2
  25. package/dist_ts/classes.tui.js +51 -2
  26. package/dist_ts/index.d.ts +2 -0
  27. package/dist_ts/index.js +26 -1
  28. package/dist_ts/plugins.d.ts +9 -2
  29. package/dist_ts/plugins.js +10 -3
  30. package/dist_ts/preuse.d.ts +89 -2
  31. package/dist_ts/preuse.js +107 -2
  32. package/package.json +17 -3
  33. package/readme.md +118 -16
  34. package/ts/00_commitinfo_data.ts +1 -1
  35. package/ts/authority-contract.ts +109 -0
  36. package/ts/authority-runtime-contract.ts +27 -0
  37. package/ts/classes.authoritybroker.ts +530 -0
  38. package/ts/classes.authorityclient.ts +183 -0
  39. package/ts/classes.authoritydaemon.ts +219 -0
  40. package/ts/classes.authoritydatabase.ts +725 -0
  41. package/ts/classes.authorityframing.ts +21 -0
  42. package/ts/classes.authoritymodels.ts +367 -0
  43. package/ts/classes.authoritysecrets.ts +27 -0
  44. package/ts/classes.authorityservice.ts +83 -0
  45. package/ts/classes.cli.ts +236 -54
  46. package/ts/classes.codexpreuse.ts +1 -1
  47. package/ts/classes.tui.ts +39 -2
  48. package/ts/index.ts +25 -0
  49. package/ts/plugins.ts +9 -2
  50. package/ts/preuse.ts +141 -3
@@ -0,0 +1,9 @@
1
+ export interface IAuthSwitchSecretCodec {
2
+ seal(accountId: string, plaintext: Uint8Array): Promise<string>;
3
+ unseal(accountId: string, ciphertext: string): Promise<Uint8Array>;
4
+ }
5
+ /** TPM-sealed byte payloads live only as ciphertext in SmartData. */
6
+ export declare class AuthSwitchTpmSecretCodec implements IAuthSwitchSecretCodec {
7
+ seal(accountId: string, plaintext: Uint8Array): Promise<string>;
8
+ unseal(accountId: string, ciphertext: string): Promise<Uint8Array>;
9
+ }
@@ -0,0 +1,30 @@
1
+ import * as plugins from './plugins.js';
2
+ const secretName = (accountId) => {
3
+ if (!/^[a-f0-9]{64}$/.test(accountId))
4
+ throw new Error('Invalid account identity for secret custody.');
5
+ return `authswitch.account.${accountId}`;
6
+ };
7
+ /** TPM-sealed byte payloads live only as ciphertext in SmartData. */
8
+ export class AuthSwitchTpmSecretCodec {
9
+ async seal(accountId, plaintext) {
10
+ const ciphertext = await plugins.smartsecret.sealSmartSecretTpm2Credential(secretName(accountId), plaintext);
11
+ try {
12
+ return Buffer.from(ciphertext).toString('base64url');
13
+ }
14
+ finally {
15
+ ciphertext.fill(0);
16
+ }
17
+ }
18
+ async unseal(accountId, ciphertext) {
19
+ if (!/^[A-Za-z0-9_-]{1,131072}$/.test(ciphertext))
20
+ throw new Error('Invalid sealed account credential.');
21
+ const bytes = Buffer.from(ciphertext, 'base64url');
22
+ try {
23
+ return await plugins.smartsecret.unsealSmartSecretTpm2Credential(secretName(accountId), bytes);
24
+ }
25
+ finally {
26
+ bytes.fill(0);
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHlzZWNyZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5hdXRob3JpdHlzZWNyZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBT3hDLE1BQU0sVUFBVSxHQUFHLENBQUMsU0FBaUIsRUFBVSxFQUFFO0lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ3ZHLE9BQU8sc0JBQXNCLFNBQVMsRUFBRSxDQUFDO0FBQzNDLENBQUMsQ0FBQztBQUVGLHFFQUFxRTtBQUNyRSxNQUFNLE9BQU8sd0JBQXdCO0lBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBaUIsRUFBRSxTQUFxQjtRQUN4RCxNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdHLElBQUksQ0FBQztZQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFBQyxDQUFDO2dCQUNyRCxDQUFDO1lBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBaUIsRUFBRSxVQUFrQjtRQUN2RCxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN6RyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUM7WUFBQyxPQUFPLE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFBQyxDQUFDO2dCQUMvRixDQUFDO1lBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGIn0=
@@ -0,0 +1,28 @@
1
+ import * as plugins from './plugins.js';
2
+ export interface IAuthSwitchAuthorityPaths {
3
+ runtimeDirectory: string;
4
+ dataDirectory: string;
5
+ databaseSocketPath: string;
6
+ authoritySocketPath: string;
7
+ runtimeSocketPath: string;
8
+ runtimeSocketDirectory: string;
9
+ }
10
+ /** Canonical per-user paths. An explicit runtime directory is also usable by a trusted container host. */
11
+ export declare const resolveAuthSwitchAuthorityPaths: (runtimeDirectory?: string | undefined) => IAuthSwitchAuthorityPaths;
12
+ /** Explicit installer and lifecycle operations for a user-scoped systemd service. */
13
+ export declare class AuthSwitchAuthorityService {
14
+ readonly unit: plugins.smartdaemon.SystemdUnit;
15
+ readonly unitFile: plugins.smartdaemon.SystemdUnitFile;
16
+ readonly definition: plugins.smartdaemon.SystemdServiceDefinition;
17
+ constructor(runtimeDirectory: string, unitDirectory?: string);
18
+ install(): Promise<Readonly<{
19
+ changed: boolean;
20
+ masked: boolean;
21
+ sha256: string;
22
+ }>>;
23
+ inspect(): Promise<plugins.smartdaemon.ISystemdUnitState>;
24
+ enable(): Promise<plugins.smartdaemon.ISystemdUnitState>;
25
+ start(): Promise<plugins.smartdaemon.ISystemdUnitState>;
26
+ stop(): Promise<plugins.smartdaemon.ISystemdUnitState>;
27
+ }
28
+ export declare const runAuthSwitchAuthorityDaemon: (paths?: IAuthSwitchAuthorityPaths) => Promise<void>;
@@ -0,0 +1,71 @@
1
+ import * as plugins from './plugins.js';
2
+ import { AuthSwitchAuthorityDaemon } from './classes.authoritydaemon.js';
3
+ /** Canonical per-user paths. An explicit runtime directory is also usable by a trusted container host. */
4
+ export const resolveAuthSwitchAuthorityPaths = (runtimeDirectory = process.env.XDG_RUNTIME_DIR) => {
5
+ if (!runtimeDirectory || !plugins.path.isAbsolute(runtimeDirectory)) {
6
+ throw new Error('A private XDG_RUNTIME_DIR is required for authswitch authority.');
7
+ }
8
+ const home = plugins.os.userInfo().homedir;
9
+ const dataHome = process.env.XDG_DATA_HOME || plugins.path.join(home, '.local/share');
10
+ if (!plugins.path.isAbsolute(dataHome))
11
+ throw new Error('XDG_DATA_HOME must be an absolute path.');
12
+ const socketDirectory = plugins.path.join(runtimeDirectory, 'authswitch');
13
+ const runtimeSocketDirectory = plugins.path.join(socketDirectory, 'runtime');
14
+ return {
15
+ runtimeDirectory,
16
+ dataDirectory: plugins.path.join(dataHome, 'authswitch', 'authority'),
17
+ databaseSocketPath: plugins.path.join(socketDirectory, 'internal', 'db.sock'),
18
+ authoritySocketPath: plugins.path.join(socketDirectory, 'management', 'authority.sock'),
19
+ runtimeSocketPath: plugins.path.join(runtimeSocketDirectory, 'runtime.sock'),
20
+ runtimeSocketDirectory,
21
+ };
22
+ };
23
+ /** Explicit installer and lifecycle operations for a user-scoped systemd service. */
24
+ export class AuthSwitchAuthorityService {
25
+ unit;
26
+ unitFile;
27
+ definition;
28
+ constructor(runtimeDirectory, unitDirectory) {
29
+ const packageRoot = plugins.path.dirname(plugins.path.dirname(plugins.fileURLToPath(import.meta.url)));
30
+ const options = { unitName: 'authswitch-authority.service', scope: 'user', runtimeDirectory };
31
+ this.unit = new plugins.smartdaemon.SystemdUnit(options);
32
+ this.unitFile = new plugins.smartdaemon.SystemdUnitFile({ ...options, unitDirectory });
33
+ this.definition = new plugins.smartdaemon.SystemdServiceDefinition({
34
+ unitName: options.unitName, scope: 'user', description: 'Authswitch account authority', executable: process.execPath,
35
+ args: [plugins.path.join(packageRoot, 'cli.js'), 'authority', 'daemon'],
36
+ workingDirectory: packageRoot, restart: 'on-failure', killMode: 'mixed', timeoutStopSeconds: 60,
37
+ });
38
+ }
39
+ async install() {
40
+ const previous = await this.unitFile.inspect();
41
+ const result = await this.unitFile.install(this.definition, previous?.sha256 ?? null);
42
+ return { changed: result.changed, masked: result.masked, sha256: result.record.sha256 };
43
+ }
44
+ inspect() { return this.unit.inspect(); }
45
+ enable() { return this.unit.enable(); }
46
+ start() { return this.unit.start(); }
47
+ stop() { return this.unit.stop(); }
48
+ }
49
+ export const runAuthSwitchAuthorityDaemon = async (paths = resolveAuthSwitchAuthorityPaths()) => {
50
+ const daemon = new AuthSwitchAuthorityDaemon({
51
+ dataDirectory: paths.dataDirectory,
52
+ socketPath: paths.databaseSocketPath,
53
+ authoritySocketPath: paths.authoritySocketPath,
54
+ runtimeSocketPath: paths.runtimeSocketPath,
55
+ });
56
+ await daemon.start();
57
+ await new Promise((resolve, reject) => {
58
+ let stopping = false;
59
+ const stop = () => {
60
+ if (stopping)
61
+ return;
62
+ stopping = true;
63
+ process.off('SIGINT', stop);
64
+ process.off('SIGTERM', stop);
65
+ void daemon.close().then(resolve, reject);
66
+ };
67
+ process.on('SIGINT', stop);
68
+ process.on('SIGTERM', stop);
69
+ });
70
+ };
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHlzZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5hdXRob3JpdHlzZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBV3pFLDBHQUEwRztBQUMxRyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUE2QixFQUFFO0lBQzNILElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN0RixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ25HLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFFLE1BQU0sc0JBQXNCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU87UUFDTCxnQkFB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
@@ -28,7 +28,55 @@ export declare class AuthSwitchCli {
28
28
  */
29
29
  private settleRunningInstances;
30
30
  private commandLogin;
31
+ /**
32
+ * Send the preuse prompt through one named account, through an account chosen here, or through every
33
+ * account of the harness.
34
+ *
35
+ * `--all` walks the harness's own account list, one request at a time, and ends with a table of what
36
+ * each account did; a single named account keeps its own contract, in which anything but a completed
37
+ * prompt is a failure. Neither form switches, refreshes or writes a login.
38
+ */
31
39
  private commandPreuse;
40
+ /**
41
+ * The account picker `preuse` shows without an account reference: one account, all of them, or Back.
42
+ *
43
+ * Choosing one account here is that account's consent, exactly as naming it on the command line is, and
44
+ * it keeps that command's contract. Choosing all of them spends quota on accounts the chooser did not
45
+ * name, so that answer is confirmed once and then runs as `--all` does, table and exit status included.
46
+ */
47
+ private preuseFromPicker;
48
+ /**
49
+ * The choices an interactive preuse offers: every account, one of them, or Back.
50
+ *
51
+ * The guide and the bare `preuse` command offer the same list with the same wording. An account id is an
52
+ * opaque string, so every choice says which kind of answer it carries instead of relying on a sentinel an
53
+ * id could collide with. A single account is offered alone: "all" of one account is that same account.
54
+ */
55
+ private preuseChoices;
56
+ /** The accounts an answer names; empty when the chosen account is no longer there. */
57
+ private preuseSelection;
58
+ /** One confirmation, naming what the prompt goes to and that it consumes quota. */
59
+ private confirmPreuse;
60
+ /**
61
+ * One preuse run and its report, for the command line and for the guide.
62
+ *
63
+ * Ctrl+C aborts the run: the account in flight is reported as interrupted and no further account is
64
+ * started, because a prompt that may already have been sent is never repeated. The exit status is 130
65
+ * for an interrupted run, 1 when an account failed -- and, for a single named account, when it was
66
+ * refused -- and 0 otherwise. Usage errors return 2 before anything reaches this.
67
+ */
68
+ private runPreuse;
69
+ /** One line per event; a run over several accounts numbers each account as it starts. */
70
+ private writePreuseEvent;
71
+ /**
72
+ * The reset schedule one completed prompt reported.
73
+ *
74
+ * Once inference completes, a schedule that could not be read or displayed is reported as exactly that:
75
+ * a completed prompt is never repeated over a lookup or presentation failure.
76
+ */
77
+ private writePreuseSchedule;
78
+ /** What every account of a run did, in one table. The rows repeat readings the run already took. */
79
+ private writePreuseSummary;
32
80
  /**
33
81
  * Watch usage and switch automatically; see `AuthSwitchWatch`. SIGINT and SIGTERM end it cleanly with status 0.
34
82
  * `--once` runs one check and exits 1 when a switch it attempted did not complete.
@@ -39,6 +87,14 @@ export declare class AuthSwitchCli {
39
87
  /** Offer a verified save before presenting the switch picker; declining never switches. */
40
88
  private offerToSave;
41
89
  private runHarnessGuide;
90
+ /**
91
+ * Preuse from the guide: one account or all of them, confirmed once before anything is sent.
92
+ *
93
+ * The prompt consumes quota, so the confirmation names what it will be sent to, and Back or a declined
94
+ * confirmation returns to the menu having sent nothing. A refusal an adapter states is not a guide
95
+ * failure, so the guide stays open; a failed prompt ends it, as every other failed action does.
96
+ */
97
+ private guidePreuse;
42
98
  private printCurrent;
43
99
  private selectActive;
44
100
  private reportOutcome;