@@ -808,41 +808,97 @@ void MainWindow::lockAllKeychains()
808
808
keychainModel->lockAllKeychains ();
809
809
}
810
810
811
- void MainWindow::setKeychainPassphrase ()
811
+ int MainWindow::setKeychainPassphrase (const QString& keychainName )
812
812
{
813
- if (!synchedVault.isVaultOpen ())
813
+ QString name;
814
+ bool bLocked;
815
+ bool bEncrypted;
816
+ if (keychainName.isEmpty ())
814
817
{
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
+ }
818
825
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 ();
825
831
}
832
+ else
833
+ {
834
+ if (!keychainModel->exists (keychainName))
835
+ {
836
+ showError (tr (" Keychain not found." ));
837
+ return QDialog::Rejected;
838
+ }
826
839
827
- int status = keychainModel->getStatus (row);
840
+ bLocked = keychainModel->isLocked (keychainName);
841
+ bEncrypted = keychainModel->isEncrypted (keychainName);
842
+
843
+ name = keychainName;
844
+ }
828
845
829
- if (status == KeychainModel::PUBLIC)
846
+ try
830
847
{
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. " );
834
851
835
- QStandardItem* nameItem = keychainModel->item (row, 0 );
836
- QString name = nameItem->text ();
852
+ if (bLocked && !unlockKeychain (name)) return QDialog::Rejected;
837
853
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)
841
894
{
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 ());
844
898
}
845
899
900
+ return QDialog::Rejected;
901
+
846
902
SetPassphraseDialog dlg (tr (" keychain \" " ) + name + " \" " , tr (" WARNING: IF YOU FORGET THIS PASSPHRASE THERE IS NO WAY TO RECOVER IT!!!" ), this );
847
903
while (dlg.exec ())
848
904
{
@@ -863,26 +919,26 @@ void MainWindow::setKeychainPassphrase()
863
919
864
920
if (QMessageBox::Yes == QMessageBox::question (this , tr (" Confirm" ), prompt))
865
921
{
866
- if (bLocked) { keychainModel->unlockKeychain (name); }
867
922
keychainModel->decryptKeychain (name);
868
923
if (bLocked) { keychainModel->lockKeychain (name); }
869
- return ;
924
+ return QDialog::Accepted ;
870
925
}
871
926
}
872
927
else
873
928
{
874
929
secure_bytes_t hash = passphraseHash (dlg.getPassphrase ().toStdString ());
875
- if (bLocked) { keychainModel->unlockKeychain (name); }
876
930
keychainModel->encryptKeychain (name, hash);
877
- keychainModel->lockKeychain (name);
878
- return ;
931
+ if (bLocked) { keychainModel->lockKeychain (name); }
932
+ return QDialog::Accepted ;
879
933
}
880
934
}
881
935
catch (const std::exception & e)
882
936
{
883
937
showError (e.what ());
884
938
}
885
939
}
940
+
941
+ return QDialog::Rejected;
886
942
}
887
943
888
944
int MainWindow::makeKeychainBackup (const QString& keychainName)
@@ -900,12 +956,11 @@ int MainWindow::makeKeychainBackup(const QString& keychainName)
900
956
901
957
if (!keychainModel->hasSeed (row))
902
958
{
903
- showError (tr (" Keychain does not contain seed ." ));
959
+ showError (tr (" Entropy seed for keychain is not known. Please use another backup format ." ));
904
960
return QDialog::Rejected;
905
961
}
906
962
907
- int status = keychainModel->getStatus (row);
908
- bLocked = status == KeychainModel::LOCKED;
963
+ bLocked = (keychainModel->getStatus (row) == KeychainModel::LOCKED);
909
964
910
965
QStandardItem* nameItem = keychainModel->item (row, 0 );
911
966
name = nameItem->data (Qt::DisplayRole).toString ();
@@ -918,6 +973,12 @@ int MainWindow::makeKeychainBackup(const QString& keychainName)
918
973
return QDialog::Rejected;
919
974
}
920
975
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
+
921
982
bLocked = keychainModel->isLocked (keychainName);
922
983
923
984
name = keychainName;
@@ -1214,7 +1275,7 @@ void MainWindow::updateCurrentKeychain(const QModelIndex& current, const QModelI
1214
1275
1215
1276
unlockKeychainAction->setEnabled (status == KeychainModel::LOCKED);
1216
1277
lockKeychainAction->setEnabled (status == KeychainModel::UNLOCKED);
1217
- setKeychainPassphraseAction->setEnabled (status == KeychainModel::UNLOCKED || (status == KeychainModel::LOCKED && !keychainModel-> isEncrypted (row)) );
1278
+ setKeychainPassphraseAction->setEnabled (status != KeychainModel::PUBLIC );
1218
1279
exportPrivateKeychainAction->setEnabled (status != KeychainModel::PUBLIC);
1219
1280
exportPublicKeychainAction->setEnabled (true );
1220
1281
viewPrivateBIP32Action->setEnabled (status != KeychainModel::PUBLIC);
0 commit comments