Parse contact sync messages

pull/63/head
Niels Andriesse 6 years ago
parent 1a99bf7164
commit 09204e66e2

@ -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
}
}

@ -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);

@ -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"];
}

@ -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<NSString *> *hexEncodedPublicKeys = [parser parseHexEncodedPublicKeys];
// TODO: Establish sessions
} else {
OWSLogWarn(@"Ignoring unsupported sync message.");
}

Loading…
Cancel
Save