// // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "OWSContactsOutputStream.h" #import "MIMETypeUtil.h" #import "NSData+keyVersionByte.h" #import "OWSBlockingManager.h" #import "OWSDisappearingMessagesConfiguration.h" #import "OWSRecipientIdentity.h" #import "SignalAccount.h" #import "TSContactThread.h" #import #import #import NS_ASSUME_NONNULL_BEGIN @implementation OWSContactsOutputStream - (void)writeSignalAccount:(SignalAccount *)signalAccount recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity profileKeyData:(nullable NSData *)profileKeyData contactsManager:(id)contactsManager conversationColorName:(NSString *)conversationColorName disappearingMessagesConfiguration:(nullable OWSDisappearingMessagesConfiguration *)disappearingMessagesConfiguration { OWSAssertDebug(signalAccount); OWSAssertDebug(contactsManager); SNProtoContactDetailsBuilder *contactBuilder = [SNProtoContactDetails builderWithNumber:signalAccount.recipientId]; [contactBuilder setName:[LKUserDisplayNameUtilities getPrivateChatDisplayNameFor:signalAccount.recipientId] ?: signalAccount.recipientId]; [contactBuilder setColor:conversationColorName]; if (recipientIdentity != nil) { SNProtoVerified *_Nullable verified = BuildVerifiedProtoWithRecipientId(recipientIdentity.recipientId, [recipientIdentity.identityKey prependKeyType], recipientIdentity.verificationState, 0); if (!verified) { OWSLogError(@"could not build protobuf."); return; } contactBuilder.verified = verified; } if (profileKeyData) { OWSAssertDebug(profileKeyData.length == kAES256_KeyByteLength); [contactBuilder setProfileKey:profileKeyData]; } // Always ensure the "expire timer" property is set so that desktop // can easily distinguish between a modern client declaring "off" vs a // legacy client "not specifying". [contactBuilder setExpireTimer:0]; if (disappearingMessagesConfiguration && disappearingMessagesConfiguration.isEnabled) { [contactBuilder setExpireTimer:disappearingMessagesConfiguration.durationSeconds]; } if ([OWSBlockingManager.sharedManager isRecipientIdBlocked:signalAccount.recipientId]) { [contactBuilder setBlocked:YES]; } NSError *error; NSData *_Nullable contactData = [contactBuilder buildSerializedDataAndReturnError:&error]; if (error || !contactData) { OWSFailDebug(@"could not serialize protobuf: %@", error); return; } uint32_t contactDataLength = (uint32_t)contactData.length; [self writeUInt32:contactDataLength]; [self writeData:contactData]; } @end NS_ASSUME_NONNULL_END