pull/370/head
Niels Andriesse 4 years ago
parent e2814fb884
commit 516f815521

@ -7,15 +7,15 @@ final class OpenGroupSuggestionGrid : UIView, UICollectionViewDataSource, UIColl
// MARK: UI Components
private lazy var layout: UICollectionViewFlowLayout = {
let result = UICollectionViewFlowLayout()
result.minimumLineSpacing = OpenGroupSuggestionGrid.separatorWidth
result.minimumInteritemSpacing = OpenGroupSuggestionGrid.separatorWidth
result.minimumLineSpacing = 0
result.minimumInteritemSpacing = 0
return result
}()
private lazy var collectionView: UICollectionView = {
let result = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
result.register(Cell.self, forCellWithReuseIdentifier: Cell.identifier)
result.backgroundColor = Colors.unimportant
result.backgroundColor = .clear
result.isScrollEnabled = false
result.dataSource = self
result.delegate = self
@ -61,7 +61,7 @@ final class OpenGroupSuggestionGrid : UIView, UICollectionViewDataSource, UIColl
// MARK: Layout
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: (maxWidth - (2 * OpenGroupSuggestionGrid.separatorWidth)) / 3, height: OpenGroupSuggestionGrid.cellHeight)
return CGSize(width: maxWidth / 3, height: OpenGroupSuggestionGrid.cellHeight)
}
// MARK: Data Source
@ -88,6 +88,7 @@ extension OpenGroupSuggestionGrid {
let result = UILabel()
result.textColor = Colors.text
result.font = .systemFont(ofSize: Values.smallFontSize)
result.lineBreakMode = .byTruncatingTail
return result
}()
@ -102,7 +103,6 @@ extension OpenGroupSuggestionGrid {
}
private func setUpViewHierarchy() {
backgroundColor = .white
addSubview(label)
label.center(in: self)
label.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor, constant: Values.smallSpacing).isActive = true

