|
|
|
@ -1067,10 +1067,10 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
hasValidMessageType = [validMessageTypes containsObject:messageType];
|
|
|
|
|
|
|
|
|
|
/* Loki: Original code
|
|
|
|
|
hasValidMessageType = ([messageType isEqualToNumber:@(TSEncryptedWhisperMessageType)] ||
|
|
|
|
|
[messageType isEqualToNumber:@(TSPreKeyWhisperMessageType)]);
|
|
|
|
|
* ========
|
|
|
|
|
hasValidMessageType = ([messageType isEqualToNumber:@(TSEncryptedWhisperMessageType)] || [messageType isEqualToNumber:@(TSPreKeyWhisperMessageType)]);
|
|
|
|
|
* ========
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!hasValidMessageType) {
|
|
|
|
@ -1104,16 +1104,46 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
return messageSend.failure(error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update the state to show that the proof of work is being calculated
|
|
|
|
|
[self saveIsCalculatingProofOfWork:YES forMessage:messageSend];
|
|
|
|
|
// Convert the message to a Loki message and send it using the Loki messaging API
|
|
|
|
|
// Get the message parameters and type
|
|
|
|
|
NSDictionary *signalMessage = deviceMessages.firstObject;
|
|
|
|
|
// Update the message and thread if needed
|
|
|
|
|
NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue;
|
|
|
|
|
if (messageType == TSFriendRequestMessageType) {
|
|
|
|
|
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil];
|
|
|
|
|
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil];
|
|
|
|
|
}
|
|
|
|
|
TSWhisperMessageType messageType = ((NSNumber *)signalMessage[@"type"]).integerValue;
|
|
|
|
|
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
|
|
|
|
// Update the PoW calculation status
|
|
|
|
|
[message saveIsCalculatingProofOfWork:YES withTransaction:transaction];
|
|
|
|
|
// Update the message and thread if needed
|
|
|
|
|
if (messageType == TSFriendRequestMessageType) {
|
|
|
|
|
[message.thread saveFriendRequestStatus:LKThreadFriendRequestStatusRequestSending withTransaction:transaction];
|
|
|
|
|
[message saveFriendRequestStatus:LKMessageFriendRequestStatusSendingOrFailed withTransaction:transaction];
|
|
|
|
|
}
|
|
|
|
|
}];
|
|
|
|
|
// Convenience
|
|
|
|
|
void (^handleError)(NSError *error) = ^(NSError *error) {
|
|
|
|
|
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
|
|
|
|
// Update the thread if needed
|
|
|
|
|
if (messageType == TSFriendRequestMessageType) {
|
|
|
|
|
[message.thread saveFriendRequestStatus:LKThreadFriendRequestStatusNone withTransaction:transaction];
|
|
|
|
|
[message saveFriendRequestStatus:LKMessageFriendRequestStatusSendingOrFailed withTransaction:transaction];
|
|
|
|
|
}
|
|
|
|
|
// Update the PoW calculation status
|
|
|
|
|
[message saveIsCalculatingProofOfWork:NO withTransaction:transaction];
|
|
|
|
|
}];
|
|
|
|
|
// Handle the error
|
|
|
|
|
NSUInteger statusCode = 0;
|
|
|
|
|
NSData *_Nullable responseData = nil;
|
|
|
|
|
if ([error.domain isEqualToString:TSNetworkManagerErrorDomain]) {
|
|
|
|
|
statusCode = error.code;
|
|
|
|
|
NSError *_Nullable underlyingError = error.userInfo[NSUnderlyingErrorKey];
|
|
|
|
|
if (underlyingError) {
|
|
|
|
|
responseData = underlyingError.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey];
|
|
|
|
|
} else {
|
|
|
|
|
OWSFailDebug(@"Missing underlying error: %@.", error);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
OWSFailDebug(@"Unexpected error: %@.", error);
|
|
|
|
|
}
|
|
|
|
|
[self messageSendDidFail:messageSend deviceMessages:deviceMessages statusCode:statusCode error:error responseData:responseData];
|
|
|
|
|
};
|
|
|
|
|
// Convert the message to a Loki message and send it using the Loki API
|
|
|
|
|
[[LokiAPI objc_sendSignalMessage:signalMessage to:recipient.recipientId with:message.timestamp]
|
|
|
|
|
.thenOn(OWSDispatch.sendingQueue, ^(id result) {
|
|
|
|
|
NSSet<AnyPromise *> *promises = (NSSet<AnyPromise *> *)result;
|
|
|
|
@ -1125,11 +1155,13 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
.thenOn(OWSDispatch.sendingQueue, ^(id result) {
|
|
|
|
|
if (isSuccess) { return; } // Succeed as soon as the first promise succeeds
|
|
|
|
|
isSuccess = YES;
|
|
|
|
|
// Update the message and thread if needed
|
|
|
|
|
if (messageType == TSFriendRequestMessageType) {
|
|
|
|
|
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
|
|
|
|
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction];
|
|
|
|
|
[message.thread removeOldOutgoingFriendRequestMessagesWithTransaction:transaction];
|
|
|
|
|
// Update the thread
|
|
|
|
|
[message.thread saveFriendRequestStatus:LKThreadFriendRequestStatusRequestSent withTransaction:transaction];
|
|
|
|
|
[message.thread removeOldOutgoingFriendRequestMessagesIfNeededWithTransaction:transaction];
|
|
|
|
|
// Update the message
|
|
|
|
|
[message saveFriendRequestStatus:LKMessageFriendRequestStatusPending withTransaction:transaction];
|
|
|
|
|
NSTimeInterval expirationInterval = 72 * kHourInterval;
|
|
|
|
|
NSDate *expirationDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval];
|
|
|
|
|
[message saveFriendRequestExpiresAt:[NSDate ows_millisecondsSince1970ForDate:expirationDate] withTransaction:transaction];
|
|
|
|
@ -1141,29 +1173,12 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
.catchOn(OWSDispatch.sendingQueue, ^(NSError *error) {
|
|
|
|
|
errorCount += 1;
|
|
|
|
|
if (errorCount != promiseCount) { return; } // Only error out if all promises failed
|
|
|
|
|
// Update the thread if needed
|
|
|
|
|
if (messageType == TSFriendRequestMessageType) {
|
|
|
|
|
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil];
|
|
|
|
|
}
|
|
|
|
|
// Update the PoW calculation status
|
|
|
|
|
[self saveIsCalculatingProofOfWork:NO forMessage:messageSend];
|
|
|
|
|
// Handle the error
|
|
|
|
|
NSUInteger statusCode = 0;
|
|
|
|
|
NSData *_Nullable responseData = nil;
|
|
|
|
|
if ([error.domain isEqualToString:TSNetworkManagerErrorDomain]) {
|
|
|
|
|
statusCode = error.code;
|
|
|
|
|
NSError *_Nullable underlyingError = error.userInfo[NSUnderlyingErrorKey];
|
|
|
|
|
if (underlyingError) {
|
|
|
|
|
responseData = underlyingError.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey];
|
|
|
|
|
} else {
|
|
|
|
|
OWSFailDebug(@"Missing underlying error: %@.", error);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
OWSFailDebug(@"Unexpected error: %@.", error);
|
|
|
|
|
}
|
|
|
|
|
[self messageSendDidFail:messageSend deviceMessages:deviceMessages statusCode:statusCode error:error responseData:responseData];
|
|
|
|
|
handleError(error);
|
|
|
|
|
}) retainUntilComplete];
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catchOn(OWSDispatch.sendingQueue, ^(NSError *error) { // Unreachable snode; usually a problem with LokiNet
|
|
|
|
|
handleError(error);
|
|
|
|
|
}) retainUntilComplete];
|
|
|
|
|
|
|
|
|
|
// Loki: Original code
|
|
|
|
@ -1229,16 +1244,6 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)saveIsCalculatingProofOfWork:(BOOL)isCalculatingPoW forMessage:(OWSMessageSend *)messageSend
|
|
|
|
|
{
|
|
|
|
|
OWSAssertDebug(messageSend);
|
|
|
|
|
dispatch_async(OWSDispatch.sendingQueue, ^{
|
|
|
|
|
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
|
|
|
|
[messageSend.message saveIsCalculatingProofOfWork:isCalculatingPoW withTransaction:transaction];
|
|
|
|
|
}];
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)messageSendDidSucceed:(OWSMessageSend *)messageSend
|
|
|
|
|
deviceMessages:(NSArray<NSDictionary *> *)deviceMessages
|
|
|
|
|
wasSentByUD:(BOOL)wasSentByUD
|
|
|
|
@ -1331,6 +1336,11 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
switch (statusCode) {
|
|
|
|
|
case 0: { // Loki
|
|
|
|
|
NSError *error = OWSErrorMakeFailedToSendOutgoingMessageError();
|
|
|
|
|
[error setIsRetryable:NO];
|
|
|
|
|
return messageSend.failure(error);
|
|
|
|
|
}
|
|
|
|
|
case 401: {
|
|
|
|
|
OWSLogWarn(@"Unable to send due to invalid credentials. Did the user's client get de-authed by "
|
|
|
|
|
@"registering elsewhere?");
|
|
|
|
|