diff --git a/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeySendingErrorMessage.m b/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeySendingErrorMessage.m index d943a958b..8c17d12e7 100644 --- a/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeySendingErrorMessage.m +++ b/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeySendingErrorMessage.m @@ -58,22 +58,39 @@ return message; } -- (void)acceptNewIdentityKey { - [[TSStorageManager sharedManager] saveRemoteIdentity:[self newKey] recipientId:_recipientId]; +- (void)acceptNewIdentityKey +{ + [[TSStorageManager sharedManager] saveRemoteIdentity:[self newKey] recipientId:self.recipientId]; __block TSOutgoingMessage *message; __block TSThread *thread; + __block SignalRecipient *recipient; - [[TSStorageManager sharedManager] - .newDatabaseConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - thread = [TSContactThread fetchObjectWithUniqueID:self.uniqueThreadId transaction:transaction]; - message = [TSOutgoingMessage fetchObjectWithUniqueID:_messageId transaction:transaction]; + [[TSStorageManager sharedManager].newDatabaseConnection + readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + thread = [TSContactThread fetchObjectWithUniqueID:self.uniqueThreadId transaction:transaction]; + message = [TSOutgoingMessage fetchObjectWithUniqueID:self.messageId transaction:transaction]; + recipient = [SignalRecipient fetchObjectWithUniqueID:self.recipientId transaction:transaction]; + + [self removeWithTransaction:transaction]; + }]; - [self removeWithTransaction:transaction]; - }]; if (message) { - [[TSMessagesManager sharedManager] sendMessage:message inThread:thread success:nil failure:nil]; + + void (^logSuccess)() = ^void() { + DDLogInfo(@"Successfully redelivered message to recipient after accepting new key."); + }; + + void (^logFailure)() = ^void() { + DDLogWarn(@"Failed to redeliver message to recipient after accepting new key."); + }; + // Resend to single recipient + [[TSMessagesManager sharedManager] resendMessage:message + toRecipient:recipient + inThread:thread + success:logSuccess + failure:logFailure]; } } diff --git a/src/Messages/TSMessagesManager+sendMessages.h b/src/Messages/TSMessagesManager+sendMessages.h index 17eb063f6..d004b57f0 100644 --- a/src/Messages/TSMessagesManager+sendMessages.h +++ b/src/Messages/TSMessagesManager+sendMessages.h @@ -18,4 +18,10 @@ typedef void (^failedSendingCompletionBlock)(); success:(successSendingCompletionBlock)successCompletionBlock failure:(failedSendingCompletionBlock)failedCompletionBlock; +- (void)resendMessage:(TSOutgoingMessage *)message + toRecipient:(SignalRecipient *)recipient + inThread:(TSThread *)thread + success:(successSendingCompletionBlock)successCompletionBlock + failure:(failedSendingCompletionBlock)failedCompletionBlock; + @end diff --git a/src/Messages/TSMessagesManager+sendMessages.m b/src/Messages/TSMessagesManager+sendMessages.m index 08647dc56..c91f41597 100644 --- a/src/Messages/TSMessagesManager+sendMessages.m +++ b/src/Messages/TSMessagesManager+sendMessages.m @@ -84,6 +84,27 @@ dispatch_queue_t sendingQueue() { return [ContactsUpdater sharedUpdater]; } +- (void)resendMessage:(TSOutgoingMessage *)message + toRecipient:(SignalRecipient *)recipient + inThread:(TSThread *)thread + success:(successSendingCompletionBlock)successCompletionBlock + failure:(failedSendingCompletionBlock)failedCompletionBlock +{ + if ([thread isKindOfClass:[TSGroupThread class]]) { + dispatch_async(sendingQueue(), ^{ + TSGroupThread *groupThread = (TSGroupThread *)thread; + [self groupSend:@[ recipient ] // Avoid spamming entire group when resending failed message. + Message:message + inThread:thread + success:successCompletionBlock + failure:failedCompletionBlock]; + }); + } else { + [self sendMessage:message inThread:thread success:successCompletionBlock failure:failedCompletionBlock]; + } +} + + - (void)sendMessage:(TSOutgoingMessage *)message inThread:(TSThread *)thread success:(successSendingCompletionBlock)successCompletionBlock @@ -91,7 +112,6 @@ dispatch_queue_t sendingQueue() { dispatch_async(sendingQueue(), ^{ if ([thread isKindOfClass:[TSGroupThread class]]) { TSGroupThread *groupThread = (TSGroupThread *)thread; - [self saveGroupMessage:message inThread:thread]; [self getRecipients:groupThread.groupModel.groupMemberIds success:^(NSArray *recipients) { [self groupSend:recipients @@ -177,7 +197,9 @@ dispatch_queue_t sendingQueue() { Message:(TSOutgoingMessage *)message inThread:(TSThread *)thread success:(successSendingCompletionBlock)successBlock - failure:(failedSendingCompletionBlock)failureBlock { + failure:(failedSendingCompletionBlock)failureBlock +{ + [self saveGroupMessage:message inThread:thread]; NSMutableArray *futures = [NSMutableArray array]; for (SignalRecipient *rec in recipients) {