instar 1.3.1597 → 1.3.1598

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 (87) hide show
  1. package/dashboard/desktop.css +8 -0
  2. package/dashboard/desktop.html +10 -0
  3. package/dashboard/desktop.js +98 -1
  4. package/dist/core/DesktopAccessAudit.d.ts +3 -1
  5. package/dist/core/DesktopAccessAudit.d.ts.map +1 -1
  6. package/dist/core/DesktopAccessAudit.js +1 -0
  7. package/dist/core/DesktopAccessAudit.js.map +1 -1
  8. package/dist/core/DesktopAead.d.ts +8 -1
  9. package/dist/core/DesktopAead.d.ts.map +1 -1
  10. package/dist/core/DesktopAead.js +18 -1
  11. package/dist/core/DesktopAead.js.map +1 -1
  12. package/dist/core/DesktopHost.d.ts +26 -1
  13. package/dist/core/DesktopHost.d.ts.map +1 -1
  14. package/dist/core/DesktopHost.js.map +1 -1
  15. package/dist/core/DesktopLockState.d.ts +38 -0
  16. package/dist/core/DesktopLockState.d.ts.map +1 -0
  17. package/dist/core/DesktopLockState.js +43 -0
  18. package/dist/core/DesktopLockState.js.map +1 -0
  19. package/dist/core/DesktopLockedController.d.ts +138 -0
  20. package/dist/core/DesktopLockedController.d.ts.map +1 -0
  21. package/dist/core/DesktopLockedController.js +442 -0
  22. package/dist/core/DesktopLockedController.js.map +1 -0
  23. package/dist/core/DesktopOperatorAssertion.d.ts +39 -0
  24. package/dist/core/DesktopOperatorAssertion.d.ts.map +1 -1
  25. package/dist/core/DesktopOperatorAssertion.js +49 -0
  26. package/dist/core/DesktopOperatorAssertion.js.map +1 -1
  27. package/dist/core/DesktopProvenVersions.d.ts +19 -0
  28. package/dist/core/DesktopProvenVersions.d.ts.map +1 -0
  29. package/dist/core/DesktopProvenVersions.js +8 -0
  30. package/dist/core/DesktopProvenVersions.js.map +1 -0
  31. package/dist/core/DirectDesktopAccess.d.ts +20 -1
  32. package/dist/core/DirectDesktopAccess.d.ts.map +1 -1
  33. package/dist/core/DirectDesktopAccess.js +263 -10
  34. package/dist/core/DirectDesktopAccess.js.map +1 -1
  35. package/dist/core/MacDesktopHost.d.ts +32 -1
  36. package/dist/core/MacDesktopHost.d.ts.map +1 -1
  37. package/dist/core/MacDesktopHost.js +115 -37
  38. package/dist/core/MacDesktopHost.js.map +1 -1
  39. package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
  40. package/dist/core/WriteDomainRegistry.js +8 -0
  41. package/dist/core/WriteDomainRegistry.js.map +1 -1
  42. package/dist/core/types.d.ts +6 -0
  43. package/dist/core/types.d.ts.map +1 -1
  44. package/dist/core/types.js.map +1 -1
  45. package/dist/data/standards-guard-index.json +1 -1
  46. package/dist/data/standards-guard-index.meta.json +2 -2
  47. package/dist/data/standards-registry.meta.json +1 -1
  48. package/dist/native/instar-desktop-host +0 -0
  49. package/dist/native/instar-desktop-host.json +1 -1
  50. package/dist/scaffold/templates.d.ts.map +1 -1
  51. package/dist/scaffold/templates.js +1 -1
  52. package/dist/scaffold/templates.js.map +1 -1
  53. package/dist/server/AgentServer.d.ts +4 -0
  54. package/dist/server/AgentServer.d.ts.map +1 -1
  55. package/dist/server/AgentServer.js +116 -3
  56. package/dist/server/AgentServer.js.map +1 -1
  57. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  58. package/dist/server/CapabilityIndex.js +2 -1
  59. package/dist/server/CapabilityIndex.js.map +1 -1
  60. package/dist/server/DesktopMeshBroker.d.ts +6 -0
  61. package/dist/server/DesktopMeshBroker.d.ts.map +1 -1
  62. package/dist/server/DesktopMeshBroker.js +17 -1
  63. package/dist/server/DesktopMeshBroker.js.map +1 -1
  64. package/dist/server/DesktopStreamManager.d.ts +11 -3
  65. package/dist/server/DesktopStreamManager.d.ts.map +1 -1
  66. package/dist/server/DesktopStreamManager.js +24 -1
  67. package/dist/server/DesktopStreamManager.js.map +1 -1
  68. package/dist/server/machineRoutes.d.ts +1 -0
  69. package/dist/server/machineRoutes.d.ts.map +1 -1
  70. package/dist/server/machineRoutes.js +14 -0
  71. package/dist/server/machineRoutes.js.map +1 -1
  72. package/dist/server/routes.d.ts +9 -0
  73. package/dist/server/routes.d.ts.map +1 -1
  74. package/dist/server/routes.js +99 -0
  75. package/dist/server/routes.js.map +1 -1
  76. package/dist/testing/selfActionRegistry.d.ts.map +1 -1
  77. package/dist/testing/selfActionRegistry.js +58 -0
  78. package/dist/testing/selfActionRegistry.js.map +1 -1
  79. package/package.json +1 -1
  80. package/scripts/build-native-desktop-host.mjs +4 -2
  81. package/src/data/builtin-manifest.json +48 -48
  82. package/src/data/standards-guard-index.json +1 -1
  83. package/src/data/standards-guard-index.meta.json +2 -2
  84. package/src/data/standards-registry.meta.json +1 -1
  85. package/src/scaffold/templates.ts +1 -1
  86. package/upgrades/1.3.1598.md +24 -0
  87. package/upgrades/side-effects/desktop-locked-screen.md +129 -0
