Authenticate private media capabilities in Noise

This commit is contained in:
jack
2026-07-25 23:00:27 +02:00
committed by jack
parent 30215de295
commit 71e5d8da10
31 changed files with 1412 additions and 133 deletions
@@ -94,6 +94,7 @@ private final class MockChatMediaTransferContext: ChatMediaTransferContext {
private(set) var broadcastFileSends: [String] = []
private(set) var cancelledTransfers: [String] = []
var privateMediaPolicy: PrivateMediaSendPolicy = .encrypted
var resolvedPrivateMediaPolicy: PrivateMediaSendPolicy?
private(set) var legacyConsentRequests: [(
id: UUID,
peerID: PeerID,
@@ -108,6 +109,13 @@ private final class MockChatMediaTransferContext: ChatMediaTransferContext {
privateMediaPolicy
}
func resolvePrivateMediaSendPolicy(
to peerID: PeerID,
completion: @escaping @MainActor (PrivateMediaSendPolicy) -> Void
) {
completion(resolvedPrivateMediaPolicy ?? privateMediaPolicy)
}
func requestLegacyPrivateMediaConsent(
for peerID: PeerID,
transferId: String,
@@ -576,6 +584,31 @@ struct ChatMediaTransferCoordinatorContextTests {
#expect(context.privateFileLegacyAllowances == [true])
}
@Test @MainActor
func capabilityProofTimeoutTransitionsToConsentWithoutAutomaticRawSend() async throws {
let context = MockChatMediaTransferContext()
let coordinator = ChatMediaTransferCoordinator(context: context)
let peerID = PeerID(str: "1020304050607080")
context.selectedPrivateChatPeer = peerID
context.privateMediaPolicy = .awaitingCapabilityProof
context.resolvedPrivateMediaPolicy = .legacyRequiresConsent
let url = FileManager.default.temporaryDirectory
.appendingPathComponent("proof-timeout-consent-\(UUID().uuidString).m4a")
try Data("voice".utf8).write(to: url)
defer { try? FileManager.default.removeItem(at: url) }
coordinator.sendVoiceNote(at: url)
let prompted = await TestHelpers.waitUntil(
{ context.legacyConsentRequests.count == 1 },
timeout: TestConstants.longTimeout
)
#expect(prompted)
#expect(context.privateFileSends.isEmpty)
context.resolveNextLegacyConsent(false)
#expect(context.privateFileSends.isEmpty)
}
@Test @MainActor
func legacyConsentApprovalAfterCancelCannotSend() async throws {
let context = MockChatMediaTransferContext()