Revision 8358d691
ChatSecure/Classes/Controllers/XMPP/OTRXMPPManager.m | ||
---|---|---|
877 | 877 |
|
878 | 878 |
[self goOnline]; |
879 | 879 |
|
880 |
|
|
881 |
|
|
880 | 882 |
// Fetch latest vCard from server so we can update nickname |
881 | 883 |
//[self.xmppvCardTempModule fetchvCardTempForJID:self.JID ignoreStorage:YES]; |
882 | 884 |
|
883 |
// [self.messageStorage.archiving retrieveMessageArchiveWithFields:nil withResultSet:nil]; |
|
885 |
//NSDate *lastInteraction = OTRProtocolManager.shared.lastInteractionDate; |
|
886 |
[self.databaseConnection asyncReadWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) { |
|
887 |
OTRXMPPAccount *account = [self.account refetchWithTransaction:transaction]; |
|
888 |
[self.messageStorage.archiving fetchHistoryWithArchiveJID:nil userJID:nil since:account.lastHistoryFetchDate]; |
|
889 |
}]; |
|
890 |
//[self.messageStorage.archiving fetchHistoryWithArchiveJID:nil userJID:nil since:lastInteraction]; |
|
891 |
|
|
892 |
//[self.messageStorage.archiving retrieveMessageArchiveWithFields:nil withResultSet:nil]; |
|
884 | 893 |
} |
885 | 894 |
|
886 | 895 |
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error |
ChatSecure/Classes/Controllers/XMPP/Storage/MessageStorage.swift | ||
---|---|---|
39 | 39 |
self.capabilities = capabilities |
40 | 40 |
self.carbons = XMPPMessageCarbons(dispatchQueue: dispatchQueue) |
41 | 41 |
self.archiving = XMPPMessageArchiveManagement(dispatchQueue: dispatchQueue) |
42 |
self.archiving.resultAutomaticPagingPageSize = NSNotFound |
|
42 | 43 |
self.fileTransfer = fileTransfer |
43 | 44 |
super.init(dispatchQueue: dispatchQueue) |
44 | 45 |
self.carbons.addDelegate(self, delegateQueue: self.moduleQueue) |
... | ... | |
106 | 107 |
} |
107 | 108 |
|
108 | 109 |
/// It is a violation of the XMPP spec to discard messages with duplicate stanza elementIds. We must use XEP-0359 stanza-id only. |
109 |
private func isDuplicate(xmppMessage: XMPPMessage, stanzaId: String, buddyUniqueId: String, transaction: YapDatabaseReadTransaction) -> Bool {
|
|
110 |
private func isDuplicate(message: OTRBaseMessage, transaction: YapDatabaseReadTransaction) -> Bool {
|
|
110 | 111 |
var result = false |
111 |
transaction.enumerateMessages(elementId: nil, originId: nil, stanzaId: stanzaId) { (message, stop) in |
|
112 |
let buddyUniqueId = message.buddyUniqueId |
|
113 |
let oid = message.originId |
|
114 |
let sid = message.stanzaId |
|
115 |
if oid == nil, sid == nil { |
|
116 |
return false |
|
117 |
} |
|
118 |
transaction.enumerateMessages(elementId: nil, originId: oid, stanzaId: sid) { (message, stop) in |
|
112 | 119 |
if message.threadId == buddyUniqueId { |
113 | 120 |
result = true |
114 | 121 |
stop.pointee = true |
... | ... | |
156 | 163 |
} |
157 | 164 |
|
158 | 165 |
// Bail out if we receive duplicate messages identified by XEP-0359 |
159 |
if let stanzaId = message.stanzaId, |
|
160 |
self.isDuplicate(xmppMessage: xmppMessage, stanzaId: stanzaId, buddyUniqueId: buddy.uniqueId, transaction: transaction) { |
|
166 |
if self.isDuplicate(message: message, transaction: transaction) { |
|
161 | 167 |
DDLogWarn("Duplicate forwarded message received: \(xmppMessage)") |
162 | 168 |
return |
163 | 169 |
} |
... | ... | |
178 | 184 |
body: String?, |
179 | 185 |
accountId: String, |
180 | 186 |
preSave: PreSave? = nil) { |
181 |
var incomingMessage: OTRIncomingMessage? = nil |
|
187 |
//var incomingMessage: OTRIncomingMessage? = nil
|
|
182 | 188 |
connection.asyncReadWrite({ (transaction) in |
183 | 189 |
guard let account = OTRXMPPAccount.fetchObject(withUniqueID: accountId, transaction: transaction), |
184 | 190 |
let fromJID = message.from, |
... | ... | |
221 | 227 |
return |
222 | 228 |
} |
223 | 229 |
|
224 |
incomingMessage = OTRIncomingMessage(xmppMessage: message, body: body, account: account, buddy: buddy, capabilities: self.capabilities)
|
|
230 |
let incoming = OTRIncomingMessage(xmppMessage: message, body: body, account: account, buddy: buddy, capabilities: self.capabilities)
|
|
225 | 231 |
|
226 | 232 |
// Check for duplicates |
227 |
if let stanzaId = incomingMessage?.stanzaId, |
|
228 |
self.isDuplicate(xmppMessage: message, stanzaId: stanzaId, buddyUniqueId: buddy.uniqueId, transaction: transaction) { |
|
233 |
if self.isDuplicate(message: incoming, transaction: transaction) { |
|
229 | 234 |
DDLogWarn("Duplicate message received: \(message)") |
230 | 235 |
return |
231 | 236 |
} |
232 |
guard let incoming = incomingMessage, let text = incoming.text, text.count > 0 else {
|
|
237 |
guard let text = incoming.text, text.count > 0 else { |
|
233 | 238 |
// discard empty message text |
234 | 239 |
return |
235 | 240 |
} |
... | ... | |
297 | 302 |
} |
298 | 303 |
|
299 | 304 |
extension MessageStorage: XMPPMessageArchiveManagementDelegate { |
305 |
public func xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didFinishReceivingMessagesWith resultSet: XMPPResultSet) { |
|
306 |
connection.asyncReadWrite { (transaction) in |
|
307 |
guard let accountId = xmppMessageArchiveManagement.xmppStream?.accountId, |
|
308 |
let account = OTRXMPPAccount.fetchObject(withUniqueID: accountId, transaction: transaction)?.copyAsSelf() else { |
|
309 |
return |
|
310 |
} |
|
311 |
account.lastHistoryFetchDate = Date() |
|
312 |
account.save(with: transaction) |
|
313 |
} |
|
314 |
} |
|
315 |
|
|
300 | 316 |
public func xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didFailToReceiveMessages error: XMPPIQ) { |
301 | 317 |
DDLogError("Failed to receive messages \(error)") |
302 | 318 |
} |
ChatSecure/Classes/Controllers/XMPP/XMPPManager.swift | ||
---|---|---|
9 | 9 |
import Foundation |
10 | 10 |
import XMPPFramework |
11 | 11 |
|
12 |
extension XMPPMessageArchiveManagement { |
|
13 |
public func fetchHistory(archiveJID: XMPPJID? = nil, userJID: XMPPJID? = nil, since: Date? = nil) { |
|
12 |
public extension XMPPMessageArchiveManagement {
|
|
13 |
@objc public func fetchHistory(archiveJID: XMPPJID? = nil, userJID: XMPPJID? = nil, since: Date? = nil) {
|
|
14 | 14 |
var fields: [XMLElement] = [] |
15 | 15 |
|
16 | 16 |
if let userJID = userJID { |
... | ... | |
24 | 24 |
let start = XMPPMessageArchiveManagement.field(withVar: "start", type: nil, andValue: xmppDateString) |
25 | 25 |
fields.append(start) |
26 | 26 |
} |
27 |
retrieveMessageArchive(at: archiveJID, withFields: fields, with: nil) |
|
27 |
retrieveMessageArchive(at: archiveJID ?? xmppStream?.myJID?.bareJID, withFields: fields, with: nil)
|
|
28 | 28 |
} |
29 | 29 |
} |
30 | 30 |
|
ChatSecure/Classes/Model/Yap Storage/Accounts/OTRXMPPAccount.h | ||
---|---|---|
21 | 21 |
@property (nonatomic, strong, nullable) NSString *pushPubsubEndpoint; |
22 | 22 |
@property (nonatomic, strong, nullable) NSString *pushPubsubNode; |
23 | 23 |
|
24 |
/** For usage with MAM */ |
|
25 |
@property (nonatomic, strong, nullable) NSDate *lastHistoryFetchDate; |
|
26 |
|
|
24 | 27 |
+ (uint16_t)defaultPort; |
25 | 28 |
+ (NSString *)newResource; |
26 | 29 |
|
ChatSecure/Classes/View Controllers/OTRMessagesViewController.m | ||
---|---|---|
223 | 223 |
[self scrollToBottomAnimated:animated]; |
224 | 224 |
}); |
225 | 225 |
self.loadingMessages = NO; |
226 |
[self fetchMessageHistory]; |
|
227 | 226 |
} |
228 | 227 |
|
229 | 228 |
- (void)viewWillAppear:(BOOL)animated |
... | ... | |
323 | 322 |
|
324 | 323 |
#pragma - mark Setters & getters |
325 | 324 |
|
326 |
- (void) fetchMessageHistory { |
|
327 |
[self.readOnlyDatabaseConnection asyncReadWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) { |
|
328 |
id<OTRThreadOwner> thread = [self threadObjectWithTransaction:transaction]; |
|
329 |
OTRXMPPManager *xmpp = [self xmppManagerWithTransaction:transaction]; |
|
330 |
[xmpp fetchHistoryForThread:thread transaction:transaction]; |
|
331 |
}]; |
|
332 |
} |
|
333 |
|
|
334 | 325 |
- (OTRAttachmentPicker *)attachmentPicker |
335 | 326 |
{ |
336 | 327 |
if (!_attachmentPicker) { |
ChatSecure/Info.plist | ||
---|---|---|
15 | 15 |
<key>CFBundlePackageType</key> |
16 | 16 |
<string>APPL</string> |
17 | 17 |
<key>CFBundleShortVersionString</key> |
18 |
<string>4.2.2</string>
|
|
18 |
<string>4.3.0</string>
|
|
19 | 19 |
<key>CFBundleSignature</key> |
20 | 20 |
<string>????</string> |
21 | 21 |
<key>CFBundleURLTypes</key> |
... | ... | |
35 | 35 |
</dict> |
36 | 36 |
</array> |
37 | 37 |
<key>CFBundleVersion</key> |
38 |
<string>111</string>
|
|
38 |
<string>113</string>
|
|
39 | 39 |
<key>FacebookAppID</key> |
40 | 40 |
<string>447241325394334</string> |
41 | 41 |
<key>FacebookDisplayName</key> |
Submodules/XMPPFramework | ||
---|---|---|
1 |
Subproject commit f5f1cea4d4553fed05fe388a747c73398ca7568a |
|
1 |
Subproject commit b1a3bad5431020171d2c01fbd1b55dcb65876ce3 |
Also available in: Unified diff