@ -7,7 +7,8 @@ extension Storage {
let transaction = transaction as! YapDatabaseReadWriteTransaction
var threadOrNil: TSThread?
if let openGroupID = openGroupID {
if let threadID = Storage.shared.getThreadID(for: openGroupID), let thread = TSGroupThread.fetch(uniqueId: threadID, transaction: transaction) {
if let threadID = Storage.shared.v2GetThreadID(for: openGroupID) ?? Storage.shared.getThreadID(for: openGroupID),
let thread = TSGroupThread.fetch(uniqueId: threadID, transaction: transaction) {
threadOrNil = thread
}
} else if let groupPublicKey = groupPublicKey {

@ -60,10 +60,12 @@ public final class OpenGroupAPIV2 : NSObject {
// MARK: Info
public struct Info {
public let id: String
public let name: String
public let imageID: String?
public init(name: String, imageID: String?) {
public init(id: String, name: String, imageID: String?) {
self.id = id
self.name = name
self.imageID = imageID
}
@ -279,25 +281,26 @@ public final class OpenGroupAPIV2 : NSObject {
// MARK: General
public static func getInfo(for room: String, on server: String) -> Promise<Info> {
let request = Request(verb: .get, room: room, server: server, endpoint: "rooms/\(room)")
return send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { json in
guard let name = json["name"] as? String else { throw Error.parsingFailed }
let imageID = json["image_id"] as? String
return Info(name: name, imageID: imageID)
let request = Request(verb: .get, room: room, server: server, endpoint: "rooms/\(room)", isAuthRequired: false)
let promise: Promise<Info> = send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { json in
guard let rawRoom = json["room"] as? JSON, let id = rawRoom["id"] as? String, let name = rawRoom["name"] as? String else { throw Error.parsingFailed }
let imageID = rawRoom["image_id"] as? String
return Info(id: id, name: name, imageID: imageID)
}
return promise
}
public static func getAllRooms(from server: String) -> Promise<[Info]> {
let request = Request(verb: .get, room: nil, server: server, endpoint: "rooms")
let request = Request(verb: .get, room: nil, server: server, endpoint: "rooms", isAuthRequired: false)
return send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { json in
guard let rawRooms = json["rooms"] as? [JSON] else { throw Error.parsingFailed }
let rooms: [Info] = rawRooms.compactMap { json in
guard let name = json["name"] as? String else {
guard let id = json["id"] as? String, let name = json["name"] as? String else {
SNLog("Couldn't parse room from JSON: \(json).")
return nil
}
let imageID = json["image_id"] as? String
return Info(name: name, imageID: imageID)
return Info(id: id, name: name, imageID: imageID)
}
return rooms
}

@ -33,6 +33,7 @@ public final class OpenGroupManagerV2 : NSObject {
let storage = Storage.shared
storage.removeLastMessageServerID(for: room, on: server, using: transaction)
storage.removeLastDeletionServerID(for: room, on: server, using: transaction)
storage.setOpenGroupPublicKey(for: server, to: publicKey, using: transaction)
let (promise, seal) = Promise<Void>.pending()
OpenGroupAPIV2.getInfo(for: room, on: server).done(on: DispatchQueue.global(qos: .default)) { info in
let openGroup = OpenGroupV2(server: server, room: room, name: info.name, imageID: info.imageID)

@ -2,6 +2,7 @@
public struct OpenGroupMessageV2 {
public let serverID: Int64?
public let sender: String?
public let sentTimestamp: UInt64
/// The serialized protobuf in base64 encoding.
public let base64EncodedData: String
/// When sending a message, the sender signs the serialized protobuf with their private key so that
@ -15,11 +16,12 @@ public struct OpenGroupMessageV2 {
SNLog("Failed to sign open group message.")
return nil
}
return OpenGroupMessageV2(serverID: serverID, sender: sender, base64EncodedData: base64EncodedData, base64EncodedSignature: signature.base64EncodedString())
return OpenGroupMessageV2(serverID: serverID, sender: sender, sentTimestamp: sentTimestamp,
base64EncodedData: base64EncodedData, base64EncodedSignature: signature.base64EncodedString())
}
public func toJSON() -> JSON? {
var result: JSON = [ "data" : base64EncodedData ]
var result: JSON = [ "data" : base64EncodedData, "timestamp" : sentTimestamp ]
if let serverID = serverID { result["server_id"] = serverID }
if let sender = sender { result["public_key"] = sender }
if let base64EncodedSignature = base64EncodedSignature { result["signature"] = base64EncodedSignature }
@ -27,10 +29,10 @@ public struct OpenGroupMessageV2 {
}
public static func fromJSON(_ json: JSON) -> OpenGroupMessageV2? {
guard let base64EncodedData = json["data"] as? String else { return nil }
guard let base64EncodedData = json["data"] as? String, let sentTimestamp = json["timestamp"] as? UInt64 else { return nil }
let serverID = json["server_id"] as? Int64
let sender = json["public_key"] as? String
let base64EncodedSignature = json["signature"] as? String
return OpenGroupMessageV2(serverID: serverID, sender: sender, base64EncodedData: base64EncodedData, base64EncodedSignature: base64EncodedSignature)
return OpenGroupMessageV2(serverID: serverID, sender: sender, sentTimestamp: sentTimestamp, base64EncodedData: base64EncodedData, base64EncodedSignature: base64EncodedSignature)
}
}

@ -5,6 +5,7 @@ public final class OpenGroupV2 : NSObject, NSCoding { // NSObject/NSCoding confo
@objc public let room: String
public let id: String
public let name: String
/// The ID with which the image can be retrieved from the server.
public let imageID: String?
public init(server: String, room: String, name: String, imageID: String?) {

@ -57,8 +57,8 @@ public enum MessageReceiver {
// If the message failed to process the first time around we retry it later (if the error is retryable). In this case the timestamp
// will already be in the database but we don't want to treat the message as a duplicate. The isRetry flag is a simple workaround
// for this issue.
guard !Set(storage.getReceivedMessageTimestamps(using: transaction)).contains(envelope.timestamp) || isRetry else { throw Error.duplicateMessage }
storage.addReceivedMessageTimestamp(envelope.timestamp, using: transaction)
// guard !Set(storage.getReceivedMessageTimestamps(using: transaction)).contains(envelope.timestamp) || isRetry else { throw Error.duplicateMessage }
// storage.addReceivedMessageTimestamp(envelope.timestamp, using: transaction)
// Decrypt the contents
guard let ciphertext = envelope.content else { throw Error.noData }
var plaintext: Data!

@ -335,7 +335,8 @@ public final class MessageSender : NSObject {
return promise
}
// Send the result
let openGroupMessage = OpenGroupMessageV2(serverID: nil, sender: nil, base64EncodedData: plaintext.base64EncodedString(), base64EncodedSignature: nil)
let openGroupMessage = OpenGroupMessageV2(serverID: nil, sender: nil, sentTimestamp: message.sentTimestamp!,
base64EncodedData: plaintext.base64EncodedString(), base64EncodedSignature: nil)
OpenGroupAPIV2.send(openGroupMessage, to: room, on: server).done(on: DispatchQueue.global(qos: .userInitiated)) { openGroupMessage in
message.openGroupServerMessageID = given(openGroupMessage.serverID) { UInt64($0) }
storage.write(with: { transaction in

@ -75,7 +75,7 @@ public final class OpenGroupPollerV2 : NSObject {
guard let data = Data(base64Encoded: message.base64EncodedData) else {
return SNLog("Ignoring open group message with invalid encoding.")
}
let envelope = SNProtoEnvelope.builder(type: .sessionMessage, timestamp: 0)
let envelope = SNProtoEnvelope.builder(type: .sessionMessage, timestamp: message.sentTimestamp)
envelope.setContent(data)
envelope.setSource(message.sender!) // Safe because messages with a nil sender are filtered out
let job = MessageReceiveJob(data: try! envelope.buildSerializedData(), openGroupMessageServerID: UInt64(message.serverID!), openGroupID: self.openGroup.id, isBackgroundPoll: isBackgroundPoll)

Loading…
Cancel
Save