From ec589ce554eff9ab32190493329212bef10e64e9 Mon Sep 17 00:00:00 2001 From: Max Radermacher Date: Thu, 22 Jan 2026 00:39:43 -0600 Subject: [PATCH] Swiftify OWSOutgoingSyncMessage --- Signal.xcodeproj/project.pbxproj | 12 +- .../Account/PniDistributionSyncMessage.swift | 2 +- .../Calls/OutgoingCallEventSyncMessage.swift | 6 +- .../Calls/OutgoingCallLinkUpdateMessage.swift | 6 +- .../OutgoingCallLogEventSyncMessage.swift | 6 +- .../OutgoingBlockedSyncMessage.swift | 6 +- .../OutgoingDeviceNameChangeSyncMessage.swift | 6 +- .../OutgoingReadReceiptsSyncMessage.swift | 6 +- ...OutgoingVerificationStateSyncMessage.swift | 6 +- .../OutgoingViewOnceOpenSyncMessage.swift | 6 +- .../OutgoingViewedReceiptsSyncMessage.swift | 6 +- .../SyncMessages/StickerPackSyncMessage.swift | 6 +- .../DeleteForMeOutgoingSyncMessage.swift | 6 +- .../DeviceSyncing/OWSOutgoingSyncMessage.h | 90 ------------- .../DeviceSyncing/OWSOutgoingSyncMessage.m | 120 ------------------ .../OWSSyncContactsMessage.swift | 6 +- .../OutgoingConfigurationSyncMessage.swift | 6 +- .../OutgoingFetchLatestSyncMessage.swift | 6 +- .../OutgoingKeysSyncMessage.swift | 6 +- ...ingMessageRequestResponseSyncMessage.swift | 8 +- .../OutgoingPaymentSyncMessage.swift | 6 +- .../OutgoingRequestSyncMessage.swift | 6 +- .../OutgoingSentMessageTranscript.swift | 10 +- .../DeviceSyncing/OutgoingSyncMessage.swift | 82 ++++++++++++ .../Messages/Edit/OutgoingEditMessage.swift | 2 +- .../Messages/Interactions/TSInteraction.swift | 2 +- .../Messages/Interactions/TSOutgoingMessage.m | 1 - .../Interactions/TSOutgoingMessage.swift | 2 +- .../Messages/MessageSendLog.swift | 2 +- SignalServiceKit/Messages/MessageSender.swift | 2 +- .../Stories/OutgoingStoryMessage.swift | 2 +- .../OutgoingStorySentMessageTranscript.swift | 12 +- SignalServiceKit/SignalServiceKit.h | 1 - 33 files changed, 159 insertions(+), 293 deletions(-) delete mode 100644 SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSyncMessage.h delete mode 100644 SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m create mode 100644 SignalServiceKit/Messages/DeviceSyncing/OutgoingSyncMessage.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index ad34d6c686..f11f572934 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -821,6 +821,7 @@ 50DCCBFA2F1817280024D124 /* DisappearingMessagesConfigurationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DCCBF92F1817280024D124 /* DisappearingMessagesConfigurationMessage.swift */; }; 50DCCBFC2F181A790024D124 /* ProfileKeyMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DCCBFB2F181A790024D124 /* ProfileKeyMessage.swift */; }; 50DCCBFE2F1820600024D124 /* OutgoingSenderKeyDistributionMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DCCBFD2F1820600024D124 /* OutgoingSenderKeyDistributionMessage.swift */; }; + 50DE50602F21F4A700F30994 /* OutgoingSyncMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DE505F2F21F4A700F30994 /* OutgoingSyncMessage.swift */; }; 50E42FEA2C1BA3B900554BD6 /* CallHTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E42FE92C1BA3B900554BD6 /* CallHTTPClient.swift */; }; 50E51A3B2AE989C4004F9069 /* AccountAttributesTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E51A3A2AE989C4004F9069 /* AccountAttributesTest.swift */; }; 50E5E4B129932D9B00E15A1C /* DeviceMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E5E4B029932D9B00E15A1C /* DeviceMessage.swift */; }; @@ -3538,9 +3539,7 @@ F9C5C8AA289451B900548EEE /* SignalServiceKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9C5C897289451B900548EEE /* SignalServiceKit.framework */; }; F9C5C8AB289451B900548EEE /* SignalServiceKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F9C5C897289451B900548EEE /* SignalServiceKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; F9C5CBB4289453B300548EEE /* OutgoingPaymentSyncMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C8BF289453B100548EEE /* OutgoingPaymentSyncMessage.swift */; }; - F9C5CBB7289453B300548EEE /* OWSOutgoingSyncMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C8C2289453B100548EEE /* OWSOutgoingSyncMessage.m */; }; F9C5CBB8289453B300548EEE /* OWSSyncContactsMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C8C3289453B100548EEE /* OWSSyncContactsMessage.swift */; }; - F9C5CBC7289453B300548EEE /* OWSOutgoingSyncMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C5C8D2289453B100548EEE /* OWSOutgoingSyncMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; F9C5CBC8289453B300548EEE /* TSCall.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C5C8D3289453B100548EEE /* TSCall.h */; settings = {ATTRIBUTES = (Public, ); }; }; F9C5CBC9289453B300548EEE /* MessageBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C8D4289453B100548EEE /* MessageBody.swift */; }; F9C5CBCA289453B300548EEE /* MessageSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C8D5289453B100548EEE /* MessageSender.swift */; }; @@ -4979,6 +4978,7 @@ 50DCCBF92F1817280024D124 /* DisappearingMessagesConfigurationMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisappearingMessagesConfigurationMessage.swift; sourceTree = ""; }; 50DCCBFB2F181A790024D124 /* ProfileKeyMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileKeyMessage.swift; sourceTree = ""; }; 50DCCBFD2F1820600024D124 /* OutgoingSenderKeyDistributionMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingSenderKeyDistributionMessage.swift; sourceTree = ""; }; + 50DE505F2F21F4A700F30994 /* OutgoingSyncMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingSyncMessage.swift; sourceTree = ""; }; 50E42FE52C1B9EB900554BD6 /* CallLinkState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallLinkState.swift; sourceTree = ""; }; 50E42FE92C1BA3B900554BD6 /* CallHTTPClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallHTTPClient.swift; sourceTree = ""; }; 50E51A3A2AE989C4004F9069 /* AccountAttributesTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountAttributesTest.swift; sourceTree = ""; }; @@ -7747,9 +7747,7 @@ F9C5C899289451B900548EEE /* SignalServiceKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SignalServiceKit.h; sourceTree = ""; }; F9C5C89E289451B900548EEE /* SignalServiceKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SignalServiceKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; F9C5C8BF289453B100548EEE /* OutgoingPaymentSyncMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutgoingPaymentSyncMessage.swift; sourceTree = ""; }; - F9C5C8C2289453B100548EEE /* OWSOutgoingSyncMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSOutgoingSyncMessage.m; sourceTree = ""; }; F9C5C8C3289453B100548EEE /* OWSSyncContactsMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OWSSyncContactsMessage.swift; sourceTree = ""; }; - F9C5C8D2289453B100548EEE /* OWSOutgoingSyncMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSOutgoingSyncMessage.h; sourceTree = ""; }; F9C5C8D3289453B100548EEE /* TSCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSCall.h; sourceTree = ""; }; F9C5C8D4289453B100548EEE /* MessageBody.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageBody.swift; sourceTree = ""; }; F9C5C8D5289453B100548EEE /* MessageSender.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageSender.swift; sourceTree = ""; }; @@ -14438,9 +14436,8 @@ F9C5C8BF289453B100548EEE /* OutgoingPaymentSyncMessage.swift */, D93CE1232A5C84F600D916B7 /* OutgoingRequestSyncMessage.swift */, C16B8B742B8940D40030BA24 /* OutgoingSentMessageTranscript.swift */, + 50DE505F2F21F4A700F30994 /* OutgoingSyncMessage.swift */, 6619A1C62B2BA21F004B38FE /* OWSIncomingSentMessageTranscript.swift */, - F9C5C8D2289453B100548EEE /* OWSOutgoingSyncMessage.h */, - F9C5C8C2289453B100548EEE /* OWSOutgoingSyncMessage.m */, F9C5C8C3289453B100548EEE /* OWSSyncContactsMessage.swift */, ); path = DeviceSyncing; @@ -15326,7 +15323,6 @@ C190F8F52C1B47E100D1EAC9 /* OWSOutgoingArchivedPaymentMessage.h in Headers */, F9C5CC05289453B300548EEE /* OWSOutgoingPaymentMessage.h in Headers */, F9C5CC39289453B300548EEE /* OWSOutgoingReactionMessage.h in Headers */, - F9C5CBC7289453B300548EEE /* OWSOutgoingSyncMessage.h in Headers */, 6642A8702A8D7B4B00E591C2 /* OWSPaymentActivationRequestFinishedMessage.h in Headers */, 6642A8742A8D80CB00E591C2 /* OWSPaymentActivationRequestMessage.h in Headers */, 6605D4FD2A85AD17004DC345 /* OWSPaymentMessage.h in Headers */, @@ -19094,6 +19090,7 @@ C16B8B752B8940D40030BA24 /* OutgoingSentMessageTranscript.swift in Sources */, F9C5CC5A289453B300548EEE /* OutgoingStoryMessage.swift in Sources */, 884E4C4828AF2F2A007A338C /* OutgoingStorySentMessageTranscript.swift in Sources */, + 50DE50602F21F4A700F30994 /* OutgoingSyncMessage.swift in Sources */, 042223BA2EDF30BA00158556 /* OutgoingUnpinMessage.swift in Sources */, 50BCD5562F219A730032BF02 /* OutgoingVerificationStateSyncMessage.swift in Sources */, 50BCD5402F21447B0032BF02 /* OutgoingViewedReceiptsSyncMessage.swift in Sources */, @@ -19169,7 +19166,6 @@ 6674807E2E344EE9004DA6E9 /* OWSOutgoingPaymentMessage.swift in Sources */, F9C5CC3B289453B300548EEE /* OWSOutgoingReactionMessage.m in Sources */, 505B228329F73ABE005578F3 /* OWSOutgoingResendResponse.swift in Sources */, - F9C5CBB7289453B300548EEE /* OWSOutgoingSyncMessage.m in Sources */, 6642A87A2A8D85F500E591C2 /* OWSPaymentActivationRequestFinishedMessage+SDS.swift in Sources */, 6642A8722A8D7C5700E591C2 /* OWSPaymentActivationRequestFinishedMessage.m in Sources */, 6642A8792A8D85F500E591C2 /* OWSPaymentActivationRequestMessage+SDS.swift in Sources */, diff --git a/SignalServiceKit/Account/PniDistributionSyncMessage.swift b/SignalServiceKit/Account/PniDistributionSyncMessage.swift index 97b351d67d..2ae0bb5916 100644 --- a/SignalServiceKit/Account/PniDistributionSyncMessage.swift +++ b/SignalServiceKit/Account/PniDistributionSyncMessage.swift @@ -45,7 +45,7 @@ final class PniDistributionSyncMessage { let syncMessageBuilder = SSKProtoSyncMessage.builder() syncMessageBuilder.setPniChangeNumber(changeNumberBuilder.buildInfallibly()) - let syncMessageProto = try OWSOutgoingSyncMessage.buildSyncMessageProto(for: syncMessageBuilder) + let syncMessageProto = try OutgoingSyncMessage.buildSyncMessageProto(forMessageBuilder: syncMessageBuilder) let contentProto = SSKProtoContent.builder() contentProto.setSyncMessage(syncMessageProto) diff --git a/SignalServiceKit/Calls/OutgoingCallEventSyncMessage.swift b/SignalServiceKit/Calls/OutgoingCallEventSyncMessage.swift index 6562f83e16..6d18ea510b 100644 --- a/SignalServiceKit/Calls/OutgoingCallEventSyncMessage.swift +++ b/SignalServiceKit/Calls/OutgoingCallEventSyncMessage.swift @@ -103,7 +103,7 @@ class OutgoingCallEvent: NSObject, NSSecureCoding { /// /// - SeeAlso ``IncomingCallEventSyncMessageManager`` @objc(OutgoingCallEventSyncMessage) -public class OutgoingCallEventSyncMessage: OWSOutgoingSyncMessage { +public class OutgoingCallEventSyncMessage: OutgoingSyncMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -142,12 +142,12 @@ public class OutgoingCallEventSyncMessage: OWSOutgoingSyncMessage { tx: DBReadTransaction, ) { self.callEvent = event - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override public var isUrgent: Bool { false } - override public func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override public func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let callEventBuilder = SSKProtoSyncMessageCallEvent.builder() callEventBuilder.setCallID(callEvent.callId) callEventBuilder.setType(callEvent.callType.protoValue) diff --git a/SignalServiceKit/Calls/OutgoingCallLinkUpdateMessage.swift b/SignalServiceKit/Calls/OutgoingCallLinkUpdateMessage.swift index 81296eed52..3dfdba678c 100644 --- a/SignalServiceKit/Calls/OutgoingCallLinkUpdateMessage.swift +++ b/SignalServiceKit/Calls/OutgoingCallLinkUpdateMessage.swift @@ -7,7 +7,7 @@ import Foundation public import SignalRingRTC @objc(OutgoingCallLinkUpdateMessage) -public class OutgoingCallLinkUpdateMessage: OWSOutgoingSyncMessage { +public class OutgoingCallLinkUpdateMessage: OutgoingSyncMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -54,12 +54,12 @@ public class OutgoingCallLinkUpdateMessage: OWSOutgoingSyncMessage { ) { self.rootKey = rootKey.bytes self.adminPasskey = adminPasskey - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override public var isUrgent: Bool { false } - override public func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override public func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let callLinkUpdateBuilder = SSKProtoSyncMessageCallLinkUpdate.builder() callLinkUpdateBuilder.setType(.update) callLinkUpdateBuilder.setRootKey(self.rootKey) diff --git a/SignalServiceKit/Calls/OutgoingCallLogEventSyncMessage.swift b/SignalServiceKit/Calls/OutgoingCallLogEventSyncMessage.swift index d4540887ac..a66e03ef97 100644 --- a/SignalServiceKit/Calls/OutgoingCallLogEventSyncMessage.swift +++ b/SignalServiceKit/Calls/OutgoingCallLogEventSyncMessage.swift @@ -8,7 +8,7 @@ /// /// - SeeAlso ``IncomingCallLogEventSyncMessageManager`` @objc(OutgoingCallLogEventSyncMessage) -public class OutgoingCallLogEventSyncMessage: OWSOutgoingSyncMessage { +public class OutgoingCallLogEventSyncMessage: OutgoingSyncMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -47,12 +47,12 @@ public class OutgoingCallLogEventSyncMessage: OWSOutgoingSyncMessage { tx: DBReadTransaction, ) { self.callLogEvent = callLogEvent - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override public var isUrgent: Bool { false } - override public func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override public func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let callLogEventBuilder = SSKProtoSyncMessageCallLogEvent.builder() callLogEventBuilder.setTimestamp(callLogEvent.timestamp) diff --git a/SignalServiceKit/Devices/SyncMessages/OutgoingBlockedSyncMessage.swift b/SignalServiceKit/Devices/SyncMessages/OutgoingBlockedSyncMessage.swift index 870f917f15..f446b1fa24 100644 --- a/SignalServiceKit/Devices/SyncMessages/OutgoingBlockedSyncMessage.swift +++ b/SignalServiceKit/Devices/SyncMessages/OutgoingBlockedSyncMessage.swift @@ -7,7 +7,7 @@ import Foundation import LibSignalClient @objc(OWSBlockedPhoneNumbersMessage) -final class OutgoingBlockedSyncMessage: OWSOutgoingSyncMessage { +final class OutgoingBlockedSyncMessage: OutgoingSyncMessage { let phoneNumbers: [String] let acis: [Aci] @@ -58,10 +58,10 @@ final class OutgoingBlockedSyncMessage: OWSOutgoingSyncMessage { self.phoneNumbers = phoneNumbers self.acis = acis self.groupIds = groupIds - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let blockedBuilder = SSKProtoSyncMessageBlocked.builder() blockedBuilder.setNumbers(self.phoneNumbers) if BuildFlags.serviceIdStrings { diff --git a/SignalServiceKit/Devices/SyncMessages/OutgoingDeviceNameChangeSyncMessage.swift b/SignalServiceKit/Devices/SyncMessages/OutgoingDeviceNameChangeSyncMessage.swift index be1c145267..83ed8be8e7 100644 --- a/SignalServiceKit/Devices/SyncMessages/OutgoingDeviceNameChangeSyncMessage.swift +++ b/SignalServiceKit/Devices/SyncMessages/OutgoingDeviceNameChangeSyncMessage.swift @@ -6,7 +6,7 @@ /// Informs other platforms that a linked device's name has changed, and they /// should refresh their list of linked devices. @objc(OutgoingDeviceNameChangeSyncMessage) -public class OutgoingDeviceNameChangeSyncMessage: OWSOutgoingSyncMessage { +public class OutgoingDeviceNameChangeSyncMessage: OutgoingSyncMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -44,12 +44,12 @@ public class OutgoingDeviceNameChangeSyncMessage: OWSOutgoingSyncMessage { tx: DBReadTransaction, ) { self.deviceId = deviceId - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override public var isUrgent: Bool { false } - override public func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override public func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let deviceNameChangeBuilder = SSKProtoSyncMessageDeviceNameChange.builder() deviceNameChangeBuilder.setDeviceID(deviceId) diff --git a/SignalServiceKit/Devices/SyncMessages/OutgoingReadReceiptsSyncMessage.swift b/SignalServiceKit/Devices/SyncMessages/OutgoingReadReceiptsSyncMessage.swift index 7796e28ef6..ab2eefab12 100644 --- a/SignalServiceKit/Devices/SyncMessages/OutgoingReadReceiptsSyncMessage.swift +++ b/SignalServiceKit/Devices/SyncMessages/OutgoingReadReceiptsSyncMessage.swift @@ -7,7 +7,7 @@ import Foundation import LibSignalClient @objc(OWSReadReceiptsForLinkedDevicesMessage) -final class OutgoingReadReceiptsSyncMessage: OWSOutgoingSyncMessage { +final class OutgoingReadReceiptsSyncMessage: OutgoingSyncMessage { let readReceipts: [LinkedDeviceReadReceipt] @@ -17,7 +17,7 @@ final class OutgoingReadReceiptsSyncMessage: OWSOutgoingSyncMessage { tx: DBReadTransaction, ) { self.readReceipts = readReceipts - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override class var supportsSecureCoding: Bool { true } @@ -49,7 +49,7 @@ final class OutgoingReadReceiptsSyncMessage: OWSOutgoingSyncMessage { return true } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let syncMessageBuilder = SSKProtoSyncMessage.builder() for readReceipt in self.readReceipts { let readProtoBuilder = SSKProtoSyncMessageRead.builder(timestamp: readReceipt.messageIdTimestamp) diff --git a/SignalServiceKit/Devices/SyncMessages/OutgoingVerificationStateSyncMessage.swift b/SignalServiceKit/Devices/SyncMessages/OutgoingVerificationStateSyncMessage.swift index 86f0dd7927..141e377b63 100644 --- a/SignalServiceKit/Devices/SyncMessages/OutgoingVerificationStateSyncMessage.swift +++ b/SignalServiceKit/Devices/SyncMessages/OutgoingVerificationStateSyncMessage.swift @@ -6,7 +6,7 @@ import Foundation @objc(OWSVerificationStateSyncMessage) -final class OutgoingVerificationStateSyncMessage: OWSOutgoingSyncMessage { +final class OutgoingVerificationStateSyncMessage: OutgoingSyncMessage { // This is a clunky name, but we want to differentiate it from // `recipientIdentifier` inherited from `TSOutgoingMessage` @@ -40,7 +40,7 @@ final class OutgoingVerificationStateSyncMessage: OWSOutgoingSyncMessage { // subtract it from the total length. self.paddingBytesLength = UInt.random(in: 1...512) - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override class var supportsSecureCoding: Bool { true } @@ -98,7 +98,7 @@ final class OutgoingVerificationStateSyncMessage: OWSOutgoingSyncMessage { return true } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { // We add the same amount of padding in the VerificationStateSync message and it's corresponding NullMessage so that // the sync message is indistinguishable from an outgoing Sent transcript corresponding to the NullMessage. We pad // the NullMessage so as to obscure it's content. The sync message (like all sync messages) will be *additionally* diff --git a/SignalServiceKit/Devices/SyncMessages/OutgoingViewOnceOpenSyncMessage.swift b/SignalServiceKit/Devices/SyncMessages/OutgoingViewOnceOpenSyncMessage.swift index 24d6283634..41c838a690 100644 --- a/SignalServiceKit/Devices/SyncMessages/OutgoingViewOnceOpenSyncMessage.swift +++ b/SignalServiceKit/Devices/SyncMessages/OutgoingViewOnceOpenSyncMessage.swift @@ -7,7 +7,7 @@ import Foundation import LibSignalClient @objc(OWSViewOnceMessageReadSyncMessage) -final class OutgoingViewOnceOpenSyncMessage: OWSOutgoingSyncMessage { +final class OutgoingViewOnceOpenSyncMessage: OutgoingSyncMessage { let senderAddress: SignalServiceAddress let messageIdTimestamp: UInt64 @@ -26,7 +26,7 @@ final class OutgoingViewOnceOpenSyncMessage: OWSOutgoingSyncMessage { self.messageUniqueId = message.uniqueId self.messageIdTimestamp = message.timestamp self.readTimestamp = readTimestamp - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override class var supportsSecureCoding: Bool { true } @@ -82,7 +82,7 @@ final class OutgoingViewOnceOpenSyncMessage: OWSOutgoingSyncMessage { override var isUrgent: Bool { false } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let syncMessageBuilder = SSKProtoSyncMessage.builder() let readProtoBuilder = SSKProtoSyncMessageViewOnceOpen.builder(timestamp: self.messageIdTimestamp) diff --git a/SignalServiceKit/Devices/SyncMessages/OutgoingViewedReceiptsSyncMessage.swift b/SignalServiceKit/Devices/SyncMessages/OutgoingViewedReceiptsSyncMessage.swift index 84217e8ec7..3acc6d98e5 100644 --- a/SignalServiceKit/Devices/SyncMessages/OutgoingViewedReceiptsSyncMessage.swift +++ b/SignalServiceKit/Devices/SyncMessages/OutgoingViewedReceiptsSyncMessage.swift @@ -7,7 +7,7 @@ import Foundation import LibSignalClient @objc(OWSViewedReceiptsForLinkedDevicesMessage) -final class OutgoingViewedReceiptsSyncMessage: OWSOutgoingSyncMessage { +final class OutgoingViewedReceiptsSyncMessage: OutgoingSyncMessage { let viewedReceipts: [LinkedDeviceViewedReceipt] @@ -17,7 +17,7 @@ final class OutgoingViewedReceiptsSyncMessage: OWSOutgoingSyncMessage { tx: DBReadTransaction, ) { self.viewedReceipts = viewedReceipts - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override class var supportsSecureCoding: Bool { true } @@ -51,7 +51,7 @@ final class OutgoingViewedReceiptsSyncMessage: OWSOutgoingSyncMessage { override var isUrgent: Bool { false } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let syncMessageBuilder = SSKProtoSyncMessage.builder() for viewedReceipt in self.viewedReceipts { let viewedProtoBuilder = SSKProtoSyncMessageViewed.builder(timestamp: viewedReceipt.messageIdTimestamp) diff --git a/SignalServiceKit/Devices/SyncMessages/StickerPackSyncMessage.swift b/SignalServiceKit/Devices/SyncMessages/StickerPackSyncMessage.swift index 27e70c4d23..a1ce052428 100644 --- a/SignalServiceKit/Devices/SyncMessages/StickerPackSyncMessage.swift +++ b/SignalServiceKit/Devices/SyncMessages/StickerPackSyncMessage.swift @@ -11,7 +11,7 @@ enum StickerPackOperationType: UInt { } @objc(OWSStickerPackSyncMessage) -final class StickerPackSyncMessage: OWSOutgoingSyncMessage { +final class StickerPackSyncMessage: OutgoingSyncMessage { private let packs: [StickerPackInfo] private let operationType: StickerPackOperationType @@ -61,10 +61,10 @@ final class StickerPackSyncMessage: OWSOutgoingSyncMessage { ) { self.packs = packs self.operationType = operationType - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let operationType: SSKProtoSyncMessageStickerPackOperationType switch self.operationType { case .install: diff --git a/SignalServiceKit/Messages/DeviceSyncing/DeleteForMe/DeleteForMeOutgoingSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/DeleteForMe/DeleteForMeOutgoingSyncMessage.swift index e385b62835..2902957ee5 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/DeleteForMe/DeleteForMeOutgoingSyncMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/DeleteForMe/DeleteForMeOutgoingSyncMessage.swift @@ -10,7 +10,7 @@ import LibSignalClient /// /// - SeeAlso ``DeleteForMeOutgoingSyncMessageManager`` @objc(DeleteForMeOutgoingSyncMessage) -class DeleteForMeOutgoingSyncMessage: OWSOutgoingSyncMessage { +final class DeleteForMeOutgoingSyncMessage: OutgoingSyncMessage { override class var supportsSecureCoding: Bool { true } required init?(coder: NSCoder) { @@ -111,12 +111,12 @@ class DeleteForMeOutgoingSyncMessage: OWSOutgoingSyncMessage { return nil } - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override var isUrgent: Bool { false } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let contents: Contents do { contents = try JSONDecoder().decode(Contents.self, from: self.contents) diff --git a/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSyncMessage.h b/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSyncMessage.h deleted file mode 100644 index a53aef766c..0000000000 --- a/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSyncMessage.h +++ /dev/null @@ -1,90 +0,0 @@ -// -// Copyright 2018 Signal Messenger, LLC -// SPDX-License-Identifier: AGPL-3.0-only -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class DBReadTransaction; -@class SSKProtoSyncMessage; -@class SSKProtoSyncMessageBuilder; -@class TSContactThread; - -/** - * Abstract base class used for the family of sync messages which take care - * of keeping your multiple registered devices consistent. E.g. sharing contacts, sharing groups, - * notifying your devices of sent messages, and "read" receipts. - */ -@interface OWSOutgoingSyncMessage : TSOutgoingMessage - -- (instancetype)initOutgoingMessageWithBuilder:(TSOutgoingMessageBuilder *)outgoingMessageBuilder - recipientAddressStates: - (NSDictionary *) - recipientAddressStates NS_UNAVAILABLE; -- (instancetype)initOutgoingMessageWithBuilder:(TSOutgoingMessageBuilder *)outgoingMessageBuilder - additionalRecipients:(NSArray *)additionalRecipients - explicitRecipients:(NSArray *)explicitRecipients - skippedRecipients:(NSArray *)skippedRecipients - transaction:(DBReadTransaction *)transaction NS_UNAVAILABLE; - -- (instancetype)initWithGrdbId:(int64_t)grdbId - uniqueId:(NSString *)uniqueId - receivedAtTimestamp:(uint64_t)receivedAtTimestamp - sortId:(uint64_t)sortId - timestamp:(uint64_t)timestamp - uniqueThreadId:(NSString *)uniqueThreadId - body:(nullable NSString *)body - bodyRanges:(nullable MessageBodyRanges *)bodyRanges - contactShare:(nullable OWSContact *)contactShare - deprecated_attachmentIds:(nullable NSArray *)deprecated_attachmentIds - editState:(TSEditState)editState - expireStartedAt:(uint64_t)expireStartedAt - expireTimerVersion:(nullable NSNumber *)expireTimerVersion - expiresAt:(uint64_t)expiresAt - expiresInSeconds:(unsigned int)expiresInSeconds - giftBadge:(nullable OWSGiftBadge *)giftBadge - isGroupStoryReply:(BOOL)isGroupStoryReply - isPoll:(BOOL)isPoll - isSmsMessageRestoredFromBackup:(BOOL)isSmsMessageRestoredFromBackup - isViewOnceComplete:(BOOL)isViewOnceComplete - isViewOnceMessage:(BOOL)isViewOnceMessage - linkPreview:(nullable OWSLinkPreview *)linkPreview - messageSticker:(nullable MessageSticker *)messageSticker - quotedMessage:(nullable TSQuotedMessage *)quotedMessage - storedShouldStartExpireTimer:(BOOL)storedShouldStartExpireTimer - storyAuthorUuidString:(nullable NSString *)storyAuthorUuidString - storyReactionEmoji:(nullable NSString *)storyReactionEmoji - storyTimestamp:(nullable NSNumber *)storyTimestamp - wasRemotelyDeleted:(BOOL)wasRemotelyDeleted - customMessage:(nullable NSString *)customMessage - groupMetaMessage:(TSGroupMetaMessage)groupMetaMessage - hasLegacyMessageState:(BOOL)hasLegacyMessageState - hasSyncedTranscript:(BOOL)hasSyncedTranscript - isVoiceMessage:(BOOL)isVoiceMessage - legacyMessageState:(TSOutgoingMessageState)legacyMessageState - legacyWasDelivered:(BOOL)legacyWasDelivered - mostRecentFailureText:(nullable NSString *)mostRecentFailureText - recipientAddressStates:(nullable NSDictionary *) - recipientAddressStates - storedMessageState:(TSOutgoingMessageState)storedMessageState - wasNotCreatedLocally:(BOOL)wasNotCreatedLocally NS_UNAVAILABLE; - -- (instancetype)initWithLocalThread:(TSContactThread *)localThread - transaction:(DBReadTransaction *)transaction NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithTimestamp:(uint64_t)timestamp - localThread:(TSContactThread *)localThread - transaction:(DBReadTransaction *)transaction NS_DESIGNATED_INITIALIZER; -- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; - -- (nullable SSKProtoSyncMessageBuilder *)syncMessageBuilderWithTransaction:(DBReadTransaction *)transaction - NS_SWIFT_NAME(syncMessageBuilder(transaction:)); - -+ (nullable SSKProtoSyncMessage *)buildSyncMessageProtoForMessageBuilder: - (SSKProtoSyncMessageBuilder *)syncMessageBuilder - error:(NSError **)errorHandle; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m b/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m deleted file mode 100644 index 97064edcfa..0000000000 --- a/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m +++ /dev/null @@ -1,120 +0,0 @@ -// -// Copyright 2017 Signal Messenger, LLC -// SPDX-License-Identifier: AGPL-3.0-only -// - -#import "OWSOutgoingSyncMessage.h" -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation OWSOutgoingSyncMessage - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (nullable instancetype)initWithCoder:(NSCoder *)coder -{ - return [super initWithCoder:coder]; -} - -- (instancetype)initWithLocalThread:(TSContactThread *)localThread transaction:(DBReadTransaction *)transaction -{ - TSOutgoingMessageBuilder *messageBuilder = [TSOutgoingMessageBuilder outgoingMessageBuilderWithThread:localThread]; - self = [super initOutgoingMessageWithBuilder:messageBuilder - additionalRecipients:@[] - explicitRecipients:@[] - skippedRecipients:@[] - transaction:transaction]; - - if (!self) { - return self; - } - - return self; -} - -- (instancetype)initWithTimestamp:(uint64_t)timestamp - localThread:(TSContactThread *)localThread - transaction:(DBReadTransaction *)transaction -{ - TSOutgoingMessageBuilder *messageBuilder = [TSOutgoingMessageBuilder outgoingMessageBuilderWithThread:localThread]; - messageBuilder.timestamp = timestamp; - self = [super initOutgoingMessageWithBuilder:messageBuilder - additionalRecipients:@[] - explicitRecipients:@[] - skippedRecipients:@[] - transaction:transaction]; - - if (!self) { - return self; - } - - return self; -} - -- (BOOL)shouldBeSaved -{ - return NO; -} - -- (BOOL)shouldSyncTranscript -{ - return NO; -} - -// This method should not be overridden, since we want to add random padding to *every* sync message -- (nullable SSKProtoSyncMessage *)buildSyncMessageWithTransaction:(DBReadTransaction *)transaction -{ - SSKProtoSyncMessageBuilder *_Nullable builder = [self syncMessageBuilderWithTransaction:transaction]; - if (!builder) { - return nil; - } - - NSError *error; - SSKProtoSyncMessage *_Nullable proto = [[self class] buildSyncMessageProtoForMessageBuilder:builder error:&error]; - - if (error || !proto) { - OWSFailDebug(@"could not build protobuf: %@", error); - return nil; - } - - return proto; -} - -- (nullable SSKProtoSyncMessageBuilder *)syncMessageBuilderWithTransaction:(DBReadTransaction *)transaction -{ - OWSAbstractMethod(); - - return [SSKProtoSyncMessage builder]; -} - -- (nullable SSKProtoContentBuilder *)contentBuilderWithThread:(TSThread *)thread - transaction:(DBReadTransaction *)transaction -{ - SSKProtoSyncMessage *_Nullable syncMessage = [self buildSyncMessageWithTransaction:transaction]; - if (!syncMessage) { - return nil; - } - - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - [contentBuilder setSyncMessage:syncMessage]; - return contentBuilder; -} - -+ (nullable SSKProtoSyncMessage *)buildSyncMessageProtoForMessageBuilder: - (SSKProtoSyncMessageBuilder *)syncMessageBuilder - error:(NSError **)errorHandle -{ - // Add a random 1-512 bytes to obscure sync message type - size_t paddingBytesLength = arc4random_uniform(512) + 1; - syncMessageBuilder.padding = [Randomness generateRandomBytes:paddingBytesLength]; - - return [syncMessageBuilder buildAndReturnError:errorHandle]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/Messages/DeviceSyncing/OWSSyncContactsMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/OWSSyncContactsMessage.swift index d57f2ad752..23b4bb838e 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OWSSyncContactsMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OWSSyncContactsMessage.swift @@ -5,7 +5,7 @@ import Foundation -public final class OWSSyncContactsMessage: OWSOutgoingSyncMessage { +public final class OWSSyncContactsMessage: OutgoingSyncMessage { private let uploadedAttachment: Upload.Result @@ -15,7 +15,7 @@ public final class OWSSyncContactsMessage: OWSOutgoingSyncMessage { tx: DBReadTransaction, ) { self.uploadedAttachment = uploadedAttachment - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override public func encode(with coder: NSCoder) { @@ -29,7 +29,7 @@ public final class OWSSyncContactsMessage: OWSOutgoingSyncMessage { override public var isUrgent: Bool { false } - override public func syncMessageBuilder(transaction tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override public func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let attachmentBuilder = SSKProtoAttachmentPointer.builder() diff --git a/SignalServiceKit/Messages/DeviceSyncing/OutgoingConfigurationSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/OutgoingConfigurationSyncMessage.swift index 976925e379..d4bce60275 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OutgoingConfigurationSyncMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OutgoingConfigurationSyncMessage.swift @@ -6,7 +6,7 @@ import Foundation @objc(OWSSyncConfigurationMessage) -final class OutgoingConfigurationSyncMessage: OWSOutgoingSyncMessage { +final class OutgoingConfigurationSyncMessage: OutgoingSyncMessage { private let areReadReceiptsEnabled: Bool private let showUnidentifiedDeliveryIndicators: Bool @@ -28,7 +28,7 @@ final class OutgoingConfigurationSyncMessage: OWSOutgoingSyncMessage { self.showTypingIndicators = showTypingIndicators self.sendLinkPreviews = sendLinkPreviews self.provisioningVersion = provisioningVersion - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override class var supportsSecureCoding: Bool { true } @@ -73,7 +73,7 @@ final class OutgoingConfigurationSyncMessage: OWSOutgoingSyncMessage { return true } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let configurationBuilder = SSKProtoSyncMessageConfiguration.builder() configurationBuilder.setReadReceipts(self.areReadReceiptsEnabled) configurationBuilder.setUnidentifiedDeliveryIndicators(self.showUnidentifiedDeliveryIndicators) diff --git a/SignalServiceKit/Messages/DeviceSyncing/OutgoingFetchLatestSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/OutgoingFetchLatestSyncMessage.swift index ed70a4ced5..6bfce37752 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OutgoingFetchLatestSyncMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OutgoingFetchLatestSyncMessage.swift @@ -6,7 +6,7 @@ import Foundation @objc(OWSSyncFetchLatestMessage) -final class OutgoingFetchLatestSyncMessage: OWSOutgoingSyncMessage { +final class OutgoingFetchLatestSyncMessage: OutgoingSyncMessage { enum FetchType: UInt { case localProfile = 1 @@ -22,7 +22,7 @@ final class OutgoingFetchLatestSyncMessage: OWSOutgoingSyncMessage { tx: DBReadTransaction, ) { self.fetchType = fetchType - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override class var supportsSecureCoding: Bool { true } @@ -65,7 +65,7 @@ final class OutgoingFetchLatestSyncMessage: OWSOutgoingSyncMessage { } } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let fetchLatestBuilder = SSKProtoSyncMessageFetchLatest.builder() fetchLatestBuilder.setType(self.fetchTypeAsProtoFetchType) diff --git a/SignalServiceKit/Messages/DeviceSyncing/OutgoingKeysSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/OutgoingKeysSyncMessage.swift index cc7f49e0c7..c16a06ac12 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OutgoingKeysSyncMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OutgoingKeysSyncMessage.swift @@ -6,7 +6,7 @@ import Foundation @objc(OWSSyncKeysMessage) -final class OutgoingKeysSyncMessage: OWSOutgoingSyncMessage { +final class OutgoingKeysSyncMessage: OutgoingSyncMessage { let accountEntropyPool: String? let masterKey: Data? @@ -22,7 +22,7 @@ final class OutgoingKeysSyncMessage: OWSOutgoingSyncMessage { self.accountEntropyPool = accountEntropyPool?.rawString self.masterKey = masterKey?.rawData self.mediaRootBackupKey = mediaRootBackupKey?.serialize() - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override class var supportsSecureCoding: Bool { true } @@ -65,7 +65,7 @@ final class OutgoingKeysSyncMessage: OWSOutgoingSyncMessage { return true } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let keysBuilder = SSKProtoSyncMessageKeys.builder() if let accountEntropyPool { keysBuilder.setAccountEntropyPool(accountEntropyPool) diff --git a/SignalServiceKit/Messages/DeviceSyncing/OutgoingMessageRequestResponseSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/OutgoingMessageRequestResponseSyncMessage.swift index 7bac915fd7..b57ccf979b 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OutgoingMessageRequestResponseSyncMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OutgoingMessageRequestResponseSyncMessage.swift @@ -7,7 +7,7 @@ import Foundation import LibSignalClient @objc(OWSSyncMessageRequestResponseMessage) -public final class OutgoingMessageRequestResponseSyncMessage: OWSOutgoingSyncMessage { +public final class OutgoingMessageRequestResponseSyncMessage: OutgoingSyncMessage { public enum ResponseType: UInt64 { case accept = 0 @@ -115,10 +115,10 @@ public final class OutgoingMessageRequestResponseSyncMessage: OWSOutgoingSyncMes owsFailDebug("can't response to thread type") } self.responseType = responseType - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } - override public func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override public func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let messageRequestResponseBuilder = SSKProtoSyncMessageMessageRequestResponse.builder() messageRequestResponseBuilder.setType(self.responseType.asProtoResponseType) @@ -135,7 +135,7 @@ public final class OutgoingMessageRequestResponseSyncMessage: OWSOutgoingSyncMes // Fallback behavior. Messages of this version are no longer created. // Eventually, all enqueued messages of this type should be resolved // (either because they have been sent or because they ran out of retries). - let thread = self.thread(tx: transaction) + let thread = self.thread(tx: tx) guard let thread else { owsFailDebug("Missing thread for message request response") return nil diff --git a/SignalServiceKit/Messages/DeviceSyncing/OutgoingPaymentSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/OutgoingPaymentSyncMessage.swift index c0b7561bfc..84492f0538 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OutgoingPaymentSyncMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OutgoingPaymentSyncMessage.swift @@ -6,7 +6,7 @@ import Foundation @objc(OutgoingPaymentSyncMessage) -public final class OutgoingPaymentSyncMessage: OWSOutgoingSyncMessage { +public final class OutgoingPaymentSyncMessage: OutgoingSyncMessage { let mobileCoin: OutgoingPaymentMobileCoin @@ -16,7 +16,7 @@ public final class OutgoingPaymentSyncMessage: OWSOutgoingSyncMessage { tx: DBReadTransaction, ) { self.mobileCoin = mobileCoin - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override public class var supportsSecureCoding: Bool { true } @@ -48,7 +48,7 @@ public final class OutgoingPaymentSyncMessage: OWSOutgoingSyncMessage { return true } - override public func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override public func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { do { let amountPicoMob = mobileCoin.amountPicoMob let feePicoMob = mobileCoin.feePicoMob diff --git a/SignalServiceKit/Messages/DeviceSyncing/OutgoingRequestSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/OutgoingRequestSyncMessage.swift index f7fd697bc2..14407d73b5 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OutgoingRequestSyncMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OutgoingRequestSyncMessage.swift @@ -4,7 +4,7 @@ // @objc(OWSSyncRequestMessage) -final class OutgoingRequestSyncMessage: OWSOutgoingSyncMessage { +final class OutgoingRequestSyncMessage: OutgoingSyncMessage { let requestType: SSKProtoSyncMessageRequestType init( @@ -13,7 +13,7 @@ final class OutgoingRequestSyncMessage: OWSOutgoingSyncMessage { tx: DBReadTransaction, ) { self.requestType = requestType - super.init(localThread: localThread, transaction: tx) + super.init(localThread: localThread, tx: tx) } override class var supportsSecureCoding: Bool { true } @@ -48,7 +48,7 @@ final class OutgoingRequestSyncMessage: OWSOutgoingSyncMessage { return true } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let requestBuilder = SSKProtoSyncMessageRequest.builder() switch self.requestType { diff --git a/SignalServiceKit/Messages/DeviceSyncing/OutgoingSentMessageTranscript.swift b/SignalServiceKit/Messages/DeviceSyncing/OutgoingSentMessageTranscript.swift index 3a5ab8a184..c2cfaabd71 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OutgoingSentMessageTranscript.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OutgoingSentMessageTranscript.swift @@ -8,7 +8,7 @@ import Foundation /// Notifies your other registered devices (if you have any) that you've /// sent a message. This way the message you just sent can appear on all /// your devices. -class OutgoingSentMessageTranscript: OWSOutgoingSyncMessage { +class OutgoingSentMessageTranscript: OutgoingSyncMessage { let message: TSOutgoingMessage let messageThread: TSThread let isRecipientUpdate: Bool @@ -30,7 +30,7 @@ class OutgoingSentMessageTranscript: OWSOutgoingSyncMessage { self.sentRecipientAddress = (messageThread as? TSContactThread)?.contactAddress // The sync message's timestamp must match the original outgoing message's timestamp. - super.init(timestamp: message.timestamp, localThread: localThread, transaction: tx) + super.init(timestamp: message.timestamp, localThread: localThread, tx: tx) } override func encode(with coder: NSCoder) { @@ -64,7 +64,7 @@ class OutgoingSentMessageTranscript: OWSOutgoingSyncMessage { override var isUrgent: Bool { false } - override func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let sentBuilder = SSKProtoSyncMessageSent.builder() sentBuilder.setTimestamp(self.timestamp) if let phoneNumber = self.sentRecipientAddress?.phoneNumber { @@ -80,11 +80,11 @@ class OutgoingSentMessageTranscript: OWSOutgoingSyncMessage { } sentBuilder.setIsRecipientUpdate(self.isRecipientUpdate) - guard prepareDataSyncMessageContent(with: sentBuilder, tx: transaction) else { + guard prepareDataSyncMessageContent(with: sentBuilder, tx: tx) else { return nil } - prepareUnidentifiedStatusSyncMessageContent(with: sentBuilder, tx: transaction) + prepareUnidentifiedStatusSyncMessageContent(with: sentBuilder, tx: tx) do { let syncMessageBuilder = SSKProtoSyncMessage.builder() diff --git a/SignalServiceKit/Messages/DeviceSyncing/OutgoingSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/OutgoingSyncMessage.swift new file mode 100644 index 0000000000..f252ca448c --- /dev/null +++ b/SignalServiceKit/Messages/DeviceSyncing/OutgoingSyncMessage.swift @@ -0,0 +1,82 @@ +// +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only +// + +import Foundation + +/** + * Abstract base class used for the family of sync messages which take care + * of keeping your multiple registered devices consistent. E.g. sharing contacts, sharing groups, + * notifying your devices of sent messages, and "read" receipts. + */ +@objc(OWSOutgoingSyncMessage) +public class OutgoingSyncMessage: TSOutgoingMessage { + + override public class var supportsSecureCoding: Bool { true } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + init(localThread: TSContactThread, tx: DBReadTransaction) { + let messageBuilder = TSOutgoingMessageBuilder.outgoingMessageBuilder(thread: localThread) + super.init( + outgoingMessageWith: messageBuilder, + additionalRecipients: [], + explicitRecipients: [], + skippedRecipients: [], + transaction: tx, + ) + } + + init(timestamp: UInt64, localThread: TSContactThread, tx: DBReadTransaction) { + let messageBuilder = TSOutgoingMessageBuilder.outgoingMessageBuilder(thread: localThread) + messageBuilder.timestamp = timestamp + super.init( + outgoingMessageWith: messageBuilder, + additionalRecipients: [], + explicitRecipients: [], + skippedRecipients: [], + transaction: tx, + ) + } + + override public var shouldBeSaved: Bool { false } + + override public func shouldSyncTranscript() -> Bool { false } + + // This method should not be overridden because we want to add random padding to *every* sync message + private func buildSyncMessage(tx: DBReadTransaction) -> SSKProtoSyncMessage? { + guard let builder = self.syncMessageBuilder(tx: tx) else { + return nil + } + do { + return try Self.buildSyncMessageProto(forMessageBuilder: builder) + } catch { + owsFailDebug("could not build protobuf: \(error)") + return nil + } + } + + func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + owsFail("Method must be implemented by subclasses.") + } + + override public func contentBuilder(thread: TSThread, transaction: DBReadTransaction) -> SSKProtoContentBuilder? { + guard let syncMessage = self.buildSyncMessage(tx: transaction) else { + return nil + } + + let contentBuilder = SSKProtoContent.builder() + contentBuilder.setSyncMessage(syncMessage) + return contentBuilder + } + + static func buildSyncMessageProto(forMessageBuilder messageBuilder: SSKProtoSyncMessageBuilder) throws -> SSKProtoSyncMessage { + // Add a random 1-512 bytes to obscure sync message type + let paddingBytesLength = UInt.random(in: 1...512) + messageBuilder.setPadding(Randomness.generateRandomBytes(paddingBytesLength)) + return try messageBuilder.build() + } +} diff --git a/SignalServiceKit/Messages/Edit/OutgoingEditMessage.swift b/SignalServiceKit/Messages/Edit/OutgoingEditMessage.swift index 74cd8e6562..e49f69f00c 100644 --- a/SignalServiceKit/Messages/Edit/OutgoingEditMessage.swift +++ b/SignalServiceKit/Messages/Edit/OutgoingEditMessage.swift @@ -129,7 +129,7 @@ public final class OutgoingEditMessage: TSOutgoingMessage { override public func buildTranscriptSyncMessage( localThread: TSContactThread, transaction: DBWriteTransaction, - ) -> OWSOutgoingSyncMessage? { + ) -> OutgoingSyncMessage? { guard let thread = thread(tx: transaction) else { owsFailDebug("Missing thread for interaction.") return nil diff --git a/SignalServiceKit/Messages/Interactions/TSInteraction.swift b/SignalServiceKit/Messages/Interactions/TSInteraction.swift index 6529a42847..0269cda64d 100644 --- a/SignalServiceKit/Messages/Interactions/TSInteraction.swift +++ b/SignalServiceKit/Messages/Interactions/TSInteraction.swift @@ -167,7 +167,7 @@ extension TSInteraction { public func shouldAppearInInbox( groupUpdateItemsBuilder: (TSInfoMessage) -> [TSInfoMessage.PersistableGroupUpdateItem]?, ) -> Bool { - if !shouldBeSaved || isDynamicInteraction || self is OWSOutgoingSyncMessage { + if !shouldBeSaved || isDynamicInteraction || self is OutgoingSyncMessage { owsFailDebug("Unexpected interaction type: \(type(of: self))") return false } diff --git a/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.m b/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.m index a2320a007e..ef3cf53a71 100644 --- a/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.m +++ b/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.m @@ -4,7 +4,6 @@ // #import "TSOutgoingMessage.h" -#import "OWSOutgoingSyncMessage.h" #import "TSContactThread.h" #import "TSGroupThread.h" #import "TSQuotedMessage.h" diff --git a/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.swift b/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.swift index bf200d3adb..f4136ab8af 100644 --- a/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.swift +++ b/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.swift @@ -538,7 +538,7 @@ extension TSOutgoingMessage { } @objc - func _buildTranscriptSyncMessage(localThread: TSContactThread, tx: DBWriteTransaction) -> OWSOutgoingSyncMessage? { + func _buildTranscriptSyncMessage(localThread: TSContactThread, tx: DBWriteTransaction) -> OutgoingSyncMessage? { owsAssertDebug(self.shouldSyncTranscript()) guard let messageThread = self.thread(tx: tx) else { diff --git a/SignalServiceKit/Messages/MessageSendLog.swift b/SignalServiceKit/Messages/MessageSendLog.swift index 6a729f4503..fd756b6f49 100644 --- a/SignalServiceKit/Messages/MessageSendLog.swift +++ b/SignalServiceKit/Messages/MessageSendLog.swift @@ -124,7 +124,7 @@ public class MessageSendLog { // not a major issue. The MSL is critical for correct behavior of sender // key messages. For non sender key messages, it's a nice-to-have in case // some unforeseen decryption failure happens. - owsAssertDebug(message is OWSOutgoingSyncMessage, "Found an MSL inconsistency for a non-sync message.") + owsAssertDebug(message is OutgoingSyncMessage, "Found an MSL inconsistency for a non-sync message.") return nil } diff --git a/SignalServiceKit/Messages/MessageSender.swift b/SignalServiceKit/Messages/MessageSender.swift index dd758d7c6d..f6756b8936 100644 --- a/SignalServiceKit/Messages/MessageSender.swift +++ b/SignalServiceKit/Messages/MessageSender.swift @@ -17,7 +17,7 @@ private extension TSOutgoingMessage { self is OutgoingResendRequest } - var isSyncMessage: Bool { self is OWSOutgoingSyncMessage } + var isSyncMessage: Bool { self is OutgoingSyncMessage } var canSendToLocalAddress: Bool { return isSyncMessage || diff --git a/SignalServiceKit/Messages/Stories/OutgoingStoryMessage.swift b/SignalServiceKit/Messages/Stories/OutgoingStoryMessage.swift index 07f9deb098..161e5b446d 100644 --- a/SignalServiceKit/Messages/Stories/OutgoingStoryMessage.swift +++ b/SignalServiceKit/Messages/Stories/OutgoingStoryMessage.swift @@ -128,7 +128,7 @@ public class OutgoingStoryMessage: TSOutgoingMessage { override public func buildTranscriptSyncMessage( localThread: TSContactThread, transaction: DBWriteTransaction, - ) -> OWSOutgoingSyncMessage? { + ) -> OutgoingSyncMessage? { guard let storyMessage = StoryMessage.anyFetch(uniqueId: storyMessageId, transaction: transaction) else { owsFailDebug("Missing story message") return nil diff --git a/SignalServiceKit/Messages/Stories/OutgoingStorySentMessageTranscript.swift b/SignalServiceKit/Messages/Stories/OutgoingStorySentMessageTranscript.swift index f11e510208..e03a85d5ad 100644 --- a/SignalServiceKit/Messages/Stories/OutgoingStorySentMessageTranscript.swift +++ b/SignalServiceKit/Messages/Stories/OutgoingStorySentMessageTranscript.swift @@ -6,7 +6,7 @@ import Foundation public import LibSignalClient -public class OutgoingStorySentMessageTranscript: OWSOutgoingSyncMessage { +public class OutgoingStorySentMessageTranscript: OutgoingSyncMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -59,14 +59,14 @@ public class OutgoingStorySentMessageTranscript: OWSOutgoingSyncMessage { self.storyEncodedRecipientStates = Self.encodeRecipientStates(recipientStates) self.storyMessageUniqueId = nil self.isRecipientUpdate = true - super.init(timestamp: timestamp, localThread: localThread, transaction: transaction) + super.init(timestamp: timestamp, localThread: localThread, tx: transaction) } public init(localThread: TSContactThread, storyMessage: StoryMessage, transaction: DBReadTransaction) { self.storyEncodedRecipientStates = nil self.storyMessageUniqueId = storyMessage.uniqueId self.isRecipientUpdate = false - super.init(timestamp: storyMessage.timestamp, localThread: localThread, transaction: transaction) + super.init(timestamp: storyMessage.timestamp, localThread: localThread, tx: transaction) } private static func encodeRecipientStates(_ recipientStates: [ServiceId: StoryRecipientState]) -> Data? { @@ -90,14 +90,14 @@ public class OutgoingStorySentMessageTranscript: OWSOutgoingSyncMessage { return StoryMessage.anyFetch(uniqueId: storyMessageUniqueId, transaction: transaction) } - override public func syncMessageBuilder(transaction: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { + override public func syncMessageBuilder(tx: DBReadTransaction) -> SSKProtoSyncMessageBuilder? { let sentBuilder = SSKProtoSyncMessageSent.builder() sentBuilder.setTimestamp(timestamp) sentBuilder.setIsRecipientUpdate(isRecipientUpdate) - if let storyMessage = storyMessage(transaction: transaction) { + if let storyMessage = storyMessage(transaction: tx) { if !isRecipientUpdate { - guard let storyMessageProto = storyMessageProto(for: storyMessage, transaction: transaction) else { + guard let storyMessageProto = storyMessageProto(for: storyMessage, transaction: tx) else { owsFailDebug("Failed to build sync proto for story message with timestamp \(storyMessage.timestamp)") return nil } diff --git a/SignalServiceKit/SignalServiceKit.h b/SignalServiceKit/SignalServiceKit.h index d631cc8372..9810841f2c 100644 --- a/SignalServiceKit/SignalServiceKit.h +++ b/SignalServiceKit/SignalServiceKit.h @@ -29,7 +29,6 @@ FOUNDATION_EXPORT const unsigned char SignalServiceKitVersionString[]; #import #import #import -#import #import #import #import