Moved contactPreKey and contactSignedPreKey to sql.

This commit is contained in:
Mikunj 2018-11-08 08:52:03 +11:00
parent 525007f944
commit 77602e3dbb
5 changed files with 301 additions and 137 deletions

View File

@ -43,6 +43,22 @@ module.exports = {
removeSignedPreKeyById,
removeAllSignedPreKeys,
createOrUpdateContactPreKey,
getContactPreKeyById,
getContactPreKeyByIdentityKey,
getContactPreKeys,
bulkAddContactPreKeys,
removeContactPreKeyById,
removeAllContactPreKeys,
createOrUpdateContactSignedPreKey,
getContactSignedPreKeyById,
getContactSignedPreKeyByIdentityKey,
getContactSignedPreKeys,
bulkAddContactSignedPreKeys,
removeContactSignedPreKeyById,
removeAllContactSignedPreKeys,
createOrUpdateItem,
getItemById,
getAllItems,
@ -419,6 +435,24 @@ async function updateToSchemaVersion6(currentVersion, instance) {
);`
);
await instance.run(
`CREATE TABLE contactPreKeys(
id INTEGER PRIMARY KEY ASC AUTO_INCREMENT,
keyId INTEGER,
identityKeyString STRING,
json TEXT
);`
);
await instance.run(
`CREATE TABLE contactSignedPreKeys(
id INTEGER PRIMARY KEY ASC AUTO_INCREMENT,
identityKeyString STRING,
keyId INTEGER,
json TEXT
);`
);
await instance.run('PRAGMA schema_version = 6;');
await instance.run('COMMIT TRANSACTION;');
console.log('updateToSchemaVersion6: success!');
@ -607,6 +641,113 @@ async function removeAllPreKeys() {
return removeAllFromTable(PRE_KEYS_TABLE);
}
const CONTACT_PRE_KEYS_TABLE = 'contactPreKeys';
async function createOrUpdateContactPreKey(data) {
const { keyId, identityKeyString } = data;
await db.run(
`INSERT OR REPLACE INTO ${CONTACT_PRE_KEYS_TABLE} (
keyId,
identityKeyString,
json
) values (
$keyId,
$identityKeyString,
$json
)`,
{
$keyId: keyId,
$identityKeyString: identityKeyString || '',
$json: objectToJSON(data),
}
);
}
async function getContactPreKeyById(id) {
return getById(CONTACT_PRE_KEYS_TABLE, id);
}
async function getContactPreKeyByIdentityKey(key) {
const row = await db.get(`SELECT * FROM ${CONTACT_PRE_KEYS_TABLE} WHERE identityKeyString = $identityKeyString;`, {
$identityKeyString: key,
});
if (!row) {
return null;
}
return jsonToObject(row.json);
}
async function getContactPreKeys(keyId, identityKeyString) {
const query = `SELECT * FROM ${CONTACT_PRE_KEYS_TABLE} WHERE identityKeyString = $identityKeyString AND keyId = $keyId;`;
const rows = await db.all(query, {
$keyId: keyId,
$identityKeyString: identityKeyString,
});
return map(rows, row => jsonToObject(row.json));
}
async function bulkAddContactPreKeys(array) {
return bulkAdd(CONTACT_PRE_KEYS_TABLE, array);
}
async function removeContactPreKeyById(id) {
return removeById(CONTACT_PRE_KEYS_TABLE, id);
}
async function removeAllContactPreKeys() {
return removeAllFromTable(CONTACT_PRE_KEYS_TABLE);
}
const CONTACT_SIGNED_PRE_KEYS_TABLE = 'contactSignedPreKeys';
async function createOrUpdateContactSignedPreKey(data) {
const { keyId, identityKeyString } = data;
await db.run(
`INSERT OR REPLACE INTO ${CONTACT_SIGNED_PRE_KEYS_TABLE} (
keyId,
identityKeyString,
json
) values (
$keyId,
$identityKeyString,
$json
)`,
{
$keyId: keyId,
$identityKeyString: identityKeyString || '',
$json: objectToJSON(data),
}
);
}
async function getContactSignedPreKeyById(id) {
return getById(CONTACT_SIGNED_PRE_KEYS_TABLE, id);
}
async function getContactSignedPreKeyByIdentityKey(key) {
const row = await db.get(`SELECT * FROM ${CONTACT_SIGNED_PRE_KEYS_TABLE} WHERE identityKeyString = $identityKeyString;`, {
$identityKeyString: key,
});
if (!row) {
return null;
}
return jsonToObject(row.json);
}
async function getContactSignedPreKeys(keyId, identityKeyString) {
const query = `SELECT * FROM ${CONTACT_SIGNED_PRE_KEYS_TABLE} WHERE identityKeyString = $identityKeyString AND keyId = $keyId;`;
const rows = await db.all(query, {
$keyId: keyId,
$identityKeyString: identityKeyString,
});
return map(rows, row => jsonToObject(row.json));
}
async function bulkAddContactSignedPreKeys(array) {
return bulkAdd(CONTACT_SIGNED_PRE_KEYS_TABLE, array);
}
async function removeContactSignedPreKeyById(id) {
return removeById(CONTACT_SIGNED_PRE_KEYS_TABLE, id);
}
async function removeAllContactSignedPreKeys() {
return removeAllFromTable(CONTACT_SIGNED_PRE_KEYS_TABLE);
}
const SIGNED_PRE_KEYS_TABLE = 'signedPreKeys';
async function createOrUpdateSignedPreKey(data) {
return createOrUpdate(SIGNED_PRE_KEYS_TABLE, data);

View File

@ -69,6 +69,23 @@ module.exports = {
removeSignedPreKeyById,
removeAllSignedPreKeys,
createOrUpdateContactPreKey,
getContactPreKeyById,
getContactPreKeyByIdentityKey,
getContactPreKeys,
getAllContactPreKeys,
bulkAddContactPreKeys,
removeContactPreKeyById,
removeAllContactPreKeys,
createOrUpdateContactSignedPreKey,
getContactSignedPreKeyById,
getContactSignedPreKeyByIdentityKey,
getContactSignedPreKeys,
bulkAddContactSignedPreKeys,
removeContactSignedPreKeyById,
removeAllContactSignedPreKeys,
createOrUpdateItem,
getItemById,
getAllItems,
@ -381,6 +398,10 @@ async function getPreKeyById(id) {
const data = await channels.getPreKeyById(id);
return keysToArrayBuffer(PRE_KEY_KEYS, data);
}
async function getPreKeyByRecipent(recipient) {
const data = await channels.getPreKeyByRecipent(recipient);
return keysToArrayBuffer(PRE_KEY_KEYS, data);
}
async function bulkAddPreKeys(array) {
const updated = map(array, data => keysFromArrayBuffer(PRE_KEY_KEYS, data));
await channels.bulkAddPreKeys(updated);
@ -418,6 +439,67 @@ async function removeAllSignedPreKeys() {
await channels.removeAllSignedPreKeys();
}
// Contact Pre Key
async function createOrUpdateContactPreKey(data) {
const updated = keysFromArrayBuffer(PRE_KEY_KEYS, data);
await channels.createOrUpdateContactPreKey(updated);
}
async function getContactPreKeyById(id) {
const data = await channels.getContactPreKeyById(id);
return keysToArrayBuffer(PRE_KEY_KEYS, data);
}
async function getContactPreKeyByIdentityKey(key) {
const data = await channels.getContactPreKeyByIdentityKey(key);
return keysToArrayBuffer(PRE_KEY_KEYS, data);
}
async function getContactPreKeys(keyId, identityKeyString) {
const keys = await channels.getContactPreKeys(keyId, identityKeyString);
return keys.map(k => keysToArrayBuffer(PRE_KEY_KEYS, data));
}
async function getAllContactPreKeys() {
const keys = await channels.getAllContactPreKeys();
return keys;
}
async function bulkAddContactPreKeys(array) {
const updated = map(array, data => keysFromArrayBuffer(PRE_KEY_KEYS, data));
await channels.bulkAddContactPreKeys(updated);
}
async function removeContactPreKeyById(id) {
await channels.removePreContactKeyById(id);
}
async function removeAllContactPreKeys() {
await channels.removeAllContactPreKeys();
}
// Contact Signed Pre Key
async function createOrUpdateContactSignedPreKey(data) {
const updated = keysFromArrayBuffer(PRE_KEY_KEYS, data);
await channels.createOrUpdateContactSignedPreKey(updated);
}
async function getContactSignedPreKeyById(id) {
const data = await channels.getContactSignedPreKeyById(id);
return keysToArrayBuffer(PRE_KEY_KEYS, data);
}
async function getContactSignedPreKeyByIdentityKey(key) {
const data = await channels.getContactSignedPreKeyByIdentityKey(key);
return keysToArrayBuffer(PRE_KEY_KEYS, data);
}
async function getContactSignedPreKeys(keyId, identityKeyString) {
const keys = await channels.getContactSignedPreKeys(keyId, identityKeyString);
return keys.map(k => keysToArrayBuffer(PRE_KEY_KEYS, data));
}
async function bulkAddContactSignedPreKeys(array) {
const updated = map(array, data => keysFromArrayBuffer(PRE_KEY_KEYS, data));
await channels.bulkAddContactSignedPreKeys(updated);
}
async function removeContactSignedPreKeyById(id) {
await channels.removePreContactSignedKeyById(id);
}
async function removeAllContactSignedPreKeys() {
await channels.removeAllContactSignedPreKeys();
}
// Items
const ITEM_KEYS = {

View File

@ -148,28 +148,6 @@
},
});
const Model = Backbone.Model.extend({ database: Whisper.Database });
const ContactPreKey = Model.extend({ storeName: 'contactPreKeys' });
const ContactPreKeyCollection = Backbone.Collection.extend({
storeName: 'contactPreKeys',
database: Whisper.Database,
model: ContactPreKey,
fetchBy(filter) {
return this.fetch({ conditions: filter });
},
});
const ContactSignedPreKey = Model.extend({
storeName: 'contactSignedPreKeys',
});
const ContactSignedPreKeyCollection = Backbone.Collection.extend({
storeName: 'contactSignedPreKeys',
database: Whisper.Database,
model: ContactSignedPreKey,
fetchBy(filter) {
return this.fetch({ conditions: filter });
},
});
function SignalProtocolStore() {}
SignalProtocolStore.prototype = {
@ -220,62 +198,47 @@
};
}
},
loadContactPreKey(pubKey) {
const prekey = new ContactPreKey({ identityKeyString: pubKey });
return new Promise(resolve => {
prekey.fetch().then(
() => {
window.log.info('Successfully fetched contact prekey:', pubKey);
resolve({
id: prekey.get('id'),
keyId: prekey.get('keyId'),
publicKey: prekey.get('publicKey'),
identityKeyString: prekey.get('identityKeyString'),
});
},
() => {
window.log.error('Failed to fetch contact prekey:', pubKey);
resolve();
}
);
});
async loadContactPreKey(pubKey) {
const preKey = await window.Signal.Data.getContactPreKeyByIdentityKey(pubKey);
if (preKey) {
return {
id: preKey.id,
keyId: preKey.keyId,
publicKey: preKey.publicKey,
identityKeyString: preKey.identityKeyString,
}
}
window.log.error('Failed to fetch contact prekey:', pubKey);
return undefined;
},
loadContactPreKeys(filters) {
const contactPreKeys = new ContactPreKeyCollection();
return new Promise((resolve, reject) => {
contactPreKeys
.fetchBy(filters)
.then(() => {
resolve(
contactPreKeys.map(prekey => ({
id: prekey.get('id'),
keyId: prekey.get('keyId'),
publicKey: prekey.get('publicKey'),
identityKeyString: prekey.get('identityKeyString'),
}))
);
})
.fail(e => {
window.log.error(
'Failed to fetch signed prekey with filters',
filters
);
reject(e);
});
});
async loadContactPreKeys(filters) {
const { keyId, identityKeyString } = filters;
const keys = await window.Signal.Data.getContactPreKeys(keyId, identityKeyString);
if (keys) {
return keys.map(preKey => ({
id: preKey.id,
keyId: preKey.keyId,
publicKey: preKey.publicKey,
identityKeyString: preKey.identityKeyString,
}));
}
window.log.error(
'Failed to fetch signed prekey with filters',
filters
);
return undefined;
},
storeContactPreKey(pubKey, preKey) {
const prekey = new ContactPreKey({
async storeContactPreKey(pubKey, preKey) {
const key = {
// id: (autoincrement)
identityKeyString: pubKey,
publicKey: preKey.publicKey,
keyId: preKey.keyId,
});
return new Promise(resolve => {
prekey.save().always(() => {
resolve();
});
});
};
await window.Signal.Data.createorUpdateContactPreKey(key);
},
async storePreKey(keyId, keyPair, contactIdentityKeyString) {
const data = {
@ -321,58 +284,42 @@
window.log.error('Failed to fetch signed prekey:', keyId);
return undefined;
},
loadContactSignedPreKeys(filters) {
const contactSignedPreKeys = new ContactSignedPreKeyCollection();
return new Promise((resolve, reject) => {
contactSignedPreKeys
.fetchBy(filters)
.then(() => {
resolve(
contactSignedPreKeys.map(prekey => ({
id: prekey.get('id'),
identityKeyString: prekey.get('identityKeyString'),
publicKey: prekey.get('publicKey'),
signature: prekey.get('signature'),
created_at: prekey.get('created_at'),
keyId: prekey.get('keyId'),
confirmed: prekey.get('confirmed'),
}))
);
})
.fail(e => {
window.log.error(
'Failed to fetch signed prekey with filters',
filters
);
reject(e);
});
});
async loadContactSignedPreKeys(filters) {
const { keyId, identityKeyString } = filters;
const keys = await window.Signal.Data.getContactSignedPreKeys(keyId, identityKeyString);
if (keys) {
return keys.map(preKey => ({
id: preKey.id,
identityKeyString: preKey.identityKeyString,
publicKey: preKey.publicKey,
signature: preKey.signature,
created_at: preKey.created_at,
keyId: preKey.keyId,
confirmed: preKey.confirmed,
}));
}
window.log.error(
'Failed to fetch contact signed prekey with filters',
filters
);
return undefined;
},
loadContactSignedPreKey(pubKey) {
const prekey = new ContactSignedPreKey({ identityKeyString: pubKey });
return new Promise(resolve => {
prekey
.fetch()
.then(() => {
window.log.info(
'Successfully fetched signed prekey:',
prekey.get('id')
);
resolve({
id: prekey.get('id'),
identityKeyString: prekey.get('identityKeyString'),
publicKey: prekey.get('publicKey'),
signature: prekey.get('signature'),
created_at: prekey.get('created_at'),
keyId: prekey.get('keyId'),
confirmed: prekey.get('confirmed'),
});
})
.fail(() => {
window.log.error('Failed to fetch signed prekey:', pubKey);
resolve();
});
});
async loadContactSignedPreKey(pubKey) {
const preKey = await window.Signal.Data.getContactSignedPreKeyByIdentityKey(pubKey);
if (preKey) {
return {
id: preKey.id,
identityKeyString: preKey.identityKeyString,
publicKey: preKey.publicKey,
signature: preKey.signature,
created_at: preKey.created_at,
keyId: preKey.keyId,
confirmed: preKey.confirmed,
};
}
window.log.error('Failed to fetch contact signed prekey:', pubKey);
return undefined;
},
async loadSignedPreKeys() {
if (arguments.length > 0) {
@ -400,8 +347,8 @@
};
await window.Signal.Data.createOrUpdateSignedPreKey(key);
},
storeContactSignedPreKey(pubKey, signedPreKey) {
const prekey = new ContactSignedPreKey({
async storeContactSignedPreKey(pubKey, signedPreKey) {
const key = {
// id: (autoincrement)
identityKeyString: pubKey,
keyId: signedPreKey.keyId,
@ -409,12 +356,8 @@
signature: signedPreKey.signature,
created_at: Date.now(),
confirmed: false,
});
return new Promise(resolve => {
prekey.save().always(() => {
resolve();
});
});
};
await window.Signal.Date.createorUpdateContactSignedPreKey(key);
},
async removeSignedPreKey(keyId) {
await window.Signal.Data.removeSignedPreKeyById(keyId);

View File

@ -132,7 +132,7 @@
});
const preKeyPromise = new Promise(async resolve => {
const existingPreKeys = textsecure.storage.protocol.loadContactPreKeys({
const existingPreKeys = await textsecure.storage.protocol.loadContactPreKeys({
identityKeyString: pubKey,
keyId: preKeyId,
});

View File

@ -1,4 +1,3 @@
<<<<<<< HEAD
/* global
textsecure,
libsignal,
@ -8,10 +7,9 @@
StringView,
dcodeIO,
log,
*/
=======
/* global textsecure, libsignal, window, btoa, _ */
>>>>>>> sig-development
btoa,
_
*/
/* eslint-disable more/no-then */