diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMisc.m b/Signal/src/ViewControllers/DebugUI/DebugUIMisc.m index bffd48f61..0bdea418c 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMisc.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMisc.m @@ -17,6 +17,7 @@ #import #import #import +#import #import NS_ASSUME_NONNULL_BEGIN @@ -67,6 +68,18 @@ NS_ASSUME_NONNULL_BEGIN [[OWSProfileManager sharedManager] regenerateLocalProfile]; }]]; #endif + [items addObject:[OWSTableItem itemWithTitle:@"Send profile key message." + actionBlock:^{ + OWSProfileKeyMessage *message = [[OWSProfileKeyMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] inThread:thread]; + + [[Environment getCurrent].messageSender sendMessage:message + success:^{ + DDLogInfo(@"Successfully sent profile key message to thread: %@", thread); + } + failure:^(NSError * _Nonnull error) { + OWSFail(@"Failed to send prifle key message to thread: %@", thread); + }]; + }]]; [items addObject:[OWSTableItem itemWithTitle:@"Clear hasDismissedOffers" actionBlock:^{ [DebugUIMisc clearHasDismissedOffers]; diff --git a/SignalServiceKit/protobuf/OWSSignalServiceProtos.proto b/SignalServiceKit/protobuf/OWSSignalServiceProtos.proto index b7143f49c..127564f86 100644 --- a/SignalServiceKit/protobuf/OWSSignalServiceProtos.proto +++ b/SignalServiceKit/protobuf/OWSSignalServiceProtos.proto @@ -82,6 +82,7 @@ message DataMessage { enum Flags { END_SESSION = 1; EXPIRATION_TIMER_UPDATE = 2; + PROFILE_KEY = 4; } optional string body = 1; diff --git a/SignalServiceKit/src/Messages/OWSProfileKeyMessage.h b/SignalServiceKit/src/Messages/OWSProfileKeyMessage.h new file mode 100644 index 000000000..cd8c4d73a --- /dev/null +++ b/SignalServiceKit/src/Messages/OWSProfileKeyMessage.h @@ -0,0 +1,13 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import "TSOutgoingMessage.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface OWSProfileKeyMessage : TSOutgoingMessage + +@end + +NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/OWSProfileKeyMessage.m b/SignalServiceKit/src/Messages/OWSProfileKeyMessage.m new file mode 100644 index 000000000..06af08c8c --- /dev/null +++ b/SignalServiceKit/src/Messages/OWSProfileKeyMessage.m @@ -0,0 +1,50 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import "OWSProfileKeyMessage.h" +#import "OWSSignalServiceProtos.pb.h" +#import "ProfileManagerProtocol.h" +#import "ProtoBuf+OWS.h" +#import "TextSecureKitEnv.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation OWSProfileKeyMessage + +- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + // override superclass with no-op. + // + // There's no need to save this message, since it's not displayed to the user. +} + +- (BOOL)shouldSyncTranscript +{ + return NO; +} + +- (OWSSignalServiceProtosDataMessage *)buildDataMessage:(NSString *_Nullable)recipientId +{ + OWSAssert(self.thread); + + OWSSignalServiceProtosDataMessageBuilder *builder = [self dataMessageBuilder]; + [builder addLocalProfileKey]; + [builder setFlags:OWSSignalServiceProtosDataMessageFlagsProfileKey]; + + if (recipientId.length > 0) { + // Once we've shared our profile key with a user (perhaps due to being + // a member of a whitelisted group), make sure they're whitelisted. + id profileManager = [TextSecureKitEnv sharedEnv].profileManager; + // FIXME PERF avoid this dispatch. It's going to happen for *each* recipient in a group message. + dispatch_async(dispatch_get_main_queue(), ^{ + [profileManager addUserToProfileWhitelist:recipientId]; + }); + } + + return [builder build]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/OWSSignalServiceProtos.pb.h b/SignalServiceKit/src/Messages/OWSSignalServiceProtos.pb.h index af214bbde..37430bee2 100644 --- a/SignalServiceKit/src/Messages/OWSSignalServiceProtos.pb.h +++ b/SignalServiceKit/src/Messages/OWSSignalServiceProtos.pb.h @@ -112,6 +112,7 @@ NSString *NSStringFromOWSSignalServiceProtosEnvelopeType(OWSSignalServiceProtosE typedef NS_ENUM(SInt32, OWSSignalServiceProtosDataMessageFlags) { OWSSignalServiceProtosDataMessageFlagsEndSession = 1, OWSSignalServiceProtosDataMessageFlagsExpirationTimerUpdate = 2, + OWSSignalServiceProtosDataMessageFlagsProfileKey = 4, }; BOOL OWSSignalServiceProtosDataMessageFlagsIsValidValue(OWSSignalServiceProtosDataMessageFlags value); diff --git a/SignalServiceKit/src/Messages/OWSSignalServiceProtos.pb.m b/SignalServiceKit/src/Messages/OWSSignalServiceProtos.pb.m index b64ef57be..7c8c8c478 100644 --- a/SignalServiceKit/src/Messages/OWSSignalServiceProtos.pb.m +++ b/SignalServiceKit/src/Messages/OWSSignalServiceProtos.pb.m @@ -3103,6 +3103,7 @@ BOOL OWSSignalServiceProtosDataMessageFlagsIsValidValue(OWSSignalServiceProtosDa switch (value) { case OWSSignalServiceProtosDataMessageFlagsEndSession: case OWSSignalServiceProtosDataMessageFlagsExpirationTimerUpdate: + case OWSSignalServiceProtosDataMessageFlagsProfileKey: return YES; default: return NO; @@ -3114,6 +3115,8 @@ NSString *NSStringFromOWSSignalServiceProtosDataMessageFlags(OWSSignalServicePro return @"OWSSignalServiceProtosDataMessageFlagsEndSession"; case OWSSignalServiceProtosDataMessageFlagsExpirationTimerUpdate: return @"OWSSignalServiceProtosDataMessageFlagsExpirationTimerUpdate"; + case OWSSignalServiceProtosDataMessageFlagsProfileKey: + return @"OWSSignalServiceProtosDataMessageFlagsProfileKey"; default: return nil; } diff --git a/SignalServiceKit/src/Protocols/ProtoBuf+OWS.h b/SignalServiceKit/src/Protocols/ProtoBuf+OWS.h index 3ce1fc1d6..320635475 100644 --- a/SignalServiceKit/src/Protocols/ProtoBuf+OWS.h +++ b/SignalServiceKit/src/Protocols/ProtoBuf+OWS.h @@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSSignalServiceProtosDataMessageBuilder (OWS) - (void)addLocalProfileKeyIfNecessary:(TSThread *)thread recipientId:(NSString *_Nullable)recipientId; +- (void)addLocalProfileKey; @end diff --git a/SignalServiceKit/src/Protocols/ProtoBuf+OWS.m b/SignalServiceKit/src/Protocols/ProtoBuf+OWS.m index a5afc5a45..00e207d9c 100644 --- a/SignalServiceKit/src/Protocols/ProtoBuf+OWS.m +++ b/SignalServiceKit/src/Protocols/ProtoBuf+OWS.m @@ -64,6 +64,11 @@ NS_ASSUME_NONNULL_BEGIN } } +- (void)addLocalProfileKey +{ + [self setProfileKey:self.localProfileKey.keyData]; +} + @end #pragma mark -