Delete session *before* sending EndSession message

Typically we're sending an EndSession message because our session has
diverged from the remote party's session. So if we send an EndSession
message, but decrypt it with our old out-of-sync session, how can we
expect them to be able to decrypt it?

Instead, by deleting the existing sessions, we'll fetch a new PreKey,
and start fresh with the remote side.

// FREEBIE
This commit is contained in:
Michael Kirk 2017-04-06 20:38:12 -04:00
parent 9d0c76ca56
commit d8ae941736
1 changed files with 18 additions and 12 deletions

View File

@ -25,12 +25,16 @@ class SessionResetJob: NSObject {
func run() { func run() {
Logger.info("\(TAG) Local user reset session.") Logger.info("\(TAG) Local user reset session.")
let endSessionMessage = EndSessionMessage(timestamp:NSDate.ows_millisecondTimeStamp(), in: thread) OWSDispatch.sessionStoreQueue().async {
self.storageManager.deleteAllSessions(forContact: self.recipientId)
DispatchQueue.main.async {
let endSessionMessage = EndSessionMessage(timestamp:NSDate.ows_millisecondTimeStamp(), in: self.thread)
self.messageSender.send(endSessionMessage, success: { self.messageSender.send(endSessionMessage, success: {
Logger.info("\(self.TAG) successfully sent EndSession<essage.") Logger.info("\(self.TAG) successfully sent EndSession<essage.")
Logger.info("\(self.TAG) deleting sessions for recipient: \(self.recipientId)") Logger.info("\(self.TAG) deleting sessions for recipient: \(self.recipientId)")
self.storageManager.deleteAllSessions(forContact: self.recipientId)
let message = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), let message = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(),
in: self.thread, in: self.thread,
@ -40,6 +44,8 @@ class SessionResetJob: NSObject {
Logger.error("\(self.TAG) failed to send EndSesionMessage with error: \(error.localizedDescription)") Logger.error("\(self.TAG) failed to send EndSesionMessage with error: \(error.localizedDescription)")
}) })
} }
}
}
class func run(contactThread: TSContactThread, messageSender: MessageSender, storageManager: TSStorageManager) { class func run(contactThread: TSContactThread, messageSender: MessageSender, storageManager: TSStorageManager) {
let job = self.init(recipientId: contactThread.contactIdentifier(), let job = self.init(recipientId: contactThread.contactIdentifier(),