@@ -41,3 +41,11 @@ body.desktop-live #localCursor{display:block}
41
41
  .setup-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
42
42
  .setup-note:empty { display: none; }
43
43
  .setup-quiet { background: none; border: none; color: inherit; opacity: 0.7; text-decoration: underline; }
44
+
45
+ #lockedPassword{position:absolute;z-index:8;left:max(.5rem,env(safe-area-inset-left));right:max(.5rem,env(safe-area-inset-right));top:max(.5rem,env(safe-area-inset-top));display:grid;gap:.4rem;padding:.6rem;background:#111827f2;border:1px solid #64748b;border-radius:10px;color:#f1f5f9}
46
+ #lockedPassword[hidden],#leaveUnlockedButton[hidden]{display:none}
47
+ #lockedPassword input{width:100%;font-size:16px;padding:.55rem}
48
+ #lockedPassword p{margin:0;font-size:.8rem}
49
+ #leaveUnlockedButton{position:absolute;z-index:8;right:max(.5rem,env(safe-area-inset-right));bottom:4rem;padding:.55rem .8rem}
50
+ #lockedCard{margin-top:.8rem}
51
+ #lockedCard[hidden]{display:none}
@@ -19,6 +19,10 @@
19
19
  <label>Machine <select id="machine"></select></label>
20
20
  <button id="requestButton">Open selected machine</button>
21
21
  <ul id="machineNotes" class="machine-notes" aria-label="Machines that are not ready"></ul>
22
+ <div id="lockedCard" hidden>
23
+ <p id="lockedCardText"></p>
24
+ <button id="lockedToggle" type="button" hidden></button>
25
+ </div>
22
26
  </section>
23
27
  <section id="setup" hidden>
24
28
  <h2>Machines</h2>
@@ -86,6 +90,12 @@
86
90
  <button data-remote-key="F11" type="button">F11</button>
87
91
  <button data-remote-key="F12" type="button">F12</button>
88
92
  </div>
93
+ <form id="lockedPassword" hidden>
94
+ <label>Mac password <input id="lockedPasswordInput" type="password" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" maxlength="256"></label>
95
+ <button type="submit">Unlock</button>
96
+ <p>The machine serving this page and the tunnel provider can read what you type here. The Instar app is safer.</p>
97
+ </form>
98
+ <button id="leaveUnlockedButton" type="button" hidden>Leave unlocked</button>
89
99
  <div id="keyboardBar" hidden>
90
100
  <label class="type-label" for="typeText">Type on remote desktop</label>
91
101
  <input id="typeText" maxlength="64" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" enterkeyhint="done">
@@ -251,7 +251,7 @@ const base64ToBytes = text => Uint8Array.from(atob(text), character => character
251
251
  function recordIv(direction, sequence) {
252
252
  const iv = new Uint8Array(12);
253
253
  const view = new DataView(iv.buffer);
254
- view.setUint32(0, direction === 'frame' ? 1 : 2);
254
+ view.setUint32(0, { frame: 1, input: 2, control: 3 }[direction]);
255
255
  view.setBigUint64(4, sequence);
256
256
  return iv;
257
257
  }
@@ -410,11 +410,65 @@ function receiveH264(bytes, epoch) {
410
410
  timestamp, data }));
411
411
  needsVideoKeyframe = false;
412
412
  }
