From 612df0a02634b00bd6e820dd5915a0bf4cd12b86 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 2 May 2018 10:51:47 -0400 Subject: [PATCH 1/5] Send fake contacts. --- Signal/src/ViewControllers/DebugUI/DebugUIMessages.m | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index c4b13a2e0..68d1a218b 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -124,6 +124,10 @@ NS_ASSUME_NONNULL_BEGIN actionBlock:^{ [DebugUIMessages selectBackDatedAction:thread]; }], + [OWSTableItem itemWithTitle:@"Send All Contacts" + actionBlock:^{ + [DebugUIMessages sendAllContacts:thread]; + }], #pragma mark - Misc. @@ -306,6 +310,14 @@ NS_ASSUME_NONNULL_BEGIN [self performActionNTimes:[self sendTextMessagesActionInThread:thread]]; } ++ (void)sendAllContacts:(TSThread *)thread +{ + NSArray *subactions = [self allShareContactActions:thread includeLabels:NO]; + DebugUIMessagesAction *action = + [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Share Contact" subactions:subactions]; + [action prepareAndPerformNTimes:subactions.count]; +} + + (DebugUIMessagesAction *)sendTextMessagesActionInThread:(TSThread *)thread { OWSAssert(thread); From c53b2934a8e3d15f65d311093b92e0f325613a11 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 2 May 2018 11:25:35 -0400 Subject: [PATCH 2/5] Send fake contact shares. --- .../ViewControllers/DebugUI/DebugUIMessages.m | 141 +++++++++++++++++- 1 file changed, 134 insertions(+), 7 deletions(-) diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index 68d1a218b..4c74e3905 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -312,9 +312,9 @@ NS_ASSUME_NONNULL_BEGIN + (void)sendAllContacts:(TSThread *)thread { - NSArray *subactions = [self allShareContactActions:thread includeLabels:NO]; + NSArray *subactions = [self allSendContactShareActions:thread includeLabels:NO]; DebugUIMessagesAction *action = - [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Share Contact" subactions:subactions]; + [DebugUIMessagesGroupAction allGroupActionWithLabel:@"Send All Share Contact" subactions:subactions]; [action prepareAndPerformNTimes:subactions.count]; } @@ -2670,7 +2670,7 @@ NS_ASSUME_NONNULL_BEGIN [actions addObjectsFromArray:[self allFakeSequenceActions:thread includeLabels:includeLabels]]; [actions addObjectsFromArray:[self allFakeQuotedReplyActions:thread includeLabels:includeLabels]]; [actions addObjectsFromArray:[self allFakeBackDatedActions:thread includeLabels:includeLabels]]; - [actions addObjectsFromArray:[self allContactShareActions:thread includeLabels:includeLabels]]; + [actions addObjectsFromArray:[self allFakeContactShareActions:thread includeLabels:includeLabels]]; return actions; } @@ -2910,7 +2910,7 @@ NS_ASSUME_NONNULL_BEGIN [self selectActionUI:[self allFakeBackDatedActions:thread includeLabels:NO] label:@"Select Back-Dated"]; } -#pragma mark - +#pragma mark - Contact Shares typedef OWSContact * (^OWSContactBlock)(void); @@ -2937,7 +2937,7 @@ typedef OWSContact * (^OWSContactBlock)(void); }]; } -+ (NSArray *)allContactShareActions:(TSThread *)thread includeLabels:(BOOL)includeLabels ++ (NSArray *)allFakeContactShareActions:(TSThread *)thread includeLabels:(BOOL)includeLabels { OWSAssert(thread); @@ -3083,8 +3083,135 @@ typedef OWSContact * (^OWSContactBlock)(void); { OWSAssert(thread); - return [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Contact Shares" - subactions:[self allContactShareActions:thread includeLabels:YES]]; + return + [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Contact Shares" + subactions:[self allFakeContactShareActions:thread includeLabels:YES]]; +} + + ++ (DebugUIMessagesAction *)sendContactShareMessageAction:(TSThread *)thread + label:(NSString *)label + contactBlock:(OWSContactBlock)contactBlock +{ + OWSAssert(thread); + + return [DebugUIMessagesSingleAction + actionWithLabel:[NSString stringWithFormat:@"Fake Contact Share (%@)", label] + unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { + OWSContact *contact = contactBlock(); + TSOutgoingMessage *message = [self createFakeOutgoingMessage:thread + messageBody:nil + fakeAssetLoader:nil + messageState:TSOutgoingMessageStateSent + isDelivered:NO + isRead:NO + quotedMessage:nil + contactShare:contact + transaction:transaction]; + [message saveWithTransaction:transaction]; + }]; +} + ++ (NSArray *)allSendContactShareActions:(TSThread *)thread includeLabels:(BOOL)includeLabels +{ + OWSAssert(thread); + + NSMutableArray *actions = [NSMutableArray new]; + + if (includeLabels) { + [actions addObject:[self fakeOutgoingTextMessageAction:thread + messageState:TSOutgoingMessageStateSent + text:@"⚠️ Send Share Contact ⚠️"]]; + } + + [actions addObject:[self sendContactShareMessageAction:thread + label:@"Name & Number" + contactBlock:^{ + OWSContact *contact = [OWSContact new]; + contact.givenName = @"Alice"; + OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; + phoneNumber.phoneType = OWSContactPhoneType_Home; + phoneNumber.phoneNumber = @"+13213214321"; + contact.phoneNumbers = @[ + phoneNumber, + ]; + return contact; + }]]; + [actions addObject:[self sendContactShareMessageAction:thread + label:@"Name & Email" + contactBlock:^{ + OWSContact *contact = [OWSContact new]; + contact.givenName = @"Bob"; + OWSContactEmail *email = [OWSContactEmail new]; + email.emailType = OWSContactEmailType_Home; + email.email = @"a@b.com"; + contact.emails = @[ + email, + ]; + return contact; + }]]; + [actions addObject:[self sendContactShareMessageAction:thread + label:@"Complicated" + contactBlock:^{ + OWSContact *contact = [OWSContact new]; + contact.givenName = @"Alice"; + contact.familyName = @"Carol"; + contact.middleName = @"Bob"; + contact.namePrefix = @"Ms."; + contact.nameSuffix = @"Esq."; + contact.organizationName = @"Falafel Hut"; + + OWSContactPhoneNumber *phoneNumber1 = [OWSContactPhoneNumber new]; + phoneNumber1.phoneType = OWSContactPhoneType_Home; + phoneNumber1.phoneNumber = @"+13213214321"; + OWSContactPhoneNumber *phoneNumber2 = [OWSContactPhoneNumber new]; + phoneNumber2.phoneType = OWSContactPhoneType_Custom; + phoneNumber2.label = @"Carphone"; + phoneNumber2.phoneNumber = @"+13332221111"; + contact.phoneNumbers = @[ + phoneNumber1, + phoneNumber2, + ]; + + OWSContactEmail *email1 = [OWSContactEmail new]; + email1.emailType = OWSContactEmailType_Home; + email1.email = @"a@b.com"; + OWSContactEmail *email2 = [OWSContactEmail new]; + email2.emailType = OWSContactEmailType_Custom; + email2.label = @"customer support"; + email2.email = @"a@b.com"; + contact.emails = @[ + email1, + email2, + ]; + + OWSContactAddress *address1 = [OWSContactAddress new]; + address1.addressType = OWSContactAddressType_Home; + address1.street = @"123 home st."; + address1.neighborhood = @"round the bend."; + address1.city = @"homeville"; + address1.region = @"HO"; + address1.postcode = @"12345"; + address1.country = @"USA"; + OWSContactAddress *address2 = [OWSContactAddress new]; + address2.addressType = OWSContactAddressType_Custom; + address2.label = @"Otra casa"; + address2.pobox = @"caja 123"; + address2.street = @"123 casa calle"; + address2.city = @"barrio norte"; + address2.region = @"AB"; + address2.postcode = @"53421"; + address2.country = @"MX"; + contact.addresses = @[ + address1, + address2, + ]; + + // TODO: Avatar + return contact; + }]]; + + return actions; } #pragma mark - From 390c0bc201795b50c4a898e697eb4a219f5c3825 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 2 May 2018 12:37:07 -0400 Subject: [PATCH 3/5] Send fake contact shares. --- .../ContactViewController.swift | 4 +- .../ViewControllers/DebugUI/DebugUIMessages.m | 92 +++++++--- SignalMessaging/utils/ThreadUtil.h | 6 +- SignalMessaging/utils/ThreadUtil.m | 52 +++++- .../src/Messages/Interactions/OWSContact.h | 20 +- .../src/Messages/Interactions/OWSContact.m | 173 +++++++++++++++++- 6 files changed, 306 insertions(+), 41 deletions(-) diff --git a/Signal/src/ViewControllers/ContactViewController.swift b/Signal/src/ViewControllers/ContactViewController.swift index 0465fa42a..37d02f53e 100644 --- a/Signal/src/ViewControllers/ContactViewController.swift +++ b/Signal/src/ViewControllers/ContactViewController.swift @@ -360,7 +360,7 @@ class ContactViewController: OWSViewController, CNContactViewControllerDelegate for phoneNumber in contact.phoneNumbers { // TODO: Try to format the phone number nicely. - addRow(createNameValueRow(name: phoneNumber.labelString(), + addRow(createNameValueRow(name: phoneNumber.localizedLabel(), value: phoneNumber.phoneNumber, actionBlock: { guard let url = NSURL(string: "tel:\(phoneNumber.phoneNumber)") else { @@ -372,7 +372,7 @@ class ContactViewController: OWSViewController, CNContactViewControllerDelegate } for email in contact.emails { - addRow(createNameValueRow(name: email.labelString(), + addRow(createNameValueRow(name: email.localizedLabel(), value: email.email, actionBlock: { guard let url = NSURL(string: "mailto:\(email.email)") else { diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index 4c74e3905..68b712d29 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -124,7 +124,7 @@ NS_ASSUME_NONNULL_BEGIN actionBlock:^{ [DebugUIMessages selectBackDatedAction:thread]; }], - [OWSTableItem itemWithTitle:@"Send All Contacts" + [OWSTableItem itemWithTitle:@"Send All Contact Shares" actionBlock:^{ [DebugUIMessages sendAllContacts:thread]; }], @@ -310,14 +310,6 @@ NS_ASSUME_NONNULL_BEGIN [self performActionNTimes:[self sendTextMessagesActionInThread:thread]]; } -+ (void)sendAllContacts:(TSThread *)thread -{ - NSArray *subactions = [self allSendContactShareActions:thread includeLabels:NO]; - DebugUIMessagesAction *action = - [DebugUIMessagesGroupAction allGroupActionWithLabel:@"Send All Share Contact" subactions:subactions]; - [action prepareAndPerformNTimes:subactions.count]; -} - + (DebugUIMessagesAction *)sendTextMessagesActionInThread:(TSThread *)thread { OWSAssert(thread); @@ -3095,21 +3087,24 @@ typedef OWSContact * (^OWSContactBlock)(void); { OWSAssert(thread); - return [DebugUIMessagesSingleAction - actionWithLabel:[NSString stringWithFormat:@"Fake Contact Share (%@)", label] - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = contactBlock(); - TSOutgoingMessage *message = [self createFakeOutgoingMessage:thread - messageBody:nil - fakeAssetLoader:nil - messageState:TSOutgoingMessageStateSent - isDelivered:NO - isRead:NO - quotedMessage:nil - contactShare:contact - transaction:transaction]; - [message saveWithTransaction:transaction]; - }]; + return + [DebugUIMessagesSingleAction actionWithLabel:[NSString stringWithFormat:@"Send Contact Share (%@)", label] + staggeredActionBlock:^(NSUInteger index, + YapDatabaseReadWriteTransaction *transaction, + ActionSuccessBlock success, + ActionFailureBlock failure) { + dispatch_async(dispatch_get_main_queue(), ^{ + OWSContact *contact = contactBlock(); + DDLogVerbose(@"%@ sending contact: %@", self.logTag, contact.debugDescription); + OWSMessageSender *messageSender = [Environment current].messageSender; + [ThreadUtil sendMessageWithContactShare:contact + inThread:thread + messageSender:messageSender + completion:nil]; + + success(); + }); + }]; } + (NSArray *)allSendContactShareActions:(TSThread *)thread includeLabels:(BOOL)includeLabels @@ -3210,10 +3205,58 @@ typedef OWSContact * (^OWSContactBlock)(void); // TODO: Avatar return contact; }]]; + [actions addObject:[self sendContactShareMessageAction:thread + label:@"Long values" + contactBlock:^{ + OWSContact *contact = [OWSContact new]; + contact.givenName = @"Bobasdjasdlkjasldkjas"; + contact.familyName = @"Bobasdjasdlkjasldkjas"; + OWSContactEmail *email = [OWSContactEmail new]; + email.emailType = OWSContactEmailType_Mobile; + email.email = @"asdlakjsaldkjasldkjasdlkjasdlkjasdlkajsa@b.com"; + contact.emails = @[ + email, + ]; + return contact; + }]]; + [actions addObject:[self sendContactShareMessageAction:thread + label:@"System Contact w/o Signal" + contactBlock:^{ + OWSContact *contact = [OWSContact new]; + contact.givenName = @"Add Me To Your Contacts"; + OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; + phoneNumber.phoneType = OWSContactPhoneType_Work; + phoneNumber.phoneNumber = @"+324602053911"; + contact.phoneNumbers = @[ + phoneNumber, + ]; + return contact; + }]]; + [actions addObject:[self sendContactShareMessageAction:thread + label:@"System Contact w. Signal" + contactBlock:^{ + OWSContact *contact = [OWSContact new]; + contact.givenName = @"Add Me To Your Contacts"; + OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; + phoneNumber.phoneType = OWSContactPhoneType_Work; + phoneNumber.phoneNumber = @"+32460205392"; + contact.phoneNumbers = @[ + phoneNumber, + ]; + return contact; + }]]; return actions; } ++ (void)sendAllContacts:(TSThread *)thread +{ + NSArray *subactions = [self allSendContactShareActions:thread includeLabels:NO]; + DebugUIMessagesAction *action = + [DebugUIMessagesGroupAction allGroupActionWithLabel:@"Send All Contact Shares" subactions:subactions]; + [action prepareAndPerformNTimes:subactions.count]; +} + #pragma mark - + (NSString *)randomOversizeText @@ -3282,7 +3325,6 @@ typedef OWSContact * (^OWSContactBlock)(void); [ThreadUtil sendMessageWithAttachment:attachment inThread:thread quotedReplyModel:nil - contactShare:nil messageSender:messageSender ignoreErrors:YES completion:nil]; diff --git a/SignalMessaging/utils/ThreadUtil.h b/SignalMessaging/utils/ThreadUtil.h index 8a93ab51b..197cc1c67 100644 --- a/SignalMessaging/utils/ThreadUtil.h +++ b/SignalMessaging/utils/ThreadUtil.h @@ -72,11 +72,15 @@ NS_ASSUME_NONNULL_BEGIN + (TSOutgoingMessage *)sendMessageWithAttachment:(SignalAttachment *)attachment inThread:(TSThread *)thread quotedReplyModel:(nullable OWSQuotedReplyModel *)quotedReplyModel - contactShare:(nullable OWSContact *)contactShare messageSender:(OWSMessageSender *)messageSender ignoreErrors:(BOOL)ignoreErrors completion:(void (^_Nullable)(NSError *_Nullable error))completion; ++ (TSOutgoingMessage *)sendMessageWithContactShare:(OWSContact *)contactShare + inThread:(TSThread *)thread + messageSender:(OWSMessageSender *)messageSender + completion:(void (^_Nullable)(NSError *_Nullable error))completion; + // This method will create and/or remove any offers and indicators // necessary for this thread. This includes: // diff --git a/SignalMessaging/utils/ThreadUtil.m b/SignalMessaging/utils/ThreadUtil.m index 60d6b5e40..c5df4a72a 100644 --- a/SignalMessaging/utils/ThreadUtil.m +++ b/SignalMessaging/utils/ThreadUtil.m @@ -107,7 +107,6 @@ NS_ASSUME_NONNULL_BEGIN return [self sendMessageWithAttachment:attachment inThread:thread quotedReplyModel:quotedReplyModel - contactShare:nil messageSender:messageSender ignoreErrors:NO completion:completion]; @@ -116,7 +115,6 @@ NS_ASSUME_NONNULL_BEGIN + (TSOutgoingMessage *)sendMessageWithAttachment:(SignalAttachment *)attachment inThread:(TSThread *)thread quotedReplyModel:(nullable OWSQuotedReplyModel *)quotedReplyModel - contactShare:(nullable OWSContact *)contactShare messageSender:(OWSMessageSender *)messageSender ignoreErrors:(BOOL)ignoreErrors completion:(void (^_Nullable)(NSError *_Nullable error))completion @@ -142,7 +140,7 @@ NS_ASSUME_NONNULL_BEGIN isVoiceMessage:[attachment isVoiceMessage] groupMetaMessage:TSGroupMessageUnspecified quotedMessage:[quotedReplyModel buildQuotedMessage] - contactShare:contactShare]; + contactShare:nil]; [messageSender enqueueAttachment:attachment.dataSource contentType:attachment.mimeType @@ -168,6 +166,54 @@ NS_ASSUME_NONNULL_BEGIN return message; } ++ (TSOutgoingMessage *)sendMessageWithContactShare:(OWSContact *)contactShare + inThread:(TSThread *)thread + messageSender:(OWSMessageSender *)messageSender + completion:(void (^_Nullable)(NSError *_Nullable error))completion +{ + OWSAssertIsOnMainThread(); + OWSAssert(contactShare); + OWSAssert(contactShare.ows_isValid); + OWSAssert(thread); + OWSAssert(messageSender); + + OWSDisappearingMessagesConfiguration *configuration = + [OWSDisappearingMessagesConfiguration fetchObjectWithUniqueID:thread.uniqueId]; + + uint32_t expiresInSeconds = (configuration.isEnabled ? configuration.durationSeconds : 0); + TSOutgoingMessage *message = + [[TSOutgoingMessage alloc] initOutgoingMessageWithTimestamp:[NSDate ows_millisecondTimeStamp] + inThread:thread + messageBody:nil + attachmentIds:[NSMutableArray new] + expiresInSeconds:expiresInSeconds + expireStartedAt:0 + isVoiceMessage:NO + groupMetaMessage:TSGroupMessageUnspecified + quotedMessage:nil + contactShare:contactShare]; + + [messageSender enqueueMessage:message + success:^{ + DDLogDebug(@"%@ Successfully sent contact share.", self.logTag); + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^(void) { + completion(nil); + }); + } + } + failure:^(NSError *error) { + DDLogError(@"%@ Failed to send contact share with error: %@", self.logTag, error); + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^(void) { + completion(error); + }); + } + }]; + + return message; +} + + (ThreadDynamicInteractions *)ensureDynamicInteractionsForThread:(TSThread *)thread contactsManager:(OWSContactsManager *)contactsManager blockingManager:(OWSBlockingManager *)blockingManager diff --git a/SignalServiceKit/src/Messages/Interactions/OWSContact.h b/SignalServiceKit/src/Messages/Interactions/OWSContact.h index 905c14147..517debc26 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSContact.h +++ b/SignalServiceKit/src/Messages/Interactions/OWSContact.h @@ -22,6 +22,8 @@ typedef NS_ENUM(NSUInteger, OWSContactPhoneType) { OWSContactPhoneType_Custom, }; +NSString *NSStringForContactPhoneType(OWSContactPhoneType value); + @interface OWSContactPhoneNumber : MTLModel @property (nonatomic, readonly) OWSContactPhoneType phoneType; @@ -32,7 +34,9 @@ typedef NS_ENUM(NSUInteger, OWSContactPhoneType) { - (BOOL)ows_isValid; -- (NSString *)labelString; +- (NSString *)localizedLabel; + +- (NSString *)debugDescription; @end @@ -45,6 +49,8 @@ typedef NS_ENUM(NSUInteger, OWSContactEmailType) { OWSContactEmailType_Custom, }; +NSString *NSStringForContactEmailType(OWSContactEmailType value); + @interface OWSContactEmail : MTLModel @property (nonatomic, readonly) OWSContactEmailType emailType; @@ -55,7 +61,9 @@ typedef NS_ENUM(NSUInteger, OWSContactEmailType) { - (BOOL)ows_isValid; -- (NSString *)labelString; +- (NSString *)localizedLabel; + +- (NSString *)debugDescription; @end @@ -67,6 +75,8 @@ typedef NS_ENUM(NSUInteger, OWSContactAddressType) { OWSContactAddressType_Custom, }; +NSString *NSStringForContactAddressType(OWSContactAddressType value); + @interface OWSContactAddress : MTLModel @property (nonatomic, readonly) OWSContactAddressType addressType; @@ -83,7 +93,9 @@ typedef NS_ENUM(NSUInteger, OWSContactAddressType) { - (BOOL)ows_isValid; -- (NSString *)labelString; +- (NSString *)localizedLabel; + +- (NSString *)debugDescription; @end @@ -114,6 +126,8 @@ typedef NS_ENUM(NSUInteger, OWSContactAddressType) { - (BOOL)ows_isValid; +- (NSString *)debugDescription; + @end #pragma mark - diff --git a/SignalServiceKit/src/Messages/Interactions/OWSContact.m b/SignalServiceKit/src/Messages/Interactions/OWSContact.m index b07c0b0e6..b7c7f9fb2 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSContact.m +++ b/SignalServiceKit/src/Messages/Interactions/OWSContact.m @@ -16,6 +16,20 @@ NS_ASSUME_NONNULL_BEGIN BOOL kIsSendingContactSharesEnabled = YES; +NSString *NSStringForContactPhoneType(OWSContactPhoneType value) +{ + switch (value) { + case OWSContactPhoneType_Home: + return @"Home"; + case OWSContactPhoneType_Mobile: + return @"Mobile"; + case OWSContactPhoneType_Work: + return @"Work"; + case OWSContactPhoneType_Custom: + return @"Custom"; + } +} + @interface OWSContactPhoneNumber () @property (nonatomic) OWSContactPhoneType phoneType; @@ -32,6 +46,7 @@ BOOL kIsSendingContactSharesEnabled = YES; - (BOOL)ows_isValid { if (![PhoneNumber tryParsePhoneNumberFromE164:self.phoneNumber]) { + DDLogWarn(@"%@ invalid phone number; not e164: %@.", self.logTag, self.phoneNumber); return NO; } switch (self.phoneType) { @@ -40,11 +55,15 @@ BOOL kIsSendingContactSharesEnabled = YES; case OWSContactPhoneType_Work: return YES; case OWSContactPhoneType_Custom: - return self.label.ows_stripped.length > 0; + if (self.label.ows_stripped.length < 1) { + DDLogWarn(@"%@ invalid phone number; missing custom label: %@.", self.logTag, self.label); + return NO; + } + return YES; } } -- (NSString *)labelString +- (NSString *)localizedLabel { switch (self.phoneType) { case OWSContactPhoneType_Home: @@ -58,10 +77,40 @@ BOOL kIsSendingContactSharesEnabled = YES; } } +- (NSString *)debugDescription +{ + NSMutableString *result = [NSMutableString new]; + [result appendFormat:@"[Phone Number: %@, ", NSStringForContactPhoneType(self.phoneType)]; + + if (self.label.length > 0) { + [result appendFormat:@"label: %@, ", self.label]; + } + if (self.phoneNumber.length > 0) { + [result appendFormat:@"phoneNumber: %@, ", self.phoneNumber]; + } + + [result appendString:@"]"]; + return result; +} + @end #pragma mark - +NSString *NSStringForContactEmailType(OWSContactEmailType value) +{ + switch (value) { + case OWSContactEmailType_Home: + return @"Home"; + case OWSContactEmailType_Mobile: + return @"Mobile"; + case OWSContactEmailType_Work: + return @"Work"; + case OWSContactEmailType_Custom: + return @"Custom"; + } +} + @interface OWSContactEmail () @property (nonatomic) OWSContactEmailType emailType; @@ -78,6 +127,7 @@ BOOL kIsSendingContactSharesEnabled = YES; - (BOOL)ows_isValid { if (self.email.ows_stripped.length < 1) { + DDLogWarn(@"%@ invalid email: %@.", self.logTag, self.email); return NO; } switch (self.emailType) { @@ -86,11 +136,15 @@ BOOL kIsSendingContactSharesEnabled = YES; case OWSContactEmailType_Work: return YES; case OWSContactEmailType_Custom: - return self.label.ows_stripped.length > 0; + if (self.label.ows_stripped.length < 1) { + DDLogWarn(@"%@ invalid email; missing custom label: %@.", self.logTag, self.label); + return NO; + } + return YES; } } -- (NSString *)labelString +- (NSString *)localizedLabel { switch (self.emailType) { case OWSContactEmailType_Home: @@ -104,10 +158,37 @@ BOOL kIsSendingContactSharesEnabled = YES; } } +- (NSString *)debugDescription +{ + NSMutableString *result = [NSMutableString new]; + [result appendFormat:@"[Email: %@, ", NSStringForContactEmailType(self.emailType)]; + + if (self.label.length > 0) { + [result appendFormat:@"label: %@, ", self.label]; + } + if (self.email.length > 0) { + [result appendFormat:@"email: %@, ", self.email]; + } + + [result appendString:@"]"]; + return result; +} + @end #pragma mark - +NSString *NSStringForContactAddressType(OWSContactAddressType value) +{ + switch (value) { + case OWSContactAddressType_Home: + return @"Home"; + case OWSContactAddressType_Work: + return @"Work"; + case OWSContactAddressType_Custom: + return @"Custom"; + } +} @interface OWSContactAddress () @property (nonatomic) OWSContactAddressType addressType; @@ -133,6 +214,7 @@ BOOL kIsSendingContactSharesEnabled = YES; && self.neighborhood.ows_stripped.length < 1 && self.city.ows_stripped.length < 1 && self.region.ows_stripped.length < 1 && self.postcode.ows_stripped.length < 1 && self.country.ows_stripped.length < 1) { + DDLogWarn(@"%@ invalid address; empty.", self.logTag); return NO; } switch (self.addressType) { @@ -140,11 +222,15 @@ BOOL kIsSendingContactSharesEnabled = YES; case OWSContactAddressType_Work: return YES; case OWSContactAddressType_Custom: - return self.label.ows_stripped.length > 0; + if (self.label.ows_stripped.length < 1) { + DDLogWarn(@"%@ invalid address; missing custom label: %@.", self.logTag, self.label); + return NO; + } + return YES; } } -- (NSString *)labelString +- (NSString *)localizedLabel { switch (self.addressType) { case OWSContactAddressType_Home: @@ -156,6 +242,40 @@ BOOL kIsSendingContactSharesEnabled = YES; } } +- (NSString *)debugDescription +{ + NSMutableString *result = [NSMutableString new]; + [result appendFormat:@"[Address: %@, ", NSStringForContactAddressType(self.addressType)]; + + if (self.label.length > 0) { + [result appendFormat:@"label: %@, ", self.label]; + } + if (self.street.length > 0) { + [result appendFormat:@"street: %@, ", self.street]; + } + if (self.pobox.length > 0) { + [result appendFormat:@"pobox: %@, ", self.pobox]; + } + if (self.neighborhood.length > 0) { + [result appendFormat:@"neighborhood: %@, ", self.neighborhood]; + } + if (self.city.length > 0) { + [result appendFormat:@"city: %@, ", self.city]; + } + if (self.region.length > 0) { + [result appendFormat:@"region: %@, ", self.region]; + } + if (self.postcode.length > 0) { + [result appendFormat:@"postcode: %@, ", self.postcode]; + } + if (self.country.length > 0) { + [result appendFormat:@"country: %@, ", self.country]; + } + + [result appendString:@"]"]; + return result; +} + @end #pragma mark - @@ -214,7 +334,8 @@ BOOL kIsSendingContactSharesEnabled = YES; - (BOOL)ows_isValid { - if (self.displayName.ows_stripped.length) { + if (self.displayName.ows_stripped.length < 1) { + DDLogWarn(@"%@ invalid contact; no display name.", self.logTag); return NO; } BOOL hasValue = NO; @@ -261,6 +382,44 @@ BOOL kIsSendingContactSharesEnabled = YES; } } +- (NSString *)debugDescription +{ + NSMutableString *result = [NSMutableString new]; + [result appendString:@"["]; + + if (self.givenName.length > 0) { + [result appendFormat:@"givenName: %@, ", self.givenName]; + } + if (self.familyName.length > 0) { + [result appendFormat:@"familyName: %@, ", self.familyName]; + } + if (self.middleName.length > 0) { + [result appendFormat:@"middleName: %@, ", self.middleName]; + } + if (self.namePrefix.length > 0) { + [result appendFormat:@"namePrefix: %@, ", self.namePrefix]; + } + if (self.nameSuffix.length > 0) { + [result appendFormat:@"nameSuffix: %@, ", self.nameSuffix]; + } + if (self.displayName.length > 0) { + [result appendFormat:@"displayName: %@, ", self.displayName]; + } + + for (OWSContactPhoneNumber *phoneNumber in self.phoneNumbers) { + [result appendFormat:@"%@, ", phoneNumber.debugDescription]; + } + for (OWSContactEmail *email in self.emails) { + [result appendFormat:@"%@, ", email.debugDescription]; + } + for (OWSContactAddress *address in self.addresses) { + [result appendFormat:@"%@, ", address.debugDescription]; + } + + [result appendString:@"]"]; + return result; +} + @end #pragma mark - From 8dc33334675fabc37d35364f1f57af9e9ac826ab Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 2 May 2018 12:43:23 -0400 Subject: [PATCH 4/5] Send fake contact shares. --- SignalServiceKit/src/Messages/OWSMessageManager.m | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index b437549cf..e96dd9508 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -909,6 +909,7 @@ NS_ASSUME_NONNULL_BEGIN uint64_t timestamp = envelope.timestamp; NSString *body = dataMessage.body; NSData *groupId = dataMessage.hasGroup ? dataMessage.group.id : nil; + OWSContact *_Nullable contact = [OWSContacts contactForDataMessage:dataMessage]; if (dataMessage.group.type == OWSSignalServiceProtosGroupContextTypeRequestInfo) { [self handleGroupInfoRequest:envelope dataMessage:dataMessage transaction:transaction]; @@ -983,7 +984,7 @@ NS_ASSUME_NONNULL_BEGIN return nil; } - if (body.length == 0 && attachmentIds.count < 1) { + if (body.length == 0 && attachmentIds.count < 1 && !contact) { DDLogWarn(@"%@ ignoring empty incoming message from: %@ for group: %@ with timestamp: %lu", self.logTag, envelopeAddress(envelope), @@ -997,8 +998,6 @@ NS_ASSUME_NONNULL_BEGIN relay:envelope.relay transaction:transaction]; - OWSContact *_Nullable contact = [OWSContacts contactForDataMessage:dataMessage]; - DDLogDebug(@"%@ incoming message from: %@ for group: %@ with timestamp: %lu", self.logTag, envelopeAddress(envelope), @@ -1028,7 +1027,7 @@ NS_ASSUME_NONNULL_BEGIN } } } else { - if (body.length == 0 && attachmentIds.count < 1) { + if (body.length == 0 && attachmentIds.count < 1 && !contact) { DDLogWarn(@"%@ ignoring empty incoming message from: %@ with timestamp: %lu", self.logTag, envelopeAddress(envelope), @@ -1048,7 +1047,6 @@ NS_ASSUME_NONNULL_BEGIN thread:thread relay:envelope.relay transaction:transaction]; - OWSContact *_Nullable contact = [OWSContacts contactForDataMessage:dataMessage]; TSIncomingMessage *incomingMessage = [[TSIncomingMessage alloc] initIncomingMessageWithTimestamp:timestamp From 8e84f892392b9975d98bdea4abe04e8064a2ba2b Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 4 May 2018 09:38:37 -0400 Subject: [PATCH 5/5] Respond to CR. --- SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m b/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m index 8f91b2b57..586993d71 100644 --- a/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m +++ b/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m @@ -140,7 +140,7 @@ NS_ASSUME_NONNULL_BEGIN return; } - if (outgoingMessage.body.length < 1 && outgoingMessage.attachmentIds.count < 1) { + if (outgoingMessage.body.length < 1 && outgoingMessage.attachmentIds.count < 1 && !outgoingMessage.contactShare) { OWSFail(@"Ignoring message transcript for empty message."); return; }