Move Session Storage to indexedDB

pull/749/head
lilia 10 years ago
parent 20ebc3f890
commit 7eda48f755

@ -58,6 +58,7 @@
var Model = Backbone.Model.extend({ database: Whisper.Database }); var Model = Backbone.Model.extend({ database: Whisper.Database });
var PreKey = Model.extend({ storeName: 'preKeys' }); var PreKey = Model.extend({ storeName: 'preKeys' });
var SignedPreKey = Model.extend({ storeName: 'signedPreKeys' }); var SignedPreKey = Model.extend({ storeName: 'signedPreKeys' });
var Contact = Model.extend({ storeName: 'contacts' });
function AxolotlStore() {} function AxolotlStore() {}
@ -161,47 +162,54 @@
getSession: function(encodedNumber) { getSession: function(encodedNumber) {
if (encodedNumber === null || encodedNumber === undefined) if (encodedNumber === null || encodedNumber === undefined)
throw new Error("Tried to get session for undefined/null key"); throw new Error("Tried to get session for undefined/null key");
return Promise.resolve((function() { return new Promise(function(resolve) {
var number = textsecure.utils.unencodeNumber(encodedNumber)[0]; var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
var deviceId = textsecure.utils.unencodeNumber(encodedNumber)[1]; var deviceId = textsecure.utils.unencodeNumber(encodedNumber)[1];
var sessions = textsecure.storage.get("sessions" + number); var contact = new Contact({id: number});
if (sessions === undefined) contact.fetch().always(function() {
return undefined; var sessions = contact.get('sessions') || {};
if (sessions[deviceId] === undefined) resolve(sessions[deviceId]);
return undefined; });
return sessions[deviceId]; });
})());
}, },
putSession: function(encodedNumber, record) { putSession: function(encodedNumber, record) {
if (encodedNumber === null || encodedNumber === undefined) if (encodedNumber === null || encodedNumber === undefined)
throw new Error("Tried to put session for undefined/null key"); throw new Error("Tried to put session for undefined/null key");
var number = textsecure.utils.unencodeNumber(encodedNumber)[0]; return new Promise(function(resolve) {
var deviceId = textsecure.utils.unencodeNumber(encodedNumber)[1]; var number = textsecure.utils.unencodeNumber(encodedNumber)[0];
var deviceId = textsecure.utils.unencodeNumber(encodedNumber)[1];
var sessions = textsecure.storage.get("sessions" + number);
if (sessions === undefined) var contact = new Contact({id: number});
sessions = {}; contact.fetch().always(function() {
sessions[deviceId] = record; var sessions = contact.get('sessions') || {};
textsecure.storage.put("sessions" + number, sessions); sessions[deviceId] = record;
contact.save({sessions: sessions}).always(function() {
return textsecure.storage.devices.getDeviceObject(encodedNumber).then(function(device) { resolve(textsecure.storage.devices.getDeviceObject(encodedNumber).then(function(device) {
if (device === undefined) { if (device === undefined) {
return textsecure.storage.axolotl.getIdentityKey(number).then(function(identityKey) { return textsecure.storage.axolotl.getIdentityKey(number).then(function(identityKey) {
device = { encodedNumber: encodedNumber, device = { encodedNumber: encodedNumber,
//TODO: Remove this duplication //TODO: Remove this duplication
identityKey: identityKey identityKey: identityKey
}; };
return textsecure.storage.devices.saveDeviceObject(device); return textsecure.storage.devices.saveDeviceObject(device);
});
}
}));
}); });
} });
}); });
}, },
removeAllSessions: function(number) { removeAllSessions: function(number) {
if (number === null || number === undefined) if (number === null || number === undefined)
throw new Error("Tried to put session for undefined/null key"); throw new Error("Tried to put session for undefined/null key");
return Promise.resolve(textsecure.storage.remove("sessions" + number)); return new Promise(function(resolve) {
var contact = new Contact({id: number});
contact.fetch().then(function() {
contact.save({sessions: {}}).always(resolve);
});
});
}, },
getIdentityKey: function(identifier) { getIdentityKey: function(identifier) {
if (identifier === null || identifier === undefined) if (identifier === null || identifier === undefined)

@ -34,6 +34,8 @@
conversations.createIndex("group", "members", { unique: false, multiEntry: true }); conversations.createIndex("group", "members", { unique: false, multiEntry: true });
conversations.createIndex("type", "type", { unique: false }); conversations.createIndex("type", "type", { unique: false });
var contacts = transaction.db.createObjectStore('contacts');
var preKeys = transaction.db.createObjectStore("preKeys"); var preKeys = transaction.db.createObjectStore("preKeys");
var signedPreKeys = transaction.db.createObjectStore("signedPreKeys"); var signedPreKeys = transaction.db.createObjectStore("signedPreKeys");

@ -20,6 +20,7 @@ describe("AxolotlStore", function() {
before(function() { localStorage.clear(); }); before(function() { localStorage.clear(); });
var store = textsecure.storage.axolotl; var store = textsecure.storage.axolotl;
var identifier = '+5558675309'; var identifier = '+5558675309';
var another_identifier = '+5555590210';
var identityKey = { var identityKey = {
pubKey: textsecure.crypto.getRandomBytes(33), pubKey: textsecure.crypto.getRandomBytes(33),
privKey: textsecure.crypto.getRandomBytes(32), privKey: textsecure.crypto.getRandomBytes(32),

Loading…
Cancel
Save