Handle session request message for group members
This commit is contained in:
parent
369b5ddaf2
commit
3dc7494b16
|
@ -0,0 +1,15 @@
|
|||
//
|
||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import "LKFriendRequestMessage.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface LKSessionRequestMessage : LKFriendRequestMessage
|
||||
|
||||
- (instancetype)initWithThread:(TSThread *)thread;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,20 @@
|
|||
//
|
||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import "LKSessionRequestMessage.h"
|
||||
#import <SignalCoreKit/NSDate+OWS.h>
|
||||
#import <SignalServiceKit/SignalServiceKit-Swift.h>
|
||||
|
||||
@implementation LKSessionRequestMessage
|
||||
|
||||
- (instancetype)initWithThread:(TSThread *)thread {
|
||||
return [self initOutgoingMessageWithTimestamp:NSDate.ows_millisecondTimeStamp inThread:thread messageBody:@"" attachmentIds:[NSMutableArray<NSString *> new]
|
||||
expiresInSeconds:0 expireStartedAt:0 isVoiceMessage:NO groupMetaMessage:TSGroupMetaMessageUnspecified quotedMessage:nil contactShare:nil linkPreview:nil];
|
||||
}
|
||||
|
||||
- (BOOL)shouldBeSaved {
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end
|
|
@ -20,6 +20,7 @@
|
|||
#import "OWSDisappearingMessagesConfiguration.h"
|
||||
#import "OWSDisappearingMessagesJob.h"
|
||||
#import "LKEphemeralMessage.h"
|
||||
#import "LKSessionRequestMessage.h"
|
||||
#import "LKDeviceLinkMessage.h"
|
||||
#import "OWSIdentityManager.h"
|
||||
#import "OWSIncomingMessageFinder.h"
|
||||
|
@ -577,6 +578,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
// Unknown group.
|
||||
if (dataMessage.group.type == SSKProtoGroupContextTypeUpdate) {
|
||||
// Accept group updates for unknown groups.
|
||||
OWSLogInfo(@"RYAN: Group update message for unknown groups, %@", dataMessage.body);
|
||||
} else if (dataMessage.group.type == SSKProtoGroupContextTypeDeliver) {
|
||||
[self sendGroupInfoRequest:dataMessage.group.id envelope:envelope transaction:transaction];
|
||||
return;
|
||||
|
@ -1405,6 +1407,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
contactsManager:self.contactsManager];
|
||||
newGroupThread.groupModel = newGroupModel;
|
||||
[newGroupThread saveWithTransaction:transaction];
|
||||
|
||||
//Loki - Try to establish session with members when a group is created or updated
|
||||
[self establishSessionsWithMembersIfNeeded: newMemberIds.allObjects forThread:newGroupThread transaction:transaction];
|
||||
|
||||
[[OWSDisappearingMessagesJob sharedJob] becomeConsistentWithDisappearingDuration:dataMessage.expireTimer
|
||||
thread:newGroupThread
|
||||
|
@ -1648,6 +1653,24 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
}
|
||||
}
|
||||
|
||||
//Loki: Establish a session if there is no session between the memebers of a group
|
||||
- (void)establishSessionsWithMembersIfNeeded: (NSArray *)members forThread: (TSGroupThread *)thread transaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
{
|
||||
NSString *userHexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey;
|
||||
for (NSString *member in members) {
|
||||
if ([member isEqualToString:userHexEncodedPublicKey] ) { continue; }
|
||||
TSThread *contactThread = [TSContactThread getThreadWithContactId:member transaction:transaction];
|
||||
if (contactThread == nil || !contactThread.isContactFriend) {
|
||||
OWSLogInfo(@"Try to build session with %@", member);
|
||||
LKSessionRequestMessage *message = [[LKSessionRequestMessage alloc] initWithThread:thread];
|
||||
[self.messageSenderJobQueue addMessage:message transaction:transaction];
|
||||
}
|
||||
else {
|
||||
OWSLogInfo(@"There is session with %@", member);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)canFriendRequestBeAutoAcceptedForThread:(TSContactThread *)thread transaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
{
|
||||
NSString *senderHexEncodedPublicKey = thread.contactIdentifier;
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#import "TSThread.h"
|
||||
#import "TSContactThread.h"
|
||||
#import "LKFriendRequestMessage.h"
|
||||
#import "LKSessionRequestMessage.h"
|
||||
#import "LKDeviceLinkMessage.h"
|
||||
#import "LKAddressMessage.h"
|
||||
#import <AxolotlKit/AxolotlExceptions.h>
|
||||
|
@ -960,6 +961,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|||
} else {
|
||||
BOOL isSilentMessage = message.isSilent || [message isKindOfClass:LKEphemeralMessage.class] || [message isKindOfClass:OWSOutgoingSyncMessage.class];
|
||||
BOOL isFriendRequestMessage = [message isKindOfClass:LKFriendRequestMessage.class];
|
||||
BOOL isSessionRequestMessage = [message isKindOfClass:LKSessionRequestMessage.class];
|
||||
[[LKAPI getDestinationsFor:contactID]
|
||||
.thenOn(OWSDispatch.sendingQueue, ^(NSArray<LKDestination *> *destinations) {
|
||||
// Get master destination
|
||||
|
@ -969,7 +971,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|||
// Send to master destination
|
||||
if (masterDestination != nil) {
|
||||
TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:masterDestination.hexEncodedPublicKey];
|
||||
if (thread.isContactFriend || isSilentMessage || isFriendRequestMessage) {
|
||||
if (thread.isContactFriend || isSilentMessage || isFriendRequestMessage || isSessionRequestMessage) {
|
||||
OWSMessageSend *messageSendCopy = [messageSend copyWithDestination:masterDestination];
|
||||
[self sendMessage:messageSendCopy];
|
||||
} else {
|
||||
|
@ -984,7 +986,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|||
// Send to slave destinations (using a best attempt approach (i.e. ignoring the message send result) for now)
|
||||
for (LKDestination *slaveDestination in slaveDestinations) {
|
||||
TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:slaveDestination.hexEncodedPublicKey];
|
||||
if (thread.isContactFriend || isSilentMessage || isFriendRequestMessage) {
|
||||
if (thread.isContactFriend || isSilentMessage || isFriendRequestMessage || isSessionRequestMessage) {
|
||||
OWSMessageSend *messageSendCopy = [messageSend copyWithDestination:slaveDestination];
|
||||
[self sendMessage:messageSendCopy];
|
||||
} else {
|
||||
|
@ -1698,8 +1700,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|||
|
||||
// Loki: Both for friend request messages and device link messages we don't require a session
|
||||
BOOL isFriendRequest = [messageSend.message isKindOfClass:LKFriendRequestMessage.class];
|
||||
BOOL isSessionRequest = [messageSend.message isKindOfClass:LKSessionRequestMessage.class];
|
||||
BOOL isDeviceLinkMessage = [messageSend.message isKindOfClass:LKDeviceLinkMessage.class];
|
||||
if (!isFriendRequest && !(isDeviceLinkMessage && ((LKDeviceLinkMessage *)messageSend.message).kind == LKDeviceLinkMessageKindRequest)) {
|
||||
if (!isFriendRequest && !isSessionRequest && !(isDeviceLinkMessage && ((LKDeviceLinkMessage *)messageSend.message).kind == LKDeviceLinkMessageKindRequest)) {
|
||||
[self throws_ensureRecipientHasSessionForMessageSend:messageSend recipientID:recipientID deviceId:@(OWSDevicePrimaryDeviceId)];
|
||||
}
|
||||
|
||||
|
@ -1943,8 +1946,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|||
|
||||
// Loki: Both for friend request messages and device link messages we use fallback encryption as we don't necessarily have a session yet
|
||||
BOOL isFriendRequest = [messageSend.message isKindOfClass:LKFriendRequestMessage.class];
|
||||
BOOL isSessionRequest = [messageSend.message isKindOfClass:LKSessionRequestMessage.class];
|
||||
BOOL isDeviceLinkMessage = [messageSend.message isKindOfClass:LKDeviceLinkMessage.class];
|
||||
if (isFriendRequest || (isDeviceLinkMessage && ((LKDeviceLinkMessage *)messageSend.message).kind == LKDeviceLinkMessageKindRequest)) {
|
||||
if (isFriendRequest || isSessionRequest || (isDeviceLinkMessage && ((LKDeviceLinkMessage *)messageSend.message).kind == LKDeviceLinkMessageKindRequest)) {
|
||||
return [self throws_encryptedFriendRequestOrDeviceLinkMessageForMessageSend:messageSend deviceId:@(OWSDevicePrimaryDeviceId) plainText:plainText];
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue