From df756423f24ac91dd69f45cc036c09771c15f6eb Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 22 Nov 2016 12:14:39 -0500 Subject: [PATCH] Ignore unknown group messages otherwise when (e.g.) android adds a new group type they'll be shown as empty bubbles. // FREEBIE --- Example/TSKitiOSTestApp/Podfile.lock | 4 +- SignalServiceKit.podspec | 2 +- src/Messages/TSMessagesManager.m | 69 +++++++++++++++----------- src/Security/OWSFingerprint.m | 2 +- tests/Messages/TSMessagesManagerTest.m | 27 ++++++++++ 5 files changed, 72 insertions(+), 32 deletions(-) diff --git a/Example/TSKitiOSTestApp/Podfile.lock b/Example/TSKitiOSTestApp/Podfile.lock index 17719db16..3bf1da513 100644 --- a/Example/TSKitiOSTestApp/Podfile.lock +++ b/Example/TSKitiOSTestApp/Podfile.lock @@ -35,7 +35,7 @@ PODS: - ProtocolBuffers (1.9.10) - Reachability (3.2) - SAMKeychain (1.5.0) - - SignalServiceKit (0.7.0): + - SignalServiceKit (0.7.1): - '25519' - AFNetworking - AxolotlKit @@ -130,7 +130,7 @@ SPEC CHECKSUMS: ProtocolBuffers: d088180c10072b3d24a9939a6314b7b9bcc2340b Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 SAMKeychain: 1fc9ae02f576365395758b12888c84704eebc423 - SignalServiceKit: f32dd13f4bdc46276e2e090719f3a88288fd78ad + SignalServiceKit: 0cd25c4d4c96b541723bfc74f46695cc94e05d5f SocketRocket: 3f77ec2104cc113add553f817ad90a77114f5d43 SQLCipher: 4c768761421736a247ed6cf412d9045615d53dff TwistedOakCollapsingFutures: f359b90f203e9ab13dfb92c9ff41842a7fe1cd0c diff --git a/SignalServiceKit.podspec b/SignalServiceKit.podspec index aabb1cb1c..774d3d44e 100644 --- a/SignalServiceKit.podspec +++ b/SignalServiceKit.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = "SignalServiceKit" - s.version = "0.7.1" + s.version = "0.7.2" s.summary = "An Objective-C library for communicating with the Signal messaging service." s.description = <<-DESC diff --git a/src/Messages/TSMessagesManager.m b/src/Messages/TSMessagesManager.m index 270a5efcb..94b266deb 100644 --- a/src/Messages/TSMessagesManager.m +++ b/src/Messages/TSMessagesManager.m @@ -397,6 +397,8 @@ NS_ASSUME_NONNULL_BEGIN failure:^(NSError *error) { DDLogError(@"%@ Failed to send Groups response syncMessage with error: %@", self.tag, error); }]; + } else { + DDLogWarn(@"%@ ignoring unsupported sync request message", self.tag); } } else if (syncMessage.read.count > 0) { DDLogInfo(@"%@ Received %ld read receipt(s)", self.tag, (u_long)syncMessage.read.count); @@ -487,37 +489,48 @@ NS_ASSUME_NONNULL_BEGIN TSGroupThread *gThread = [TSGroupThread getOrCreateThreadWithGroupModel:model transaction:transaction]; [gThread saveWithTransaction:transaction]; - if (dataMessage.group.type == OWSSignalServiceProtosGroupContextTypeUpdate) { - NSString *updateGroupInfo = [gThread.groupModel getInfoStringAboutUpdateTo:model contactsManager:self.contactsManager]; - gThread.groupModel = model; - [gThread saveWithTransaction:transaction]; - [[[TSInfoMessage alloc] initWithTimestamp:timestamp - inThread:gThread - messageType:TSInfoMessageTypeGroupUpdate - customMessage:updateGroupInfo] saveWithTransaction:transaction]; - } else if (dataMessage.group.type == OWSSignalServiceProtosGroupContextTypeQuit) { - NSString *nameString = [self.contactsManager nameStringForPhoneIdentifier:envelope.source]; + switch (dataMessage.group.type) { + case OWSSignalServiceProtosGroupContextTypeUpdate: { + NSString *updateGroupInfo = + [gThread.groupModel getInfoStringAboutUpdateTo:model contactsManager:self.contactsManager]; + gThread.groupModel = model; + [gThread saveWithTransaction:transaction]; + [[[TSInfoMessage alloc] initWithTimestamp:timestamp + inThread:gThread + messageType:TSInfoMessageTypeGroupUpdate + customMessage:updateGroupInfo] saveWithTransaction:transaction]; + break; + } + case OWSSignalServiceProtosGroupContextTypeQuit: { + NSString *nameString = [self.contactsManager nameStringForPhoneIdentifier:envelope.source]; - NSString *updateGroupInfo = - [NSString stringWithFormat:NSLocalizedString(@"GROUP_MEMBER_LEFT", @""), nameString]; - NSMutableArray *newGroupMembers = [NSMutableArray arrayWithArray:gThread.groupModel.groupMemberIds]; - [newGroupMembers removeObject:envelope.source]; - gThread.groupModel.groupMemberIds = newGroupMembers; + NSString *updateGroupInfo = + [NSString stringWithFormat:NSLocalizedString(@"GROUP_MEMBER_LEFT", @""), nameString]; + NSMutableArray *newGroupMembers = [NSMutableArray arrayWithArray:gThread.groupModel.groupMemberIds]; + [newGroupMembers removeObject:envelope.source]; + gThread.groupModel.groupMemberIds = newGroupMembers; - [gThread saveWithTransaction:transaction]; - [[[TSInfoMessage alloc] initWithTimestamp:timestamp - inThread:gThread - messageType:TSInfoMessageTypeGroupUpdate - customMessage:updateGroupInfo] saveWithTransaction:transaction]; - } else { - incomingMessage = [[TSIncomingMessage alloc] initWithTimestamp:timestamp - inThread:gThread - authorId:envelope.source - messageBody:body - attachmentIds:attachmentIds - expiresInSeconds:dataMessage.expireTimer]; + [gThread saveWithTransaction:transaction]; + [[[TSInfoMessage alloc] initWithTimestamp:timestamp + inThread:gThread + messageType:TSInfoMessageTypeGroupUpdate + customMessage:updateGroupInfo] saveWithTransaction:transaction]; + break; + } + case OWSSignalServiceProtosGroupContextTypeDeliver: { + incomingMessage = [[TSIncomingMessage alloc] initWithTimestamp:timestamp + inThread:gThread + authorId:envelope.source + messageBody:body + attachmentIds:attachmentIds + expiresInSeconds:dataMessage.expireTimer]; - [incomingMessage saveWithTransaction:transaction]; + [incomingMessage saveWithTransaction:transaction]; + break; + } + default: { + DDLogWarn(@"%@ Ignoring unknown group message type:%d", self.tag, dataMessage.group.type); + } } thread = gThread; diff --git a/src/Security/OWSFingerprint.m b/src/Security/OWSFingerprint.m index 0e77d64db..82d67b497 100644 --- a/src/Security/OWSFingerprint.m +++ b/src/Security/OWSFingerprint.m @@ -164,7 +164,7 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200; NSMutableArray *lines = [NSMutableArray new]; - uint lineLength = self.text.length / 3; + NSUInteger lineLength = self.text.length / 3; for (uint i = 0; i < 3; i++) { NSString *line = [input substringWithRange:NSMakeRange(i * lineLength, lineLength)]; diff --git a/tests/Messages/TSMessagesManagerTest.m b/tests/Messages/TSMessagesManagerTest.m index 5c656995f..4bca3aa60 100644 --- a/tests/Messages/TSMessagesManagerTest.m +++ b/tests/Messages/TSMessagesManagerTest.m @@ -160,6 +160,33 @@ NS_ASSUME_NONNULL_BEGIN XCTAssertEqualObjects(@"Newly created Group with Avatar Name", groupThread.name); } +- (void)testUnknownGroupMessageIsIgnored +{ + NSData *groupIdData = [Cryptography generateRandomBytes:32]; + TSGroupThread *groupThread = [TSGroupThread getOrCreateThreadWithGroupIdData:groupIdData]; + + // Sanity check + XCTAssertEqual(0, groupThread.numberOfInteractions); + + TSMessagesManager *messagesManager = [self messagesManagerWithSender:[OWSFakeMessageSender new]]; + + OWSSignalServiceProtosEnvelopeBuilder *envelopeBuilder = [OWSSignalServiceProtosEnvelopeBuilder new]; + + OWSSignalServiceProtosGroupContextBuilder *groupContextBuilder = [OWSSignalServiceProtosGroupContextBuilder new]; + groupContextBuilder.name = @"Newly created Group with Avatar Name"; + groupContextBuilder.id = groupIdData; + + // e.g. some future feature sent from another device that we don't yet support. + groupContextBuilder.type = 666; + + OWSSignalServiceProtosDataMessageBuilder *messageBuilder = [OWSSignalServiceProtosDataMessageBuilder new]; + messageBuilder.group = [groupContextBuilder build]; + + [messagesManager handleIncomingEnvelope:[envelopeBuilder build] withDataMessage:[messageBuilder build]]; + + XCTAssertEqual(0, groupThread.numberOfInteractions); +} + @end NS_ASSUME_NONNULL_END