From cf5a313ed072187f46a868909dca2cd57b56c766 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 23 Oct 2020 12:20:14 -0300 Subject: [PATCH 1/2] Never clear the local profile name. --- SignalServiceKit/src/Util/OWSUserProfile.m | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/SignalServiceKit/src/Util/OWSUserProfile.m b/SignalServiceKit/src/Util/OWSUserProfile.m index 7cf349c143..9bf21c885a 100644 --- a/SignalServiceKit/src/Util/OWSUserProfile.m +++ b/SignalServiceKit/src/Util/OWSUserProfile.m @@ -409,6 +409,21 @@ NSUInteger const kUserProfileSchemaVersion = 1; equalTo:profile.familyName]; BOOL avatarUrlPathDidChange = ![NSObject isNullableObject:avatarUrlPathBefore equalTo:profile.avatarUrlPath]; + + if ([profile.address.phoneNumber + isEqualToString:kLocalProfileInvariantPhoneNumber]) { + BOOL hasValidProfileNameBefore + = givenNameBefore.filterStringForDisplay.length > 0; + BOOL hasValidProfileNameAfter + = profile.givenName.filterStringForDisplay.length > 0; + if (hasValidProfileNameBefore && !hasValidProfileNameAfter) { + OWSFailDebug(@"Restoring local profile name."); + // Profile names are required; never clear the profile + // name for the local user. + profile.givenName = givenNameBefore; + } + } + NSString *profileKeyDescription; if (profile.profileKey.keyData != nil) { if (SSKDebugFlags.internalLogging) { From f272471db582770fa805ccfdc00884ddd8fe62f3 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 23 Oct 2020 14:01:44 -0300 Subject: [PATCH 2/2] Re-upload protected profiled names. --- SignalMessaging/profiles/OWSProfileManager.m | 7 ++++++ .../src/Protocols/ProfileManagerProtocol.h | 2 ++ .../src/TestUtils/OWSFakeProfileManager.m | 5 ++++ SignalServiceKit/src/Util/Atomics.swift | 2 +- SignalServiceKit/src/Util/OWSUserProfile.m | 24 +++++++++++++++---- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/SignalMessaging/profiles/OWSProfileManager.m b/SignalMessaging/profiles/OWSProfileManager.m index 4f23c21607..bc06779a47 100644 --- a/SignalMessaging/profiles/OWSProfileManager.m +++ b/SignalMessaging/profiles/OWSProfileManager.m @@ -453,6 +453,13 @@ const NSString *kNSNotificationKey_WasLocallyInitiated = @"kNSNotificationKey_Wa }); } +- (void)reuploadLocalProfile +{ + [self reuploadLocalProfilePromiseObjc].then(^{ OWSLogInfo(@"Done."); }).catch(^(NSError *error) { + OWSFailDebug(@"Error: %@", error); + }); +} + #pragma mark - Profile Key Rotation - (nullable NSString *)groupKeyForGroupId:(NSData *)groupId { diff --git a/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h b/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h index 56f8497bba..dd5d058d7b 100644 --- a/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h +++ b/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h @@ -130,6 +130,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)didSendOrReceiveMessageFromAddress:(SignalServiceAddress *)address transaction:(SDSAnyWriteTransaction *)transaction; +- (void)reuploadLocalProfile; + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/TestUtils/OWSFakeProfileManager.m b/SignalServiceKit/src/TestUtils/OWSFakeProfileManager.m index b5116b94fc..b3f5993a1a 100644 --- a/SignalServiceKit/src/TestUtils/OWSFakeProfileManager.m +++ b/SignalServiceKit/src/TestUtils/OWSFakeProfileManager.m @@ -322,6 +322,11 @@ NS_ASSUME_NONNULL_BEGIN // Do nothing. } +- (void)reuploadLocalProfile +{ + // Do nothing. +} + @end #endif diff --git a/SignalServiceKit/src/Util/Atomics.swift b/SignalServiceKit/src/Util/Atomics.swift index 3defe8a0f5..395c8b1042 100644 --- a/SignalServiceKit/src/Util/Atomics.swift +++ b/SignalServiceKit/src/Util/Atomics.swift @@ -34,7 +34,7 @@ private class Atomics { public class AtomicBool: NSObject { private let value = AtomicValue(false) - @objc + @objc(initWithValue:) public required init(_ value: Bool) { self.value.set(value) } diff --git a/SignalServiceKit/src/Util/OWSUserProfile.m b/SignalServiceKit/src/Util/OWSUserProfile.m index 9bf21c885a..247e6fd511 100644 --- a/SignalServiceKit/src/Util/OWSUserProfile.m +++ b/SignalServiceKit/src/Util/OWSUserProfile.m @@ -351,6 +351,18 @@ NSUInteger const kUserProfileSchemaVersion = 1; #pragma mark - Update With... Methods ++ (BOOL)shouldReuploadProtectedProfileName +{ + // Only re-upload once per launch. + // + // This value will only be accessed within write transactions, + // so it is thread-safe. + static BOOL hasReuploaded = NO; + BOOL canReupload = !hasReuploaded; + hasReuploaded = YES; + return canReupload; +} + // Similar in spirit to anyUpdateWithTransaction, // but with significant differences. // @@ -412,15 +424,19 @@ NSUInteger const kUserProfileSchemaVersion = 1; if ([profile.address.phoneNumber isEqualToString:kLocalProfileInvariantPhoneNumber]) { - BOOL hasValidProfileNameBefore - = givenNameBefore.filterStringForDisplay.length > 0; - BOOL hasValidProfileNameAfter - = profile.givenName.filterStringForDisplay.length > 0; + BOOL hasValidProfileNameBefore = givenNameBefore.length > 0; + BOOL hasValidProfileNameAfter = profile.givenName.length > 0; if (hasValidProfileNameBefore && !hasValidProfileNameAfter) { OWSFailDebug(@"Restoring local profile name."); // Profile names are required; never clear the profile // name for the local user. profile.givenName = givenNameBefore; + + if (OWSUserProfile.shouldReuploadProtectedProfileName) { + [transaction addAsyncCompletionOffMain:^{ + [self.profileManager reuploadLocalProfile]; + }]; + } } }