Feature Enhancement Planning
Nucleic-Session: 3CD3A375-8BC1-407E-951F-8EF136B08390 Co-authored-by: Nucleic <[email protected]>
This commit is contained in:
@@ -434,6 +434,29 @@ final class HostConnection {
|
|||||||
case .peerList(let peers):
|
case .peerList(let peers):
|
||||||
meshPeers = peers
|
meshPeers = peers
|
||||||
callbacks.didUpdate()
|
callbacks.didUpdate()
|
||||||
|
case .meshRoster(let push):
|
||||||
|
// Mesh "join": the host gossiped its group view. Auto-learn every Mac member into the
|
||||||
|
// paired-hosts registry (so the multiplexer connects to all of them), and drop any the
|
||||||
|
// group revoked. Phone members are ignored — a phone doesn't dial other phones.
|
||||||
|
var changed = false
|
||||||
|
for member in push.members where member.kind == .mac || member.capabilities.canHost {
|
||||||
|
// A mac deviceID is `sha256(staticPublicKey)`; reject a forged (id, key) pair.
|
||||||
|
guard DeviceIdentity.hostID(ofStaticKey: member.staticPublicKey) == member.deviceID
|
||||||
|
else { continue }
|
||||||
|
let fingerprint = member.staticPublicKey.fingerprintHex
|
||||||
|
guard fingerprint != self.hostID else { continue } // that's the Mac we're on
|
||||||
|
if IdentityStore.pairedHost(id: fingerprint) == nil { changed = true }
|
||||||
|
IdentityStore.mergePairedHost(Self.pairedHost(from: member))
|
||||||
|
}
|
||||||
|
for tombstone in push.tombstones {
|
||||||
|
// fingerprint = first 16 hex of the hostID (sha256 prefix), the registry key.
|
||||||
|
let fingerprint = String(tombstone.deviceID.prefix(16))
|
||||||
|
if IdentityStore.pairedHost(id: fingerprint) != nil {
|
||||||
|
IdentityStore.removePairedHost(id: fingerprint)
|
||||||
|
changed = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if changed { callbacks.meshRosterChanged() }
|
||||||
case .transferAccept, .transferReject, .transferReady, .transferCommitted, .transferChunkAck:
|
case .transferAccept, .transferReject, .transferReady, .transferCommitted, .transferChunkAck:
|
||||||
// Session-transfer replies (mesh P5) only reach a *source* Mac; a phone is never one.
|
// Session-transfer replies (mesh P5) only reach a *source* Mac; a phone is never one.
|
||||||
break
|
break
|
||||||
|
|||||||
Reference in New Issue
Block a user