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.
- package/dashboard/desktop.css +8 -0
- package/dashboard/desktop.html +10 -0
- package/dashboard/desktop.js +98 -1
- package/dist/core/DesktopAccessAudit.d.ts +3 -1
- package/dist/core/DesktopAccessAudit.d.ts.map +1 -1
- package/dist/core/DesktopAccessAudit.js +1 -0
- package/dist/core/DesktopAccessAudit.js.map +1 -1
- package/dist/core/DesktopAead.d.ts +8 -1
- package/dist/core/DesktopAead.d.ts.map +1 -1
- package/dist/core/DesktopAead.js +18 -1
- package/dist/core/DesktopAead.js.map +1 -1
- package/dist/core/DesktopHost.d.ts +26 -1
- package/dist/core/DesktopHost.d.ts.map +1 -1
- package/dist/core/DesktopHost.js.map +1 -1
- package/dist/core/DesktopLockState.d.ts +38 -0
- package/dist/core/DesktopLockState.d.ts.map +1 -0
- package/dist/core/DesktopLockState.js +43 -0
- package/dist/core/DesktopLockState.js.map +1 -0
- package/dist/core/DesktopLockedController.d.ts +138 -0
- package/dist/core/DesktopLockedController.d.ts.map +1 -0
- package/dist/core/DesktopLockedController.js +442 -0
- package/dist/core/DesktopLockedController.js.map +1 -0
- package/dist/core/DesktopOperatorAssertion.d.ts +39 -0
- package/dist/core/DesktopOperatorAssertion.d.ts.map +1 -1
- package/dist/core/DesktopOperatorAssertion.js +49 -0
- package/dist/core/DesktopOperatorAssertion.js.map +1 -1
- package/dist/core/DesktopProvenVersions.d.ts +19 -0
- package/dist/core/DesktopProvenVersions.d.ts.map +1 -0
- package/dist/core/DesktopProvenVersions.js +8 -0
- package/dist/core/DesktopProvenVersions.js.map +1 -0
- package/dist/core/DirectDesktopAccess.d.ts +20 -1
- package/dist/core/DirectDesktopAccess.d.ts.map +1 -1
- package/dist/core/DirectDesktopAccess.js +263 -10
- package/dist/core/DirectDesktopAccess.js.map +1 -1
- package/dist/core/MacDesktopHost.d.ts +32 -1
- package/dist/core/MacDesktopHost.d.ts.map +1 -1
- package/dist/core/MacDesktopHost.js +115 -37
- package/dist/core/MacDesktopHost.js.map +1 -1
- package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
- package/dist/core/WriteDomainRegistry.js +8 -0
- package/dist/core/WriteDomainRegistry.js.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/native/instar-desktop-host +0 -0
- package/dist/native/instar-desktop-host.json +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +1 -1
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +4 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +116 -3
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +2 -1
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/DesktopMeshBroker.d.ts +6 -0
- package/dist/server/DesktopMeshBroker.d.ts.map +1 -1
- package/dist/server/DesktopMeshBroker.js +17 -1
- package/dist/server/DesktopMeshBroker.js.map +1 -1
- package/dist/server/DesktopStreamManager.d.ts +11 -3
- package/dist/server/DesktopStreamManager.d.ts.map +1 -1
- package/dist/server/DesktopStreamManager.js +24 -1
- package/dist/server/DesktopStreamManager.js.map +1 -1
- package/dist/server/machineRoutes.d.ts +1 -0
- package/dist/server/machineRoutes.d.ts.map +1 -1
- package/dist/server/machineRoutes.js +14 -0
- package/dist/server/machineRoutes.js.map +1 -1
- package/dist/server/routes.d.ts +9 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +99 -0
- package/dist/server/routes.js.map +1 -1
- package/dist/testing/selfActionRegistry.d.ts.map +1 -1
- package/dist/testing/selfActionRegistry.js +58 -0
- package/dist/testing/selfActionRegistry.js.map +1 -1
- package/package.json +1 -1
- package/scripts/build-native-desktop-host.mjs +4 -2
- package/src/data/builtin-manifest.json +48 -48
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/src/scaffold/templates.ts +1 -1
- package/upgrades/1.3.1598.md +24 -0
- package/upgrades/side-effects/desktop-locked-screen.md +129 -0
package/dashboard/desktop.css
CHANGED
|
@@ -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}
|
package/dashboard/desktop.html
CHANGED
|
@@ -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">
|
package/dashboard/desktop.js
CHANGED
|
@@ -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,
|
|
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;
|
|
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;
|
|
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;
|
|
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"}
|
package/dist/core/DesktopAead.js
CHANGED
|
@@ -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
|
|
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":"AAAA;;kFAEkF;AAClF,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,0FAA0F;AAC1F,MAAM,CAAC,MAAM,iCAAiC,GAAG,oBAAoB,GAAG,EAAE,CAAC;AAE3E,SAAS,EAAE,CAAC,SAA2B,EAAE,QAAgB;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/B,KAAK,CAAC,aAAa,CAAC,SAAS,
|
|
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
|
-
|
|
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":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACjF;oFACoF;AACpF,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE;AACxC,iEAAiE;GAC/D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE;AAChD,gFAAgF;GAC9E;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAMxD;sEACsE;AACtE,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAIC,CAAC;AAG5C,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAE5D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,aAAa,CAExE;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAkB/D;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;iFAC6E;IAC7E,WAAW,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,MAAM,CAAC;IAC3C,UAAU,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,MAAM,CAAC;IAC1C,4EAA4E;IAC5E,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,6BAA6B,CAAC;
|
|
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"}
|