From cc73937856e01786f259ae41e8d83cfb46b24b6f Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 11 Nov 2019 15:52:17 +1100 Subject: [PATCH] WIP --- .../Loki/Settings/DeviceLinkingModal.swift | 1 + SignalMessaging/contacts/OWSSyncManager.m | 28 ++++++-------- .../src/Devices/OWSContactsOutputStream.m | 7 +++- .../DeviceSyncing/OWSSyncContactsMessage.m | 37 ++++++++++++------- 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/Signal/src/Loki/Settings/DeviceLinkingModal.swift b/Signal/src/Loki/Settings/DeviceLinkingModal.swift index 1c6f8fbb8..bc0862b90 100644 --- a/Signal/src/Loki/Settings/DeviceLinkingModal.swift +++ b/Signal/src/Loki/Settings/DeviceLinkingModal.swift @@ -148,6 +148,7 @@ final class DeviceLinkingModal : Modal, DeviceLinkingSessionDelegate { LokiStorageAPI.addDeviceLink(signedDeviceLink).catch { error in print("[Loki] Failed to add device link due to error: \(error).") } + let _ = SSKEnvironment.shared.syncManager.syncAllContacts() } func handleDeviceLinkAuthorized(_ deviceLink: DeviceLink) { diff --git a/SignalMessaging/contacts/OWSSyncManager.m b/SignalMessaging/contacts/OWSSyncManager.m index 722f47db7..a2c4828bc 100644 --- a/SignalMessaging/contacts/OWSSyncManager.m +++ b/SignalMessaging/contacts/OWSSyncManager.m @@ -21,6 +21,7 @@ #import #import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -265,32 +266,27 @@ NSString *const kSyncManagerLastContactSyncKey = @"kTSStorageManagerOWSSyncManag - (AnyPromise *)syncAllContacts { - return [self syncContactsForSignalAccounts:self.contactsManager.signalAccounts]; + NSMutableArray *friends = @[].mutableCopy; + [TSContactThread enumerateCollectionObjectsUsingBlock:^(TSContactThread *thread, BOOL *stop) { + NSString *hexEncodedPublicKey = thread.contactIdentifier; + if (hexEncodedPublicKey != nil) { + [friends addObject:[[SignalAccount alloc] initWithRecipientId:hexEncodedPublicKey]]; + } + }]; + return [self syncContactsForSignalAccounts:friends]; } - (AnyPromise *)syncContactsForSignalAccounts:(NSArray *)signalAccounts { - OWSSyncContactsMessage *syncContactsMessage = - [[OWSSyncContactsMessage alloc] initWithSignalAccounts:signalAccounts - identityManager:self.identityManager - profileManager:self.profileManager]; - __block DataSource *dataSource; - [self.readDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - dataSource = [DataSourceValue - dataSourceWithSyncMessageData:[syncContactsMessage - buildPlainTextAttachmentDataWithTransaction:transaction]]; - }]; - + OWSSyncContactsMessage *syncContactsMessage = [[OWSSyncContactsMessage alloc] initWithSignalAccounts:signalAccounts identityManager:self.identityManager profileManager:self.profileManager]; AnyPromise *promise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { - [self.messageSender sendTemporaryAttachment:dataSource - contentType:OWSMimeTypeApplicationOctetStream - inMessage:syncContactsMessage + [self.messageSender sendMessage:syncContactsMessage success:^{ OWSLogInfo(@"Successfully sent contacts sync message."); resolve(@(1)); } failure:^(NSError *error) { - OWSLogError(@"Failed to send contacts sync message with error: %@", error); + OWSLogError(@"Failed to send contacts sync message with error: %@.", error); resolve(error); }]; }]; diff --git a/SignalServiceKit/src/Devices/OWSContactsOutputStream.m b/SignalServiceKit/src/Devices/OWSContactsOutputStream.m index 9bc307f0e..b9a3eef2b 100644 --- a/SignalServiceKit/src/Devices/OWSContactsOutputStream.m +++ b/SignalServiceKit/src/Devices/OWSContactsOutputStream.m @@ -28,12 +28,11 @@ NS_ASSUME_NONNULL_BEGIN disappearingMessagesConfiguration:(nullable OWSDisappearingMessagesConfiguration *)disappearingMessagesConfiguration { OWSAssertDebug(signalAccount); - OWSAssertDebug(signalAccount.contact); OWSAssertDebug(contactsManager); SSKProtoContactDetailsBuilder *contactBuilder = [SSKProtoContactDetails builderWithNumber:signalAccount.recipientId]; - [contactBuilder setName:signalAccount.contact.fullName]; + [contactBuilder setName:[LKDisplayNameUtilities getPrivateChatDisplayNameFor:signalAccount.recipientId] ?: signalAccount.recipientId]; [contactBuilder setColor:conversationColorName]; if (recipientIdentity != nil) { @@ -48,6 +47,7 @@ disappearingMessagesConfiguration:(nullable OWSDisappearingMessagesConfiguration contactBuilder.verified = verified; } + /* UIImage *_Nullable rawAvatar = [contactsManager avatarImageForCNContactId:signalAccount.contact.cnContactId]; NSData *_Nullable avatarPng; if (rawAvatar) { @@ -66,6 +66,7 @@ disappearingMessagesConfiguration:(nullable OWSDisappearingMessagesConfiguration [contactBuilder setAvatar:avatar]; } } + */ if (profileKeyData) { OWSAssertDebug(profileKeyData.length == kAES256_KeyByteLength); @@ -96,9 +97,11 @@ disappearingMessagesConfiguration:(nullable OWSDisappearingMessagesConfiguration [self writeVariableLengthUInt32:contactDataLength]; [self writeData:contactData]; + /* if (avatarPng) { [self writeData:avatarPng]; } + */ } @end diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m index 44f030ef0..6df08f2a5 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m @@ -16,6 +16,7 @@ #import "TSContactThread.h" #import #import +#import "OWSPrimaryStorage.h" @import Contacts; @@ -66,25 +67,33 @@ NS_ASSUME_NONNULL_BEGIN - (nullable SSKProtoSyncMessageBuilder *)syncMessageBuilder { - if (self.attachmentIds.count != 1) { - OWSLogError(@"expected sync contact message to have exactly one attachment, but found %lu", - (unsigned long)self.attachmentIds.count); + if (self.attachmentIds.count > 1) { + OWSLogError(@"Expected sync contact message to have one or zero attachments, but found %lu.", (unsigned long)self.attachmentIds.count); } - SSKProtoAttachmentPointer *_Nullable attachmentProto = - [TSAttachmentStream buildProtoForAttachmentId:self.attachmentIds.firstObject]; - if (!attachmentProto) { - OWSFailDebug(@"could not build protobuf."); - return nil; + SSKProtoSyncMessageContactsBuilder *contactsBuilder; + if (self.attachmentIds.count == 0) { + SSKProtoAttachmentPointer *attachmentProto = [SSKProtoAttachmentPointer builderWithId:0]; + contactsBuilder = [SSKProtoSyncMessageContacts builderWithBlob:attachmentProto]; + __block NSData *data; + [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + data = [self buildPlainTextAttachmentDataWithTransaction:transaction]; + }]; + [contactsBuilder setData:data]; + } else { + SSKProtoAttachmentPointer *attachmentProto = [TSAttachmentStream buildProtoForAttachmentId:self.attachmentIds.firstObject]; + if (attachmentProto == nil) { + OWSFailDebug(@"Couldn't build protobuf."); + return nil; + } + contactsBuilder = [SSKProtoSyncMessageContacts builderWithBlob:attachmentProto]; } - - SSKProtoSyncMessageContactsBuilder *contactsBuilder = [SSKProtoSyncMessageContacts builderWithBlob:attachmentProto]; [contactsBuilder setIsComplete:YES]; - + NSError *error; - SSKProtoSyncMessageContacts *_Nullable contactsProto = [contactsBuilder buildAndReturnError:&error]; - if (error || !contactsProto) { - OWSFailDebug(@"could not build protobuf: %@", error); + SSKProtoSyncMessageContacts *contactsProto = [contactsBuilder buildAndReturnError:&error]; + if (error || contactsProto == nil) { + OWSFailDebug(@"Couldn't build protobuf due to error: %@.", error); return nil; } SSKProtoSyncMessageBuilder *syncMessageBuilder = [SSKProtoSyncMessage builder];