Rename ClosedGroupUpdateV2 → ClosedGroupControlMessage

This commit is contained in:
Niels Andriesse 2021-01-22 10:28:26 +11:00
parent 9ea1ccd0c2
commit c9c83da3dc
16 changed files with 895 additions and 288 deletions

View File

@ -519,7 +519,7 @@
C3471ED42555386B00297E91 /* AESGCM.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D72553860B00C340D1 /* AESGCM.swift */; };
C3471F4C25553AB000297E91 /* MessageReceiver+Decryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471F4B25553AB000297E91 /* MessageReceiver+Decryption.swift */; };
C3471FA42555439E00297E91 /* Notification+MessageSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471FA32555439E00297E91 /* Notification+MessageSender.swift */; };
C34A977425A3E34A00852C71 /* ClosedGroupUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C34A977325A3E34A00852C71 /* ClosedGroupUpdate.swift */; };
C34A977425A3E34A00852C71 /* ClosedGroupControlMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C34A977325A3E34A00852C71 /* ClosedGroupControlMessage.swift */; };
C34C8F7423A7830B00D82669 /* SpaceMono-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C34C8F7323A7830A00D82669 /* SpaceMono-Bold.ttf */; };
C352A2F525574B4700338F3E /* Job.swift in Sources */ = {isa = PBXBuildFile; fileRef = C352A2F425574B4700338F3E /* Job.swift */; };
C352A2FF25574B6300338F3E /* MessageSendJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = C352A2FE25574B6300338F3E /* MessageSendJob.swift */; };
@ -1518,7 +1518,7 @@
C3471ECA2555356A00297E91 /* MessageSender+Encryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageSender+Encryption.swift"; sourceTree = "<group>"; };
C3471F4B25553AB000297E91 /* MessageReceiver+Decryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageReceiver+Decryption.swift"; sourceTree = "<group>"; };
C3471FA32555439E00297E91 /* Notification+MessageSender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+MessageSender.swift"; sourceTree = "<group>"; };
C34A977325A3E34A00852C71 /* ClosedGroupUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClosedGroupUpdate.swift; sourceTree = "<group>"; };
C34A977325A3E34A00852C71 /* ClosedGroupControlMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClosedGroupControlMessage.swift; sourceTree = "<group>"; };
C34C8F7323A7830A00D82669 /* SpaceMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SpaceMono-Bold.ttf"; sourceTree = "<group>"; };
C352A2F425574B4700338F3E /* Job.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Job.swift; sourceTree = "<group>"; };
C352A2FE25574B6300338F3E /* MessageSendJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageSendJob.swift; sourceTree = "<group>"; };
@ -2354,7 +2354,7 @@
C3C2A7702553A41E00C340D1 /* ControlMessage.swift */,
C300A5BC2554B00D00555489 /* ReadReceipt.swift */,
C300A5D22554B05A00555489 /* TypingIndicator.swift */,
C34A977325A3E34A00852C71 /* ClosedGroupUpdate.swift */,
C34A977325A3E34A00852C71 /* ClosedGroupControlMessage.swift */,
C300A5E62554B07300555489 /* ExpirationTimerUpdate.swift */,
);
path = "Control Messages";
@ -4912,7 +4912,7 @@
C3471FA42555439E00297E91 /* Notification+MessageSender.swift in Sources */,
C32C5BEF256DC8EE003C73A2 /* OWSDisappearingMessagesJob.m in Sources */,
C3A7222A2558C1E40043A11F /* DotNetAPI.swift in Sources */,
C34A977425A3E34A00852C71 /* ClosedGroupUpdate.swift in Sources */,
C34A977425A3E34A00852C71 /* ClosedGroupControlMessage.swift in Sources */,
C32C5E97256DE0CB003C73A2 /* OWSPrimaryStorage.m in Sources */,
C32C5EB9256DE130003C73A2 /* OWSQuotedReplyModel+Conversion.swift in Sources */,
C3A71D1F25589AC30043A11F /* WebSocketResources.pb.swift in Sources */,

View File

