Закрытие области, когда область не может быть открыта из-за неправильного ключа шифрования - PullRequest
0 голосов
/ 04 февраля 2020

У нас есть процесс инициализации, который происходит, когда отображается экран spla sh. Часть этой инициализации включает в себя настройку Realm.

Мы используем шифрование для Realm и устанавливаем encryptionKey при построении с использованием RealmConfiguration.Builder(). Мы изменили как генерировать ключ шифрования, чтобы у пользователей, которые обновляют приложение, была база данных Realm, к которой больше нельзя получить доступ (из-за измененного ключа). Во время инициализации мы пытаемся открыть экземпляр Realm, и если происходит RealmFileException - Unable to open a realm at path: Realm file decryption failed, мы пытаемся удалить базу данных Realm. Некоторый код:

fun setupRealm() {  

    Realm.init(context)  

    val realmFileName = "mydb.realm"                                                               
    val key = EncryptDecryptHelper.loadKey(spHelper)                                                
    val version = 1L                                                                                

    val defaultConfig = RealmConfiguration.Builder().apply {                                         
        name(realmFileName)                                                                         
        encryptionKey(key)                                                                          
        schemaVersion(version)                                                                      
        deleteRealmIfMigrationNeeded()                                                                                                                                       
    }.build()                                                                                       
    Realm.setDefaultConfiguration(defaultConfig)

    try {                                                                                           
        Realm.getInstance(defaultConfig).close()                                                    
    } catch (exception: RealmFileException) {                                                       
        var instances = Realm.getGlobalInstanceCount(defaultConfig)                                 
        Log.d("Testing", "Instances $instances")                                                    
        RollbarHelper.logWarning("Failure while reading realm file", exception.toString(), spHelper)
        Realm.deleteRealm(Realm.getDefaultConfiguration()!!)                                        
    }                                                                                               
}   

Мы видим, что от наших пользователей поступают некоторые исключения:

java .lang.IllegalStateException: не разрешается удалять файл, связанный с открытое Царство. Не забудьте закрыть () все экземпляры Царства перед удалением его файла.

Это, конечно, указывает на строку Realm.deleteRealm(Realm.getDefaultConfiguration()!!) и предполагает, что экземпляры Царства необходимо закрыть перед удалением Царства. Тем не менее, этот блок выполняется только , если открытие Царства не удается , что означает, что Царство должно быть невозможно открыть.

Вопросы:

  1. Что может быть причиной IllegalStateException с, учитывая, что для Королевства должно быть невозможным открытие в этой точке, как описано выше?
  2. Можно ли проверить, действителен ли ключ шифрования до попытки открыть экземпляр Realm?
...