diff --git a/Signal/src/Profiles/OWSProfileManager.h b/Signal/src/Profiles/OWSProfileManager.h index e5b2b9e56..7a4b372bf 100644 --- a/Signal/src/Profiles/OWSProfileManager.h +++ b/Signal/src/Profiles/OWSProfileManager.h @@ -62,8 +62,8 @@ extern NSString *const kNSNotificationName_OtherUsersProfileDidChange; - (void)updateProfileForRecipientId:(NSString *)recipientId profileNameEncrypted:(NSData *_Nullable)profileNameEncrypted - avatarUrlEncrypted:(NSData *_Nullable)avatarUrlEncrypted - avatarDigestEncrypted:(NSData *_Nullable)avatarDigestEncrypted; + avatarUrlData:(NSData *_Nullable)avatarUrlData + avatarDigest:(NSData *_Nullable)avatarDigest; @end diff --git a/Signal/src/Profiles/OWSProfileManager.m b/Signal/src/Profiles/OWSProfileManager.m index 26bd48789..e520211ec 100644 --- a/Signal/src/Profiles/OWSProfileManager.m +++ b/Signal/src/Profiles/OWSProfileManager.m @@ -424,10 +424,9 @@ static const NSInteger kProfileKeyLength = 16; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // TODO: Do we need to use NSDataBase64EncodingOptions? - NSString *_Nullable localProfileNameEncrypted = - [[self encryptProfileString:localProfileName] base64EncodedString]; - NSString *_Nullable avatarUrlEncrypted = [[self encryptProfileString:avatarUrl] base64EncodedString]; - NSString *_Nullable avatarDigestEncrypted = [[self encryptProfileData:avatarDigest] base64EncodedString]; + NSString *_Nullable localProfileNameBase64 = [[self encryptProfileString:localProfileName] base64EncodedString]; + NSString *_Nullable avatarUrlBase64 = [[avatarUrl dataUsingEncoding:NSUTF8StringEncoding] base64EncodedString]; + NSString *_Nullable avatarDigestBase64 = [avatarDigest base64EncodedString]; // TODO: if (YES) { @@ -669,8 +668,8 @@ static const NSInteger kProfileKeyLength = 16; - (void)updateProfileForRecipientId:(NSString *)recipientId profileNameEncrypted:(NSData *_Nullable)profileNameEncrypted - avatarUrlEncrypted:(NSData *_Nullable)avatarUrlEncrypted - avatarDigestEncrypted:(NSData *_Nullable)avatarDigestEncrypted + avatarUrlData:(NSData *_Nullable)avatarUrlData + avatarDigest:(NSData *_Nullable)avatarDigest { OWSAssert(recipientId.length > 0); @@ -681,8 +680,8 @@ static const NSInteger kProfileKeyLength = 16; NSString *_Nullable profileName = [self decryptProfileString:profileNameEncrypted profileKey:userProfile.profileKey]; - NSString *_Nullable avatarUrl = [self decryptProfileString:avatarUrlEncrypted profileKey:userProfile.profileKey]; - NSData *_Nullable avatarDigest = [self decryptProfileData:avatarDigestEncrypted profileKey:userProfile.profileKey]; + NSString *_Nullable avatarUrl + = (avatarUrlData ? [[NSString alloc] initWithData:avatarUrlData encoding:NSUTF8StringEncoding] : nil); if (!avatarUrl || !avatarDigest) { // If either avatar url or digest is missing, skip both. @@ -745,8 +744,8 @@ static const NSInteger kProfileKeyLength = 16; return nil; } - // TODO: Decrypt. - return nil; + // TODO: Decrypt. For now, return the input. + return encryptedData; } + (NSString *_Nullable)decryptProfileString:(NSData *_Nullable)encryptedData profileKey:(NSData *)profileKey @@ -770,8 +769,8 @@ static const NSInteger kProfileKeyLength = 16; return nil; } - // TODO: Encrypt. - return nil; + // TODO: Encrypt. For now, return the input. + return data; } + (NSData *_Nullable)encryptProfileString:(NSString *_Nullable)value profileKey:(NSData *)profileKey diff --git a/Signal/src/Profiles/ProfileFetcherJob.swift b/Signal/src/Profiles/ProfileFetcherJob.swift index ffda36563..4098f6279 100644 --- a/Signal/src/Profiles/ProfileFetcherJob.swift +++ b/Signal/src/Profiles/ProfileFetcherJob.swift @@ -116,8 +116,8 @@ class ProfileFetcherJob: NSObject { OWSProfileManager.shared().updateProfile(forRecipientId : signalServiceProfile.recipientId, profileNameEncrypted : signalServiceProfile.profileNameEncrypted, - avatarUrlEncrypted : signalServiceProfile.avatarUrlEncrypted, - avatarDigestEncrypted : signalServiceProfile.avatarDigestEncrypted) + avatarUrlData : signalServiceProfile.avatarUrlData, + avatarDigest : signalServiceProfile.avatarDigest) } private func verifyIdentityUpToDateAsync(recipientId: String, latestIdentityKey: Data) { @@ -146,14 +146,12 @@ struct SignalServiceProfile { public let recipientId: String public let identityKey: Data public let profileNameEncrypted: Data? - public let avatarUrlEncrypted: Data? - public let avatarDigestEncrypted: Data? + public let avatarUrlData: Data? + public let avatarDigest: Data? init(recipientId: String, rawResponse: Any?) throws { self.recipientId = recipientId - Logger.info("rawResponse: \(rawResponse)") - guard let responseDict = rawResponse as? [String: Any?] else { throw ValidationError.invalid(description: "\(TAG) unexpected type: \(String(describing: rawResponse))") } @@ -177,26 +175,26 @@ struct SignalServiceProfile { profileNameEncrypted = data } - var avatarUrlEncrypted: Data? = nil + var avatarUrlData: Data? = nil if let avatarUrlString = responseDict["avatar"] as? String { guard let data = Data(base64Encoded: avatarUrlString) else { throw ValidationError.invalidAvatarUrl(description: "\(TAG) unable to parse avatar URL: \(avatarUrlString)") } - avatarUrlEncrypted = data + avatarUrlData = data } - var avatarDigestEncrypted: Data? = nil + var avatarDigest: Data? = nil if let avatarDigestString = responseDict["avatarDigest"] as? String { guard let data = Data(base64Encoded: avatarDigestString) else { throw ValidationError.invalidAvatarDigest(description: "\(TAG) unable to parse avatar digest: \(avatarDigestString)") } - avatarDigestEncrypted = data + avatarDigest = data } // `removeKeyType` is an objc category method only on NSData, so temporarily cast. self.identityKey = (identityKeyWithType as NSData).removeKeyType() as Data self.profileNameEncrypted = profileNameEncrypted - self.avatarUrlEncrypted = avatarUrlEncrypted - self.avatarDigestEncrypted = avatarDigestEncrypted + self.avatarUrlData = avatarUrlData + self.avatarDigest = avatarDigest } }