diff --git a/js/crypto.js b/js/crypto.js index b88d3ab17..ba08268a1 100644 --- a/js/crypto.js +++ b/js/crypto.js @@ -401,6 +401,15 @@ window.textsecure.crypto = function() { session.indexInfo.closed = new Date().getTime(); } + self.closeOpenSessionForDevice = function(encodedNumber) { + var session = crypto_storage.getOpenSession(encodedNumber); + if (session === undefined) + return; + + closeSession(session); + crypto_storage.saveSession(encodedNumber, session); + } + var initSessionFromPreKeyWhisperMessage; var decryptWhisperMessage; var handlePreKeyWhisperMessage = function(from, encodedMessage) { @@ -570,7 +579,8 @@ window.textsecure.crypto = function() { var finalMessage = textsecure.protos.decodePushMessageContentProtobuf(getString(plaintext)); - if ((finalMessage.flags & 1) == 1) // END_SESSION + if ((finalMessage.flags & textsecure.protos.PushMessageContentProtobuf.Flags.END_SESSION) + == textsecure.protos.PushMessageContentProtobuf.Flags.END_SESSION) closeSession(session); crypto_storage.saveSession(encodedNumber, session, registrationId); diff --git a/js/sendmessage.js b/js/sendmessage.js index f9267dc68..45ece7f48 100644 --- a/js/sendmessage.js +++ b/js/sendmessage.js @@ -209,7 +209,20 @@ window.textsecure.messaging = function() { } self.closeSession = function(number) { - //TODO + var devices = textsecure.storage.devices.getDeviceObjectsForNumber(number); + for (i in devices) + textsecure.crypto.closeOpenSessionForDevice(devices[i].encodedNumber); + + return new Promise(function(resolve, reject) { + var proto = new textsecure.protos.PushMessageContentProtobuf(); + proto.flags = textsecure.protos.PushMessageContentProtobuf.Flags.END_SESSION; + sendMessageProto([number], proto, function(res) { + if (res.failure.length > 0) + reject(res.failure[0].error); + else + resolve(); + }); + }); } return self;