Further cleanup

pull/440/head
Niels Andriesse 3 years ago
parent b090227a2d
commit 7bb7edd3c0

@ -14,7 +14,7 @@ public final class ClosedGroupControlMessage : ControlMessage {
// MARK: Kind // MARK: Kind
public enum Kind : CustomStringConvertible { public enum Kind : CustomStringConvertible {
case new(publicKey: Data, name: String, encryptionKeyPair: ECKeyPair, members: [Data], admins: [Data], expireTimer: UInt32) case new(publicKey: Data, name: String, encryptionKeyPair: ECKeyPair, members: [Data], admins: [Data], expirationTimer: UInt32)
/// An encryption key pair encrypted for each member individually. /// An encryption key pair encrypted for each member individually.
/// ///
/// - Note: `publicKey` is only set when an encryption key pair is sent in a one-to-one context (i.e. not in a group). /// - Note: `publicKey` is only set when an encryption key pair is sent in a one-to-one context (i.e. not in a group).
@ -89,9 +89,9 @@ public final class ClosedGroupControlMessage : ControlMessage {
public override var isValid: Bool { public override var isValid: Bool {
guard super.isValid, let kind = kind else { return false } guard super.isValid, let kind = kind else { return false }
switch kind { switch kind {
case .new(let publicKey, let name, let encryptionKeyPair, let members, let admins, let expireTimer): case .new(let publicKey, let name, let encryptionKeyPair, let members, let admins, let expirationTimer):
return !publicKey.isEmpty && !name.isEmpty && !encryptionKeyPair.publicKey.isEmpty return !publicKey.isEmpty && !name.isEmpty && !encryptionKeyPair.publicKey.isEmpty
&& !encryptionKeyPair.privateKey.isEmpty && !members.isEmpty && !admins.isEmpty && expireTimer >= 0 && !encryptionKeyPair.privateKey.isEmpty && !members.isEmpty && !admins.isEmpty
case .encryptionKeyPair: return true case .encryptionKeyPair: return true
case .nameChange(let name): return !name.isEmpty case .nameChange(let name): return !name.isEmpty
case .membersAdded(let members): return !members.isEmpty case .membersAdded(let members): return !members.isEmpty
@ -112,8 +112,8 @@ public final class ClosedGroupControlMessage : ControlMessage {
let encryptionKeyPair = coder.decodeObject(forKey: "encryptionKeyPair") as? ECKeyPair, let encryptionKeyPair = coder.decodeObject(forKey: "encryptionKeyPair") as? ECKeyPair,
let members = coder.decodeObject(forKey: "members") as? [Data], let members = coder.decodeObject(forKey: "members") as? [Data],
let admins = coder.decodeObject(forKey: "admins") as? [Data] else { return nil } let admins = coder.decodeObject(forKey: "admins") as? [Data] else { return nil }
let expireTimer = coder.decodeObject(forKey: "expireTimer") as? UInt32 ?? 0 let expirationTimer = coder.decodeObject(forKey: "expirationTimer") as? UInt32 ?? 0
self.kind = .new(publicKey: publicKey, name: name, encryptionKeyPair: encryptionKeyPair, members: members, admins: admins, expireTimer: expireTimer) self.kind = .new(publicKey: publicKey, name: name, encryptionKeyPair: encryptionKeyPair, members: members, admins: admins, expirationTimer: expirationTimer)
case "encryptionKeyPair": case "encryptionKeyPair":
let publicKey = coder.decodeObject(forKey: "publicKey") as? Data let publicKey = coder.decodeObject(forKey: "publicKey") as? Data
guard let wrappers = coder.decodeObject(forKey: "wrappers") as? [KeyPairWrapper] else { return nil } guard let wrappers = coder.decodeObject(forKey: "wrappers") as? [KeyPairWrapper] else { return nil }
@ -139,14 +139,14 @@ public final class ClosedGroupControlMessage : ControlMessage {
super.encode(with: coder) super.encode(with: coder)
guard let kind = kind else { return } guard let kind = kind else { return }
switch kind { switch kind {
case .new(let publicKey, let name, let encryptionKeyPair, let members, let admins, let expireTimer): case .new(let publicKey, let name, let encryptionKeyPair, let members, let admins, let expirationTimer):
coder.encode("new", forKey: "kind") coder.encode("new", forKey: "kind")
coder.encode(publicKey, forKey: "publicKey") coder.encode(publicKey, forKey: "publicKey")
coder.encode(name, forKey: "name") coder.encode(name, forKey: "name")
coder.encode(encryptionKeyPair, forKey: "encryptionKeyPair") coder.encode(encryptionKeyPair, forKey: "encryptionKeyPair")
coder.encode(members, forKey: "members") coder.encode(members, forKey: "members")
coder.encode(admins, forKey: "admins") coder.encode(admins, forKey: "admins")
coder.encode(expireTimer, forKey: "expireTimer") coder.encode(expirationTimer, forKey: "expirationTimer")
case .encryptionKeyPair(let publicKey, let wrappers): case .encryptionKeyPair(let publicKey, let wrappers):
coder.encode("encryptionKeyPair", forKey: "kind") coder.encode("encryptionKeyPair", forKey: "kind")
coder.encode(publicKey, forKey: "publicKey") coder.encode(publicKey, forKey: "publicKey")
@ -175,11 +175,11 @@ public final class ClosedGroupControlMessage : ControlMessage {
case .new: case .new:
guard let publicKey = closedGroupControlMessageProto.publicKey, let name = closedGroupControlMessageProto.name, guard let publicKey = closedGroupControlMessageProto.publicKey, let name = closedGroupControlMessageProto.name,
let encryptionKeyPairAsProto = closedGroupControlMessageProto.encryptionKeyPair else { return nil } let encryptionKeyPairAsProto = closedGroupControlMessageProto.encryptionKeyPair else { return nil }
let expirationTimer = closedGroupControlMessageProto.expirationTimer
do { do {
let expireTimer = closedGroupControlMessageProto.expireTimer
let encryptionKeyPair = try ECKeyPair(publicKeyData: encryptionKeyPairAsProto.publicKey.removing05PrefixIfNeeded(), privateKeyData: encryptionKeyPairAsProto.privateKey) let encryptionKeyPair = try ECKeyPair(publicKeyData: encryptionKeyPairAsProto.publicKey.removing05PrefixIfNeeded(), privateKeyData: encryptionKeyPairAsProto.privateKey)
kind = .new(publicKey: publicKey, name: name, encryptionKeyPair: encryptionKeyPair, kind = .new(publicKey: publicKey, name: name, encryptionKeyPair: encryptionKeyPair,
members: closedGroupControlMessageProto.members, admins: closedGroupControlMessageProto.admins, expireTimer: expireTimer) members: closedGroupControlMessageProto.members, admins: closedGroupControlMessageProto.admins, expirationTimer: expirationTimer)
} catch { } catch {
SNLog("Couldn't parse key pair.") SNLog("Couldn't parse key pair.")
return nil return nil
@ -211,7 +211,7 @@ public final class ClosedGroupControlMessage : ControlMessage {
do { do {
let closedGroupControlMessage: SNProtoDataMessageClosedGroupControlMessage.SNProtoDataMessageClosedGroupControlMessageBuilder let closedGroupControlMessage: SNProtoDataMessageClosedGroupControlMessage.SNProtoDataMessageClosedGroupControlMessageBuilder
switch kind { switch kind {
case .new(let publicKey, let name, let encryptionKeyPair, let members, let admins, let expireTimer): case .new(let publicKey, let name, let encryptionKeyPair, let members, let admins, let expirationTimer):
closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .new) closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .new)
closedGroupControlMessage.setPublicKey(publicKey) closedGroupControlMessage.setPublicKey(publicKey)
closedGroupControlMessage.setName(name) closedGroupControlMessage.setName(name)
@ -224,7 +224,7 @@ public final class ClosedGroupControlMessage : ControlMessage {
} }
closedGroupControlMessage.setMembers(members) closedGroupControlMessage.setMembers(members)
closedGroupControlMessage.setAdmins(admins) closedGroupControlMessage.setAdmins(admins)
closedGroupControlMessage.setExpireTimer(expireTimer) closedGroupControlMessage.setExpirationTimer(expirationTimer)
case .encryptionKeyPair(let publicKey, let wrappers): case .encryptionKeyPair(let publicKey, let wrappers):
closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .encryptionKeyPair) closedGroupControlMessage = SNProtoDataMessageClosedGroupControlMessage.builder(type: .encryptionKeyPair)
if let publicKey = publicKey { if let publicKey = publicKey {

@ -1579,8 +1579,8 @@ extension SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper.SNProtoDataM
builder.setMembers(members) builder.setMembers(members)
builder.setAdmins(admins) builder.setAdmins(admins)
builder.setWrappers(wrappers) builder.setWrappers(wrappers)
if hasExpireTimer { if hasExpirationTimer {
builder.setExpireTimer(expireTimer) builder.setExpirationTimer(expirationTimer)
} }
return builder return builder
} }
@ -1643,8 +1643,8 @@ extension SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper.SNProtoDataM
proto.wrappers = wrappedItems.map { $0.proto } proto.wrappers = wrappedItems.map { $0.proto }
} }
@objc public func setExpireTimer(_ valueParam: UInt32) { @objc public func setExpirationTimer(_ valueParam: UInt32) {
proto.expireTimer = valueParam proto.expirationTimer = valueParam
} }
@objc public func build() throws -> SNProtoDataMessageClosedGroupControlMessage { @objc public func build() throws -> SNProtoDataMessageClosedGroupControlMessage {
@ -1692,11 +1692,11 @@ extension SNProtoDataMessageClosedGroupControlMessageKeyPairWrapper.SNProtoDataM
return proto.admins return proto.admins
} }
@objc public var expireTimer: UInt32 { @objc public var expirationTimer: UInt32 {
return proto.expireTimer return proto.expirationTimer
} }
@objc public var hasExpireTimer: Bool { @objc public var hasExpirationTimer: Bool {
return proto.hasExpireTimer return proto.hasExpirationTimer
} }
private init(proto: SessionProtos_DataMessage.ClosedGroupControlMessage, private init(proto: SessionProtos_DataMessage.ClosedGroupControlMessage,

File diff suppressed because it is too large Load Diff

@ -54,7 +54,7 @@ struct WebSocketProtos_WebSocketRequestMessage {
mutating func clearPath() {self._path = nil} mutating func clearPath() {self._path = nil}
var body: Data { var body: Data {
get {return _body ?? SwiftProtobuf.Internal.emptyData} get {return _body ?? Data()}
set {_body = newValue} set {_body = newValue}
} }
/// Returns true if `body` has been explicitly set. /// Returns true if `body` has been explicitly set.
@ -121,7 +121,7 @@ struct WebSocketProtos_WebSocketResponseMessage {
var headers: [String] = [] var headers: [String] = []
var body: Data { var body: Data {
get {return _body ?? SwiftProtobuf.Internal.emptyData} get {return _body ?? Data()}
set {_body = newValue} set {_body = newValue}
} }
/// Returns true if `body` has been explicitly set. /// Returns true if `body` has been explicitly set.
@ -234,12 +234,15 @@ extension WebSocketProtos_WebSocketRequestMessage: SwiftProtobuf.Message, SwiftP
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() { while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { switch fieldNumber {
case 1: try decoder.decodeSingularStringField(value: &self._verb) case 1: try { try decoder.decodeSingularStringField(value: &self._verb) }()
case 2: try decoder.decodeSingularStringField(value: &self._path) case 2: try { try decoder.decodeSingularStringField(value: &self._path) }()
case 3: try decoder.decodeSingularBytesField(value: &self._body) case 3: try { try decoder.decodeSingularBytesField(value: &self._body) }()
case 4: try decoder.decodeSingularUInt64Field(value: &self._requestID) case 4: try { try decoder.decodeSingularUInt64Field(value: &self._requestID) }()
case 5: try decoder.decodeRepeatedStringField(value: &self.headers) case 5: try { try decoder.decodeRepeatedStringField(value: &self.headers) }()
default: break default: break
} }
} }
@ -287,12 +290,15 @@ extension WebSocketProtos_WebSocketResponseMessage: SwiftProtobuf.Message, Swift
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() { while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { switch fieldNumber {
case 1: try decoder.decodeSingularUInt64Field(value: &self._requestID) case 1: try { try decoder.decodeSingularUInt64Field(value: &self._requestID) }()
case 2: try decoder.decodeSingularUInt32Field(value: &self._status) case 2: try { try decoder.decodeSingularUInt32Field(value: &self._status) }()
case 3: try decoder.decodeSingularStringField(value: &self._message) case 3: try { try decoder.decodeSingularStringField(value: &self._message) }()
case 4: try decoder.decodeSingularBytesField(value: &self._body) case 4: try { try decoder.decodeSingularBytesField(value: &self._body) }()
case 5: try decoder.decodeRepeatedStringField(value: &self.headers) case 5: try { try decoder.decodeRepeatedStringField(value: &self.headers) }()
default: break default: break
} }
} }
@ -338,10 +344,13 @@ extension WebSocketProtos_WebSocketMessage: SwiftProtobuf.Message, SwiftProtobuf
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() { while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { switch fieldNumber {
case 1: try decoder.decodeSingularEnumField(value: &self._type) case 1: try { try decoder.decodeSingularEnumField(value: &self._type) }()
case 2: try decoder.decodeSingularMessageField(value: &self._request) case 2: try { try decoder.decodeSingularMessageField(value: &self._request) }()
case 3: try decoder.decodeSingularMessageField(value: &self._response) case 3: try { try decoder.decodeSingularMessageField(value: &self._response) }()
default: break default: break
} }
} }

@ -111,7 +111,7 @@ message DataMessage {
message ClosedGroupControlMessage { message ClosedGroupControlMessage {
enum Type { enum Type {
NEW = 1; // publicKey, name, encryptionKeyPair, members, admins, expireTimer NEW = 1; // publicKey, name, encryptionKeyPair, members, admins, expirationTimer
ENCRYPTION_KEY_PAIR = 3; // publicKey, wrappers ENCRYPTION_KEY_PAIR = 3; // publicKey, wrappers
NAME_CHANGE = 4; // name NAME_CHANGE = 4; // name
MEMBERS_ADDED = 5; // members MEMBERS_ADDED = 5; // members
@ -135,7 +135,7 @@ message DataMessage {
repeated bytes members = 5; repeated bytes members = 5;
repeated bytes admins = 6; repeated bytes admins = 6;
repeated KeyPairWrapper wrappers = 7; repeated KeyPairWrapper wrappers = 7;
optional uint32 expireTimer = 8; optional uint32 expirationTimer = 8;
} }
optional string body = 1; optional string body = 1;

@ -208,7 +208,7 @@ extension MessageReceiver {
for closedGroup in message.closedGroups { for closedGroup in message.closedGroups {
guard !allClosedGroupPublicKeys.contains(closedGroup.publicKey) else { continue } guard !allClosedGroupPublicKeys.contains(closedGroup.publicKey) else { continue }
handleNewClosedGroup(groupPublicKey: closedGroup.publicKey, name: closedGroup.name, encryptionKeyPair: closedGroup.encryptionKeyPair, handleNewClosedGroup(groupPublicKey: closedGroup.publicKey, name: closedGroup.name, encryptionKeyPair: closedGroup.encryptionKeyPair,
members: [String](closedGroup.members), admins: [String](closedGroup.admins), expireTimer: 0, messageSentTimestamp: message.sentTimestamp!, using: transaction) members: [String](closedGroup.members), admins: [String](closedGroup.admins), expirationTimer: 0, messageSentTimestamp: message.sentTimestamp!, using: transaction)
} }
// Open groups // Open groups
for openGroupURL in message.openGroups { for openGroupURL in message.openGroups {
@ -368,15 +368,15 @@ extension MessageReceiver {
} }
private static func handleNewClosedGroup(_ message: ClosedGroupControlMessage, using transaction: Any) { private static func handleNewClosedGroup(_ message: ClosedGroupControlMessage, using transaction: Any) {
guard case let .new(publicKeyAsData, name, encryptionKeyPair, membersAsData, adminsAsData, expireTimer) = message.kind else { return } guard case let .new(publicKeyAsData, name, encryptionKeyPair, membersAsData, adminsAsData, expirationTimer) = message.kind else { return }
let groupPublicKey = publicKeyAsData.toHexString() let groupPublicKey = publicKeyAsData.toHexString()
let members = membersAsData.map { $0.toHexString() } let members = membersAsData.map { $0.toHexString() }
let admins = adminsAsData.map { $0.toHexString() } let admins = adminsAsData.map { $0.toHexString() }
handleNewClosedGroup(groupPublicKey: groupPublicKey, name: name, encryptionKeyPair: encryptionKeyPair, handleNewClosedGroup(groupPublicKey: groupPublicKey, name: name, encryptionKeyPair: encryptionKeyPair,
members: members, admins: admins, expireTimer: expireTimer, messageSentTimestamp: message.sentTimestamp!, using: transaction) members: members, admins: admins, expirationTimer: expirationTimer, messageSentTimestamp: message.sentTimestamp!, using: transaction)
} }
private static func handleNewClosedGroup(groupPublicKey: String, name: String, encryptionKeyPair: ECKeyPair, members: [String], admins: [String], expireTimer: UInt32, messageSentTimestamp: UInt64, using transaction: Any) { private static func handleNewClosedGroup(groupPublicKey: String, name: String, encryptionKeyPair: ECKeyPair, members: [String], admins: [String], expirationTimer: UInt32, messageSentTimestamp: UInt64, using transaction: Any) {
let transaction = transaction as! YapDatabaseReadWriteTransaction let transaction = transaction as! YapDatabaseReadWriteTransaction
// Create the group // Create the group
let groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(groupPublicKey) let groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(groupPublicKey)
@ -397,8 +397,8 @@ extension MessageReceiver {
let infoMessage = TSInfoMessage(timestamp: messageSentTimestamp, in: thread, messageType: .groupCreated) let infoMessage = TSInfoMessage(timestamp: messageSentTimestamp, in: thread, messageType: .groupCreated)
infoMessage.save(with: transaction) infoMessage.save(with: transaction)
} }
let isExpirationTimerEnabled = (expireTimer > 0) let isExpirationTimerEnabled = (expirationTimer > 0)
let expirationTimerDuration = (isExpirationTimerEnabled ? expireTimer : 24 * 60 * 60) let expirationTimerDuration = (isExpirationTimerEnabled ? expirationTimer : 24 * 60 * 60)
let configuration = OWSDisappearingMessagesConfiguration(threadId: thread.uniqueId!, enabled: isExpirationTimerEnabled, let configuration = OWSDisappearingMessagesConfiguration(threadId: thread.uniqueId!, enabled: isExpirationTimerEnabled,
durationSeconds: expirationTimerDuration) durationSeconds: expirationTimerDuration)
configuration.save(with: transaction) configuration.save(with: transaction)

@ -27,7 +27,7 @@ extension MessageSender {
let thread = TSContactThread.getOrCreateThread(withContactSessionID: member, transaction: transaction) let thread = TSContactThread.getOrCreateThread(withContactSessionID: member, transaction: transaction)
thread.save(with: transaction) thread.save(with: transaction)
let closedGroupControlMessageKind = ClosedGroupControlMessage.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, expireTimer: 0) encryptionKeyPair: encryptionKeyPair, members: membersAsData, admins: adminsAsData, expirationTimer: 0)
let closedGroupControlMessage = ClosedGroupControlMessage(kind: closedGroupControlMessageKind) let closedGroupControlMessage = ClosedGroupControlMessage(kind: closedGroupControlMessageKind)
// Sending this non-durably is okay because we show a loader to the user. If they close the app while the // Sending this non-durably is okay because we show a loader to the user. If they close the app while the
// loader is still showing, it's within expectation that the group creation might be incomplete. // loader is still showing, it's within expectation that the group creation might be incomplete.
@ -163,7 +163,7 @@ extension MessageSender {
let members = [String](Set(group.groupMemberIds).union(newMembers)) let members = [String](Set(group.groupMemberIds).union(newMembers))
let membersAsData = members.map { Data(hex: $0) } let membersAsData = members.map { Data(hex: $0) }
let adminsAsData = group.groupAdminIds.map { Data(hex: $0) } let adminsAsData = group.groupAdminIds.map { Data(hex: $0) }
let expireTimer = thread.disappearingMessagesDuration(with: transaction) let expirationTimer = thread.disappearingMessagesDuration(with: transaction)
guard let encryptionKeyPair = Storage.shared.getLatestClosedGroupEncryptionKeyPair(for: groupPublicKey) else { guard let encryptionKeyPair = Storage.shared.getLatestClosedGroupEncryptionKeyPair(for: groupPublicKey) else {
SNLog("Couldn't find encryption key pair for closed group: \(groupPublicKey).") SNLog("Couldn't find encryption key pair for closed group: \(groupPublicKey).")
return Promise(error: Error.noKeyPair) return Promise(error: Error.noKeyPair)
@ -176,7 +176,7 @@ extension MessageSender {
let thread = TSContactThread.getOrCreateThread(withContactSessionID: member, transaction: transaction) let thread = TSContactThread.getOrCreateThread(withContactSessionID: member, transaction: transaction)
thread.save(with: transaction) thread.save(with: transaction)
let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: group.groupName!, let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: group.groupName!,
encryptionKeyPair: encryptionKeyPair, members: membersAsData, admins: adminsAsData, expireTimer: expireTimer) encryptionKeyPair: encryptionKeyPair, members: membersAsData, admins: adminsAsData, expirationTimer: expirationTimer)
let closedGroupControlMessage = ClosedGroupControlMessage(kind: closedGroupControlMessageKind) let closedGroupControlMessage = ClosedGroupControlMessage(kind: closedGroupControlMessageKind)
MessageSender.send(closedGroupControlMessage, in: thread, using: transaction) MessageSender.send(closedGroupControlMessage, in: thread, using: transaction)
} }

Loading…
Cancel
Save