Signal-iOS/SignalServiceKit/Messages/DecryptedIncomingEnvelope.swift
2024-03-27 12:22:52 -05:00

76 lines
2.2 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
import LibSignalClient
import SignalCoreKit
/// Represents an envelope that's already been decrypted.
///
/// This might be a message from one of our linked devices, or it might be a
/// message from another user.
///
/// Identified and unidentified envelopes take different paths to produce
/// this object, but they both produce this type so that most downstream
/// logic doesn't need to care about the source of a message.
///
/// For identified envelopes, `sourceAci` is taken directly from the
/// `ValidatedIncomingEnvelope`, and then we decrypt the envelope payload to
/// populate `plaintextData`.
///
/// For unidentified envelopes, we first decrypt the envelope payload which
/// gives us the `sourceAci` and a nested payload. We then decrypt that
/// nested payload to populate `plaintextData`.
@objc
class DecryptedIncomingEnvelope: NSObject {
@objc
let envelope: SSKProtoEnvelope
@objc
let timestamp: UInt64
@objc
let serverTimestamp: UInt64
let sourceAci: Aci
@objc
let sourceDeviceId: UInt32
let localIdentity: OWSIdentity
let wasReceivedByUD: Bool
let plaintextData: Data
let content: SSKProtoContent?
@objc
var sourceAciObjC: AciObjC { AciObjC(sourceAci) }
init(
validatedEnvelope: ValidatedIncomingEnvelope,
updatedEnvelope: SSKProtoEnvelope,
sourceAci: Aci,
sourceDeviceId: UInt32,
wasReceivedByUD: Bool,
plaintextData: Data
) {
self.envelope = updatedEnvelope
self.timestamp = validatedEnvelope.timestamp
self.serverTimestamp = validatedEnvelope.serverTimestamp
self.sourceAci = sourceAci
self.sourceDeviceId = sourceDeviceId
self.localIdentity = validatedEnvelope.localIdentity
self.wasReceivedByUD = wasReceivedByUD
self.plaintextData = plaintextData
self.content = {
do {
return try SSKProtoContent(serializedData: plaintextData)
} catch {
owsFailDebug("Failed to deserialize content proto: \(error)")
return nil
}
}()
}
}