diff --git a/components/password-prompt.js b/components/password-prompt.js index c2a246e..dec0b68 100644 --- a/components/password-prompt.js +++ b/components/password-prompt.js @@ -24,7 +24,7 @@ export default class PasswordPrompt extends Component { } async tryToOpenDb() { - const connected = await openDb({ persistConnection: true }) + const connected = await openDb() if (!connected) { this.setState({ showPasswordPrompt: true }) await saveEncryptionFlag(true) @@ -35,7 +35,7 @@ export default class PasswordPrompt extends Component { } passHashToDb = async hash => { - const connected = await openDb({ hash, persistConnection: true }) + const connected = await openDb(hash) if (!connected) { Alert.alert( shared.incorrectPassword, diff --git a/components/settings/password/check-current-password.js b/components/settings/password/check-current-password.js index 0a27487..7d60308 100644 --- a/components/settings/password/check-current-password.js +++ b/components/settings/password/check-current-password.js @@ -3,19 +3,18 @@ import { openDb } from '../../../db' import { shared } from '../../labels' export default async function checkPassword({hash, onCancel, onTryAgain }) { - const connected = await openDb({ hash, persistConnection: false }) - if (!connected) { - Alert.alert( - shared.incorrectPassword, - shared.incorrectPasswordMessage, - [{ - text: shared.cancel, - onPress: onCancel - }, { - text: shared.tryAgain, - onPress: onTryAgain - }] - ) - return false - } + const connected = await openDb(hash) + if (connected) return true + Alert.alert( + shared.incorrectPassword, + shared.incorrectPasswordMessage, + [{ + text: shared.cancel, + onPress: onCancel + }, { + text: shared.tryAgain, + onPress: onTryAgain + }] + ) + return false } \ No newline at end of file diff --git a/db/index.js b/db/index.js index 15523f6..2fcdc5a 100644 --- a/db/index.js +++ b/db/index.js @@ -10,14 +10,28 @@ let db let isMensesStart let getMensesDaysRightAfter -export async function openDb ({ hash, persistConnection }) { +export async function openDb (hash) { const realmConfig = {} if (hash) { realmConfig.encryptionKey = hashToInt8Array(hash) } // perform migrations if necessary, see https://realm.io/docs/javascript/2.8.0/#migrations + // we open the db temporarily, to get the schema version even if the db is encrypted + let tempConnection + try { + tempConnection = await Realm.open(realmConfig) + } catch(err) { + // wrong password provided + if (hash && err.toString().includes('decrypt')) return false + // tried to open without password, but is encrypted + if (!hash && err.toString().includes('Invalid mnemonic')) return false + + throw err + } + let nextSchemaIndex = Realm.schemaVersion(Realm.defaultPath) + tempConnection.close() while (nextSchemaIndex < schemas.length - 1) { const tempConfig = Object.assign( realmConfig, @@ -29,23 +43,15 @@ export async function openDb ({ hash, persistConnection }) { // open the Realm with the latest schema realmConfig.schema = schemas[schemas.length - 1] - let connection - try { - connection = await Realm.open(Object.assign( + const connection = await Realm.open(Object.assign( realmConfig, schemas[schemas.length - 1] )) - } catch(err) { - if (!err.toString().includes('decrypt')) throw err - return false - } - if (persistConnection) { - db = connection + db = connection const cycle = cycleModule() isMensesStart = cycle.isMensesStart getMensesDaysRightAfter = cycle.getMensesDaysRightAfter -} return true } @@ -197,6 +203,7 @@ export function requestHash(type, pw) { } export async function changeEncryptionAndRestartApp(hash) { + console.log('this runs') let key if (hash) key = hashToInt8Array(hash) const defaultPath = db.path @@ -221,7 +228,7 @@ export async function changeEncryptionAndRestartApp(hash) { export async function deleteDbAndOpenNew() { const exists = await fs.exists(Realm.defaultPath) if (exists) await fs.unlink(Realm.defaultPath) - await openDb({ persistConnection: true }) + await openDb() } function hashToInt8Array(hash) {