|
|
@ -579,7 +579,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
message:(TSOutgoingMessage *)message
|
|
|
|
message:(TSOutgoingMessage *)message
|
|
|
|
thread:(nullable TSThread *)thread
|
|
|
|
thread:(nullable TSThread *)thread
|
|
|
|
senderCertificate:(nullable SMKSenderCertificate *)senderCertificate
|
|
|
|
senderCertificate:(nullable SMKSenderCertificate *)senderCertificate
|
|
|
|
selfUDAccessKey:(nullable SMKUDAccessKey *)selfUDAccessKey
|
|
|
|
selfUDAccess:(nullable OWSUDAccess *)selfUDAccess
|
|
|
|
sendErrors:(NSMutableArray<NSError *> *)sendErrors
|
|
|
|
sendErrors:(NSMutableArray<NSError *> *)sendErrors
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OWSAssertDebug(recipients.count > 0);
|
|
|
|
OWSAssertDebug(recipients.count > 0);
|
|
|
@ -591,16 +591,16 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
for (SignalRecipient *recipient in recipients) {
|
|
|
|
for (SignalRecipient *recipient in recipients) {
|
|
|
|
// Use chained promises to make the code more readable.
|
|
|
|
// Use chained promises to make the code more readable.
|
|
|
|
AnyPromise *sendPromise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) {
|
|
|
|
AnyPromise *sendPromise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) {
|
|
|
|
SMKUDAccessKey *_Nullable theirUDAccessKey;
|
|
|
|
OWSUDAccess *_Nullable theirUDAccess;
|
|
|
|
if (senderCertificate != nil && selfUDAccessKey != nil) {
|
|
|
|
if (senderCertificate != nil && selfUDAccess != nil) {
|
|
|
|
theirUDAccessKey = [self.udManager udSendAccessKeyForRecipientId:recipient.recipientId];
|
|
|
|
theirUDAccess = [self.udManager udAccessForRecipientId:recipient.recipientId requireSyncAccess:YES];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OWSMessageSend *messageSend = [[OWSMessageSend alloc] initWithMessage:message
|
|
|
|
OWSMessageSend *messageSend = [[OWSMessageSend alloc] initWithMessage:message
|
|
|
|
thread:thread
|
|
|
|
thread:thread
|
|
|
|
recipient:recipient
|
|
|
|
recipient:recipient
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
udAccessKey:theirUDAccessKey
|
|
|
|
udAccess:theirUDAccess
|
|
|
|
localNumber:self.tsAccountManager.localNumber
|
|
|
|
localNumber:self.tsAccountManager.localNumber
|
|
|
|
success:^{
|
|
|
|
success:^{
|
|
|
|
// The value doesn't matter, we just need any non-NSError value.
|
|
|
|
// The value doesn't matter, we just need any non-NSError value.
|
|
|
@ -631,16 +631,16 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
{
|
|
|
|
{
|
|
|
|
AssertIsOnSendingQueue();
|
|
|
|
AssertIsOnSendingQueue();
|
|
|
|
|
|
|
|
|
|
|
|
SMKUDAccessKey *_Nullable selfUDAccessKey;
|
|
|
|
OWSUDAccess *_Nullable selfUDAccess;
|
|
|
|
if (senderCertificate) {
|
|
|
|
if (senderCertificate) {
|
|
|
|
selfUDAccessKey = [self.udManager udSendAccessKeyForRecipientId:self.tsAccountManager.localNumber];
|
|
|
|
selfUDAccess = [self.udManager udAccessForRecipientId:self.tsAccountManager.localNumber requireSyncAccess:YES];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void (^successHandler)(void) = ^() {
|
|
|
|
void (^successHandler)(void) = ^() {
|
|
|
|
dispatch_async([OWSDispatch sendingQueue], ^{
|
|
|
|
dispatch_async([OWSDispatch sendingQueue], ^{
|
|
|
|
[self handleMessageSentLocally:message
|
|
|
|
[self handleMessageSentLocally:message
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
selfUDAccessKey:selfUDAccessKey
|
|
|
|
selfUDAccess:selfUDAccess
|
|
|
|
success:^{
|
|
|
|
success:^{
|
|
|
|
successHandlerParam();
|
|
|
|
successHandlerParam();
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -658,7 +658,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
dispatch_async([OWSDispatch sendingQueue], ^{
|
|
|
|
dispatch_async([OWSDispatch sendingQueue], ^{
|
|
|
|
[self handleMessageSentLocally:message
|
|
|
|
[self handleMessageSentLocally:message
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
selfUDAccessKey:selfUDAccessKey
|
|
|
|
selfUDAccess:selfUDAccess
|
|
|
|
success:^{
|
|
|
|
success:^{
|
|
|
|
failureHandlerParam(error);
|
|
|
|
failureHandlerParam(error);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -740,7 +740,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
message:message
|
|
|
|
message:message
|
|
|
|
thread:thread
|
|
|
|
thread:thread
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
selfUDAccessKey:selfUDAccessKey
|
|
|
|
selfUDAccess:selfUDAccess
|
|
|
|
sendErrors:sendErrors]
|
|
|
|
sendErrors:sendErrors]
|
|
|
|
.then(^(id value) {
|
|
|
|
.then(^(id value) {
|
|
|
|
successHandler();
|
|
|
|
successHandler();
|
|
|
@ -1076,8 +1076,15 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
OWSLogWarn(@"Sending a message with no device messages.");
|
|
|
|
OWSLogWarn(@"Sending a message with no device messages.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NOTE: canFailoverUDAuth is NO because UD-auth and Non-UD-auth requests
|
|
|
|
// NOTE: canFailoverUDAuth depends on whether or not we're sending a
|
|
|
|
// use different device lists.
|
|
|
|
// sync message because sync messages use different device lists
|
|
|
|
|
|
|
|
// for UD-auth and Non-UD-auth requests.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Therefore, for sync messages, we can't use OWSRequestMaker's
|
|
|
|
|
|
|
|
// retry/failover logic; we need to use the message sender's retry
|
|
|
|
|
|
|
|
// logic that will build a new set of device messages.
|
|
|
|
|
|
|
|
BOOL isSyncMessageSend = messageSend.isLocalNumber;
|
|
|
|
|
|
|
|
BOOL canFailoverUDAuth = !isSyncMessageSend;
|
|
|
|
OWSRequestMaker *requestMaker = [[OWSRequestMaker alloc] initWithLabel:@"Message Send"
|
|
|
|
OWSRequestMaker *requestMaker = [[OWSRequestMaker alloc] initWithLabel:@"Message Send"
|
|
|
|
requestFactoryBlock:^(SMKUDAccessKey *_Nullable udAccessKey) {
|
|
|
|
requestFactoryBlock:^(SMKUDAccessKey *_Nullable udAccessKey) {
|
|
|
|
return [OWSRequestFactory submitMessageRequestWithRecipient:recipient.recipientId
|
|
|
|
return [OWSRequestFactory submitMessageRequestWithRecipient:recipient.recipientId
|
|
|
@ -1086,14 +1093,18 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
udAccessKey:udAccessKey];
|
|
|
|
udAccessKey:udAccessKey];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
udAuthFailureBlock:^{
|
|
|
|
udAuthFailureBlock:^{
|
|
|
|
|
|
|
|
// Note the UD auth failure so subsequent retries
|
|
|
|
|
|
|
|
// to this recipient also use basic auth.
|
|
|
|
[messageSend setHasUDAuthFailed];
|
|
|
|
[messageSend setHasUDAuthFailed];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
websocketFailureBlock:^{
|
|
|
|
websocketFailureBlock:^{
|
|
|
|
|
|
|
|
// Note the websocket failure so subsequent retries
|
|
|
|
|
|
|
|
// to this recipient also use REST.
|
|
|
|
messageSend.hasWebsocketSendFailed = YES;
|
|
|
|
messageSend.hasWebsocketSendFailed = YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
recipientId:recipient.recipientId
|
|
|
|
recipientId:recipient.recipientId
|
|
|
|
udAccessKey:messageSend.udAccessKey
|
|
|
|
udAccess:messageSend.udAccess
|
|
|
|
canFailoverUDAuth:NO];
|
|
|
|
canFailoverUDAuth:canFailoverUDAuth];
|
|
|
|
[[requestMaker makeRequestObjc]
|
|
|
|
[[requestMaker makeRequestObjc]
|
|
|
|
.then(^(OWSRequestMakerResult *result) {
|
|
|
|
.then(^(OWSRequestMakerResult *result) {
|
|
|
|
dispatch_async([OWSDispatch sendingQueue], ^{
|
|
|
|
dispatch_async([OWSDispatch sendingQueue], ^{
|
|
|
@ -1341,7 +1352,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
|
|
|
|
|
|
|
- (void)handleMessageSentLocally:(TSOutgoingMessage *)message
|
|
|
|
- (void)handleMessageSentLocally:(TSOutgoingMessage *)message
|
|
|
|
senderCertificate:(nullable SMKSenderCertificate *)senderCertificate
|
|
|
|
senderCertificate:(nullable SMKSenderCertificate *)senderCertificate
|
|
|
|
selfUDAccessKey:(nullable SMKUDAccessKey *)selfUDAccessKey
|
|
|
|
selfUDAccess:(nullable OWSUDAccess *)selfUDAccess
|
|
|
|
success:(void (^)(void))success
|
|
|
|
success:(void (^)(void))success
|
|
|
|
failure:(RetryableFailureHandler)failure
|
|
|
|
failure:(RetryableFailureHandler)failure
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -1358,7 +1369,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
[self
|
|
|
|
[self
|
|
|
|
sendSyncTranscriptForMessage:message
|
|
|
|
sendSyncTranscriptForMessage:message
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
selfUDAccessKey:selfUDAccessKey
|
|
|
|
selfUDAccess:selfUDAccess
|
|
|
|
success:^{
|
|
|
|
success:^{
|
|
|
|
// TODO: We might send to a recipient, then to another recipient on retry.
|
|
|
|
// TODO: We might send to a recipient, then to another recipient on retry.
|
|
|
|
// To ensure desktop receives all "delivery status" info, we might
|
|
|
|
// To ensure desktop receives all "delivery status" info, we might
|
|
|
@ -1375,7 +1386,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
|
|
|
|
|
|
|
- (void)sendSyncTranscriptForMessage:(TSOutgoingMessage *)message
|
|
|
|
- (void)sendSyncTranscriptForMessage:(TSOutgoingMessage *)message
|
|
|
|
senderCertificate:(nullable SMKSenderCertificate *)senderCertificate
|
|
|
|
senderCertificate:(nullable SMKSenderCertificate *)senderCertificate
|
|
|
|
selfUDAccessKey:(nullable SMKUDAccessKey *)selfUDAccessKey
|
|
|
|
selfUDAccess:(nullable OWSUDAccess *)selfUDAccess
|
|
|
|
success:(void (^)(void))success
|
|
|
|
success:(void (^)(void))success
|
|
|
|
failure:(RetryableFailureHandler)failure
|
|
|
|
failure:(RetryableFailureHandler)failure
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -1392,7 +1403,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
thread:message.thread
|
|
|
|
thread:message.thread
|
|
|
|
recipient:recipient
|
|
|
|
recipient:recipient
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
senderCertificate:senderCertificate
|
|
|
|
udAccessKey:selfUDAccessKey
|
|
|
|
udAccess:selfUDAccess
|
|
|
|
localNumber:self.tsAccountManager.localNumber
|
|
|
|
localNumber:self.tsAccountManager.localNumber
|
|
|
|
success:^{
|
|
|
|
success:^{
|
|
|
|
OWSLogInfo(@"Successfully sent sync transcript.");
|
|
|
|
OWSLogInfo(@"Successfully sent sync transcript.");
|
|
|
@ -1578,13 +1589,17 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
udAccessKey:udAccessKey];
|
|
|
|
udAccessKey:udAccessKey];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
udAuthFailureBlock:^{
|
|
|
|
udAuthFailureBlock:^{
|
|
|
|
|
|
|
|
// Note the UD auth failure so subsequent retries
|
|
|
|
|
|
|
|
// to this recipient also use basic auth.
|
|
|
|
[messageSend setHasUDAuthFailed];
|
|
|
|
[messageSend setHasUDAuthFailed];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
websocketFailureBlock:^{
|
|
|
|
websocketFailureBlock:^{
|
|
|
|
|
|
|
|
// Note the websocket failure so subsequent retries
|
|
|
|
|
|
|
|
// to this recipient also use REST.
|
|
|
|
messageSend.hasWebsocketSendFailed = YES;
|
|
|
|
messageSend.hasWebsocketSendFailed = YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
recipientId:recipientId
|
|
|
|
recipientId:recipientId
|
|
|
|
udAccessKey:messageSend.udAccessKey
|
|
|
|
udAccess:messageSend.udAccess
|
|
|
|
canFailoverUDAuth:YES];
|
|
|
|
canFailoverUDAuth:YES];
|
|
|
|
[[requestMaker makeRequestObjc]
|
|
|
|
[[requestMaker makeRequestObjc]
|
|
|
|
.then(^(OWSRequestMakerResult *result) {
|
|
|
|
.then(^(OWSRequestMakerResult *result) {
|
|
|
|