SyncMessages for blocked groups

pull/1/head
Michael Kirk 7 years ago
parent 236c17f65e
commit b282d51da0

@ -137,7 +137,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)sendBlockListSyncMessage + (void)sendBlockListSyncMessage
{ {
[self.blockingManager syncBlockedPhoneNumbers]; [self.blockingManager syncBlockList];
} }
+ (void)sendConfigurationSyncMessage + (void)sendConfigurationSyncMessage

@ -10,7 +10,8 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)init NS_UNAVAILABLE; - (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithPhoneNumbers:(NSArray<NSString *> *)phoneNumbers NS_DESIGNATED_INITIALIZER; - (instancetype)initWithPhoneNumbers:(NSArray<NSString *> *)phoneNumbers
groupIds:(NSArray<NSData *> *)groupIds NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
@end @end

@ -10,6 +10,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSBlockedPhoneNumbersMessage () @interface OWSBlockedPhoneNumbersMessage ()
@property (nonatomic, readonly) NSArray<NSString *> *phoneNumbers; @property (nonatomic, readonly) NSArray<NSString *> *phoneNumbers;
@property (nonatomic, readonly) NSArray<NSData *> *groupIds;
@end @end
@ -20,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
return [super initWithCoder:coder]; return [super initWithCoder:coder];
} }
- (instancetype)initWithPhoneNumbers:(NSArray<NSString *> *)phoneNumbers - (instancetype)initWithPhoneNumbers:(NSArray<NSString *> *)phoneNumbers groupIds:(NSArray<NSData *> *)groupIds
{ {
self = [super init]; self = [super init];
if (!self) { if (!self) {
@ -28,6 +29,7 @@ NS_ASSUME_NONNULL_BEGIN
} }
_phoneNumbers = [phoneNumbers copy]; _phoneNumbers = [phoneNumbers copy];
_groupIds = [groupIds copy];
return self; return self;
} }
@ -36,6 +38,8 @@ NS_ASSUME_NONNULL_BEGIN
{ {
SSKProtoSyncMessageBlockedBuilder *blockedBuilder = [SSKProtoSyncMessageBlockedBuilder new]; SSKProtoSyncMessageBlockedBuilder *blockedBuilder = [SSKProtoSyncMessageBlockedBuilder new];
[blockedBuilder setNumbers:_phoneNumbers]; [blockedBuilder setNumbers:_phoneNumbers];
[blockedBuilder setGroupIds:_groupIds];
NSError *error; NSError *error;
SSKProtoSyncMessageBlocked *_Nullable blockedProto = [blockedBuilder buildAndReturnError:&error]; SSKProtoSyncMessageBlocked *_Nullable blockedProto = [blockedBuilder buildAndReturnError:&error];
if (error || !blockedProto) { if (error || !blockedProto) {

@ -4,6 +4,7 @@
#import "OWSGroupsOutputStream.h" #import "OWSGroupsOutputStream.h"
#import "MIMETypeUtil.h" #import "MIMETypeUtil.h"
#import "OWSBlockingManager.h"
#import "OWSDisappearingMessagesConfiguration.h" #import "OWSDisappearingMessagesConfiguration.h"
#import "TSGroupModel.h" #import "TSGroupModel.h"
#import "TSGroupThread.h" #import "TSGroupThread.h"
@ -27,6 +28,10 @@ NS_ASSUME_NONNULL_BEGIN
[groupBuilder setMembers:group.groupMemberIds]; [groupBuilder setMembers:group.groupMemberIds];
[groupBuilder setColor:groupThread.conversationColorName]; [groupBuilder setColor:groupThread.conversationColorName];
if ([OWSBlockingManager.sharedManager isGroupIdBlocked:group.groupId]) {
[groupBuilder setBlocked:YES];
}
NSData *avatarPng; NSData *avatarPng;
if (group.groupImage) { if (group.groupImage) {
SSKProtoGroupDetailsAvatarBuilder *avatarBuilder = SSKProtoGroupDetailsAvatarBuilder *avatarBuilder =

@ -33,7 +33,7 @@ extern NSString *const kNSNotificationName_BlockedPhoneNumbersDidChange;
- (BOOL)isRecipientIdBlocked:(NSString *)recipientId; - (BOOL)isRecipientIdBlocked:(NSString *)recipientId;
- (BOOL)isThreadBlocked:(TSThread *)thread; - (BOOL)isThreadBlocked:(TSThread *)thread;
- (void)syncBlockedPhoneNumbers; - (void)syncBlockList;
@end @end

@ -20,13 +20,13 @@ NSString *const kNSNotificationName_BlockedPhoneNumbersDidChange = @"kNSNotifica
NSString *const kOWSBlockingManager_BlockListCollection = @"kOWSBlockingManager_BlockedPhoneNumbersCollection"; NSString *const kOWSBlockingManager_BlockListCollection = @"kOWSBlockingManager_BlockedPhoneNumbersCollection";
// This key is used to persist the current "blocked phone numbers" state. // These keys are used to persist the current local "block list" state.
NSString *const kOWSBlockingManager_BlockedPhoneNumbersKey = @"kOWSBlockingManager_BlockedPhoneNumbersKey"; NSString *const kOWSBlockingManager_BlockedPhoneNumbersKey = @"kOWSBlockingManager_BlockedPhoneNumbersKey";
NSString *const kOWSBlockingManager_BlockedGroupIdsKey = @"kOWSBlockingManager_BlockedGroupIdsKey"; NSString *const kOWSBlockingManager_BlockedGroupIdsKey = @"kOWSBlockingManager_BlockedGroupIdsKey";
// This key is used to persist the most recently synced "blocked phone numbers" state. // These keys are used to persist the most recently synced remote "block list" state.
NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockingManager_SyncedBlockedPhoneNumbersKey"; NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockingManager_SyncedBlockedPhoneNumbersKey";
NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingManager_SyncedBlockedGroupIdsKey";
@interface OWSBlockingManager () @interface OWSBlockingManager ()
@ -264,6 +264,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockin
[self handleUpdate:YES]; [self handleUpdate:YES];
} }
// TODO label the `sendSyncMessage` param
- (void)handleUpdate:(BOOL)sendSyncMessage - (void)handleUpdate:(BOOL)sendSyncMessage
{ {
NSArray<NSString *> *blockedPhoneNumbers = [self blockedPhoneNumbers]; NSArray<NSString *> *blockedPhoneNumbers = [self blockedPhoneNumbers];
@ -272,12 +273,18 @@ NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockin
forKey:kOWSBlockingManager_BlockedPhoneNumbersKey forKey:kOWSBlockingManager_BlockedPhoneNumbersKey
inCollection:kOWSBlockingManager_BlockListCollection]; inCollection:kOWSBlockingManager_BlockListCollection];
NSArray<NSData *> *blockedGroupIds = [self blockedGroupIds];
[self.dbConnection setObject:blockedGroupIds
forKey:kOWSBlockingManager_BlockedGroupIdsKey
inCollection:kOWSBlockingManager_BlockListCollection];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if (sendSyncMessage) { if (sendSyncMessage) {
[self sendBlockedPhoneNumbersMessage:blockedPhoneNumbers]; [self sendBlockListSyncMessageWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds];
} else { } else {
// If this update came from an incoming block list sync message, // If this update came from an incoming block list sync message,
// update the "synced blocked phone numbers" state immediately, // update the "synced blocked list" state immediately,
// since we're now in sync. // since we're now in sync.
// //
// There could be data loss if both clients modify the block list // There could be data loss if both clients modify the block list
@ -288,7 +295,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockin
// c) It's unlikely a user will make conflicting changes on two // c) It's unlikely a user will make conflicting changes on two
// devices around the same time. // devices around the same time.
// d) There isn't a good way to avoid this. // d) There isn't a good way to avoid this.
[self saveSyncedBlockedPhoneNumbers:blockedPhoneNumbers]; [self saveSyncedBlockListWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds];
} }
[[NSNotificationCenter defaultCenter] postNotificationNameAsync:kNSNotificationName_BlockedPhoneNumbersDidChange [[NSNotificationCenter defaultCenter] postNotificationNameAsync:kNSNotificationName_BlockedPhoneNumbersDidChange
@ -316,64 +323,82 @@ NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockin
inCollection:kOWSBlockingManager_BlockListCollection]; inCollection:kOWSBlockingManager_BlockListCollection];
_blockedGroupIdSet = [[NSMutableSet alloc] initWithArray:(blockedGroupIds ?: [NSArray new])]; _blockedGroupIdSet = [[NSMutableSet alloc] initWithArray:(blockedGroupIds ?: [NSArray new])];
[self syncBlockedPhoneNumbersIfNecessary]; [self syncBlockListIfNecessary];
[self observeNotifications]; [self observeNotifications];
} }
- (void)syncBlockedPhoneNumbers - (void)syncBlockList
{ {
OWSAssert(_blockedPhoneNumberSet); OWSAssert(_blockedPhoneNumberSet);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self sendBlockedPhoneNumbersMessage:self.blockedPhoneNumbers]; [self sendBlockListSyncMessageWithPhoneNumbers:self.blockedPhoneNumbers groupIds:self.blockedGroupIds];
}); });
} }
// This method should only be called from within a synchronized block. // This method should only be called from within a synchronized block.
- (void)syncBlockedPhoneNumbersIfNecessary - (void)syncBlockListIfNecessary
{ {
OWSAssert(_blockedPhoneNumberSet); OWSAssert(_blockedPhoneNumberSet);
// If we haven't yet successfully synced the current "blocked phone numbers" changes, // If we haven't yet successfully synced the current "block list" changes,
// try again to sync now. // try again to sync now.
NSArray<NSString *> *syncedBlockedPhoneNumbers = NSArray<NSString *> *syncedBlockedPhoneNumbers =
[self.dbConnection objectForKey:kOWSBlockingManager_SyncedBlockedPhoneNumbersKey [self.dbConnection objectForKey:kOWSBlockingManager_SyncedBlockedPhoneNumbersKey
inCollection:kOWSBlockingManager_BlockListCollection]; inCollection:kOWSBlockingManager_BlockListCollection];
NSSet *syncedBlockedPhoneNumberSet = [[NSSet alloc] initWithArray:(syncedBlockedPhoneNumbers ?: [NSArray new])]; NSSet<NSString *> *syncedBlockedPhoneNumberSet =
if (![_blockedPhoneNumberSet isEqualToSet:syncedBlockedPhoneNumberSet]) { [[NSSet alloc] initWithArray:(syncedBlockedPhoneNumbers ?: [NSArray new])];
DDLogInfo(@"%@ retrying sync of blocked phone numbers", self.logTag);
[self sendBlockedPhoneNumbersMessage:self.blockedPhoneNumbers]; NSArray<NSData *> *syncedBlockedGroupIds =
[self.dbConnection objectForKey:kOWSBlockingManager_SyncedBlockedGroupIdsKey
inCollection:kOWSBlockingManager_BlockListCollection];
NSSet<NSData *> *syncedBlockedGroupIdSet = [[NSSet alloc] initWithArray:(syncedBlockedGroupIds ?: [NSArray new])];
if ([self.blockedPhoneNumberSet isEqualToSet:syncedBlockedPhoneNumberSet] &&
[self.blockedGroupIdSet isEqualToSet:syncedBlockedGroupIdSet]) {
DDLogVerbose(@"Ignoring redundant block list sync");
return;
} }
DDLogInfo(@"%@ retrying sync of block list", self.logTag);
[self sendBlockListSyncMessageWithPhoneNumbers:self.blockedPhoneNumbers groupIds:self.blockedGroupIds];
} }
- (void)sendBlockedPhoneNumbersMessage:(NSArray<NSString *> *)blockedPhoneNumbers - (void)sendBlockListSyncMessageWithPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers
groupIds:(NSArray<NSData *> *)blockedGroupIds
{ {
OWSAssert(blockedPhoneNumbers); OWSAssert(blockedPhoneNumbers);
OWSAssert(blockedGroupIds); OWSAssert(blockedGroupIds);
OWSBlockedPhoneNumbersMessage *message = OWSBlockedPhoneNumbersMessage *message =
[[OWSBlockedPhoneNumbersMessage alloc] initWithPhoneNumbers:blockedPhoneNumbers]; [[OWSBlockedPhoneNumbersMessage alloc] initWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds];
[self.messageSender enqueueMessage:message [self.messageSender enqueueMessage:message
success:^{ success:^{
DDLogInfo(@"%@ Successfully sent blocked phone numbers sync message", self.logTag); DDLogInfo(@"%@ Successfully sent blocked phone numbers sync message", self.logTag);
// Record the last set of "blocked phone numbers" which we successfully synced. // Record the last set of "blocked phone numbers" which we successfully synced.
[self saveSyncedBlockedPhoneNumbers:blockedPhoneNumbers]; [self saveSyncedBlockListWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds];
} }
failure:^(NSError *error) { failure:^(NSError *error) {
DDLogError(@"%@ Failed to send blocked phone numbers sync message with error: %@", self.logTag, error); DDLogError(@"%@ Failed to send blocked phone numbers sync message with error: %@", self.logTag, error);
}]; }];
} }
- (void)saveSyncedBlockedPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers /// Records the last block list which we successfully synced.
- (void)saveSyncedBlockListWithPhoneNumbers:(NSArray<NSString *> *)blockedPhoneNumbers
groupIds:(NSArray<NSData *> *)blockedGroupIds
{ {
OWSAssert(blockedPhoneNumbers); OWSAssert(blockedPhoneNumbers);
OWSAssert(blockedGroupIds);
// Record the last set of "blocked phone numbers" which we successfully synced.
[self.dbConnection setObject:blockedPhoneNumbers [self.dbConnection setObject:blockedPhoneNumbers
forKey:kOWSBlockingManager_SyncedBlockedPhoneNumbersKey forKey:kOWSBlockingManager_SyncedBlockedPhoneNumbersKey
inCollection:kOWSBlockingManager_BlockListCollection]; inCollection:kOWSBlockingManager_BlockListCollection];
[self.dbConnection setObject:blockedGroupIds
forKey:kOWSBlockingManager_SyncedBlockedGroupIdsKey
inCollection:kOWSBlockingManager_BlockListCollection];
} }
#pragma mark - Notifications #pragma mark - Notifications
@ -385,7 +410,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedPhoneNumbersKey = @"kOWSBlockin
[AppReadiness runNowOrWhenAppIsReady:^{ [AppReadiness runNowOrWhenAppIsReady:^{
@synchronized(self) @synchronized(self)
{ {
[self syncBlockedPhoneNumbersIfNecessary]; [self syncBlockListIfNecessary];
} }
}]; }];
} }

@ -698,7 +698,7 @@ NS_ASSUME_NONNULL_BEGIN
}]; }];
} else if (syncMessage.request.type == SSKProtoSyncMessageRequestTypeBlocked) { } else if (syncMessage.request.type == SSKProtoSyncMessageRequestTypeBlocked) {
DDLogInfo(@"%@ Received request for block list", self.logTag); DDLogInfo(@"%@ Received request for block list", self.logTag);
[_blockingManager syncBlockedPhoneNumbers]; [_blockingManager syncBlockList];
} else if (syncMessage.request.type == SSKProtoSyncMessageRequestTypeConfiguration) { } else if (syncMessage.request.type == SSKProtoSyncMessageRequestTypeConfiguration) {
BOOL areReadReceiptsEnabled = BOOL areReadReceiptsEnabled =
[[OWSReadReceiptManager sharedManager] areReadReceiptsEnabledWithTransaction:transaction]; [[OWSReadReceiptManager sharedManager] areReadReceiptsEnabledWithTransaction:transaction];

Loading…
Cancel
Save