diff --git a/SignalServiceKit/src/Loki/Messaging/ContactParser.swift b/SignalServiceKit/src/Loki/Messaging/ContactParser.swift new file mode 100644 index 000000000..106f8234c --- /dev/null +++ b/SignalServiceKit/src/Loki/Messaging/ContactParser.swift @@ -0,0 +1,22 @@ + +@objc public final class ContactParser : NSObject { + private let data: Data + + @objc public init(data: Data) { + self.data = data + } + + @objc public func parseHexEncodedPublicKeys() -> [String] { + var index = 0 + var result: [String] = [] + while index < data.endIndex { + let uncheckedSize: Int? = try? data[index..<(index+1)].withUnsafeBytes { $0.pointee } + guard let size = uncheckedSize else { break } + index += 1 + let protoAsData = data[index..<(index+size)] + guard let proto = try? SSKProtoContactDetails.parseData(protoAsData) else { break } + result.append(proto.number) + } + return result + } +} diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m index 6df08f2a5..e188d20ff 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m @@ -67,13 +67,15 @@ NS_ASSUME_NONNULL_BEGIN - (nullable SSKProtoSyncMessageBuilder *)syncMessageBuilder { + NSError *error; if (self.attachmentIds.count > 1) { OWSLogError(@"Expected sync contact message to have one or zero attachments, but found %lu.", (unsigned long)self.attachmentIds.count); } SSKProtoSyncMessageContactsBuilder *contactsBuilder; if (self.attachmentIds.count == 0) { - SSKProtoAttachmentPointer *attachmentProto = [SSKProtoAttachmentPointer builderWithId:0]; + SSKProtoAttachmentPointerBuilder *attachmentProtoBuilder = [SSKProtoAttachmentPointer builderWithId:0]; + SSKProtoAttachmentPointer *attachmentProto = [attachmentProtoBuilder buildAndReturnError:&error]; contactsBuilder = [SSKProtoSyncMessageContacts builderWithBlob:attachmentProto]; __block NSData *data; [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { @@ -90,7 +92,6 @@ NS_ASSUME_NONNULL_BEGIN } [contactsBuilder setIsComplete:YES]; - NSError *error; SSKProtoSyncMessageContacts *contactsProto = [contactsBuilder buildAndReturnError:&error]; if (error || contactsProto == nil) { OWSFailDebug(@"Couldn't build protobuf due to error: %@.", error); diff --git a/SignalServiceKit/src/Messages/OWSMessageHandler.m b/SignalServiceKit/src/Messages/OWSMessageHandler.m index 3caee3738..eb0853815 100644 --- a/SignalServiceKit/src/Messages/OWSMessageHandler.m +++ b/SignalServiceKit/src/Messages/OWSMessageHandler.m @@ -170,8 +170,9 @@ NSString *envelopeAddress(SSKProtoEnvelope *envelope) NSString *verifiedString = [NSString stringWithFormat:@"Verification for: %@", syncMessage.verified.destination]; [description appendString:verifiedString]; + } else if (syncMessage.contacts) { + [description appendString:@"Contacts"]; } else { - OWSFailDebug(@"Unknown sync message type"); [description appendString:@"Unknown"]; } diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 709b74bd7..9421f0e7b 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1007,6 +1007,12 @@ NS_ASSUME_NONNULL_BEGIN } else if (syncMessage.verified) { OWSLogInfo(@"Received verification state for %@", syncMessage.verified.destination); [self.identityManager throws_processIncomingSyncMessage:syncMessage.verified transaction:transaction]; + } else if (syncMessage.contacts) { + NSLog(@"[Loki] Received contact sync message."); + NSData *data = syncMessage.contacts.data; + ContactParser *parser = [[ContactParser alloc] initWithData:data]; + NSArray *hexEncodedPublicKeys = [parser parseHexEncodedPublicKeys]; + // TODO: Establish sessions } else { OWSLogWarn(@"Ignoring unsupported sync message."); }