From b5ce94c6ab361bed5014b92b26d2f6c7c3ae3d05 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Wed, 12 Feb 2020 17:08:27 +1100 Subject: [PATCH] add group parser --- .../src/Loki/Messaging/GroupParser.swift | 34 +++++++++++++++++++ .../src/Messages/OWSMessageManager.m | 1 + 2 files changed, 35 insertions(+) create mode 100644 SignalServiceKit/src/Loki/Messaging/GroupParser.swift diff --git a/SignalServiceKit/src/Loki/Messaging/GroupParser.swift b/SignalServiceKit/src/Loki/Messaging/GroupParser.swift new file mode 100644 index 000000000..6afa2386a --- /dev/null +++ b/SignalServiceKit/src/Loki/Messaging/GroupParser.swift @@ -0,0 +1,34 @@ + +@objc public final class GroupParser : NSObject { + private let data: Data + + @objc public init(data: Data) { + self.data = data + } + + @objc public func parseGroupModels() -> [TSGroupModel] { + var index = 0 + var result: [TSGroupModel] = [] + while index < data.endIndex { + var uncheckedSize: UInt32? = try? data[index..<(index+4)].withUnsafeBytes { $0.pointee } + if let size = uncheckedSize, size >= data.count, let intermediate = try? data[index..<(index+4)].reversed() { + uncheckedSize = Data(intermediate).withUnsafeBytes { $0.pointee } + } + guard let size = uncheckedSize, size < data.count else { break } + let sizeAsInt = Int(size) + index += 4 + guard index + sizeAsInt < data.count else { break } + let protoAsData = data[index..<(index+sizeAsInt)] + guard let proto = try? SSKProtoGroupDetails.parseData(protoAsData) else { break } + index += sizeAsInt + var groupModel = TSGroupModel.init(title: proto.name, + memberIds: proto.members, + image: nil, + groupId: proto.id, + groupType: GroupType.closedGroup, + adminIds: proto.admins) + result.append(groupModel) + } + return result + } +} diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index a1646c07c..c864473ee 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1107,6 +1107,7 @@ NS_ASSUME_NONNULL_BEGIN OWSLogInfo(@"[Loki] Received group sync message."); NSData *data = syncMessage.groups.data; // TODO: decode the data and handle the group info + GroupParser *parser = [[GroupParser alloc] initWithData:data]; } } else { OWSLogWarn(@"Ignoring unsupported sync message.");