mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2025-06-29 04:39:53 +00:00
* ios: additional db encryption UX * typo Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com> * fixes Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>
127 lines
4.2 KiB
Swift
127 lines
4.2 KiB
Swift
//
|
|
// DatabaseErrorView.swift
|
|
// SimpleX (iOS)
|
|
//
|
|
// Created by Evgeny on 04/09/2022.
|
|
// Copyright © 2022 SimpleX Chat. All rights reserved.
|
|
//
|
|
|
|
import SwiftUI
|
|
import SimpleXChat
|
|
|
|
struct DatabaseErrorView: View {
|
|
@EnvironmentObject var m: ChatModel
|
|
@State var status: DBMigrationResult
|
|
@State private var dbKey = ""
|
|
@State private var storedDBKey = getDatabaseKey()
|
|
@State private var useKeychain = storeDBPassphraseGroupDefault.get()
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 16) {
|
|
switch status {
|
|
case let .errorNotADatabase(dbFile):
|
|
if useKeychain && storedDBKey != nil && storedDBKey != "" {
|
|
Text("Wrong database passphrase").font(.title)
|
|
Text("Database passphrase is different from saved in the keychain.")
|
|
databaseKeyField(onSubmit: saveAndRunChat)
|
|
saveAndOpenButton()
|
|
Spacer()
|
|
Text("File: \(dbFile)")
|
|
} else {
|
|
Text("Encrypted database").font(.title)
|
|
Text("Database passphrase is required to open chat.")
|
|
if useKeychain {
|
|
databaseKeyField(onSubmit: saveAndRunChat)
|
|
saveAndOpenButton()
|
|
} else {
|
|
databaseKeyField(onSubmit: runChat)
|
|
openChatButton()
|
|
}
|
|
Spacer()
|
|
}
|
|
case let .error(dbFile, migrationError):
|
|
Text("Database error")
|
|
.font(.title)
|
|
Text("File: \(dbFile)")
|
|
Text("Error: \(migrationError)")
|
|
Spacer()
|
|
case .errorKeychain:
|
|
Text("Keychain error")
|
|
.font(.title)
|
|
Text("Cannot access keychain to save database password")
|
|
Spacer()
|
|
case let .unknown(json):
|
|
Text("Database error")
|
|
.font(.title)
|
|
Text("Unknown database error: \(json)")
|
|
Spacer()
|
|
case .ok:
|
|
EmptyView()
|
|
}
|
|
}
|
|
.padding()
|
|
.frame(maxHeight: .infinity)
|
|
}
|
|
|
|
private func databaseKeyField(onSubmit: @escaping () -> Void) -> some View {
|
|
DatabaseKeyField(key: $dbKey, placeholder: "Enter passphrase…", valid: validKey(dbKey), onSubmit: onSubmit)
|
|
}
|
|
|
|
private func saveAndOpenButton() -> some View {
|
|
Button("Save passphrase and open chat") {
|
|
saveAndRunChat()
|
|
}
|
|
}
|
|
|
|
private func openChatButton() -> some View {
|
|
Button("Open chat") {
|
|
runChat()
|
|
}
|
|
}
|
|
|
|
private func saveAndRunChat() {
|
|
if setDatabaseKey(dbKey) {
|
|
storeDBPassphraseGroupDefault.set(true)
|
|
initialRandomDBPassphraseGroupDefault.set(false)
|
|
}
|
|
runChat()
|
|
}
|
|
|
|
private func runChat() {
|
|
do {
|
|
try initializeChat(start: m.v3DBMigration.startChat, dbKey: dbKey)
|
|
if let s = m.chatDbStatus {
|
|
status = s
|
|
let am = AlertManager.shared
|
|
switch s {
|
|
case .errorNotADatabase:
|
|
am.showAlertMsg(
|
|
title: "Wrong passphrase!",
|
|
message: "Enter correct passphrase."
|
|
)
|
|
case .errorKeychain:
|
|
am.showAlertMsg(title: "Keychain error")
|
|
case let .error(_, error):
|
|
am.showAlert(Alert(
|
|
title: Text("Database error"),
|
|
message: Text(error)
|
|
))
|
|
case let .unknown(error):
|
|
am.showAlert(Alert(
|
|
title: Text("Unknown error"),
|
|
message: Text(error)
|
|
))
|
|
case .ok: ()
|
|
}
|
|
}
|
|
} catch let error {
|
|
logger.error("initializeChat \(responseError(error))")
|
|
}
|
|
}
|
|
}
|
|
|
|
struct DatabaseErrorView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
DatabaseErrorView(status: .errorNotADatabase(dbFile: "simplex_v1_chat.db"))
|
|
}
|
|
}
|