413
+ const CONTROL_MARKER = 0xc7;
414
+ let controlSequence = 0n;
415
+ let lockedSealKey = '';
416
+ let lockedScreenState = '';
417
+ let lockedBoxAllowed = false;
418
+ let secretSequence = 0;
419
+ function syncLockedPassword() {
420
+ const show = lockedBoxAllowed && lockedScreenState === 'locked-in-session' && !!lockedSealKey;
421
+ $('lockedPassword').hidden = !show;
422
+ if (!show) $('lockedPasswordInput').value = '';
423
+ }
424
+ function lockedMessage(reason) {
425
+ return { 'relock-pending': 'This Mac is finishing a relock. Try again in a couple of minutes.',
426
+ 'attempts-per-request': 'Too many tries in this session.', 'attempts-per-day': 'Too many tries today.',
427
+ 'seal-stale': 'The connection changed. Type your password again.',
428
+ aborted: 'Stopped before the password finished. Type it again.',
429
+ 'field-dirty': 'Clearing the password field. Try again in a moment.',
430
+ 'browser-box-off': 'Password entry from a browser is off for this Mac.',
431
+ 'tunnel-not-first-tier': 'Password entry is off while the backup connection is in use.' }[reason]
432
+ ?? 'This Mac did not accept that. Try again.';
433
+ }
434
+ async function receiveControl(record) {
435
+ const view = new DataView(record.buffer, record.byteOffset, record.byteLength);
436
+ const sequence = view.getBigUint64(0) & 0x00ff_ffff_ffff_ffffn;
437
+ if (sequence <= controlSequence) throw new Error('Remote control record invalid.');
438
+ const plain = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: recordIv('control', sequence),
439
+ additionalData: recordAad('control') }, aesKey, record.subarray(8));
440
+ controlSequence = sequence;
441
+ const value = JSON.parse(new TextDecoder().decode(plain));
442
+ if (value.type === 'seal') lockedSealKey = value.key;
443
+ if (value.type === 'state') { lockedScreenState = value.state; lockedBoxAllowed = value.box === true; }
444
+ if (value.type === 'secret-result' && value.refused) status(lockedMessage(value.refused));
445
+ if (value.type === 'secret-result' && value.sent) { $('leaveUnlockedButton').hidden = false; }
446
+ if (value.type === 'relock') status(value.phase === 'left-unlocked' ? 'This Mac will stay unlocked.' : 'Relocking has begun.');
447
+ syncLockedPassword();
448
+ }
449
+ /** Sealed for the helper alone: Node and the front carry bytes they cannot read. */
450
+ async function sendLockedPassword(text) {
451
+ const helperKey = lockedSealKey;
452
+ const pair = await crypto.subtle.generateKey({ name: 'ECDH', namedCurve: 'P-256' }, true, ['deriveBits']);
453
+ const helper = await crypto.subtle.importKey('raw', base64ToBytes(helperKey), { name: 'ECDH', namedCurve: 'P-256' }, false, []);
454
+ const bits = await crypto.subtle.deriveBits({ name: 'ECDH', public: helper }, pair.privateKey, 256);
455
+ const hkdf = await crypto.subtle.importKey('raw', bits, 'HKDF', false, ['deriveKey']);
456
+ const key = await crypto.subtle.deriveKey({ name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(0),
457
+ info: encoder.encode(`instar-desktop-secret-v1:${requestId}:${helperKey}`) }, hkdf,
458
+ { name: 'AES-GCM', length: 256 }, false, ['encrypt']);
459
+ const seq = ++secretSequence;
460
+ const iv = crypto.getRandomValues(new Uint8Array(12));
461
+ const ct = await crypto.subtle.encrypt({ name: 'AES-GCM', iv,
462
+ additionalData: encoder.encode(JSON.stringify(['instar-desktop-secret-v1', requestId, seq])) }, key, encoder.encode(text));
463
+ const ephemeral = await crypto.subtle.exportKey('raw', pair.publicKey);
464
+ return sendCommand({ type: 'secret', secret: { ephemeral: bytesToBase64(ephemeral), iv: bytesToBase64(iv), ct: bytesToBase64(ct), seq } });
465
+ }
413
466
  async function receiveFrame(recordBuffer, epoch) {
414
467
  if (!inputEnabled || epoch !== streamEpoch) return;
415
468
  if (!aesKey || !(recordBuffer instanceof ArrayBuffer) || recordBuffer.byteLength < 28
416
469
  || recordBuffer.byteLength > 1_600_000) throw new Error('Encrypted frame invalid.');
417
470
  const record = new Uint8Array(recordBuffer);
471
+ if (record[0] === CONTROL_MARKER) { await receiveControl(record); return; }
418
472
  const sequence = new DataView(recordBuffer).getBigUint64(0);
419
473
  // The target may drop an already-encrypted frame under backpressure. A
420
474
  // strictly increasing nonce still rejects replay/reordering without treating
@@ -699,6 +753,7 @@ async function loadTargetsAndMaybeOpen({ open = true } = {}) {
699
753
  const trustedKey = typeof target.targetSigningPublicKey === 'string'
700
754
  ? target.targetSigningPublicKey : '';
701
755
  option.disabled = !target.ready || !trustedKey;
756
+ setTimeout(() => { void refreshLockedCard(); }, 0);
702
757
  option.textContent = option.disabled
703
758
  ? `${target.label} — ${target.unavailableReason || 'Unavailable right now'}`
704
759
  : target.label;
@@ -817,6 +872,8 @@ async function requestDesktop() {
817
872
  browserEcdhPublicKey: bytesToBase64(ecdhPublicKey),
818
873
  browserNonce: crypto.randomUUID().replaceAll('-', ''),
819
874
  videoCodec,
875
+ client: 'browser',
876
+ controlRecords: true,
820
877
  });
821
878
  requestId = result.requestId;
822
879
  const approved = await api(`/desktop/requests/${encodeURIComponent(requestId)}`);
@@ -875,6 +932,10 @@ async function openStream(result, resume = null) {
875
932
  sendChain = Promise.resolve();
876
933
  receiveChain = Promise.resolve();
877
934
  socket.binaryType = 'arraybuffer';
935
+ controlSequence = 0n;
936
+ lockedSealKey = '';
937
+ secretSequence = 0;
938
+ syncLockedPassword();
878
939
  return new Promise((resolve, reject) => {
879
940
  let opened = false;
880
941
  let settled = false;
@@ -930,8 +991,17 @@ async function openStream(result, resume = null) {
930
991
  });
931
992
  }
932
993
 
994
+ const LOCK_SCREEN_KEYS = new Set(['Enter', 'Tab', 'Escape', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']);
995
+ /** A password typed at the shield must never leave as plain input. The helper
996
+ * also refuses it, but only this stops it reaching the server at all. */
997
+ function refusedAtLock(action) {
998
+ if (!['locked-in-session', 'locked-by-policy', 'screensaver-or-sleep', 'unknown'].includes(lockedScreenState)) return false;
999
+ if (action.kind === 'type') return true;
1000
+ return action.kind === 'keyDown' && !LOCK_SCREEN_KEYS.has(action.key);
1001
+ }
933
1002
  function send(action) {
934
1003
  if (!inputEnabled) return Promise.resolve(false);
1004
+ if (refusedAtLock(action)) return Promise.resolve(true);
935
1005
  if (screenSwitch && Date.now() - screenSwitch.at >= SCREEN_SWITCH_LIMIT_MS) screenSwitch = null;
936
1006
  if (screenSwitch && ['click', 'buttonDown', 'move'].includes(action.kind)) return Promise.resolve(false);
937
1007
  return sendCommand({ type: 'input', action });
@@ -1559,6 +1629,33 @@ $('stopButton').addEventListener('click', async () => {
1559
1629
  catch { message = 'The viewer closed, but the target has not confirmed revocation. Access expires automatically.'; }
1560
1630
  leave(message);
1561
1631
  });
1632
+ $('lockedPassword')?.addEventListener('submit', event => {
1633
+ event.preventDefault();
1634
+ const input = $('lockedPasswordInput');
1635
+ const text = input.value;
1636
+ input.value = '';
1637
+ if (text) void sendLockedPassword(text);
1638
+ });
1639
+ const LOCKED_REASONS = { 'unsupported-macos': 'Not available yet: this Mac\u2019s macOS has not passed the crash and Stop tests.' };
1640
+ async function refreshLockedCard() {
1641
+ let rows;
1642
+ try { rows = (await api('/desktop/locked/status?scope=pool')).machines; }
1643
+ catch { $('lockedCard').hidden = true; return; }
1644
+ const row = rows?.find(item => item.machineId === $('machine').value);
1645
+ if (!row) { $('lockedCard').hidden = true; return; }
1646
+ $('lockedCard').hidden = !row.enabled && !!row.refusal;
1647
+ $('lockedCardText').textContent = row.refusal ? LOCKED_REASONS[row.refusal] ?? 'Opening this Mac at its lock screen is unavailable.'
1648
+ : row.enabled ? 'You can open this Mac at its lock screen. It relocks when you finish.' : 'Opening this Mac at its lock screen is off.';
1649
+ $('lockedToggle').hidden = !!row.refusal;
1650
+ $('lockedToggle').textContent = row.enabled ? 'Turn off' : 'Turn on';
1651
+ $('lockedToggle').onclick = async () => {
1652
+ try { await api('/desktop/locked/settings', 'POST', { machineId: row.machineId, enabled: !row.enabled }); }
1653
+ catch (error) { status(error.message); }
1654
+ void refreshLockedCard();
1655
+ };
1656
+ }
1657
+ $('machine')?.addEventListener('change', () => { void refreshLockedCard(); });
1658
+ $('leaveUnlockedButton')?.addEventListener('click', () => { void sendCommand({ type: 'leave-unlocked' }); });
1562
1659
  window.addEventListener('beforeunload', () => {
1563
1660
  stopping = true;
1564
1661
  sendCommand({ type: 'stop' });
@@ -1,10 +1,12 @@
1
1
  export interface DesktopAuditEvent {
2
- kind: 'start' | 'stop';
2
+ kind: 'start' | 'stop' | 'leave-unlocked';
3
3
  grantId: string;
4
4
  machineId: string;
5
5
  operatorUid: string;
6
6
  authMethod?: 'pin' | 'telegram';
7
7
  inputBucket?: 'none' | '1-9' | '10-99' | '100+';
8
+ /** leave-unlocked only: true when the tap beat the relock guard. */
9
+ acknowledged?: boolean;
8
10
  }
9
11
  export declare class DesktopAccessAudit {
10
12
  private readonly dir;
@@ -1 +1 @@
1
- {"version":3,"file":"DesktopAccessAudit.d.ts","sourceRoot":"","sources":["../../src/core/DesktopAccessAudit.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;CACjD;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,YAAY,QAAQ,EAAE,MAAM,EAI3B;IAED,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAWrC;IAED,OAAO,CAAC,KAAK;CASd"}
1
+ {"version":3,"file":"DesktopAccessAudit.d.ts","sourceRoot":"","sources":["../../src/core/DesktopAccessAudit.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,gBAAgB,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;IAChD,oEAAoE;IACpE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,YAAY,QAAQ,EAAE,MAAM,EAI3B;IAED,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAYrC;IAED,OAAO,CAAC,KAAK;CASd"}
@@ -19,6 +19,7 @@ export class DesktopAccessAudit {
19
19
  operatorRef: crypto.createHash('sha256').update(event.operatorUid).digest('hex').slice(0, 16),
20
20
  ...(event.authMethod ? { authMethod: event.authMethod } : {}),
21
21
  ...(event.inputBucket ? { inputBucket: event.inputBucket } : {}),
22
+ ...(event.acknowledged !== undefined ? { acknowledged: event.acknowledged } : {}),
22
23
  };
23
24
  fs.appendFileSync(file, JSON.stringify(entry) + '\n', { mode: 0o600 });
24
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DesktopAccessAudit.js","sourceRoot":"","sources":["../../src/core/DesktopAccessAudit.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAWrD,MAAM,OAAO,kBAAkB;IACZ,GAAG,CAAS;IAC7B,YAAY,QAAgB;QAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,MAAM,CAAC,KAAwB;QAC7B,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG;YACZ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;YAChD,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACtF,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7F,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;QACF,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAEO,KAAK;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;QAClD,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,MAAM,EAAE,CAAC;gBACrD,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,gCAAgC,EAAE,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"DesktopAccessAudit.js","sourceRoot":"","sources":["../../src/core/DesktopAccessAudit.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAarD,MAAM,OAAO,kBAAkB;IACZ,GAAG,CAAS;IAC7B,YAAY,QAAgB;QAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,MAAM,CAAC,KAAwB;QAC7B,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG;YACZ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;YAChD,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACtF,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7F,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClF,CAAC;QACF,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAEO,KAAK;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;QAClD,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,MAAM,EAAE,CAAC;gBACrD,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,gCAAgC,EAAE,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -1,12 +1,19 @@
1
- export type DesktopDirection = 'frame' | 'input';
1
+ export type DesktopDirection = 'frame' | 'input' | 'control';
2
+ /** First byte of a control record. Frame sequences never reach it, and only a
3
+ * viewer that declared controlRecords is ever sent one. */
4
+ export declare const DESKTOP_CONTROL_MARKER = 199;
2
5
  export declare const DESKTOP_MAX_PLAINTEXT_FRAME_BYTES: number;
3
6
  export declare class DesktopAead {
4
7
  private readonly key;
5
8
  private readonly requestId;
6
9
  private nextFrame;
7
10
  private nextInput;
11
+ private nextControl;
8
12
  constructor(key: Buffer, requestId: string);
9
13
  encryptFrame(frame: Buffer): Buffer;
14
+ /** Its own sequence and IV domain: a control record overtaking a frame in
15
+ * flight must never make that frame's sequence look stale to a viewer. */
16
+ encryptControl(value: unknown): Buffer;
10
17
  decryptInput(record: Buffer): unknown;
11
18
  }
12
19
  export declare function deriveDesktopKey(browserEcdhPublicKey: Buffer, requestId: string, machineId: string): {
@@ -1 +1 @@
1
- {"version":3,"file":"DesktopAead.d.ts","sourceRoot":"","sources":["../../src/core/DesktopAead.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjD,eAAO,MAAM,iCAAiC,QAA4B,CAAC;AAa3E,qBAAa,WAAW;IAIV,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,OAAO,CAAC,QAAQ,CAAC,SAAS;IAHpE,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,SAAS,CAAM;IAEvB,YAA6B,GAAG,EAAE,MAAM,EAAmB,SAAS,EAAE,MAAM,EAE3E;IAED,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASlC;IAED,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUpC;CACF;AAED,wBAAgB,gBAAgB,CAAC,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IACpG,GAAG,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CACpD,CASA"}
1
+ {"version":3,"file":"DesktopAead.d.ts","sourceRoot":"","sources":["../../src/core/DesktopAead.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAC7D;2DAC2D;AAC3D,eAAO,MAAM,sBAAsB,MAAO,CAAC;AAG3C,eAAO,MAAM,iCAAiC,QAA4B,CAAC;AAa3E,qBAAa,WAAW;IAKV,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJpE,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,WAAW,CAAM;IAEzB,YAA6B,GAAG,EAAE,MAAM,EAAmB,SAAS,EAAE,MAAM,EAE3E;IAED,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASlC;IAED;8EAC0E;IAC1E,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASrC;IAED,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUpC;CACF;AAED,wBAAgB,gBAAgB,CAAC,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IACpG,GAAG,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CACpD,CASA"}
@@ -3,11 +3,15 @@
3
3
  * prevent reflection, reordering and replay. A new ECDH key is used per grant. */
4
4
  import crypto from 'node:crypto';
5
5
  import { H264_MAX_ACCESS_UNIT } from './DesktopVideo.js';
6
+ /** First byte of a control record. Frame sequences never reach it, and only a
7
+ * viewer that declared controlRecords is ever sent one. */
8
+ export const DESKTOP_CONTROL_MARKER = 0xc7;
9
+ const IV_DOMAIN = { frame: 1, input: 2, control: 3 };
6
10
  // The native access unit may fill its cap; the authenticated H.264 wrapper adds 18 bytes.
7
11
  export const DESKTOP_MAX_PLAINTEXT_FRAME_BYTES = H264_MAX_ACCESS_UNIT + 18;
8
12
  function iv(direction, sequence) {
9
13
  const nonce = Buffer.alloc(12);
10
- nonce.writeUInt32BE(direction === 'frame' ? 1 : 2, 0);
14
+ nonce.writeUInt32BE(IV_DOMAIN[direction], 0);
11
15
  nonce.writeBigUInt64BE(sequence, 4);
12
16
  return nonce;
13
17
  }
@@ -19,6 +23,7 @@ export class DesktopAead {
19
23
  requestId;
20
24
  nextFrame = 1n;
21
25
  nextInput = 1n;
26
+ nextControl = 1n;
22
27
  constructor(key, requestId) {
23
28
  this.key = key;
24
29
  this.requestId = requestId;
@@ -36,6 +41,18 @@ export class DesktopAead {
36
41
  header.writeBigUInt64BE(sequence);
37
42
  return Buffer.concat([header, encrypted, cipher.getAuthTag()]);
38
43
  }
44
+ /** Its own sequence and IV domain: a control record overtaking a frame in
45
+ * flight must never make that frame's sequence look stale to a viewer. */
46
+ encryptControl(value) {
47
+ const sequence = this.nextControl++;
48
+ const cipher = crypto.createCipheriv('aes-256-gcm', this.key, iv('control', sequence));
49
+ cipher.setAAD(aad(this.requestId, 'control'));
50
+ const encrypted = Buffer.concat([cipher.update(JSON.stringify(value), 'utf8'), cipher.final()]);
51
+ const header = Buffer.alloc(8);
52
+ header.writeBigUInt64BE(sequence);
53
+ header[0] = DESKTOP_CONTROL_MARKER;
54
+ return Buffer.concat([header, encrypted, cipher.getAuthTag()]);
55
+ }
39
56
  decryptInput(record) {
40
57
  if (record.length < 8 + 16 + 2 || record.length > 4_096)
41
58
  throw new Error('desktop input record size invalid');
@@ -1 +1 @@
1
- {"version":3,"file":"DesktopAead.js","sourceRoot":"","sources":["../../src/core/DesktopAead.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DesktopAead.js","sourceRoot":"","sources":["../../src/core/DesktopAead.ts"],"names":[],"mappings":"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"}
@@ -43,6 +43,13 @@ export declare function isDesktopKey(key: unknown): key is DesktopKey;
43
43
  export declare function isDesktopButton(button: unknown): button is DesktopButton;
44
44
  /** Shape check applied before any host sees an action. */
45
45
  export declare function validDesktopInput(action: DesktopInput): boolean;
46
+ /** Sealed to the input-stream helper's key. Node carries bytes it cannot read. */
47
+ export interface DesktopSealedSecret {
48
+ ephemeral: string;
49
+ iv: string;
50
+ ct: string;
51
+ seq: number;
52
+ }
46
53
  export interface DesktopProbe {
47
54
  screenPermission: boolean;
48
55
  inputPermission: boolean;
@@ -53,6 +60,9 @@ export interface DesktopProbe {
53
60
  onConsole?: boolean;
54
61
  loginDone?: boolean;
55
62
  screenLocked?: boolean;
63
+ osMajor?: number;
64
+ /** The classified lock reading, when the locked-screen controller exists. */
65
+ lockState?: import('./DesktopLockState.js').DesktopLockState;
56
66
  /** macOS only: which identity holds the permission. `own` is the helper
57
67
  * itself; `inherited` depends on what started this server's process tree. */
58
68
  screenGrant?: 'own' | 'inherited' | 'none';
@@ -61,6 +71,8 @@ export interface DesktopProbe {
61
71
  helperSource?: 'retained' | 'packaged';
62
72
  helperFallback?: string;
63
73
  helperChange?: DesktopHelperPermissionChange;
74
+ /** macOS only, while the locked-screen feature is on. */
75
+ lockInputs?: import('./DesktopLockState.js').DesktopLockInputs;
64
76
  }
65
77
  export type DesktopPlatform = 'macos' | 'windows';
66
78
  export interface DesktopDisplay {
@@ -105,7 +117,20 @@ export interface DesktopHost {
105
117
  x: number;
106
118
  y: number;
107
119
  }>;
108
- input(action: DesktopInput): Promise<void>;
120
+ /** A `refused` reply is not a failure: the helper did nothing and lives on. */
121
+ input(action: DesktopInput): Promise<void | {
122
+ refused: string;
123
+ }>;
124
+ secretType?(input: {
125
+ requestId: string;
126
+ key: string;
127
+ secret: DesktopSealedSecret;
128
+ }): Promise<void | {
129
+ refused: string;
130
+ }>;
131
+ abortInput?(): void;
132
+ ensureInputStream?(): void;
133
+ setSealKeyHandler?(handler: (key: string) => void): void;
109
134
  cancelInput(): void;
110
135
  setInputFailureHandler?(handler: () => void): void;
111
136
  startIndicator(onUnexpectedExit: () => void): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"DesktopHost.d.ts","sourceRoot":"","sources":["../../src/core/DesktopHost.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DesktopHost.d.ts","sourceRoot":"","sources":["../../src/core/DesktopHost.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DesktopHost.js","sourceRoot":"","sources":["../../src/core/DesktopHost.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DesktopHost.js","sourceRoot":"","sources":["../../src/core/DesktopHost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Reads whether a Mac is really locked. The flag is one input, never the
3
+ * answer: the session-only inputs name whose session is on the console and stay
4
+ * true at the shield, so only the flag and the shield window can tell locked
5
+ * from unlocked. Fixed predicates, no model; a real frame settles capture.
6
+ * Spec: docs/specs/desktop-locked-screen.md, "Lock reading".
7
+ */
8
+ export type DesktopLockState = 'unlocked' | 'screensaver-or-sleep' | 'locked-in-session' | 'locked-by-policy' | 'login-window-switched' | 'other-user-on-console' | 'unknown';
9
+ /** `pending` is a refresh after a state change. It falls on the locked side. */
10
+ export type DesktopLockPolicy = 'off' | 'on' | 'delayed' | 'unreadable' | 'pending';
11
+ export interface DesktopLockInputs {
12
+ shieldWindow: boolean;
13
+ secureInputOwner: 'loginwindow' | 'other' | 'none' | 'unreadable';
14
+ displayAsleep: boolean;
15
+ screensaver: boolean;
16
+ onlineDisplays: number;
17
+ thisUser: string;
18
+ consoleUser?: string;
19
+ osMajor: number;
20
+ sampledAtMs: number;
21
+ bootSession?: string;
22
+ loginSession?: string;
23
+ }
24
+ export declare const LOCK_SAMPLE_MAX_AGE_MS = 2000;
25
+ export interface DesktopLockSample {
26
+ screenLocked?: boolean;
27
+ onConsole?: boolean;
28
+ loginDone?: boolean;
29
+ osMajor?: number;
30
+ lockInputs?: DesktopLockInputs;
31
+ }
32
+ /** `unknown` comes first: a stale, partial or self-contradicting sample never
33
+ * reaches the table. */
34
+ export declare function classifyDesktopLock(sample: DesktopLockSample, policy: DesktopLockPolicy, nowMs: number): DesktopLockState;
35
+ export declare function isLockedClass(state: DesktopLockState): boolean;
36
+ /** Parses `sysadminctl -screenLock status`, which reports on stderr. */
37
+ export declare function parseScreenLockPolicy(output: string): DesktopLockPolicy;
38
+ //# sourceMappingURL=DesktopLockState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesktopLockState.d.ts","sourceRoot":"","sources":["../../src/core/DesktopLockState.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GACxB,UAAU,GAAG,sBAAsB,GAAG,mBAAmB,GAAG,kBAAkB,GAC9E,uBAAuB,GAAG,uBAAuB,GAAG,SAAS,CAAC;AAElE,gFAAgF;AAChF,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC;IAClE,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;wBACwB;AACxB,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAiBzH;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAE9D;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAKvE"}
@@ -0,0 +1,43 @@
1
+ export const LOCK_SAMPLE_MAX_AGE_MS = 2_000;
2
+ /** `unknown` comes first: a stale, partial or self-contradicting sample never
3
+ * reaches the table. */
4
+ export function classifyDesktopLock(sample, policy, nowMs) {
5
+ const inputs = sample.lockInputs;
6
+ const flag = sample.screenLocked;
7
+ if (!inputs || typeof flag !== 'boolean' || typeof sample.onConsole !== 'boolean'
8
+ || typeof sample.loginDone !== 'boolean' || !inputs.thisUser
9
+ || Math.abs(nowMs - inputs.sampledAtMs) > LOCK_SAMPLE_MAX_AGE_MS)
10
+ return 'unknown';
11
+ const console = inputs.consoleUser;
12
+ const quiet = inputs.screensaver || inputs.displayAsleep;
13
+ if (!flag && inputs.shieldWindow)
14
+ return 'unknown';
15
+ if (flag && !inputs.shieldWindow && !quiet)
16
+ return 'unknown';
17
+ if (console && console !== 'loginwindow' && console !== 'root' && console !== inputs.thisUser)
18
+ return 'other-user-on-console';
19
+ if (!console || console === 'loginwindow' || console === 'root' || !sample.onConsole)
20
+ return 'login-window-switched';
21
+ if (flag && inputs.shieldWindow)
22
+ return 'locked-in-session';
23
+ if (quiet && (flag || policy !== 'off'))
24
+ return 'locked-by-policy';
25
+ if (quiet)
26
+ return 'screensaver-or-sleep';
27
+ if (!flag && !inputs.shieldWindow)
28
+ return 'unlocked';
29
+ return 'unknown';
30
+ }
31
+ export function isLockedClass(state) {
32
+ return state === 'locked-in-session' || state === 'locked-by-policy' || state === 'unknown';
33
+ }
34
+ /** Parses `sysadminctl -screenLock status`, which reports on stderr. */
35
+ export function parseScreenLockPolicy(output) {
36
+ if (/screenLock is off/i.test(output))
37
+ return 'off';
38
+ const delay = /screenLock delay is (-?\d+)/i.exec(output);
39
+ if (!delay)
40
+ return /immediate/i.test(output) ? 'on' : 'unreadable';
41
+ return Number(delay[1]) === 0 ? 'on' : 'delayed';
42
+ }
43
+ //# sourceMappingURL=DesktopLockState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesktopLockState.js","sourceRoot":"","sources":["../../src/core/DesktopLockState.ts"],"names":[],"mappings":"AA4BA,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAU5C;wBACwB;AACxB,MAAM,UAAU,mBAAmB,CAAC,MAAyB,EAAE,MAAyB,EAAE,KAAa;IACrG,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;IACjC,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,SAAS;WAC5E,OAAO,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ;WACzD,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,sBAAsB;QAAE,OAAO,SAAS,CAAC;IACrF,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,aAAa,CAAC;IACzD,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IACnD,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,OAAO,IAAI,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,CAAC,QAAQ;QAAE,OAAO,uBAAuB,CAAC;IAC9H,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,uBAAuB,CAAC;IACrH,IAAI,IAAI,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,mBAAmB,CAAC;IAC5D,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACnE,IAAI,KAAK;QAAE,OAAO,sBAAsB,CAAC;IACzC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,OAAO,UAAU,CAAC;IACrD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAuB;IACnD,OAAO,KAAK,KAAK,mBAAmB,IAAI,KAAK,KAAK,kBAAkB,IAAI,KAAK,KAAK,SAAS,CAAC;AAC9F,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,KAAK,GAAG,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;IACnE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC"}