From e56504be2842c6be916c3bbf14b6ad4c0212c739 Mon Sep 17 00:00:00 2001 From: Max Radermacher Date: Thu, 22 Jan 2026 01:10:54 -0600 Subject: [PATCH] Swiftify OWSStaticOutgoingMessage --- Signal.xcodeproj/project.pbxproj | 12 +-- SignalServiceKit/Groups/GroupsV2Impl.swift | 2 +- .../Interactions/OWSStaticOutgoingMessage.h | 31 ------ .../Interactions/OWSStaticOutgoingMessage.m | 101 ------------------ .../Interactions/OutgoingStaticMessage.swift | 69 ++++++++++++ SignalServiceKit/SignalServiceKit.h | 1 - 6 files changed, 74 insertions(+), 142 deletions(-) delete mode 100644 SignalServiceKit/Messages/Interactions/OWSStaticOutgoingMessage.h delete mode 100644 SignalServiceKit/Messages/Interactions/OWSStaticOutgoingMessage.m create mode 100644 SignalServiceKit/Messages/Interactions/OutgoingStaticMessage.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index d4d6c8a3c5..be095d4ae0 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -822,6 +822,7 @@ 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 */; }; + 50DE50642F21FE1700F30994 /* OutgoingStaticMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DE50632F21FE1700F30994 /* OutgoingStaticMessage.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 */; }; @@ -3569,7 +3570,6 @@ F9C5CBE5289453B300548EEE /* OWSDisappearingConfigurationUpdateInfoMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C5C8F1289453B100548EEE /* OWSDisappearingConfigurationUpdateInfoMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; F9C5CBE7289453B300548EEE /* TSInfoMessage+GroupUpdates+GroupUpdateItemBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C8F3289453B100548EEE /* TSInfoMessage+GroupUpdates+GroupUpdateItemBuilder.swift */; }; F9C5CBE8289453B300548EEE /* OWSEndSessionMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C8F4289453B100548EEE /* OWSEndSessionMessage.m */; }; - F9C5CBE9289453B300548EEE /* OWSStaticOutgoingMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C5C8F5289453B100548EEE /* OWSStaticOutgoingMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; F9C5CBEB289453B300548EEE /* TSOutgoingMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C8F7289453B100548EEE /* TSOutgoingMessage.m */; }; F9C5CBEC289453B300548EEE /* TSOutgoingMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C8F8289453B100548EEE /* TSOutgoingMessage.swift */; }; F9C5CBED289453B300548EEE /* TSInfoMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C5C8F9289453B100548EEE /* TSInfoMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -3585,7 +3585,6 @@ F9C5CBFA289453B300548EEE /* OWSVerificationStateChangeMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C5C906289453B100548EEE /* OWSVerificationStateChangeMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; F9C5CBFB289453B300548EEE /* TSErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C907289453B100548EEE /* TSErrorMessage.m */; }; F9C5CBFC289453B300548EEE /* OWSDisappearingConfigurationUpdateInfoMessage+SDS.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C908289453B100548EEE /* OWSDisappearingConfigurationUpdateInfoMessage+SDS.swift */; }; - F9C5CBFE289453B300548EEE /* OWSStaticOutgoingMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C90A289453B100548EEE /* OWSStaticOutgoingMessage.m */; }; F9C5CBFF289453B300548EEE /* OWSEndSessionMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C5C90B289453B100548EEE /* OWSEndSessionMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; F9C5CC00289453B300548EEE /* TSMention.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C90C289453B100548EEE /* TSMention.swift */; }; F9C5CC02289453B300548EEE /* OWSDisappearingConfigurationUpdateInfoMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C5C90E289453B100548EEE /* OWSDisappearingConfigurationUpdateInfoMessage.m */; }; @@ -4977,6 +4976,7 @@ 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 = ""; }; + 50DE50632F21FE1700F30994 /* OutgoingStaticMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingStaticMessage.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 = ""; }; @@ -7775,7 +7775,6 @@ F9C5C8F1289453B100548EEE /* OWSDisappearingConfigurationUpdateInfoMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSDisappearingConfigurationUpdateInfoMessage.h; sourceTree = ""; }; F9C5C8F3289453B100548EEE /* TSInfoMessage+GroupUpdates+GroupUpdateItemBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TSInfoMessage+GroupUpdates+GroupUpdateItemBuilder.swift"; sourceTree = ""; }; F9C5C8F4289453B100548EEE /* OWSEndSessionMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSEndSessionMessage.m; sourceTree = ""; }; - F9C5C8F5289453B100548EEE /* OWSStaticOutgoingMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSStaticOutgoingMessage.h; sourceTree = ""; }; F9C5C8F7289453B100548EEE /* TSOutgoingMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSOutgoingMessage.m; sourceTree = ""; }; F9C5C8F8289453B100548EEE /* TSOutgoingMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TSOutgoingMessage.swift; sourceTree = ""; }; F9C5C8F9289453B100548EEE /* TSInfoMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSInfoMessage.h; sourceTree = ""; }; @@ -7791,7 +7790,6 @@ F9C5C906289453B100548EEE /* OWSVerificationStateChangeMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSVerificationStateChangeMessage.h; sourceTree = ""; }; F9C5C907289453B100548EEE /* TSErrorMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSErrorMessage.m; sourceTree = ""; }; F9C5C908289453B100548EEE /* OWSDisappearingConfigurationUpdateInfoMessage+SDS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OWSDisappearingConfigurationUpdateInfoMessage+SDS.swift"; sourceTree = ""; }; - F9C5C90A289453B100548EEE /* OWSStaticOutgoingMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSStaticOutgoingMessage.m; sourceTree = ""; }; F9C5C90B289453B100548EEE /* OWSEndSessionMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSEndSessionMessage.h; sourceTree = ""; }; F9C5C90C289453B100548EEE /* TSMention.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TSMention.swift; sourceTree = ""; }; F9C5C90E289453B100548EEE /* OWSDisappearingConfigurationUpdateInfoMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSDisappearingConfigurationUpdateInfoMessage.m; sourceTree = ""; }; @@ -14453,6 +14451,7 @@ 50468F2829EE130A00948E02 /* InteractionStore.swift */, F9C5C8EB289453B100548EEE /* MentionFinder.swift */, 50B74C742F1716F500F59813 /* OutgoingDeleteMessage.swift */, + 50DE50632F21FE1700F30994 /* OutgoingStaticMessage.swift */, F9C5C908289453B100548EEE /* OWSDisappearingConfigurationUpdateInfoMessage+SDS.swift */, F9C5C8F1289453B100548EEE /* OWSDisappearingConfigurationUpdateInfoMessage.h */, F9C5C90E289453B100548EEE /* OWSDisappearingConfigurationUpdateInfoMessage.m */, @@ -14460,8 +14459,6 @@ F9C5C90B289453B100548EEE /* OWSEndSessionMessage.h */, F9C5C8F4289453B100548EEE /* OWSEndSessionMessage.m */, F9C5C905289453B100548EEE /* OWSGiftBadge.swift */, - F9C5C8F5289453B100548EEE /* OWSStaticOutgoingMessage.h */, - F9C5C90A289453B100548EEE /* OWSStaticOutgoingMessage.m */, F9C5C8D9289453B100548EEE /* OWSVerificationStateChangeMessage+SDS.swift */, F9C5C906289453B100548EEE /* OWSVerificationStateChangeMessage.h */, F9C5C8EA289453B100548EEE /* OWSVerificationStateChangeMessage.m */, @@ -15321,7 +15318,6 @@ 6605D4FD2A85AD17004DC345 /* OWSPaymentMessage.h in Headers */, 7273280B2CA797370080E2C7 /* OWSReadTracking.h in Headers */, F9C5CC47289453B300548EEE /* OWSRecoverableDecryptionPlaceholder.h in Headers */, - F9C5CBE9289453B300548EEE /* OWSStaticOutgoingMessage.h in Headers */, F9C5CC81289453B300548EEE /* OWSUnknownContactBlockOfferMessage.h in Headers */, F9C5CC42289453B300548EEE /* OWSUnknownProtocolVersionMessage.h in Headers */, F9C5CE68289453B400548EEE /* OWSVerificationState.h in Headers */, @@ -19081,6 +19077,7 @@ F9C5CC1F289453B300548EEE /* OutgoingResendRequest.swift in Sources */, 50DCCBFE2F1820600024D124 /* OutgoingSenderKeyDistributionMessage.swift in Sources */, C16B8B752B8940D40030BA24 /* OutgoingSentMessageTranscript.swift in Sources */, + 50DE50642F21FE1700F30994 /* OutgoingStaticMessage.swift in Sources */, F9C5CC5A289453B300548EEE /* OutgoingStoryMessage.swift in Sources */, 884E4C4828AF2F2A007A338C /* OutgoingStorySentMessageTranscript.swift in Sources */, 50DE50602F21F4A700F30994 /* OutgoingSyncMessage.swift in Sources */, @@ -19182,7 +19179,6 @@ 669E8FEF28B417D500043D28 /* OWSSignalService.swift in Sources */, 6600F368298DA57200B1EDB7 /* OWSSignalServiceMock.swift in Sources */, F9C5CD8C289453B300548EEE /* OWSSignalServiceProtocol.swift in Sources */, - F9C5CBFE289453B300548EEE /* OWSStaticOutgoingMessage.m in Sources */, 668A01002C2B5FC8007B8808 /* OWSSwiftUtils.swift in Sources */, F9C5CBB8289453B300548EEE /* OWSSyncContactsMessage.swift in Sources */, 7254655B2BA028C400EABFD2 /* OWSSyncManager.swift in Sources */, diff --git a/SignalServiceKit/Groups/GroupsV2Impl.swift b/SignalServiceKit/Groups/GroupsV2Impl.swift index 91b3f137e0..08485050aa 100644 --- a/SignalServiceKit/Groups/GroupsV2Impl.swift +++ b/SignalServiceKit/Groups/GroupsV2Impl.swift @@ -482,7 +482,7 @@ public class GroupsV2Impl: GroupsV2 { return serviceIds.map { serviceId in let address = SignalServiceAddress(serviceId) let contactThread = TSContactThread.getOrCreateThread(withContactAddress: address, transaction: tx) - let message = OWSStaticOutgoingMessage(thread: contactThread, timestamp: timestamp, plaintextData: plaintextData, transaction: tx) + let message = OutgoingStaticMessage(thread: contactThread, timestamp: timestamp, plaintextData: plaintextData, tx: tx) let preparedMessage = PreparedOutgoingMessage.preprepared( transientMessageWithoutAttachments: message, ) diff --git a/SignalServiceKit/Messages/Interactions/OWSStaticOutgoingMessage.h b/SignalServiceKit/Messages/Interactions/OWSStaticOutgoingMessage.h deleted file mode 100644 index f73299c538..0000000000 --- a/SignalServiceKit/Messages/Interactions/OWSStaticOutgoingMessage.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// Copyright 2021 Signal Messenger, LLC -// SPDX-License-Identifier: AGPL-3.0-only -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -// A generic, serializable message that can be used to -// send fixed plaintextData payloads. -@interface OWSStaticOutgoingMessage : 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)initWithThread:(TSThread *)thread - timestamp:(uint64_t)timestamp - plaintextData:(NSData *)plaintextData - transaction:(DBReadTransaction *)transaction; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/Messages/Interactions/OWSStaticOutgoingMessage.m b/SignalServiceKit/Messages/Interactions/OWSStaticOutgoingMessage.m deleted file mode 100644 index 13e809bd1f..0000000000 --- a/SignalServiceKit/Messages/Interactions/OWSStaticOutgoingMessage.m +++ /dev/null @@ -1,101 +0,0 @@ -// -// Copyright 2017 Signal Messenger, LLC -// SPDX-License-Identifier: AGPL-3.0-only -// - -#import "OWSStaticOutgoingMessage.h" -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface OWSStaticOutgoingMessage () - -@property (nonatomic, readonly) NSData *plaintextData; - -@end - -#pragma mark - - -@implementation OWSStaticOutgoingMessage - -- (instancetype)initWithThread:(TSThread *)thread - timestamp:(uint64_t)timestamp - plaintextData:(NSData *)plaintextData - transaction:(DBReadTransaction *)transaction -{ - TSOutgoingMessageBuilder *messageBuilder = [TSOutgoingMessageBuilder outgoingMessageBuilderWithThread:thread]; - messageBuilder.timestamp = timestamp; - self = [super initOutgoingMessageWithBuilder:messageBuilder - additionalRecipients:@[] - explicitRecipients:@[] - skippedRecipients:@[] - transaction:transaction]; - - if (self) { - _plaintextData = plaintextData; - } - - return self; -} - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (void)encodeWithCoder:(NSCoder *)coder -{ - [super encodeWithCoder:coder]; - NSData *plaintextData = self.plaintextData; - if (plaintextData != nil) { - [coder encodeObject:plaintextData forKey:@"plaintextData"]; - } -} - -- (nullable instancetype)initWithCoder:(NSCoder *)coder -{ - self = [super initWithCoder:coder]; - if (!self) { - return self; - } - self->_plaintextData = [coder decodeObjectOfClass:[NSData class] forKey:@"plaintextData"]; - return self; -} - -- (NSUInteger)hash -{ - NSUInteger result = [super hash]; - result ^= self.plaintextData.hash; - return result; -} - -- (BOOL)isEqual:(id)other -{ - if (![super isEqual:other]) { - return NO; - } - OWSStaticOutgoingMessage *typedOther = (OWSStaticOutgoingMessage *)other; - if (![NSObject isObject:self.plaintextData equalToObject:typedOther.plaintextData]) { - return NO; - } - return YES; -} - -- (BOOL)shouldBeSaved -{ - return NO; -} - -- (BOOL)shouldSyncTranscript -{ - return NO; -} - -- (nullable NSData *)buildPlainTextData:(TSThread *)thread transaction:(DBWriteTransaction *)transaction -{ - return self.plaintextData; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/Messages/Interactions/OutgoingStaticMessage.swift b/SignalServiceKit/Messages/Interactions/OutgoingStaticMessage.swift new file mode 100644 index 0000000000..44f3c2aa81 --- /dev/null +++ b/SignalServiceKit/Messages/Interactions/OutgoingStaticMessage.swift @@ -0,0 +1,69 @@ +// +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only +// + +import Foundation + +// A generic, serializable message that can be used to +// send fixed plaintextData payloads. +@objc(OWSStaticOutgoingMessage) +final class OutgoingStaticMessage: TSOutgoingMessage { + + let plaintextData: Data + + init( + thread: TSThread, + timestamp: UInt64, + plaintextData: Data, + tx: DBReadTransaction, + ) { + self.plaintextData = plaintextData + let messageBuilder = TSOutgoingMessageBuilder.outgoingMessageBuilder(thread: thread) + messageBuilder.timestamp = timestamp + super.init( + outgoingMessageWith: messageBuilder, + additionalRecipients: [], + explicitRecipients: [], + skippedRecipients: [], + transaction: tx, + ) + } + + override class var supportsSecureCoding: Bool { true } + + override func encode(with coder: NSCoder) { + super.encode(with: coder) + coder.encode(self.plaintextData, forKey: "plaintextData") + } + + required init?(coder: NSCoder) { + guard let plaintextData = coder.decodeObject(of: NSData.self, forKey: "plaintextData") as Data? else { + return nil + } + self.plaintextData = plaintextData + super.init(coder: coder) + } + + override var hash: Int { + var hasher = Hasher() + hasher.combine(super.hash) + hasher.combine(self.plaintextData) + return hasher.finalize() + } + + override func isEqual(_ object: Any?) -> Bool { + guard let object = object as? Self else { return false } + guard super.isEqual(object) else { return false } + guard self.plaintextData == object.plaintextData else { return false } + return true + } + + override var shouldBeSaved: Bool { false } + + override func shouldSyncTranscript() -> Bool { false } + + override func buildPlainTextData(_ thread: TSThread, transaction: DBWriteTransaction) -> Data? { + return self.plaintextData + } +} diff --git a/SignalServiceKit/SignalServiceKit.h b/SignalServiceKit/SignalServiceKit.h index 2d7489e8dd..535dfb8a30 100644 --- a/SignalServiceKit/SignalServiceKit.h +++ b/SignalServiceKit/SignalServiceKit.h @@ -33,7 +33,6 @@ FOUNDATION_EXPORT const unsigned char SignalServiceKitVersionString[]; #import #import #import -#import #import #import #import