Skip to content

Commit 5d01cae

Browse files
committed
Modified MainWindow::setKeychainPassphrase() to use the same query and unlocking mechanism as MainWindow::makeKeychainBackup().
1 parent 09cdcbd commit 5d01cae

File tree

2 files changed

+94
-33
lines changed

2 files changed

+94
-33
lines changed

src/mainwindow.cpp

+93-32
Original file line numberDiff line numberDiff line change
@@ -808,41 +808,97 @@ void MainWindow::lockAllKeychains()
808808
keychainModel->lockAllKeychains();
809809
}
810810

811-
void MainWindow::setKeychainPassphrase()
811+
int MainWindow::setKeychainPassphrase(const QString& keychainName)
812812
{
813-
if (!synchedVault.isVaultOpen())
813+
QString name;
814+
bool bLocked;
815+
bool bEncrypted;
816+
if (keychainName.isEmpty())
814817
{
815-
showError(tr("No vault is open."));
816-
return;
817-
}
818+
QModelIndex index = keychainSelectionModel->currentIndex();
819+
int row = index.row();
820+
if (row < 0)
821+
{
822+
showError(tr("No keychain is selected."));
823+
return QDialog::Rejected;
824+
}
818825

819-
QModelIndex index = keychainSelectionModel->currentIndex();
820-
int row = index.row();
821-
if (row < 0)
822-
{
823-
showError(tr("No keychain is selected."));
824-
return;
826+
bLocked = (keychainModel->getStatus(row) == KeychainModel::LOCKED);
827+
bEncrypted = keychainModel->isEncrypted(row);
828+
829+
QStandardItem* nameItem = keychainModel->item(row, 0);
830+
name = nameItem->data(Qt::DisplayRole).toString();
825831
}
832+
else
833+
{
834+
if (!keychainModel->exists(keychainName))
835+
{
836+
showError(tr("Keychain not found."));
837+
return QDialog::Rejected;
838+
}
826839

827-
int status = keychainModel->getStatus(row);
840+
bLocked = keychainModel->isLocked(keychainName);
841+
bEncrypted = keychainModel->isEncrypted(keychainName);
842+
843+
name = keychainName;
844+
}
828845

829-
if (status == KeychainModel::PUBLIC)
846+
try
830847
{
831-
showError(tr("Keychain is nonprivate."));
832-
return;
833-
}
848+
if (!synchedVault.isVaultOpen()) throw std::runtime_error("No vault is open.");
849+
CoinDB::VaultLock lock(synchedVault);
850+
if (!synchedVault.isVaultOpen()) throw std::runtime_error("No vault is open.");
834851

835-
QStandardItem* nameItem = keychainModel->item(row, 0);
836-
QString name = nameItem->text();
852+
if (bLocked && !unlockKeychain(name)) return QDialog::Rejected;
837853

838-
bool bLocked = status == KeychainModel::LOCKED;
839-
bool bEncrypted = keychainModel->isEncrypted(row);
840-
if (bLocked && bEncrypted)
854+
SetPassphraseDialog dlg(tr("keychain \"") + name + "\"", tr("WARNING: IF YOU FORGET THIS PASSPHRASE THERE IS NO WAY TO RECOVER IT!!!"), this);
855+
while (dlg.exec())
856+
{
857+
try
858+
{
859+
QString passphrase = dlg.getPassphrase();
860+
if (passphrase.isEmpty())
861+
{
862+
QString prompt(tr("You did not enter a passphrase."));
863+
if (bEncrypted)
864+
{
865+
prompt += tr(" Are you sure you want to remove keychain encryption from ") + name + "?";
866+
}
867+
else
868+
{
869+
prompt += tr(" Leave keychain ") + name + tr(" unencrypted?");
870+
}
871+
872+
if (QMessageBox::Yes == QMessageBox::question(this, tr("Confirm"), prompt))
873+
{
874+
keychainModel->decryptKeychain(name);
875+
if (bLocked) { lockKeychain(name); }
876+
return QDialog::Accepted;
877+
}
878+
}
879+
else
880+
{
881+
secure_bytes_t hash = passphraseHash(dlg.getPassphrase().toStdString());
882+
keychainModel->encryptKeychain(name, hash);
883+
if (bLocked) { lockKeychain(name); }
884+
return QDialog::Accepted;
885+
}
886+
}
887+
catch (const std::exception& e)
888+
{
889+
showError(e.what());
890+
}
891+
}
892+
}
893+
catch (const exception& e)
841894
{
842-
showError(tr("Keychain must first be unlocked."));
843-
return;
895+
LOGGER(error) << "MainWindow::setKeychainPassphrase - " << e.what() << std::endl;
896+
if (bLocked) { lockKeychain(name); }
897+
showError(e.what());
844898
}
845899