@ -263,9 +263,9 @@ final class EditClosedGroupVC : BaseVC, UITableViewDataSource, UITableViewDelega
Storage.write(with: { [weak self] transaction in
do {
if !members.contains(getUserHexEncodedPublicKey()) {
try MessageSender.leaveV2(groupPublicKey, using: transaction)
try MessageSender.leave(groupPublicKey, using: transaction)
} else {
try MessageSender.updateV2(groupPublicKey, with: members, name: name, transaction: transaction)
try MessageSender.update(groupPublicKey, with: members, name: name, transaction: transaction)
}
} catch {
DispatchQueue.main.async {

View File

@ -171,7 +171,7 @@ final class NewClosedGroupVC : BaseVC, UITableViewDataSource, UITableViewDelegat
ModalActivityIndicatorViewController.present(fromViewController: navigationController!, message: message) { [weak self] _ in
var promise: Promise<TSGroupThread>!
Storage.writeSync { transaction in
promise = MessageSender.createV2ClosedGroup(name: name, members: selectedContacts, transaction: transaction)
promise = MessageSender.createClosedGroup(name: name, members: selectedContacts, transaction: transaction)
}
let _ = promise.done(on: DispatchQueue.main) { thread in
self?.presentingViewController?.dismiss(animated: true, completion: nil)

View File

@ -379,7 +379,7 @@ final class HomeVC : BaseVC, UITableViewDataSource, UITableViewDelegate, UIViewC
let groupID = thread.groupModel.groupId
let groupPublicKey = LKGroupUtilities.getDecodedGroupID(groupID)
do {
try MessageSender.leaveV2(groupPublicKey, using: transaction)
try MessageSender.leave(groupPublicKey, using: transaction)
} catch {
// TODO: Handle
}

View File

@ -1,7 +1,7 @@
import SessionProtocolKit
import SessionUtilitiesKit
public final class ClosedGroupUpdate : ControlMessage {
public final class ClosedGroupControlMessage : ControlMessage {
public var kind: Kind?
public override var ttl: UInt64 {
@ -58,13 +58,13 @@ public final class ClosedGroupUpdate : ControlMessage {
coder.encode(encryptedKeyPair, forKey: "encryptedKeyPair")
}
public static func fromProto(_ proto: SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper) -> KeyPairWrapper? {
public static func fromProto(_ proto: SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper) -> KeyPairWrapper? {
return KeyPairWrapper(publicKey: proto.publicKey.toHexString(), encryptedKeyPair: proto.encryptedKeyPair)
}
public func toProto() -> SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper? {
public func toProto() -> SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper? {
guard let publicKey = publicKey, let encryptedKeyPair = encryptedKeyPair else { return nil }
let result = SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.builder(publicKey: Data(hex: publicKey), encryptedKeyPair: encryptedKeyPair)
let result = SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper.builder(publicKey: Data(hex: publicKey), encryptedKeyPair: encryptedKeyPair)
do {
return try result.build()
} catch {
@ -166,38 +166,38 @@ public final class ClosedGroupUpdate : ControlMessage {
}
// MARK: Proto Conversion
public override class func fromProto(_ proto: SNProtoContent) -> ClosedGroupUpdate? {
guard let closedGroupUpdateProto = proto.dataMessage?.closedGroupUpdateV2 else { return nil }
public override class func fromProto(_ proto: SNProtoContent) -> ClosedGroupControlMessage? {
guard let closedGroupControlMessageProto = proto.dataMessage?.closedGroupControlMessage else { return nil }
let kind: Kind
switch closedGroupUpdateProto.type {
switch closedGroupControlMessageProto.type {
case .new:
guard let publicKey = closedGroupUpdateProto.publicKey, let name = closedGroupUpdateProto.name,
let encryptionKeyPairAsProto = closedGroupUpdateProto.encryptionKeyPair else { return nil }
guard let publicKey = closedGroupControlMessageProto.publicKey, let name = closedGroupControlMessageProto.name,
let encryptionKeyPairAsProto = closedGroupControlMessageProto.encryptionKeyPair else { return nil }
do {
let encryptionKeyPair = try ECKeyPair(publicKeyData: encryptionKeyPairAsProto.publicKey.removing05PrefixIfNeeded(), privateKeyData: encryptionKeyPairAsProto.privateKey)
kind = .new(publicKey: publicKey, name: name, encryptionKeyPair: encryptionKeyPair,
members: closedGroupUpdateProto.members, admins: closedGroupUpdateProto.admins)
members: closedGroupControlMessageProto.members, admins: closedGroupControlMessageProto.admins)
} catch {
SNLog("Couldn't parse key pair.")
return nil
}
case .update:
guard let name = closedGroupUpdateProto.name else { return nil }
kind = .update(name: name, members: closedGroupUpdateProto.members)
guard let name = closedGroupControlMessageProto.name else { return nil }
kind = .update(name: name, members: closedGroupControlMessageProto.members)
case .encryptionKeyPair:
let wrappers = closedGroupUpdateProto.wrappers.compactMap { KeyPairWrapper.fromProto($0) }
let wrappers = closedGroupControlMessageProto.wrappers.compactMap { KeyPairWrapper.fromProto($0) }
kind = .encryptionKeyPair(wrappers)
case .nameChange:
guard let name = closedGroupUpdateProto.name else { return nil }
guard let name = closedGroupControlMessageProto.name else { return nil }
kind = .nameChange(name: name)
case .usersAdded:
kind = .usersAdded(members: closedGroupUpdateProto.members)
kind = .usersAdded(members: closedGroupControlMessageProto.members)
case .usersRemoved:
kind = .usersRemoved(members: closedGroupUpdateProto.members)
kind = .usersRemoved(members: closedGroupControlMessageProto.members)
case .userLeft:
kind = .userLeft
}
return ClosedGroupUpdate(kind: kind)
return ClosedGroupControlMessage(kind: kind)
}
public override func toProto(using transaction: YapDatabaseReadWriteTransaction) -> SNProtoContent? {
@ -206,43 +206,43 @@ public final class ClosedGroupUpdate : ControlMessage {
return nil
}
do {
let closedGroupUpdate: SNProtoDataMessageClosedGroupUpdateV2.SNProtoDataMessageClosedGroupUpdateV2Builder
let closedGroupControlMessage: SNProtoDataMessageClosedGroupControlMessage.SNProtoDataMessageClosedGroupControlMessageBuilder
switch kind {
case .new(let publicKey, let name, let encryptionKeyPair, let members, let admins):
closedGroupUpdate = SNProtoDataMessageClosedGroupUpdateV2.builder(type: .new)
closedGroupUpdate.setPublicKey(publicKey)
closedGroupUpdate.setName(name)
let encryptionKeyPairAsProto = SNProtoDataMessageClosedGroupUpdateV2KeyPair.builder(publicKey: encryptionKeyPair.publicKey, privateKey: encryptionKeyPair.privateKey)
closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .new)
closedGroupControlMessage.setPublicKey(publicKey)
closedGroupControlMessage.setName(name)
let encryptionKeyPairAsProto = SNProtoDataMessageClosedGroupControlMessageKeyPair.builder(publicKey: encryptionKeyPair.publicKey, privateKey: encryptionKeyPair.privateKey)
do {
closedGroupUpdate.setEncryptionKeyPair(try encryptionKeyPairAsProto.build())
closedGroupControlMessage.setEncryptionKeyPair(try encryptionKeyPairAsProto.build())
} catch {
SNLog("Couldn't construct closed group update proto from: \(self).")
return nil
}
closedGroupUpdate.setMembers(members)
closedGroupUpdate.setAdmins(admins)
closedGroupControlMessage.setMembers(members)
closedGroupControlMessage.setAdmins(admins)
case .update(let name, let members):
closedGroupUpdate = SNProtoDataMessageClosedGroupUpdateV2.builder(type: .update)
closedGroupUpdate.setName(name)
closedGroupUpdate.setMembers(members)
closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .update)
closedGroupControlMessage.setName(name)
closedGroupControlMessage.setMembers(members)
case .encryptionKeyPair(let wrappers):
closedGroupUpdate = SNProtoDataMessageClosedGroupUpdateV2.builder(type: .encryptionKeyPair)
closedGroupUpdate.setWrappers(wrappers.compactMap { $0.toProto() })
closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .encryptionKeyPair)
closedGroupControlMessage.setWrappers(wrappers.compactMap { $0.toProto() })
case .nameChange(let name):
closedGroupUpdate = SNProtoDataMessageClosedGroupUpdateV2.builder(type: .nameChange)
closedGroupUpdate.setName(name)
closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .nameChange)
closedGroupControlMessage.setName(name)
case .usersAdded(let members):
closedGroupUpdate = SNProtoDataMessageClosedGroupUpdateV2.builder(type: .usersAdded)
closedGroupUpdate.setMembers(members)
closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .usersAdded)
closedGroupControlMessage.setMembers(members)
case .usersRemoved(let members):
closedGroupUpdate = SNProtoDataMessageClosedGroupUpdateV2.builder(type: .usersRemoved)
closedGroupUpdate.setMembers(members)
closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .usersRemoved)
closedGroupControlMessage.setMembers(members)
case .userLeft:
closedGroupUpdate = SNProtoDataMessageClosedGroupUpdateV2.builder(type: .userLeft)
closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .userLeft)
}
let contentProto = SNProtoContent.builder()
let dataMessageProto = SNProtoDataMessage.builder()
dataMessageProto.setClosedGroupUpdateV2(try closedGroupUpdate.build())
dataMessageProto.setClosedGroupControlMessage(try closedGroupControlMessage.build())
// Group context
try setGroupContextIfNeeded(on: dataMessageProto, using: transaction)
// Expiration timer
@ -264,7 +264,7 @@ public final class ClosedGroupUpdate : ControlMessage {
// MARK: Description
public override var description: String {
"""
ClosedGroupUpdate(
ClosedGroupControlMessage(
kind: \(kind?.description ?? "null")
)
"""

View File

@ -47,9 +47,15 @@ public enum SNProtoError: Error {
if let _value = source {
builder.setSource(_value)
}
if hasSourceDevice {
builder.setSourceDevice(sourceDevice)
}
if let _value = content {
builder.setContent(_value)
}
if hasServerTimestamp {
builder.setServerTimestamp(serverTimestamp)
}
return builder
}
@ -74,6 +80,10 @@ public enum SNProtoError: Error {
proto.source = valueParam
}
@objc public func setSourceDevice(_ valueParam: UInt32) {
proto.sourceDevice = valueParam
}
@objc public func setTimestamp(_ valueParam: UInt64) {
proto.timestamp = valueParam
}
@ -82,6 +92,10 @@ public enum SNProtoError: Error {
proto.content = valueParam
}
@objc public func setServerTimestamp(_ valueParam: UInt64) {
proto.serverTimestamp = valueParam
}
@objc public func build() throws -> SNProtoEnvelope {
return try SNProtoEnvelope.parseProto(proto)
}
@ -107,6 +121,13 @@ public enum SNProtoError: Error {
return proto.hasSource
}
@objc public var sourceDevice: UInt32 {
return proto.sourceDevice
}
@objc public var hasSourceDevice: Bool {
return proto.hasSourceDevice
}
@objc public var content: Data? {
guard proto.hasContent else {
return nil
@ -117,6 +138,13 @@ public enum SNProtoError: Error {
return proto.hasContent
}
@objc public var serverTimestamp: UInt64 {
return proto.serverTimestamp
}
@objc public var hasServerTimestamp: Bool {
return proto.hasServerTimestamp
}
private init(proto: SessionProtos_Envelope,
type: SNProtoEnvelopeType,
timestamp: UInt64) {
@ -326,6 +354,9 @@ extension SNProtoTypingMessage.SNProtoTypingMessageBuilder {
if let _value = dataMessage {
builder.setDataMessage(_value)
}
if let _value = syncMessage {
builder.setSyncMessage(_value)
}
if let _value = receiptMessage {
builder.setReceiptMessage(_value)
}
@ -345,6 +376,10 @@ extension SNProtoTypingMessage.SNProtoTypingMessageBuilder {
proto.dataMessage = valueParam.proto
}
@objc public func setSyncMessage(_ valueParam: SNProtoSyncMessage) {
proto.syncMessage = valueParam.proto
}
@objc public func setReceiptMessage(_ valueParam: SNProtoReceiptMessage) {
proto.receiptMessage = valueParam.proto
}
@ -366,16 +401,20 @@ extension SNProtoTypingMessage.SNProtoTypingMessageBuilder {
@objc public let dataMessage: SNProtoDataMessage?
@objc public let syncMessage: SNProtoSyncMessage?
@objc public let receiptMessage: SNProtoReceiptMessage?
@objc public let typingMessage: SNProtoTypingMessage?
private init(proto: SessionProtos_Content,
dataMessage: SNProtoDataMessage?,
syncMessage: SNProtoSyncMessage?,
receiptMessage: SNProtoReceiptMessage?,
typingMessage: SNProtoTypingMessage?) {
self.proto = proto
self.dataMessage = dataMessage
self.syncMessage = syncMessage
self.receiptMessage = receiptMessage
self.typingMessage = typingMessage
}
@ -396,6 +435,11 @@ extension SNProtoTypingMessage.SNProtoTypingMessageBuilder {
dataMessage = try SNProtoDataMessage.parseProto(proto.dataMessage)
}
var syncMessage: SNProtoSyncMessage? = nil
if proto.hasSyncMessage {
syncMessage = try SNProtoSyncMessage.parseProto(proto.syncMessage)
}
var receiptMessage: SNProtoReceiptMessage? = nil
if proto.hasReceiptMessage {
receiptMessage = try SNProtoReceiptMessage.parseProto(proto.receiptMessage)
@ -412,6 +456,7 @@ extension SNProtoTypingMessage.SNProtoTypingMessageBuilder {
let result = SNProtoContent(proto: proto,
dataMessage: dataMessage,
syncMessage: syncMessage,
receiptMessage: receiptMessage,
typingMessage: typingMessage)
return result
@ -2127,25 +2172,25 @@ extension SNProtoDataMessageLokiProfile.SNProtoDataMessageLokiProfileBuilder {
#endif
// MARK: - SNProtoDataMessageClosedGroupUpdateV2KeyPair
// MARK: - SNProtoDataMessageClosedGroupControlMessageKeyPair
@objc public class SNProtoDataMessageClosedGroupUpdateV2KeyPair: NSObject {
@objc public class SNProtoDataMessageClosedGroupControlMessageKeyPair: NSObject {
// MARK: - SNProtoDataMessageClosedGroupUpdateV2KeyPairBuilder
// MARK: - SNProtoDataMessageClosedGroupControlMessageKeyPairBuilder
@objc public class func builder(publicKey: Data, privateKey: Data) -> SNProtoDataMessageClosedGroupUpdateV2KeyPairBuilder {
return SNProtoDataMessageClosedGroupUpdateV2KeyPairBuilder(publicKey: publicKey, privateKey: privateKey)
@objc public class func builder(publicKey: Data, privateKey: Data) -> SNProtoDataMessageClosedGroupControlMessageKeyPairBuilder {
return SNProtoDataMessageClosedGroupControlMessageKeyPairBuilder(publicKey: publicKey, privateKey: privateKey)
}
// asBuilder() constructs a builder that reflects the proto's contents.
@objc public func asBuilder() -> SNProtoDataMessageClosedGroupUpdateV2KeyPairBuilder {
let builder = SNProtoDataMessageClosedGroupUpdateV2KeyPairBuilder(publicKey: publicKey, privateKey: privateKey)
@objc public func asBuilder() -> SNProtoDataMessageClosedGroupControlMessageKeyPairBuilder {
let builder = SNProtoDataMessageClosedGroupControlMessageKeyPairBuilder(publicKey: publicKey, privateKey: privateKey)
return builder
}
@objc public class SNProtoDataMessageClosedGroupUpdateV2KeyPairBuilder: NSObject {
@objc public class SNProtoDataMessageClosedGroupControlMessageKeyPairBuilder: NSObject {
private var proto = SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair()
private var proto = SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair()
@objc fileprivate override init() {}
@ -2164,22 +2209,22 @@ extension SNProtoDataMessageLokiProfile.SNProtoDataMessageLokiProfileBuilder {
proto.privateKey = valueParam
}
@objc public func build() throws -> SNProtoDataMessageClosedGroupUpdateV2KeyPair {
return try SNProtoDataMessageClosedGroupUpdateV2KeyPair.parseProto(proto)
@objc public func build() throws -> SNProtoDataMessageClosedGroupControlMessageKeyPair {
return try SNProtoDataMessageClosedGroupControlMessageKeyPair.parseProto(proto)
}
@objc public func buildSerializedData() throws -> Data {
return try SNProtoDataMessageClosedGroupUpdateV2KeyPair.parseProto(proto).serializedData()
return try SNProtoDataMessageClosedGroupControlMessageKeyPair.parseProto(proto).serializedData()
}
}
fileprivate let proto: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair
fileprivate let proto: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair
@objc public let publicKey: Data
@objc public let privateKey: Data
private init(proto: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair,
private init(proto: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair,
publicKey: Data,
privateKey: Data) {
self.proto = proto
@ -2192,12 +2237,12 @@ extension SNProtoDataMessageLokiProfile.SNProtoDataMessageLokiProfileBuilder {
return try self.proto.serializedData()
}
@objc public class func parseData(_ serializedData: Data) throws -> SNProtoDataMessageClosedGroupUpdateV2KeyPair {
let proto = try SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair(serializedData: serializedData)
@objc public class func parseData(_ serializedData: Data) throws -> SNProtoDataMessageClosedGroupControlMessageKeyPair {
let proto = try SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair(serializedData: serializedData)
return try parseProto(proto)
}
fileprivate class func parseProto(_ proto: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair) throws -> SNProtoDataMessageClosedGroupUpdateV2KeyPair {
fileprivate class func parseProto(_ proto: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair) throws -> SNProtoDataMessageClosedGroupControlMessageKeyPair {
guard proto.hasPublicKey else {
throw SNProtoError.invalidProtobuf(description: "\(logTag) missing required field: publicKey")
}
@ -2208,13 +2253,13 @@ extension SNProtoDataMessageLokiProfile.SNProtoDataMessageLokiProfileBuilder {
}
let privateKey = proto.privateKey
// MARK: - Begin Validation Logic for SNProtoDataMessageClosedGroupUpdateV2KeyPair -
// MARK: - Begin Validation Logic for SNProtoDataMessageClosedGroupControlMessageKeyPair -
// MARK: - End Validation Logic for SNProtoDataMessageClosedGroupUpdateV2KeyPair -
// MARK: - End Validation Logic for SNProtoDataMessageClosedGroupControlMessageKeyPair -
let result = SNProtoDataMessageClosedGroupUpdateV2KeyPair(proto: proto,
publicKey: publicKey,
privateKey: privateKey)
let result = SNProtoDataMessageClosedGroupControlMessageKeyPair(proto: proto,
publicKey: publicKey,
privateKey: privateKey)
return result
}
@ -2225,39 +2270,39 @@ extension SNProtoDataMessageLokiProfile.SNProtoDataMessageLokiProfileBuilder {
#if DEBUG
extension SNProtoDataMessageClosedGroupUpdateV2KeyPair {
extension SNProtoDataMessageClosedGroupControlMessageKeyPair {
@objc public func serializedDataIgnoringErrors() -> Data? {
return try! self.serializedData()
}
}
extension SNProtoDataMessageClosedGroupUpdateV2KeyPair.SNProtoDataMessageClosedGroupUpdateV2KeyPairBuilder {
@objc public func buildIgnoringErrors() -> SNProtoDataMessageClosedGroupUpdateV2KeyPair? {
extension SNProtoDataMessageClosedGroupControlMessageKeyPair.SNProtoDataMessageClosedGroupControlMessageKeyPairBuilder {
@objc public func buildIgnoringErrors() -> SNProtoDataMessageClosedGroupControlMessageKeyPair? {
return try! self.build()
}
}
#endif
// MARK: - SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper
// MARK: - SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper
@objc public class SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper: NSObject {
@objc public class SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper: NSObject {
// MARK: - SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapperBuilder
// MARK: - SNProtoDataMessageClosedGroupControlMessageKeyPairWrapperBuilder
@objc public class func builder(publicKey: Data, encryptedKeyPair: Data) -> SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapperBuilder {
return SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapperBuilder(publicKey: publicKey, encryptedKeyPair: encryptedKeyPair)
@objc public class func builder(publicKey: Data, encryptedKeyPair: Data) -> SNProtoDataMessageClosedGroupControlMessageKeyPairWrapperBuilder {
return SNProtoDataMessageClosedGroupControlMessageKeyPairWrapperBuilder(publicKey: publicKey, encryptedKeyPair: encryptedKeyPair)
}
// asBuilder() constructs a builder that reflects the proto's contents.
@objc public func asBuilder() -> SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapperBuilder {
let builder = SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapperBuilder(publicKey: publicKey, encryptedKeyPair: encryptedKeyPair)
@objc public func asBuilder() -> SNProtoDataMessageClosedGroupControlMessageKeyPairWrapperBuilder {
let builder = SNProtoDataMessageClosedGroupControlMessageKeyPairWrapperBuilder(publicKey: publicKey, encryptedKeyPair: encryptedKeyPair)
return builder
}
@objc public class SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapperBuilder: NSObject {
@objc public class SNProtoDataMessageClosedGroupControlMessageKeyPairWrapperBuilder: NSObject {
private var proto = SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper()
private var proto = SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper()
@objc fileprivate override init() {}
@ -2276,22 +2321,22 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPair.SNProtoDataMessageClosedG
proto.encryptedKeyPair = valueParam
}
@objc public func build() throws -> SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper {
return try SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.parseProto(proto)
@objc public func build() throws -> SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper {
return try SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper.parseProto(proto)
}
@objc public func buildSerializedData() throws -> Data {
return try SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.parseProto(proto).serializedData()
return try SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper.parseProto(proto).serializedData()
}
}
fileprivate let proto: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper
fileprivate let proto: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper
@objc public let publicKey: Data
@objc public let encryptedKeyPair: Data
private init(proto: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper,
private init(proto: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper,
publicKey: Data,
encryptedKeyPair: Data) {
self.proto = proto
@ -2304,12 +2349,12 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPair.SNProtoDataMessageClosedG
return try self.proto.serializedData()
}
@objc public class func parseData(_ serializedData: Data) throws -> SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper {
let proto = try SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper(serializedData: serializedData)
@objc public class func parseData(_ serializedData: Data) throws -> SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper {
let proto = try SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper(serializedData: serializedData)
return try parseProto(proto)
}
fileprivate class func parseProto(_ proto: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper) throws -> SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper {
fileprivate class func parseProto(_ proto: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper) throws -> SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper {
guard proto.hasPublicKey else {
throw SNProtoError.invalidProtobuf(description: "\(logTag) missing required field: publicKey")
}
@ -2320,13 +2365,13 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPair.SNProtoDataMessageClosedG
}
let encryptedKeyPair = proto.encryptedKeyPair
// MARK: - Begin Validation Logic for SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper -
// MARK: - Begin Validation Logic for SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper -
// MARK: - End Validation Logic for SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper -
// MARK: - End Validation Logic for SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper -
let result = SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper(proto: proto,
publicKey: publicKey,
encryptedKeyPair: encryptedKeyPair)
let result = SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper(proto: proto,
publicKey: publicKey,
encryptedKeyPair: encryptedKeyPair)
return result
}
@ -2337,27 +2382,27 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPair.SNProtoDataMessageClosedG
#if DEBUG
extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper {
extension SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper {
@objc public func serializedDataIgnoringErrors() -> Data? {
return try! self.serializedData()
}
}
extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapperBuilder {
@objc public func buildIgnoringErrors() -> SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper? {
extension SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper.SNProtoDataMessageClosedGroupControlMessageKeyPairWrapperBuilder {
@objc public func buildIgnoringErrors() -> SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper? {
return try! self.build()
}
}
#endif
// MARK: - SNProtoDataMessageClosedGroupUpdateV2
// MARK: - SNProtoDataMessageClosedGroupControlMessage
@objc public class SNProtoDataMessageClosedGroupUpdateV2: NSObject {
@objc public class SNProtoDataMessageClosedGroupControlMessage: NSObject {
// MARK: - SNProtoDataMessageClosedGroupUpdateV2Type
// MARK: - SNProtoDataMessageClosedGroupControlMessageType
@objc public enum SNProtoDataMessageClosedGroupUpdateV2Type: Int32 {
@objc public enum SNProtoDataMessageClosedGroupControlMessageType: Int32 {
case new = 1
case update = 2
case encryptionKeyPair = 3
@ -2367,7 +2412,7 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessage
case userLeft = 7
}
private class func SNProtoDataMessageClosedGroupUpdateV2TypeWrap(_ value: SessionProtos_DataMessage.ClosedGroupUpdateV2.TypeEnum) -> SNProtoDataMessageClosedGroupUpdateV2Type {
private class func SNProtoDataMessageClosedGroupControlMessageTypeWrap(_ value: SessionProtos_DataMessage.ClosedGroupControlMessage.TypeEnum) -> SNProtoDataMessageClosedGroupControlMessageType {
switch value {
case .new: return .new
case .update: return .update
@ -2379,7 +2424,7 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessage
}
}
private class func SNProtoDataMessageClosedGroupUpdateV2TypeUnwrap(_ value: SNProtoDataMessageClosedGroupUpdateV2Type) -> SessionProtos_DataMessage.ClosedGroupUpdateV2.TypeEnum {
private class func SNProtoDataMessageClosedGroupControlMessageTypeUnwrap(_ value: SNProtoDataMessageClosedGroupControlMessageType) -> SessionProtos_DataMessage.ClosedGroupControlMessage.TypeEnum {
switch value {
case .new: return .new
case .update: return .update
@ -2391,15 +2436,15 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessage
}
}
// MARK: - SNProtoDataMessageClosedGroupUpdateV2Builder
// MARK: - SNProtoDataMessageClosedGroupControlMessageBuilder
@objc public class func builder(type: SNProtoDataMessageClosedGroupUpdateV2Type) -> SNProtoDataMessageClosedGroupUpdateV2Builder {
return SNProtoDataMessageClosedGroupUpdateV2Builder(type: type)
@objc public class func builder(type: SNProtoDataMessageClosedGroupControlMessageType) -> SNProtoDataMessageClosedGroupControlMessageBuilder {
return SNProtoDataMessageClosedGroupControlMessageBuilder(type: type)
}
// asBuilder() constructs a builder that reflects the proto's contents.
@objc public func asBuilder() -> SNProtoDataMessageClosedGroupUpdateV2Builder {
let builder = SNProtoDataMessageClosedGroupUpdateV2Builder(type: type)
@objc public func asBuilder() -> SNProtoDataMessageClosedGroupControlMessageBuilder {
let builder = SNProtoDataMessageClosedGroupControlMessageBuilder(type: type)
if let _value = publicKey {
builder.setPublicKey(_value)
}
@ -2415,20 +2460,20 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessage
return builder
}
@objc public class SNProtoDataMessageClosedGroupUpdateV2Builder: NSObject {
@objc public class SNProtoDataMessageClosedGroupControlMessageBuilder: NSObject {
private var proto = SessionProtos_DataMessage.ClosedGroupUpdateV2()
private var proto = SessionProtos_DataMessage.ClosedGroupControlMessage()
@objc fileprivate override init() {}
@objc fileprivate init(type: SNProtoDataMessageClosedGroupUpdateV2Type) {
@objc fileprivate init(type: SNProtoDataMessageClosedGroupControlMessageType) {
super.init()
setType(type)
}
@objc public func setType(_ valueParam: SNProtoDataMessageClosedGroupUpdateV2Type) {
proto.type = SNProtoDataMessageClosedGroupUpdateV2TypeUnwrap(valueParam)
@objc public func setType(_ valueParam: SNProtoDataMessageClosedGroupControlMessageType) {
proto.type = SNProtoDataMessageClosedGroupControlMessageTypeUnwrap(valueParam)
}
@objc public func setPublicKey(_ valueParam: Data) {
@ -2439,7 +2484,7 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessage
proto.name = valueParam
}
@objc public func setEncryptionKeyPair(_ valueParam: SNProtoDataMessageClosedGroupUpdateV2KeyPair) {
@objc public func setEncryptionKeyPair(_ valueParam: SNProtoDataMessageClosedGroupControlMessageKeyPair) {
proto.encryptionKeyPair = valueParam.proto
}
@ -2463,32 +2508,32 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessage
proto.admins = wrappedItems
}
@objc public func addWrappers(_ valueParam: SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper) {
@objc public func addWrappers(_ valueParam: SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper) {
var items = proto.wrappers
items.append(valueParam.proto)
proto.wrappers = items
}
@objc public func setWrappers(_ wrappedItems: [SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper]) {
@objc public func setWrappers(_ wrappedItems: [SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper]) {
proto.wrappers = wrappedItems.map { $0.proto }
}
@objc public func build() throws -> SNProtoDataMessageClosedGroupUpdateV2 {
return try SNProtoDataMessageClosedGroupUpdateV2.parseProto(proto)
@objc public func build() throws -> SNProtoDataMessageClosedGroupControlMessage {
return try SNProtoDataMessageClosedGroupControlMessage.parseProto(proto)
}
@objc public func buildSerializedData() throws -> Data {
return try SNProtoDataMessageClosedGroupUpdateV2.parseProto(proto).serializedData()
return try SNProtoDataMessageClosedGroupControlMessage.parseProto(proto).serializedData()
}
}
fileprivate let proto: SessionProtos_DataMessage.ClosedGroupUpdateV2
fileprivate let proto: SessionProtos_DataMessage.ClosedGroupControlMessage
@objc public let type: SNProtoDataMessageClosedGroupUpdateV2Type
@objc public let type: SNProtoDataMessageClosedGroupControlMessageType
@objc public let encryptionKeyPair: SNProtoDataMessageClosedGroupUpdateV2KeyPair?
@objc public let encryptionKeyPair: SNProtoDataMessageClosedGroupControlMessageKeyPair?
@objc public let wrappers: [SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper]
@objc public let wrappers: [SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper]
@objc public var publicKey: Data? {
guard proto.hasPublicKey else {
@ -2518,10 +2563,10 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessage
return proto.admins
}
private init(proto: SessionProtos_DataMessage.ClosedGroupUpdateV2,
type: SNProtoDataMessageClosedGroupUpdateV2Type,
encryptionKeyPair: SNProtoDataMessageClosedGroupUpdateV2KeyPair?,
wrappers: [SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper]) {
private init(proto: SessionProtos_DataMessage.ClosedGroupControlMessage,
type: SNProtoDataMessageClosedGroupControlMessageType,
encryptionKeyPair: SNProtoDataMessageClosedGroupControlMessageKeyPair?,
wrappers: [SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper]) {
self.proto = proto
self.type = type
self.encryptionKeyPair = encryptionKeyPair
@ -2533,33 +2578,33 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessage
return try self.proto.serializedData()
}
@objc public class func parseData(_ serializedData: Data) throws -> SNProtoDataMessageClosedGroupUpdateV2 {
let proto = try SessionProtos_DataMessage.ClosedGroupUpdateV2(serializedData: serializedData)
@objc public class func parseData(_ serializedData: Data) throws -> SNProtoDataMessageClosedGroupControlMessage {
let proto = try SessionProtos_DataMessage.ClosedGroupControlMessage(serializedData: serializedData)
return try parseProto(proto)
}
fileprivate class func parseProto(_ proto: SessionProtos_DataMessage.ClosedGroupUpdateV2) throws -> SNProtoDataMessageClosedGroupUpdateV2 {
fileprivate class func parseProto(_ proto: SessionProtos_DataMessage.ClosedGroupControlMessage) throws -> SNProtoDataMessageClosedGroupControlMessage {
guard proto.hasType else {
throw SNProtoError.invalidProtobuf(description: "\(logTag) missing required field: type")
}
let type = SNProtoDataMessageClosedGroupUpdateV2TypeWrap(proto.type)
let type = SNProtoDataMessageClosedGroupControlMessageTypeWrap(proto.type)
var encryptionKeyPair: SNProtoDataMessageClosedGroupUpdateV2KeyPair? = nil
var encryptionKeyPair: SNProtoDataMessageClosedGroupControlMessageKeyPair? = nil
if proto.hasEncryptionKeyPair {
encryptionKeyPair = try SNProtoDataMessageClosedGroupUpdateV2KeyPair.parseProto(proto.encryptionKeyPair)
encryptionKeyPair = try SNProtoDataMessageClosedGroupControlMessageKeyPair.parseProto(proto.encryptionKeyPair)
}
var wrappers: [SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper] = []
wrappers = try proto.wrappers.map { try SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.parseProto($0) }
var wrappers: [SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper] = []
wrappers = try proto.wrappers.map { try SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper.parseProto($0) }
// MARK: - Begin Validation Logic for SNProtoDataMessageClosedGroupUpdateV2 -
// MARK: - Begin Validation Logic for SNProtoDataMessageClosedGroupControlMessage -
// MARK: - End Validation Logic for SNProtoDataMessageClosedGroupUpdateV2 -
// MARK: - End Validation Logic for SNProtoDataMessageClosedGroupControlMessage -
let result = SNProtoDataMessageClosedGroupUpdateV2(proto: proto,
type: type,
encryptionKeyPair: encryptionKeyPair,
wrappers: wrappers)
let result = SNProtoDataMessageClosedGroupControlMessage(proto: proto,
type: type,
encryptionKeyPair: encryptionKeyPair,
wrappers: wrappers)
return result
}
@ -2570,14 +2615,14 @@ extension SNProtoDataMessageClosedGroupUpdateV2KeyPairWrapper.SNProtoDataMessage
#if DEBUG
extension SNProtoDataMessageClosedGroupUpdateV2 {
extension SNProtoDataMessageClosedGroupControlMessage {
@objc public func serializedDataIgnoringErrors() -> Data? {
return try! self.serializedData()
}
}
extension SNProtoDataMessageClosedGroupUpdateV2.SNProtoDataMessageClosedGroupUpdateV2Builder {
@objc public func buildIgnoringErrors() -> SNProtoDataMessageClosedGroupUpdateV2? {
extension SNProtoDataMessageClosedGroupControlMessage.SNProtoDataMessageClosedGroupControlMessageBuilder {
@objc public func buildIgnoringErrors() -> SNProtoDataMessageClosedGroupControlMessage? {
return try! self.build()
}
}
@ -2642,8 +2687,8 @@ extension SNProtoDataMessageClosedGroupUpdateV2.SNProtoDataMessageClosedGroupUpd
if let _value = profile {
builder.setProfile(_value)
}
if let _value = closedGroupUpdateV2 {
builder.setClosedGroupUpdateV2(_value)
if let _value = closedGroupControlMessage {
builder.setClosedGroupControlMessage(_value)
}
if let _value = publicChatInfo {
builder.setPublicChatInfo(_value)
@ -2719,8 +2764,8 @@ extension SNProtoDataMessageClosedGroupUpdateV2.SNProtoDataMessageClosedGroupUpd
proto.profile = valueParam.proto
}
@objc public func setClosedGroupUpdateV2(_ valueParam: SNProtoDataMessageClosedGroupUpdateV2) {
proto.closedGroupUpdateV2 = valueParam.proto
@objc public func setClosedGroupControlMessage(_ valueParam: SNProtoDataMessageClosedGroupControlMessage) {
proto.closedGroupControlMessage = valueParam.proto
}
@objc public func setPublicChatInfo(_ valueParam: SNProtoPublicChatInfo) {
@ -2750,7 +2795,7 @@ extension SNProtoDataMessageClosedGroupUpdateV2.SNProtoDataMessageClosedGroupUpd
@objc public let profile: SNProtoDataMessageLokiProfile?
@objc public let closedGroupUpdateV2: SNProtoDataMessageClosedGroupUpdateV2?
@objc public let closedGroupControlMessage: SNProtoDataMessageClosedGroupControlMessage?
@objc public let publicChatInfo: SNProtoPublicChatInfo?
@ -2802,7 +2847,7 @@ extension SNProtoDataMessageClosedGroupUpdateV2.SNProtoDataMessageClosedGroupUpd
contact: [SNProtoDataMessageContact],
preview: [SNProtoDataMessagePreview],
profile: SNProtoDataMessageLokiProfile?,
closedGroupUpdateV2: SNProtoDataMessageClosedGroupUpdateV2?,
closedGroupControlMessage: SNProtoDataMessageClosedGroupControlMessage?,
publicChatInfo: SNProtoPublicChatInfo?) {
self.proto = proto
self.attachments = attachments
@ -2811,7 +2856,7 @@ extension SNProtoDataMessageClosedGroupUpdateV2.SNProtoDataMessageClosedGroupUpd
self.contact = contact
self.preview = preview
self.profile = profile
self.closedGroupUpdateV2 = closedGroupUpdateV2
self.closedGroupControlMessage = closedGroupControlMessage
self.publicChatInfo = publicChatInfo
}
@ -2850,9 +2895,9 @@ extension SNProtoDataMessageClosedGroupUpdateV2.SNProtoDataMessageClosedGroupUpd
profile = try SNProtoDataMessageLokiProfile.parseProto(proto.profile)
}
var closedGroupUpdateV2: SNProtoDataMessageClosedGroupUpdateV2? = nil
if proto.hasClosedGroupUpdateV2 {
closedGroupUpdateV2 = try SNProtoDataMessageClosedGroupUpdateV2.parseProto(proto.closedGroupUpdateV2)
var closedGroupControlMessage: SNProtoDataMessageClosedGroupControlMessage? = nil
if proto.hasClosedGroupControlMessage {
closedGroupControlMessage = try SNProtoDataMessageClosedGroupControlMessage.parseProto(proto.closedGroupControlMessage)
}
var publicChatInfo: SNProtoPublicChatInfo? = nil
@ -2871,7 +2916,7 @@ extension SNProtoDataMessageClosedGroupUpdateV2.SNProtoDataMessageClosedGroupUpd
contact: contact,
preview: preview,
profile: profile,
closedGroupUpdateV2: closedGroupUpdateV2,
closedGroupControlMessage: closedGroupControlMessage,
publicChatInfo: publicChatInfo)
return result
}
@ -3030,6 +3075,270 @@ extension SNProtoReceiptMessage.SNProtoReceiptMessageBuilder {
#endif
// MARK: - SNProtoSyncMessageSent
@objc public class SNProtoSyncMessageSent: NSObject {
// MARK: - SNProtoSyncMessageSentBuilder
@objc public class func builder() -> SNProtoSyncMessageSentBuilder {
return SNProtoSyncMessageSentBuilder()
}
// asBuilder() constructs a builder that reflects the proto's contents.
@objc public func asBuilder() -> SNProtoSyncMessageSentBuilder {
let builder = SNProtoSyncMessageSentBuilder()
if let _value = destination {
builder.setDestination(_value)
}
if hasTimestamp {
builder.setTimestamp(timestamp)
}
if let _value = message {
builder.setMessage(_value)
}
if hasExpirationStartTimestamp {
builder.setExpirationStartTimestamp(expirationStartTimestamp)
}
if hasIsRecipientUpdate {
builder.setIsRecipientUpdate(isRecipientUpdate)
}
return builder
}
@objc public class SNProtoSyncMessageSentBuilder: NSObject {
private var proto = SessionProtos_SyncMessage.Sent()
@objc fileprivate override init() {}
@objc public func setDestination(_ valueParam: String) {
proto.destination = valueParam
}
@objc public func setTimestamp(_ valueParam: UInt64) {
proto.timestamp = valueParam
}
@objc public func setMessage(_ valueParam: SNProtoDataMessage) {
proto.message = valueParam.proto
}
@objc public func setExpirationStartTimestamp(_ valueParam: UInt64) {
proto.expirationStartTimestamp = valueParam
}
@objc public func setIsRecipientUpdate(_ valueParam: Bool) {
proto.isRecipientUpdate = valueParam
}
@objc public func build() throws -> SNProtoSyncMessageSent {
return try SNProtoSyncMessageSent.parseProto(proto)
}
@objc public func buildSerializedData() throws -> Data {
return try SNProtoSyncMessageSent.parseProto(proto).serializedData()
}
}
fileprivate let proto: SessionProtos_SyncMessage.Sent
@objc public let message: SNProtoDataMessage?
@objc public var destination: String? {
guard proto.hasDestination else {
return nil
}
return proto.destination
}
@objc public var hasDestination: Bool {
return proto.hasDestination
}
@objc public var timestamp: UInt64 {
return proto.timestamp
}
@objc public var hasTimestamp: Bool {
return proto.hasTimestamp
}
@objc public var expirationStartTimestamp: UInt64 {
return proto.expirationStartTimestamp
}
@objc public var hasExpirationStartTimestamp: Bool {
return proto.hasExpirationStartTimestamp
}
@objc public var isRecipientUpdate: Bool {
return proto.isRecipientUpdate
}
@objc public var hasIsRecipientUpdate: Bool {
return proto.hasIsRecipientUpdate
}
private init(proto: SessionProtos_SyncMessage.Sent,
message: SNProtoDataMessage?) {
self.proto = proto
self.message = message
}
@objc
public func serializedData() throws -> Data {
return try self.proto.serializedData()
}
@objc public class func parseData(_ serializedData: Data) throws -> SNProtoSyncMessageSent {
let proto = try SessionProtos_SyncMessage.Sent(serializedData: serializedData)
return try parseProto(proto)
}
fileprivate class func parseProto(_ proto: SessionProtos_SyncMessage.Sent) throws -> SNProtoSyncMessageSent {
var message: SNProtoDataMessage? = nil
if proto.hasMessage {
message = try SNProtoDataMessage.parseProto(proto.message)
}
// MARK: - Begin Validation Logic for SNProtoSyncMessageSent -
// MARK: - End Validation Logic for SNProtoSyncMessageSent -
let result = SNProtoSyncMessageSent(proto: proto,
message: message)
return result
}
@objc public override var debugDescription: String {
return "\(proto)"
}
}
#if DEBUG
extension SNProtoSyncMessageSent {
@objc public func serializedDataIgnoringErrors() -> Data? {
return try! self.serializedData()
}
}
extension SNProtoSyncMessageSent.SNProtoSyncMessageSentBuilder {
@objc public func buildIgnoringErrors() -> SNProtoSyncMessageSent? {
return try! self.build()
}
}
#endif
// MARK: - SNProtoSyncMessage
@objc public class SNProtoSyncMessage: NSObject {
// MARK: - SNProtoSyncMessageBuilder
@objc public class func builder() -> SNProtoSyncMessageBuilder {
return SNProtoSyncMessageBuilder()
}
// asBuilder() constructs a builder that reflects the proto's contents.
@objc public func asBuilder() -> SNProtoSyncMessageBuilder {
let builder = SNProtoSyncMessageBuilder()
if let _value = sent {
builder.setSent(_value)
}
if let _value = padding {
builder.setPadding(_value)
}
return builder
}
@objc public class SNProtoSyncMessageBuilder: NSObject {
private var proto = SessionProtos_SyncMessage()
@objc fileprivate override init() {}
@objc public func setSent(_ valueParam: SNProtoSyncMessageSent) {
proto.sent = valueParam.proto
}
@objc public func setPadding(_ valueParam: Data) {
proto.padding = valueParam
}
@objc public func build() throws -> SNProtoSyncMessage {
return try SNProtoSyncMessage.parseProto(proto)
}
@objc public func buildSerializedData() throws -> Data {
return try SNProtoSyncMessage.parseProto(proto).serializedData()
}
}
fileprivate let proto: SessionProtos_SyncMessage
@objc public let sent: SNProtoSyncMessageSent?
@objc public var padding: Data? {
guard proto.hasPadding else {
return nil
}
return proto.padding
}
@objc public var hasPadding: Bool {
return proto.hasPadding
}
private init(proto: SessionProtos_SyncMessage,
sent: SNProtoSyncMessageSent?) {
self.proto = proto
self.sent = sent
}
@objc
public func serializedData() throws -> Data {
return try self.proto.serializedData()
}
@objc public class func parseData(_ serializedData: Data) throws -> SNProtoSyncMessage {
let proto = try SessionProtos_SyncMessage(serializedData: serializedData)
return try parseProto(proto)
}
fileprivate class func parseProto(_ proto: SessionProtos_SyncMessage) throws -> SNProtoSyncMessage {
var sent: SNProtoSyncMessageSent? = nil
if proto.hasSent {
sent = try SNProtoSyncMessageSent.parseProto(proto.sent)
}
// MARK: - Begin Validation Logic for SNProtoSyncMessage -
// MARK: - End Validation Logic for SNProtoSyncMessage -
let result = SNProtoSyncMessage(proto: proto,
sent: sent)
return result
}
@objc public override var debugDescription: String {
return "\(proto)"
}
}
#if DEBUG
extension SNProtoSyncMessage {
@objc public func serializedDataIgnoringErrors() -> Data? {
return try! self.serializedData()
}
}
extension SNProtoSyncMessage.SNProtoSyncMessageBuilder {
@objc public func buildIgnoringErrors() -> SNProtoSyncMessage? {
return try! self.build()
}
}
#endif
// MARK: - SNProtoAttachmentPointer
@objc public class SNProtoAttachmentPointer: NSObject {

View File

@ -45,6 +45,15 @@ struct SessionProtos_Envelope {
/// Clears the value of `source`. Subsequent reads from it will return its default value.
mutating func clearSource() {self._source = nil}
var sourceDevice: UInt32 {
get {return _sourceDevice ?? 0}
set {_sourceDevice = newValue}
}
/// Returns true if `sourceDevice` has been explicitly set.
var hasSourceDevice: Bool {return self._sourceDevice != nil}
/// Clears the value of `sourceDevice`. Subsequent reads from it will return its default value.
mutating func clearSourceDevice() {self._sourceDevice = nil}
/// @required
var timestamp: UInt64 {
get {return _timestamp ?? 0}
@ -64,6 +73,15 @@ struct SessionProtos_Envelope {
/// Clears the value of `content`. Subsequent reads from it will return its default value.
mutating func clearContent() {self._content = nil}
var serverTimestamp: UInt64 {
get {return _serverTimestamp ?? 0}
set {_serverTimestamp = newValue}
}
/// Returns true if `serverTimestamp` has been explicitly set.
var hasServerTimestamp: Bool {return self._serverTimestamp != nil}
/// Clears the value of `serverTimestamp`. Subsequent reads from it will return its default value.
mutating func clearServerTimestamp() {self._serverTimestamp = nil}
var unknownFields = SwiftProtobuf.UnknownStorage()
enum TypeEnum: SwiftProtobuf.Enum {
@ -96,8 +114,10 @@ struct SessionProtos_Envelope {
fileprivate var _type: SessionProtos_Envelope.TypeEnum? = nil
fileprivate var _source: String? = nil
fileprivate var _sourceDevice: UInt32? = nil
fileprivate var _timestamp: UInt64? = nil
fileprivate var _content: Data? = nil
fileprivate var _serverTimestamp: UInt64? = nil
}
#if swift(>=4.2)
@ -189,6 +209,15 @@ struct SessionProtos_Content {
/// Clears the value of `dataMessage`. Subsequent reads from it will return its default value.
mutating func clearDataMessage() {_uniqueStorage()._dataMessage = nil}
var syncMessage: SessionProtos_SyncMessage {
get {return _storage._syncMessage ?? SessionProtos_SyncMessage()}
set {_uniqueStorage()._syncMessage = newValue}
}
/// Returns true if `syncMessage` has been explicitly set.
var hasSyncMessage: Bool {return _storage._syncMessage != nil}
/// Clears the value of `syncMessage`. Subsequent reads from it will return its default value.
mutating func clearSyncMessage() {_uniqueStorage()._syncMessage = nil}
var receiptMessage: SessionProtos_ReceiptMessage {
get {return _storage._receiptMessage ?? SessionProtos_ReceiptMessage()}
set {_uniqueStorage()._receiptMessage = newValue}
@ -339,14 +368,14 @@ struct SessionProtos_DataMessage {
/// Clears the value of `profile`. Subsequent reads from it will return its default value.
mutating func clearProfile() {_uniqueStorage()._profile = nil}
var closedGroupUpdateV2: SessionProtos_DataMessage.ClosedGroupUpdateV2 {
get {return _storage._closedGroupUpdateV2 ?? SessionProtos_DataMessage.ClosedGroupUpdateV2()}
set {_uniqueStorage()._closedGroupUpdateV2 = newValue}
var closedGroupControlMessage: SessionProtos_DataMessage.ClosedGroupControlMessage {
get {return _storage._closedGroupControlMessage ?? SessionProtos_DataMessage.ClosedGroupControlMessage()}
set {_uniqueStorage()._closedGroupControlMessage = newValue}
}
/// Returns true if `closedGroupUpdateV2` has been explicitly set.
var hasClosedGroupUpdateV2: Bool {return _storage._closedGroupUpdateV2 != nil}
/// Clears the value of `closedGroupUpdateV2`. Subsequent reads from it will return its default value.
mutating func clearClosedGroupUpdateV2() {_uniqueStorage()._closedGroupUpdateV2 = nil}
/// Returns true if `closedGroupControlMessage` has been explicitly set.
var hasClosedGroupControlMessage: Bool {return _storage._closedGroupControlMessage != nil}
/// Clears the value of `closedGroupControlMessage`. Subsequent reads from it will return its default value.
mutating func clearClosedGroupControlMessage() {_uniqueStorage()._closedGroupControlMessage = nil}
var publicChatInfo: SessionProtos_PublicChatInfo {
get {return _storage._publicChatInfo ?? SessionProtos_PublicChatInfo()}
@ -1000,13 +1029,13 @@ struct SessionProtos_DataMessage {
fileprivate var _profilePicture: String? = nil
}
struct ClosedGroupUpdateV2 {
struct ClosedGroupControlMessage {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
/// @required
var type: SessionProtos_DataMessage.ClosedGroupUpdateV2.TypeEnum {
var type: SessionProtos_DataMessage.ClosedGroupControlMessage.TypeEnum {
get {return _storage._type ?? .new}
set {_uniqueStorage()._type = newValue}
}
@ -1033,8 +1062,8 @@ struct SessionProtos_DataMessage {
/// Clears the value of `name`. Subsequent reads from it will return its default value.
mutating func clearName() {_uniqueStorage()._name = nil}
var encryptionKeyPair: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair {
get {return _storage._encryptionKeyPair ?? SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair()}
var encryptionKeyPair: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair {
get {return _storage._encryptionKeyPair ?? SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair()}
set {_uniqueStorage()._encryptionKeyPair = newValue}
}
/// Returns true if `encryptionKeyPair` has been explicitly set.
@ -1052,7 +1081,7 @@ struct SessionProtos_DataMessage {
set {_uniqueStorage()._admins = newValue}
}
var wrappers: [SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper] {
var wrappers: [SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper] {
get {return _storage._wrappers}
set {_uniqueStorage()._wrappers = newValue}
}
@ -1254,6 +1283,93 @@ extension SessionProtos_ReceiptMessage.TypeEnum: CaseIterable {
#endif // swift(>=4.2)
struct SessionProtos_SyncMessage {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
var sent: SessionProtos_SyncMessage.Sent {
get {return _storage._sent ?? SessionProtos_SyncMessage.Sent()}
set {_uniqueStorage()._sent = newValue}
}
/// Returns true if `sent` has been explicitly set.
var hasSent: Bool {return _storage._sent != nil}
/// Clears the value of `sent`. Subsequent reads from it will return its default value.
mutating func clearSent() {_uniqueStorage()._sent = nil}
var padding: Data {
get {return _storage._padding ?? SwiftProtobuf.Internal.emptyData}
set {_uniqueStorage()._padding = newValue}
}
/// Returns true if `padding` has been explicitly set.
var hasPadding: Bool {return _storage._padding != nil}
/// Clears the value of `padding`. Subsequent reads from it will return its default value.
mutating func clearPadding() {_uniqueStorage()._padding = nil}
var unknownFields = SwiftProtobuf.UnknownStorage()
struct Sent {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
var destination: String {
get {return _storage._destination ?? String()}
set {_uniqueStorage()._destination = newValue}
}
/// Returns true if `destination` has been explicitly set.
var hasDestination: Bool {return _storage._destination != nil}
/// Clears the value of `destination`. Subsequent reads from it will return its default value.
mutating func clearDestination() {_uniqueStorage()._destination = nil}
var timestamp: UInt64 {
get {return _storage._timestamp ?? 0}
set {_uniqueStorage()._timestamp = newValue}
}
/// Returns true if `timestamp` has been explicitly set.
var hasTimestamp: Bool {return _storage._timestamp != nil}
/// Clears the value of `timestamp`. Subsequent reads from it will return its default value.
mutating func clearTimestamp() {_uniqueStorage()._timestamp = nil}
var message: SessionProtos_DataMessage {
get {return _storage._message ?? SessionProtos_DataMessage()}
set {_uniqueStorage()._message = newValue}
}
/// Returns true if `message` has been explicitly set.
var hasMessage: Bool {return _storage._message != nil}
/// Clears the value of `message`. Subsequent reads from it will return its default value.
mutating func clearMessage() {_uniqueStorage()._message = nil}
var expirationStartTimestamp: UInt64 {
get {return _storage._expirationStartTimestamp ?? 0}
set {_uniqueStorage()._expirationStartTimestamp = newValue}
}
/// Returns true if `expirationStartTimestamp` has been explicitly set.
var hasExpirationStartTimestamp: Bool {return _storage._expirationStartTimestamp != nil}
/// Clears the value of `expirationStartTimestamp`. Subsequent reads from it will return its default value.
mutating func clearExpirationStartTimestamp() {_uniqueStorage()._expirationStartTimestamp = nil}
var isRecipientUpdate: Bool {
get {return _storage._isRecipientUpdate ?? false}
set {_uniqueStorage()._isRecipientUpdate = newValue}
}
/// Returns true if `isRecipientUpdate` has been explicitly set.
var hasIsRecipientUpdate: Bool {return _storage._isRecipientUpdate != nil}
/// Clears the value of `isRecipientUpdate`. Subsequent reads from it will return its default value.
mutating func clearIsRecipientUpdate() {_uniqueStorage()._isRecipientUpdate = nil}
var unknownFields = SwiftProtobuf.UnknownStorage()
init() {}
fileprivate var _storage = _StorageClass.defaultInstance
}
init() {}
fileprivate var _storage = _StorageClass.defaultInstance
}
struct SessionProtos_AttachmentPointer {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
@ -1784,8 +1900,10 @@ extension SessionProtos_Envelope: SwiftProtobuf.Message, SwiftProtobuf._MessageI
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "type"),
2: .same(proto: "source"),
7: .same(proto: "sourceDevice"),
5: .same(proto: "timestamp"),
8: .same(proto: "content"),
10: .same(proto: "serverTimestamp"),
]
public var isInitialized: Bool {
@ -1799,7 +1917,9 @@ extension SessionProtos_Envelope: SwiftProtobuf.Message, SwiftProtobuf._MessageI
case 1: try decoder.decodeSingularEnumField(value: &self._type)
case 2: try decoder.decodeSingularStringField(value: &self._source)
case 5: try decoder.decodeSingularUInt64Field(value: &self._timestamp)
case 7: try decoder.decodeSingularUInt32Field(value: &self._sourceDevice)
case 8: try decoder.decodeSingularBytesField(value: &self._content)
case 10: try decoder.decodeSingularUInt64Field(value: &self._serverTimestamp)
default: break
}
}
@ -1815,17 +1935,25 @@ extension SessionProtos_Envelope: SwiftProtobuf.Message, SwiftProtobuf._MessageI
if let v = self._timestamp {
try visitor.visitSingularUInt64Field(value: v, fieldNumber: 5)
}
if let v = self._sourceDevice {
try visitor.visitSingularUInt32Field(value: v, fieldNumber: 7)
}
if let v = self._content {
try visitor.visitSingularBytesField(value: v, fieldNumber: 8)
}
if let v = self._serverTimestamp {
try visitor.visitSingularUInt64Field(value: v, fieldNumber: 10)
}
try unknownFields.traverse(visitor: &visitor)
}
static func ==(lhs: SessionProtos_Envelope, rhs: SessionProtos_Envelope) -> Bool {
if lhs._type != rhs._type {return false}
if lhs._source != rhs._source {return false}
if lhs._sourceDevice != rhs._sourceDevice {return false}
if lhs._timestamp != rhs._timestamp {return false}
if lhs._content != rhs._content {return false}
if lhs._serverTimestamp != rhs._serverTimestamp {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
@ -1884,12 +2012,14 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
static let protoMessageName: String = _protobuf_package + ".Content"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "dataMessage"),
2: .same(proto: "syncMessage"),
5: .same(proto: "receiptMessage"),
6: .same(proto: "typingMessage"),
]
fileprivate class _StorageClass {
var _dataMessage: SessionProtos_DataMessage? = nil
var _syncMessage: SessionProtos_SyncMessage? = nil
var _receiptMessage: SessionProtos_ReceiptMessage? = nil
var _typingMessage: SessionProtos_TypingMessage? = nil
@ -1899,6 +2029,7 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
init(copying source: _StorageClass) {
_dataMessage = source._dataMessage
_syncMessage = source._syncMessage
_receiptMessage = source._receiptMessage
_typingMessage = source._typingMessage
}
@ -1914,6 +2045,7 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
public var isInitialized: Bool {
return withExtendedLifetime(_storage) { (_storage: _StorageClass) in
if let v = _storage._dataMessage, !v.isInitialized {return false}
if let v = _storage._syncMessage, !v.isInitialized {return false}
return true
}
}
@ -1924,6 +2056,7 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
while let fieldNumber = try decoder.nextFieldNumber() {
switch fieldNumber {
case 1: try decoder.decodeSingularMessageField(value: &_storage._dataMessage)
case 2: try decoder.decodeSingularMessageField(value: &_storage._syncMessage)
case 5: try decoder.decodeSingularMessageField(value: &_storage._receiptMessage)
case 6: try decoder.decodeSingularMessageField(value: &_storage._typingMessage)
default: break
@ -1937,6 +2070,9 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
if let v = _storage._dataMessage {
try visitor.visitSingularMessageField(value: v, fieldNumber: 1)
}
if let v = _storage._syncMessage {
try visitor.visitSingularMessageField(value: v, fieldNumber: 2)
}
if let v = _storage._receiptMessage {
try visitor.visitSingularMessageField(value: v, fieldNumber: 5)
}
@ -1953,6 +2089,7 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
let _storage = _args.0
let rhs_storage = _args.1
if _storage._dataMessage != rhs_storage._dataMessage {return false}
if _storage._syncMessage != rhs_storage._syncMessage {return false}
if _storage._receiptMessage != rhs_storage._receiptMessage {return false}
if _storage._typingMessage != rhs_storage._typingMessage {return false}
return true
@ -2013,7 +2150,7 @@ extension SessionProtos_DataMessage: SwiftProtobuf.Message, SwiftProtobuf._Messa
9: .same(proto: "contact"),
10: .same(proto: "preview"),
101: .same(proto: "profile"),
104: .same(proto: "closedGroupUpdateV2"),
104: .same(proto: "closedGroupControlMessage"),
999: .same(proto: "publicChatInfo"),
]
@ -2029,7 +2166,7 @@ extension SessionProtos_DataMessage: SwiftProtobuf.Message, SwiftProtobuf._Messa
var _contact: [SessionProtos_DataMessage.Contact] = []
var _preview: [SessionProtos_DataMessage.Preview] = []
var _profile: SessionProtos_DataMessage.LokiProfile? = nil
var _closedGroupUpdateV2: SessionProtos_DataMessage.ClosedGroupUpdateV2? = nil
var _closedGroupControlMessage: SessionProtos_DataMessage.ClosedGroupControlMessage? = nil
var _publicChatInfo: SessionProtos_PublicChatInfo? = nil
static let defaultInstance = _StorageClass()
@ -2048,7 +2185,7 @@ extension SessionProtos_DataMessage: SwiftProtobuf.Message, SwiftProtobuf._Messa
_contact = source._contact
_preview = source._preview
_profile = source._profile
_closedGroupUpdateV2 = source._closedGroupUpdateV2
_closedGroupControlMessage = source._closedGroupControlMessage
_publicChatInfo = source._publicChatInfo
}
}
@ -2062,7 +2199,7 @@ extension SessionProtos_DataMessage: SwiftProtobuf.Message, SwiftProtobuf._Messa
public var isInitialized: Bool {
return withExtendedLifetime(_storage) { (_storage: _StorageClass) in
if let v = _storage._closedGroupUpdateV2, !v.isInitialized {return false}
if let v = _storage._closedGroupControlMessage, !v.isInitialized {return false}
return true
}
}
@ -2083,7 +2220,7 @@ extension SessionProtos_DataMessage: SwiftProtobuf.Message, SwiftProtobuf._Messa
case 9: try decoder.decodeRepeatedMessageField(value: &_storage._contact)
case 10: try decoder.decodeRepeatedMessageField(value: &_storage._preview)
case 101: try decoder.decodeSingularMessageField(value: &_storage._profile)
case 104: try decoder.decodeSingularMessageField(value: &_storage._closedGroupUpdateV2)
case 104: try decoder.decodeSingularMessageField(value: &_storage._closedGroupControlMessage)
case 999: try decoder.decodeSingularMessageField(value: &_storage._publicChatInfo)
default: break
}
@ -2126,7 +2263,7 @@ extension SessionProtos_DataMessage: SwiftProtobuf.Message, SwiftProtobuf._Messa
if let v = _storage._profile {
try visitor.visitSingularMessageField(value: v, fieldNumber: 101)
}
if let v = _storage._closedGroupUpdateV2 {
if let v = _storage._closedGroupControlMessage {
try visitor.visitSingularMessageField(value: v, fieldNumber: 104)
}
if let v = _storage._publicChatInfo {
@ -2152,7 +2289,7 @@ extension SessionProtos_DataMessage: SwiftProtobuf.Message, SwiftProtobuf._Messa
if _storage._contact != rhs_storage._contact {return false}
if _storage._preview != rhs_storage._preview {return false}
if _storage._profile != rhs_storage._profile {return false}
if _storage._closedGroupUpdateV2 != rhs_storage._closedGroupUpdateV2 {return false}
if _storage._closedGroupControlMessage != rhs_storage._closedGroupControlMessage {return false}
if _storage._publicChatInfo != rhs_storage._publicChatInfo {return false}
return true
}
@ -2833,8 +2970,8 @@ extension SessionProtos_DataMessage.LokiProfile: SwiftProtobuf.Message, SwiftPro
}
}
extension SessionProtos_DataMessage.ClosedGroupUpdateV2: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = SessionProtos_DataMessage.protoMessageName + ".ClosedGroupUpdateV2"
extension SessionProtos_DataMessage.ClosedGroupControlMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = SessionProtos_DataMessage.protoMessageName + ".ClosedGroupControlMessage"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "type"),
2: .same(proto: "publicKey"),
@ -2846,13 +2983,13 @@ extension SessionProtos_DataMessage.ClosedGroupUpdateV2: SwiftProtobuf.Message,
]
fileprivate class _StorageClass {
var _type: SessionProtos_DataMessage.ClosedGroupUpdateV2.TypeEnum? = nil
var _type: SessionProtos_DataMessage.ClosedGroupControlMessage.TypeEnum? = nil
var _publicKey: Data? = nil
var _name: String? = nil
var _encryptionKeyPair: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair? = nil
var _encryptionKeyPair: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair? = nil
var _members: [Data] = []
var _admins: [Data] = []
var _wrappers: [SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper] = []
var _wrappers: [SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper] = []
static let defaultInstance = _StorageClass()
@ -2930,7 +3067,7 @@ extension SessionProtos_DataMessage.ClosedGroupUpdateV2: SwiftProtobuf.Message,
try unknownFields.traverse(visitor: &visitor)
}
static func ==(lhs: SessionProtos_DataMessage.ClosedGroupUpdateV2, rhs: SessionProtos_DataMessage.ClosedGroupUpdateV2) -> Bool {
static func ==(lhs: SessionProtos_DataMessage.ClosedGroupControlMessage, rhs: SessionProtos_DataMessage.ClosedGroupControlMessage) -> Bool {
if lhs._storage !== rhs._storage {
let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in
let _storage = _args.0
@ -2951,7 +3088,7 @@ extension SessionProtos_DataMessage.ClosedGroupUpdateV2: SwiftProtobuf.Message,
}
}
extension SessionProtos_DataMessage.ClosedGroupUpdateV2.TypeEnum: SwiftProtobuf._ProtoNameProviding {
extension SessionProtos_DataMessage.ClosedGroupControlMessage.TypeEnum: SwiftProtobuf._ProtoNameProviding {
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "NEW"),
2: .same(proto: "UPDATE"),
@ -2963,8 +3100,8 @@ extension SessionProtos_DataMessage.ClosedGroupUpdateV2.TypeEnum: SwiftProtobuf.
]
}
extension SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = SessionProtos_DataMessage.ClosedGroupUpdateV2.protoMessageName + ".KeyPair"
extension SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = SessionProtos_DataMessage.ClosedGroupControlMessage.protoMessageName + ".KeyPair"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "publicKey"),
2: .same(proto: "privateKey"),
@ -2996,7 +3133,7 @@ extension SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair: SwiftProtobuf.M
try unknownFields.traverse(visitor: &visitor)
}
static func ==(lhs: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair, rhs: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair) -> Bool {
static func ==(lhs: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair, rhs: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPair) -> Bool {
if lhs._publicKey != rhs._publicKey {return false}
if lhs._privateKey != rhs._privateKey {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
@ -3004,8 +3141,8 @@ extension SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPair: SwiftProtobuf.M
}
}
extension SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = SessionProtos_DataMessage.ClosedGroupUpdateV2.protoMessageName + ".KeyPairWrapper"
extension SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = SessionProtos_DataMessage.ClosedGroupControlMessage.protoMessageName + ".KeyPairWrapper"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "publicKey"),
2: .same(proto: "encryptedKeyPair"),
@ -3037,7 +3174,7 @@ extension SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper: SwiftPro
try unknownFields.traverse(visitor: &visitor)
}
static func ==(lhs: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper, rhs: SessionProtos_DataMessage.ClosedGroupUpdateV2.KeyPairWrapper) -> Bool {
static func ==(lhs: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper, rhs: SessionProtos_DataMessage.ClosedGroupControlMessage.KeyPairWrapper) -> Bool {
if lhs._publicKey != rhs._publicKey {return false}
if lhs._encryptedKeyPair != rhs._encryptedKeyPair {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
@ -3087,6 +3224,182 @@ extension SessionProtos_ReceiptMessage.TypeEnum: SwiftProtobuf._ProtoNameProvidi
]
}
extension SessionProtos_SyncMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = _protobuf_package + ".SyncMessage"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "sent"),
8: .same(proto: "padding"),
]
fileprivate class _StorageClass {
var _sent: SessionProtos_SyncMessage.Sent? = nil
var _padding: Data? = nil
static let defaultInstance = _StorageClass()
private init() {}
init(copying source: _StorageClass) {
_sent = source._sent
_padding = source._padding
}
}
fileprivate mutating func _uniqueStorage() -> _StorageClass {
if !isKnownUniquelyReferenced(&_storage) {
_storage = _StorageClass(copying: _storage)
}
return _storage
}
public var isInitialized: Bool {
return withExtendedLifetime(_storage) { (_storage: _StorageClass) in
if let v = _storage._sent, !v.isInitialized {return false}
return true
}
}
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
_ = _uniqueStorage()
try withExtendedLifetime(_storage) { (_storage: _StorageClass) in
while let fieldNumber = try decoder.nextFieldNumber() {
switch fieldNumber {
case 1: try decoder.decodeSingularMessageField(value: &_storage._sent)
case 8: try decoder.decodeSingularBytesField(value: &_storage._padding)
default: break
}
}
}
}
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
try withExtendedLifetime(_storage) { (_storage: _StorageClass) in
if let v = _storage._sent {
try visitor.visitSingularMessageField(value: v, fieldNumber: 1)
}
if let v = _storage._padding {
try visitor.visitSingularBytesField(value: v, fieldNumber: 8)
}
}
try unknownFields.traverse(visitor: &visitor)
}
static func ==(lhs: SessionProtos_SyncMessage, rhs: SessionProtos_SyncMessage) -> Bool {
if lhs._storage !== rhs._storage {
let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in
let _storage = _args.0
let rhs_storage = _args.1
if _storage._sent != rhs_storage._sent {return false}
if _storage._padding != rhs_storage._padding {return false}
return true
}
if !storagesAreEqual {return false}
}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension SessionProtos_SyncMessage.Sent: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = SessionProtos_SyncMessage.protoMessageName + ".Sent"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "destination"),
2: .same(proto: "timestamp"),
3: .same(proto: "message"),
4: .same(proto: "expirationStartTimestamp"),
6: .same(proto: "isRecipientUpdate"),
]
fileprivate class _StorageClass {
var _destination: String? = nil
var _timestamp: UInt64? = nil
var _message: SessionProtos_DataMessage? = nil
var _expirationStartTimestamp: UInt64? = nil
var _isRecipientUpdate: Bool? = nil
static let defaultInstance = _StorageClass()
private init() {}
init(copying source: _StorageClass) {
_destination = source._destination
_timestamp = source._timestamp
_message = source._message
_expirationStartTimestamp = source._expirationStartTimestamp
_isRecipientUpdate = source._isRecipientUpdate
}
}
fileprivate mutating func _uniqueStorage() -> _StorageClass {
if !isKnownUniquelyReferenced(&_storage) {
_storage = _StorageClass(copying: _storage)
}
return _storage
}
public var isInitialized: Bool {
return withExtendedLifetime(_storage) { (_storage: _StorageClass) in
if let v = _storage._message, !v.isInitialized {return false}
return true
}
}
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
_ = _uniqueStorage()
try withExtendedLifetime(_storage) { (_storage: _StorageClass) in
while let fieldNumber = try decoder.nextFieldNumber() {
switch fieldNumber {
case 1: try decoder.decodeSingularStringField(value: &_storage._destination)
case 2: try decoder.decodeSingularUInt64Field(value: &_storage._timestamp)
case 3: try decoder.decodeSingularMessageField(value: &_storage._message)
case 4: try decoder.decodeSingularUInt64Field(value: &_storage._expirationStartTimestamp)
case 6: try decoder.decodeSingularBoolField(value: &_storage._isRecipientUpdate)
default: break
}
}
}
}
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
try withExtendedLifetime(_storage) { (_storage: _StorageClass) in
if let v = _storage._destination {
try visitor.visitSingularStringField(value: v, fieldNumber: 1)
}
if let v = _storage._timestamp {
try visitor.visitSingularUInt64Field(value: v, fieldNumber: 2)
}
if let v = _storage._message {
try visitor.visitSingularMessageField(value: v, fieldNumber: 3)
}
if let v = _storage._expirationStartTimestamp {
try visitor.visitSingularUInt64Field(value: v, fieldNumber: 4)
}
if let v = _storage._isRecipientUpdate {
try visitor.visitSingularBoolField(value: v, fieldNumber: 6)
}
}
try unknownFields.traverse(visitor: &visitor)
}
static func ==(lhs: SessionProtos_SyncMessage.Sent, rhs: SessionProtos_SyncMessage.Sent) -> Bool {
if lhs._storage !== rhs._storage {
let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in
let _storage = _args.0
let rhs_storage = _args.1
if _storage._destination != rhs_storage._destination {return false}
if _storage._timestamp != rhs_storage._timestamp {return false}
if _storage._message != rhs_storage._message {return false}
if _storage._expirationStartTimestamp != rhs_storage._expirationStartTimestamp {return false}
if _storage._isRecipientUpdate != rhs_storage._isRecipientUpdate {return false}
return true
}
if !storagesAreEqual {return false}
}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension SessionProtos_AttachmentPointer: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = _protobuf_package + ".AttachmentPointer"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [

View File

@ -14,9 +14,11 @@ message Envelope {
// @required
required Type type = 1;
optional string source = 2;
optional uint32 sourceDevice = 7;
// @required
optional uint64 timestamp = 5;
optional bytes content = 8;
optional uint64 serverTimestamp = 10;
}
message TypingMessage {
@ -33,9 +35,10 @@ message TypingMessage {
}
message Content {
optional DataMessage dataMessage = 1;
optional ReceiptMessage receiptMessage = 5;
optional TypingMessage typingMessage = 6;
optional DataMessage dataMessage = 1;
optional SyncMessage syncMessage = 2;
optional ReceiptMessage receiptMessage = 5;
optional TypingMessage typingMessage = 6;
}
message ClosedGroupCiphertextMessageWrapper {
@ -156,7 +159,7 @@ message DataMessage {
optional string profilePicture = 2;
}
message ClosedGroupUpdateV2 {
message ClosedGroupControlMessage {
enum Type {
NEW = 1; // publicKey, name, encryptionKeyPair, members, admins
@ -192,19 +195,19 @@ message DataMessage {
repeated KeyPairWrapper wrappers = 7;
}
optional string body = 1;
repeated AttachmentPointer attachments = 2;
optional GroupContext group = 3;
optional uint32 flags = 4;
optional uint32 expireTimer = 5;
optional bytes profileKey = 6;
optional uint64 timestamp = 7;
optional Quote quote = 8;
repeated Contact contact = 9;
repeated Preview preview = 10;
optional LokiProfile profile = 101;
optional ClosedGroupUpdateV2 closedGroupUpdateV2 = 104;
optional PublicChatInfo publicChatInfo = 999;
optional string body = 1;
repeated AttachmentPointer attachments = 2;
optional GroupContext group = 3;
optional uint32 flags = 4;
optional uint32 expireTimer = 5;
optional bytes profileKey = 6;
optional uint64 timestamp = 7;
optional Quote quote = 8;
repeated Contact contact = 9;
repeated Preview preview = 10;
optional LokiProfile profile = 101;
optional ClosedGroupControlMessage closedGroupControlMessage = 104;
optional PublicChatInfo publicChatInfo = 999;
}
message ReceiptMessage {
@ -219,6 +222,20 @@ message ReceiptMessage {
repeated uint64 timestamp = 2;
}
message SyncMessage {
message Sent {
optional string destination = 1;
optional uint64 timestamp = 2;
optional DataMessage message = 3;
optional uint64 expirationStartTimestamp = 4;
optional bool isRecipientUpdate = 6 [default = false];
}
optional Sent sent = 1;
optional bytes padding = 8;
}
message AttachmentPointer {
enum Flags {

View File

@ -11,7 +11,7 @@ extension MessageReceiver {
switch message {
case let message as ReadReceipt: handleReadReceipt(message, using: transaction)
case let message as TypingIndicator: handleTypingIndicator(message, using: transaction)
case let message as ClosedGroupUpdate: handleClosedGroupUpdateV2(message, using: transaction)
case let message as ClosedGroupControlMessage: handleClosedGroupControlMessage(message, using: transaction)
case let message as ExpirationTimerUpdate: handleExpirationTimerUpdate(message, using: transaction)
case let message as VisibleMessage: try handleVisibleMessage(message, associatedWithProto: proto, openGroupID: openGroupID, isBackgroundPoll: isBackgroundPoll, using: transaction)
default: fatalError()
@ -226,15 +226,19 @@ extension MessageReceiver {
return tsIncomingMessageID
}
private static func handleClosedGroupUpdateV2(_ message: ClosedGroupUpdate, using transaction: Any) {
private static func handleClosedGroupControlMessage(_ message: ClosedGroupControlMessage, using transaction: Any) {
switch message.kind! {
case .new: handleNewGroupV2(message, using: transaction)
case .update: handleGroupUpdateV2(message, using: transaction)
case .encryptionKeyPair: handleGroupEncryptionKeyPair(message, using: transaction)
case .new: handleNewClosedGroup(message, using: transaction)
case .update: handleClosedGroupUpdated(message, using: transaction)
case .encryptionKeyPair: handleClosedGroupEncryptionKeyPair(message, using: transaction)
case .nameChange: handleClosedGroupNameChanged(message, using: transaction)
case .usersAdded: handleClosedGroupMembersAdded(message, using: transaction)
case .usersRemoved: handleClosedGroupMembersRemoved(message, using: transaction)
case .userLeft: handleClosedGroupMemberLeft(message, using: transaction)
}
}
private static func handleNewGroupV2(_ message: ClosedGroupUpdate, using transaction: Any) {
private static func handleNewClosedGroup(_ message: ClosedGroupControlMessage, using transaction: Any) {
// Prepare
guard case let .new(publicKeyAsData, name, encryptionKeyPair, membersAsData, adminsAsData) = message.kind else { return }
let transaction = transaction as! YapDatabaseReadWriteTransaction
@ -264,7 +268,7 @@ extension MessageReceiver {
infoMessage.save(with: transaction)
}
private static func handleGroupUpdateV2(_ message: ClosedGroupUpdate, using transaction: Any) {
private static func handleClosedGroupUpdated(_ message: ClosedGroupControlMessage, using transaction: Any) {
// Prepare
guard case let .update(name, membersAsData) = message.kind else { return }
let transaction = transaction as! YapDatabaseReadWriteTransaction
@ -323,7 +327,7 @@ extension MessageReceiver {
}
}
private static func handleGroupEncryptionKeyPair(_ message: ClosedGroupUpdate, using transaction: Any) {
private static func handleClosedGroupEncryptionKeyPair(_ message: ClosedGroupControlMessage, using transaction: Any) {
// Prepare
guard case let .encryptionKeyPair(wrappers) = message.kind, let groupPublicKey = message.groupPublicKey else { return }
let transaction = transaction as! YapDatabaseReadWriteTransaction
@ -348,9 +352,9 @@ extension MessageReceiver {
return SNLog("Couldn't decrypt closed group encryption key pair.")
}
// Parse it
let proto: SNProtoDataMessageClosedGroupUpdateV2KeyPair
let proto: SNProtoDataMessageClosedGroupControlMessageKeyPair
do {
proto = try SNProtoDataMessageClosedGroupUpdateV2KeyPair.parseData(plaintext)
proto = try SNProtoDataMessageClosedGroupControlMessageKeyPair.parseData(plaintext)
} catch {
return SNLog("Couldn't parse closed group encryption key pair.")
}
@ -364,4 +368,20 @@ extension MessageReceiver {
Storage.shared.addClosedGroupEncryptionKeyPair(keyPair, for: groupPublicKey, using: transaction)
SNLog("Received a new closed group encryption key pair.")
}
private static func handleClosedGroupNameChanged(_ message: ClosedGroupControlMessage, using transaction: Any) {
}
private static func handleClosedGroupMembersAdded(_ message: ClosedGroupControlMessage, using transaction: Any) {
}
private static func handleClosedGroupMembersRemoved(_ message: ClosedGroupControlMessage, using transaction: Any) {
}
private static func handleClosedGroupMemberLeft(_ message: ClosedGroupControlMessage, using transaction: Any) {
}
}

View File

@ -109,7 +109,7 @@ public enum MessageReceiver {
let message: Message? = {
if let readReceipt = ReadReceipt.fromProto(proto) { return readReceipt }
if let typingIndicator = TypingIndicator.fromProto(proto) { return typingIndicator }
if let closedGroupUpdate = ClosedGroupUpdate.fromProto(proto) { return closedGroupUpdate }
if let closedGroupControlMessage = ClosedGroupControlMessage.fromProto(proto) { return closedGroupControlMessage }
if let expirationTimerUpdate = ExpirationTimerUpdate.fromProto(proto) { return expirationTimerUpdate }
if let visibleMessage = VisibleMessage.fromProto(proto) { return visibleMessage }
return nil

View File

@ -3,7 +3,7 @@ import SessionProtocolKit
extension MessageSender {
public static func createV2ClosedGroup(name: String, members: Set<String>, transaction: YapDatabaseReadWriteTransaction) -> Promise<TSGroupThread> {
public static func createClosedGroup(name: String, members: Set<String>, transaction: YapDatabaseReadWriteTransaction) -> Promise<TSGroupThread> {
// Prepare
var members = members
let userPublicKey = getUserHexEncodedPublicKey()
@ -27,10 +27,10 @@ extension MessageSender {
guard member != userPublicKey else { continue }
let thread = TSContactThread.getOrCreateThread(withContactId: member, transaction: transaction)
thread.save(with: transaction)
let closedGroupUpdateKind = ClosedGroupUpdate.Kind.new(publicKey: Data(hex: groupPublicKey), name: name,
let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: name,
encryptionKeyPair: encryptionKeyPair, members: membersAsData, admins: adminsAsData)
let closedGroupUpdate = ClosedGroupUpdate(kind: closedGroupUpdateKind)
let promise = MessageSender.sendNonDurably(closedGroupUpdate, in: thread, using: transaction)
let closedGroupControlMessage = ClosedGroupControlMessage(kind: closedGroupControlMessageKind)
let promise = MessageSender.sendNonDurably(closedGroupControlMessage, in: thread, using: transaction)
promises.append(promise)
}
// Add the group to the user's set of public keys to poll for
@ -46,7 +46,7 @@ extension MessageSender {
return when(fulfilled: promises).map2 { thread }
}
public static func updateV2(_ groupPublicKey: String, with members: Set<String>, name: String, transaction: YapDatabaseReadWriteTransaction) throws {
public static func update(_ groupPublicKey: String, with members: Set<String>, name: String, transaction: YapDatabaseReadWriteTransaction) throws {
// Prepare
let userPublicKey = getUserHexEncodedPublicKey()
let groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(groupPublicKey)
@ -81,9 +81,9 @@ extension MessageSender {
}
}
// Send the update to the group
let mainClosedGroupUpdate = ClosedGroupUpdate(kind: .update(name: name, members: membersAsData))
let mainClosedGroupControlMessage = ClosedGroupControlMessage(kind: .update(name: name, members: membersAsData))
if isUserLeaving {
let _ = MessageSender.sendNonDurably(mainClosedGroupUpdate, in: thread, using: transaction).done {
let _ = MessageSender.sendNonDurably(mainClosedGroupControlMessage, in: thread, using: transaction).done {
SNMessagingKitConfiguration.shared.storage.write { transaction in
// Remove the group from the database and unsubscribe from PNs
Storage.shared.removeAllClosedGroupEncryptionKeyPairs(for: groupPublicKey, using: transaction)
@ -92,7 +92,7 @@ extension MessageSender {
}
}
} else {
MessageSender.send(mainClosedGroupUpdate, in: thread, using: transaction)
MessageSender.send(mainClosedGroupControlMessage, in: thread, using: transaction)
// Generate and distribute a new encryption key pair if needed
if wasAnyUserRemoved && isCurrentUserAdmin {
try generateAndSendNewEncryptionKeyPair(for: groupPublicKey, to: members.subtracting(newMembers), using: transaction)
@ -101,10 +101,10 @@ extension MessageSender {
for member in newMembers {
let thread = TSContactThread.getOrCreateThread(withContactId: member, transaction: transaction)
thread.save(with: transaction)
let closedGroupUpdateKind = ClosedGroupUpdate.Kind.new(publicKey: Data(hex: groupPublicKey), name: name,
let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: name,
encryptionKeyPair: encryptionKeyPair, members: membersAsData, admins: adminsAsData)
let closedGroupUpdate = ClosedGroupUpdate(kind: closedGroupUpdateKind)
MessageSender.send(closedGroupUpdate, in: thread, using: transaction)
let closedGroupControlMessage = ClosedGroupControlMessage(kind: closedGroupControlMessageKind)
MessageSender.send(closedGroupControlMessage, in: thread, using: transaction)
}
}
// Update the group
@ -117,7 +117,7 @@ extension MessageSender {
}
@objc(leaveClosedGroupWithPublicKey:using:error:)
public static func leaveV2(_ groupPublicKey: String, using transaction: YapDatabaseReadWriteTransaction) throws {
public static func leave(_ groupPublicKey: String, using transaction: YapDatabaseReadWriteTransaction) throws {
let groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(groupPublicKey)
let threadID = TSGroupThread.threadId(fromGroupId: groupID)
guard let thread = TSGroupThread.fetch(uniqueId: threadID, transaction: transaction) else {
@ -133,7 +133,7 @@ extension MessageSender {
} else {
newMembers = [] // If the admin leaves the group is destroyed
}
return try updateV2(groupPublicKey, with: newMembers, name: group.groupName!, transaction: transaction)
return try update(groupPublicKey, with: newMembers, name: group.groupName!, transaction: transaction)
}
public static func generateAndSendNewEncryptionKeyPair(for groupPublicKey: String, to targetMembers: Set<String>, using transaction: Any) throws {
@ -152,15 +152,15 @@ extension MessageSender {
// Generate the new encryption key pair
let newKeyPair = Curve25519.generateKeyPair()
// Distribute it
let proto = try SNProtoDataMessageClosedGroupUpdateV2KeyPair.builder(publicKey: newKeyPair.publicKey,
let proto = try SNProtoDataMessageClosedGroupControlMessageKeyPair.builder(publicKey: newKeyPair.publicKey,
privateKey: newKeyPair.privateKey).build()
let plaintext = try proto.serializedData()
let wrappers = try targetMembers.compactMap { publicKey -> ClosedGroupUpdate.KeyPairWrapper in
let wrappers = try targetMembers.compactMap { publicKey -> ClosedGroupControlMessage.KeyPairWrapper in
let ciphertext = try MessageSender.encryptWithSessionProtocol(plaintext, for: publicKey)
return ClosedGroupUpdate.KeyPairWrapper(publicKey: publicKey, encryptedKeyPair: ciphertext)
return ClosedGroupControlMessage.KeyPairWrapper(publicKey: publicKey, encryptedKeyPair: ciphertext)
}
let closedGroupUpdate = ClosedGroupUpdate(kind: .encryptionKeyPair(wrappers))
let _ = MessageSender.sendNonDurably(closedGroupUpdate, in: thread, using: transaction).done { // FIXME: It'd be great if we could make this a durable operation
let closedGroupControlMessage = ClosedGroupControlMessage(kind: .encryptionKeyPair(wrappers))
let _ = MessageSender.sendNonDurably(closedGroupControlMessage, in: thread, using: transaction).done { // FIXME: It'd be great if we could make this a durable operation
// Store it * after * having sent out the message to the group
SNMessagingKitConfiguration.shared.storage.write { transaction in
Storage.shared.addClosedGroupEncryptionKeyPair(newKeyPair, for: groupPublicKey, using: transaction)

View File

@ -242,7 +242,7 @@ public final class MessageSender : NSObject {
storage.write(with: { transaction in
MessageSender.handleSuccessfulMessageSend(message, to: destination, using: transaction)
var shouldNotify = (message is VisibleMessage)
if let closedGroupUpdate = message as? ClosedGroupUpdate, case .new = closedGroupUpdate.kind {
if let closedGroupControlMessage = message as? ClosedGroupControlMessage, case .new = closedGroupControlMessage.kind {
shouldNotify = true
}
if shouldNotify {

View File

@ -15,10 +15,6 @@ typedef NS_ENUM(NSUInteger, OWSVerificationState) {
@class SNProtoVerified;
NSString *OWSVerificationStateToString(OWSVerificationState verificationState);
SNProtoVerified *_Nullable BuildVerifiedProtoWithRecipientId(NSString *destinationRecipientId,
NSData *identityKey,
OWSVerificationState verificationState,
NSUInteger paddingBytesLength);
@interface OWSRecipientIdentity : TSYapDatabaseObject

View File

@ -23,45 +23,6 @@ NSString *OWSVerificationStateToString(OWSVerificationState verificationState)
}
}
SNProtoVerifiedState OWSVerificationStateToProtoState(OWSVerificationState verificationState)
{
switch (verificationState) {
case OWSVerificationStateDefault:
return SNProtoVerifiedStateDefault;
case OWSVerificationStateVerified:
return SNProtoVerifiedStateVerified;
case OWSVerificationStateNoLongerVerified:
return SNProtoVerifiedStateUnverified;
}
}
SNProtoVerified *_Nullable BuildVerifiedProtoWithRecipientId(NSString *destinationRecipientId,
NSData *identityKey,
OWSVerificationState verificationState,
NSUInteger paddingBytesLength)
{
SNProtoVerifiedBuilder *verifiedBuilder = [SNProtoVerified builderWithDestination:destinationRecipientId];
verifiedBuilder.identityKey = identityKey;
verifiedBuilder.state = OWSVerificationStateToProtoState(verificationState);
if (paddingBytesLength > 0) {
// We add the same amount of padding in the VerificationStateSync message and it's coresponding NullMessage so
// that the sync message is indistinguishable from an outgoing Sent transcript corresponding to the NullMessage.
// We pad the NullMessage so as to obscure it's content. The sync message (like all sync messages) will be
// *additionally* padded by the superclass while being sent. The end result is we send a NullMessage of a
// non-distinct size, and a verification sync which is ~1-512 bytes larger then that.
verifiedBuilder.nullMessage = [Cryptography generateRandomBytes:paddingBytesLength];
}
NSError *error;
SNProtoVerified *_Nullable verifiedProto = [verifiedBuilder buildAndReturnError:&error];
if (error || !verifiedProto) {
return nil;
}
return verifiedProto;
}
@interface OWSRecipientIdentity ()
@property (atomic) OWSVerificationState verificationState;

View File

@ -45,15 +45,6 @@ NS_ASSUME_NONNULL_BEGIN
[dataMessageBuilder setProfileKey:self.localProfileKey.keyData];
}
+ (void)addLocalProfileKeyIfNecessary:(TSThread *)thread
recipientId:(NSString *)recipientId
callMessageBuilder:(SNProtoCallMessageBuilder *)callMessageBuilder
{
if ([self shouldMessageHaveLocalProfileKey:thread recipientId:recipientId]) {
[callMessageBuilder setProfileKey:self.localProfileKey.keyData];
}
}
@end
NS_ASSUME_NONNULL_END

View File

@ -53,10 +53,10 @@ public final class NotificationServiceExtension : UNNotificationServiceExtension
group.groupModel.groupType == .closedGroup { // Should always be true because we don't get PNs for open groups
senderDisplayName = String(format: NotificationStrings.incomingGroupMessageTitleFormat, senderDisplayName, group.groupModel.groupName ?? MessageStrings.newGroupDefaultTitle)
}
case let closedGroupUpdate as ClosedGroupUpdate:
case let closedGroupControlMessage as ClosedGroupControlMessage:
// TODO: We could consider actually handling the update here. Not sure if there's enough time though, seeing as though
// in some cases we need to send messages (e.g. our sender key) to a number of other users.
switch closedGroupUpdate.kind {
switch closedGroupControlMessage.kind {
case .new(_, let name, _, _, _): snippet = "\(senderDisplayName) added you to \(name)"
default: return self.handleFailure(for: notificationContent)
}