Move conversations to SQLCipher

This commit is contained in:
Scott Nonnenberg 2018-09-20 18:47:19 -07:00
parent 8cd3db0262
commit cd60bdd08a
31 changed files with 1354 additions and 774 deletions

View file

@ -1,15 +1,13 @@
/* global window, Whisper */
const Migrations0DatabaseWithAttachmentData = require('./migrations_0_database_with_attachment_data');
const Migrations1DatabaseWithoutAttachmentData = require('./migrations_1_database_without_attachment_data');
exports.getPlaceholderMigrations = () => {
const last0MigrationVersion = Migrations0DatabaseWithAttachmentData.getLatestVersion();
const last1MigrationVersion = Migrations1DatabaseWithoutAttachmentData.getLatestVersion();
const lastMigrationVersion = last1MigrationVersion || last0MigrationVersion;
return [
{
version: lastMigrationVersion,
version: last0MigrationVersion,
migrate() {
throw new Error(
'Unexpected invocation of placeholder migration!' +
@ -20,3 +18,18 @@ exports.getPlaceholderMigrations = () => {
},
];
};
exports.getCurrentVersion = () =>
new Promise((resolve, reject) => {
const request = window.indexedDB.open(Whisper.Database.id);
request.onerror = reject;
request.onupgradeneeded = reject;
request.onsuccess = () => {
const db = request.result;
const { version } = db;
return resolve(version);
};
});

View file

@ -1,22 +1,38 @@
/* global window */
const { last } = require('lodash');
const db = require('../database');
const settings = require('../settings');
const { runMigrations } = require('./run_migrations');
// IMPORTANT: Add new migrations that need to traverse entire database, e.g.
// messages store, below. Whenever we need this, we need to force attachment
// migration on startup:
const migrations = [
// {
// version: 0,
// migrate(transaction, next) {
// next();
// },
// },
// These are cleanup migrations, to be run after migration to SQLCipher
exports.migrations = [
{
version: 19,
migrate(transaction, next) {
window.log.info('Migration 19');
window.log.info(
'Removing messages, unprocessed, and conversations object stores'
);
// This should be run after things are migrated to SQLCipher
transaction.db.deleteObjectStore('messages');
transaction.db.deleteObjectStore('unprocessed');
transaction.db.deleteObjectStore('conversations');
next();
},
},
];
exports.run = async ({ Backbone, database, logger } = {}) => {
exports.run = async ({ Backbone, logger } = {}) => {
const database = {
id: 'signal',
nolog: true,
migrations: exports.migrations,
};
const { canRun } = await exports.getStatus({ database });
if (!canRun) {
throw new Error(
@ -24,7 +40,11 @@ exports.run = async ({ Backbone, database, logger } = {}) => {
);
}
await runMigrations({ Backbone, database, logger });
await runMigrations({
Backbone,
logger,
database,
});
};
exports.getStatus = async ({ database } = {}) => {
@ -32,7 +52,7 @@ exports.getStatus = async ({ database } = {}) => {
const isAttachmentMigrationComplete = await settings.isAttachmentMigrationComplete(
connection
);
const hasMigrations = migrations.length > 0;
const hasMigrations = exports.migrations.length > 0;
const canRun = isAttachmentMigrationComplete && hasMigrations;
return {
@ -43,7 +63,7 @@ exports.getStatus = async ({ database } = {}) => {
};
exports.getLatestVersion = () => {
const lastMigration = last(migrations);
const lastMigration = last(exports.migrations);
if (!lastMigration) {
return null;
}