900+
return QDialog::Rejected;
901+
846902
SetPassphraseDialog dlg(tr("keychain \"") + name + "\"", tr("WARNING: IF YOU FORGET THIS PASSPHRASE THERE IS NO WAY TO RECOVER IT!!!"), this);
847903
while (dlg.exec())
848904
{
@@ -863,26 +919,26 @@ void MainWindow::setKeychainPassphrase()
863919

864920
if (QMessageBox::Yes == QMessageBox::question(this, tr("Confirm"), prompt))
865921
{
866-
if (bLocked) { keychainModel->unlockKeychain(name); }
867922
keychainModel->decryptKeychain(name);
868923
if (bLocked) { keychainModel->lockKeychain(name); }
869-
return;
924+
return QDialog::Accepted;
870925
}
871926
}
872927
else
873928
{
874929
secure_bytes_t hash = passphraseHash(dlg.getPassphrase().toStdString());
875-
if (bLocked) { keychainModel->unlockKeychain(name); }
876930
keychainModel->encryptKeychain(name, hash);
877-
keychainModel->lockKeychain(name);
878-
return;
931+
if (bLocked) { keychainModel->lockKeychain(name); }
932+
return QDialog::Accepted;
879933
}
880934
}
881935
catch (const std::exception& e)
882936
{
883937
showError(e.what());
884938
}
885939
}
940+
941+
return QDialog::Rejected;
886942
}
887943

888944
int MainWindow::makeKeychainBackup(const QString& keychainName)
@@ -900,12 +956,11 @@ int MainWindow::makeKeychainBackup(const QString& keychainName)
900956

901957
if (!keychainModel->hasSeed(row))
902958
{
903-
showError(tr("Keychain does not contain seed."));
959+
showError(tr("Entropy seed for keychain is not known. Please use another backup format."));
904960
return QDialog::Rejected;
905961
}
906962

907-
int status = keychainModel->getStatus(row);
908-
bLocked = status == KeychainModel::LOCKED;
963+
bLocked = (keychainModel->getStatus(row) == KeychainModel::LOCKED);
909964

910965
QStandardItem* nameItem = keychainModel->item(row, 0);
911966
name = nameItem->data(Qt::DisplayRole).toString();
@@ -918,6 +973,12 @@ int MainWindow::makeKeychainBackup(const QString& keychainName)
918973
return QDialog::Rejected;
919974
}
920975

976+
if (!keychainModel->hasSeed(keychainName))
977+
{
978+
showError(tr("Entropy seed for keychain is not known. Please use another backup format."));
979+
return QDialog::Rejected;
980+
}
981+
921982
bLocked = keychainModel->isLocked(keychainName);
922983

923984
name = keychainName;
@@ -1214,7 +1275,7 @@ void MainWindow::updateCurrentKeychain(const QModelIndex& current, const QModelI
12141275

12151276
unlockKeychainAction->setEnabled(status == KeychainModel::LOCKED);
12161277
lockKeychainAction->setEnabled(status == KeychainModel::UNLOCKED);
1217-
setKeychainPassphraseAction->setEnabled(status == KeychainModel::UNLOCKED || (status == KeychainModel::LOCKED && !keychainModel->isEncrypted(row)));
1278+
setKeychainPassphraseAction->setEnabled(status != KeychainModel::PUBLIC);
12181279
exportPrivateKeychainAction->setEnabled(status != KeychainModel::PUBLIC);
12191280
exportPublicKeychainAction->setEnabled(true);
12201281
viewPrivateBIP32Action->setEnabled(status != KeychainModel::PUBLIC);

src/mainwindow.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ private slots:
141141
bool unlockKeychain(QString name = QString());
142142
void lockKeychain(QString name = QString());
143143
void lockAllKeychains();
144-
void setKeychainPassphrase();
144+
int setKeychainPassphrase(const QString& keychainName = QString());
145145
int makeKeychainBackup(const QString& keychainName = QString());
146146
void importKeychain(QString fileName = QString());
147147
void exportKeychain(bool exportPrivate);

0 commit comments

Comments
 (0)