diff --git a/app/src/main/java/com/futo/polycentric/core/SqlLiteDbHelper.kt b/app/src/main/java/com/futo/polycentric/core/SqlLiteDbHelper.kt index 230484544111c4f54e9d184a916a21078d285205..52d0c2672b037f54848f959c480016fba63efc3a 100644 --- a/app/src/main/java/com/futo/polycentric/core/SqlLiteDbHelper.kt +++ b/app/src/main/java/com/futo/polycentric/core/SqlLiteDbHelper.kt @@ -19,44 +19,14 @@ class SqlLiteDbHelper : SQLiteOpenHelper { Log.w(TAG, "This is version 1, no DB to update") var currentVersion = oldVersion - if (oldVersion == 1 && newVersion == 2) { + if (oldVersion <= 1 && newVersion == 2) { deleteTables(db) createTables(db) currentVersion = 2 } if (currentVersion == 2 && newVersion == 3) { - val cursor = db.rawQuery("SELECT value FROM process_secrets", arrayOf()) - val secrets = arrayListOf<ProcessSecret>() - - cursor.use { - if (it.moveToFirst()) { - do { - val value = it.getBlob(0) - if (value != null) { - try { - val secret = ProcessSecret.fromProto(Protocol.StorageTypeProcessSecret.parseFrom(PEncryptionProviderV0.instance.decrypt(value))) - secrets.add(secret) - } catch (e: Throwable) { - Log.i(TAG, "Failed to convert secret, assuming it is V1 already and skipping", e) - } - } - } while (cursor.moveToNext()) - } - } - - db.beginTransaction(); - try { - for (secret in secrets) { - db.execSQL("DELETE FROM process_secrets WHERE public_key = ?", arrayOf(secret.system.publicKey.key.toBase64())) - val value = PEncryptionProviderV1.instance.encrypt(secret.toProto().toByteArray()) - db.execSQL("INSERT INTO process_secrets VALUES(?, ?)", arrayOf(secret.system.publicKey.key.toBase64(), value)) - } - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - + upgradeOldSecrets(db) currentVersion = 3 } @@ -86,6 +56,40 @@ class SqlLiteDbHelper : SQLiteOpenHelper { } } + fun upgradeOldSecrets(db: SQLiteDatabase) { + val cursor = db.rawQuery("SELECT value FROM process_secrets", arrayOf()) + val secrets = arrayListOf<ProcessSecret>() + + cursor.use { + if (it.moveToFirst()) { + do { + val value = it.getBlob(0) + if (value != null) { + try { + val secret = ProcessSecret.fromProto(Protocol.StorageTypeProcessSecret.parseFrom(PEncryptionProviderV0.instance.decrypt(value))) + Log.i(TAG, "Upgrading old secret system = ${secret.system.publicKey.key.toBase64()}") + secrets.add(secret) + } catch (e: Throwable) { + Log.i(TAG, "Failed to convert secret, assuming it is V1 already and skipping", e) + } + } + } while (cursor.moveToNext()) + } + } + + db.beginTransaction(); + try { + for (secret in secrets) { + db.execSQL("DELETE FROM process_secrets WHERE public_key = ?", arrayOf(secret.system.publicKey.key.toBase64())) + val value = PEncryptionProviderV1.instance.encrypt(secret.toProto().toByteArray()) + db.execSQL("INSERT INTO process_secrets VALUES(?, ?)", arrayOf(secret.system.publicKey.key.toBase64(), value)) + } + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + private fun createTables(db: SQLiteDatabase) { db.execSQL("CREATE TABLE system_states (public_key VARCHAR PRIMARY KEY, value BLOB)") db.execSQL("CREATE TABLE process_states (public_key_process VARCHAR PRIMARY KEY, value BLOB)")