@@ -885,6 +885,68 @@ void MainWindow::setKeychainPassphrase()
885
885
}
886
886
}
887
887
888
+ int MainWindow::makeKeychainBackup (const QString& keychainName)
889
+ {
890
+ QString name;
891
+ bool bLocked;
892
+ if (keychainName.isEmpty ())
893
+ {
894
+ QModelIndex index = keychainSelectionModel->currentIndex ();
895
+ int row = index .row ();
896
+ if (row < 0 ) {
897
+ showError (tr (" No keychain is selected." ));
898
+ return QDialog::Rejected;
899
+ }
900
+
901
+ if (!keychainModel->hasSeed (row))
902
+ {
903
+ showError (tr (" Keychain does not contain seed." ));
904
+ return QDialog::Rejected;
905
+ }
906
+
907
+ int status = keychainModel->getStatus (row);
908
+ bLocked = status == KeychainModel::LOCKED;
909
+
910
+ QStandardItem* nameItem = keychainModel->item (row, 0 );
911
+ name = nameItem->data (Qt::DisplayRole).toString ();
912
+ }
913
+ else
914
+ {
915
+ if (!keychainModel->exists (keychainName))
916
+ {
917
+ showError (tr (" Keychain not found." ));
918
+ return QDialog::Rejected;
919
+ }
920
+
921
+ bLocked = keychainModel->isLocked (keychainName);
922
+
923
+ name = keychainName;
924
+ }
925
+
926
+ try
927
+ {
928
+ if (!synchedVault.isVaultOpen ()) throw std::runtime_error (" No vault is open." );
929
+ CoinDB::VaultLock lock (synchedVault);
930
+ if (!synchedVault.isVaultOpen ()) throw std::runtime_error (" No vault is open." );
931
+
932
+ if (bLocked && !unlockKeychain (name)) return QDialog::Rejected;
933
+
934
+ secure_bytes_t seed = synchedVault.getVault ()->exportBIP39 (name.toStdString ());
935
+
936
+ KeychainBackupWizard wizard (name, seed, this );
937
+ if (bLocked) { lockKeychain (name); }
938
+ return wizard.exec ();
939
+ }
940
+ catch (const exception & e)
941
+ {
942
+ LOGGER (error) << " MainWindow::makeKeychainBackup - " << e.what () << std::endl;
943
+ if (bLocked) { lockKeychain (name); }
944
+ showError (e.what ());
945
+ }
946
+
947
+ return QDialog::Rejected;
948
+ }
949
+
888
950
void MainWindow::importKeychain (QString fileName)
889
951
{
890
952
if (fileName.isEmpty ()) {
@@ -1136,39 +1198,6 @@ void MainWindow::viewBIP39()
1136
1198
}
1137
1199
}
1138
1200
1139
- void MainWindow::backupKeychain ()
1140
- {
1141
- QModelIndex index = keychainSelectionModel->currentIndex ();
1142
- int row = index .row ();
1143
- if (row < 0 ) {
1144
- showError (tr (" No keychain is selected." ));
1145
- return ;
1146
- }
1147
-
1148
- QStandardItem* nameItem = keychainModel->item (row, 0 );
1149
- QString name = nameItem->data (Qt::DisplayRole).toString ();
1150
-
1151
- try {
1152
- bytes_t extendedKey;
1153
-
1154
- if (keychainModel->isPrivate (name)) {
1155
- // TODO: prompt user for decryption key
1156
- extendedKey = keychainModel->getExtendedKeyBytes (name, true );
1157
- }
1158
- else {
1159
- extendedKey = keychainModel->getExtendedKeyBytes (name);
1160
- }
1161
-
1162
- KeychainBackupDialog dlg (tr (" Keychain information" ));
1163
- dlg.setExtendedKey (extendedKey);
1164
- dlg.exec ();
1165
- }
1166
- catch (const exception & e) {
1167
- LOGGER (debug) << " MainWindow::backupKeychain - " << e.what () << std::endl;
1168
- showError (e.what ());
1169
- }
1170
- }
1171
-
1172
1201
void MainWindow::updateCurrentKeychain (const QModelIndex& current, const QModelIndex& /* previous*/ )
1173
1202
{
1174
1203
int row = current.row ();
@@ -1178,11 +1207,10 @@ void MainWindow::updateCurrentKeychain(const QModelIndex& current, const QModelI
1178
1207
viewPrivateBIP32Action->setEnabled (false );
1179
1208
viewPublicBIP32Action->setEnabled (false );
1180
1209
viewBIP39Action->setEnabled (false );
1181
- backupKeychainAction->setEnabled (false );
1182
1210
}
1183
1211
else {
1184
1212
int status = keychainModel->getStatus (row);
1185
- bool hasSeed = keychainModel->hasSeed (row);
1213
+ bool hasSeed = keychainModel->hasSeed (row);
1186
1214
1187
1215
unlockKeychainAction->setEnabled (status == KeychainModel::LOCKED);
1188
1216
lockKeychainAction->setEnabled (status == KeychainModel::UNLOCKED);
@@ -1192,7 +1220,7 @@ void MainWindow::updateCurrentKeychain(const QModelIndex& current, const QModelI
1192
1220
viewPrivateBIP32Action->setEnabled (status != KeychainModel::PUBLIC);
1193
1221
viewPublicBIP32Action->setEnabled (true );
1194
1222
viewBIP39Action->setEnabled (status != KeychainModel::PUBLIC && hasSeed);
1195
- backupKeychainAction ->setEnabled (true );
1223
+ makeKeychainBackupAction ->setEnabled (status != KeychainModel::PUBLIC && hasSeed );
1196
1224
}
1197
1225
}
1198
1226
@@ -2084,6 +2112,11 @@ void MainWindow::createActions()
2084
2112
setKeychainPassphraseAction->setEnabled (false );
2085
2113
connect (setKeychainPassphraseAction, SIGNAL (triggered ()), this , SLOT (setKeychainPassphrase ()));
2086
2114
2115
+ makeKeychainBackupAction = new QAction (tr (" Make Keychain Backup..." ), this );
2116
+ makeKeychainBackupAction->setStatusTip (tr (" Open keychain backup wizard" ));
2117
+ makeKeychainBackupAction->setEnabled (false );
2118
+ connect (makeKeychainBackupAction, SIGNAL (triggered ()), this , SLOT (makeKeychainBackup ()));
2119
+
2087
2120
importPrivateAction = new QAction (tr (" Private Imports" ), this );
2088
2121
importPrivateAction->setCheckable (true );
2089
2122
importPrivateAction->setStatusTip (tr (" Import private keys if available" ));
@@ -2140,11 +2173,6 @@ void MainWindow::createActions()
2140
2173
viewBIP39Action->setEnabled (false );
2141
2174
connect (viewBIP39Action, SIGNAL (triggered ()), this , SLOT (viewBIP39 ()));
2142
2175
2143
- backupKeychainAction = new QAction (tr (" Backup Keychain..." ), this );
2144
- backupKeychainAction->setStatusTip (tr (" Make paper backup" ));
2145
- backupKeychainAction->setEnabled (false );
2146
- connect (backupKeychainAction, SIGNAL (triggered ()), this , SLOT (backupKeychain ()));
2147
-
2148
2176
// account actions
2149
2177
quickNewAccountAction = new QAction (QIcon (" :/icons/magicwand.png" ), tr (" Account &Wizard..." ), this );
2150
2178
quickNewAccountAction->setStatusTip (tr (" Create a new account, automatically create new keychains for it" ));
@@ -2354,6 +2382,9 @@ void MainWindow::createMenus()
2354
2382
keychainMenu->addAction (lockKeychainAction);
2355
2383
keychainMenu->addAction (lockAllKeychainsAction);
2356
2384
keychainMenu->addAction (setKeychainPassphraseAction);
2385
+ keychainMenu->addSeparator ();
2386
+ keychainMenu->addAction (makeKeychainBackupAction);
2387
+
2357
2388
/*
2358
2389
keychainMenu->addSeparator()->setText(tr("Import Mode"));
2359
2390
keychainMenu->addAction(importPrivateAction);
@@ -2377,10 +2408,6 @@ void MainWindow::createMenus()
2377
2408
2378
2409
keychainMenu->addSeparator ();
2379
2410
keychainMenu->addAction (quickNewAccountAction);
2380
- /*
2381
- keychainMenu->addSeparator();
2382
- keychainMenu->addAction(backupKeychainAction);
2383
- */
2384
2411
2385
2412
networkMenu = menuBar ()->addMenu (tr (" &Network" ));
2386
2413
networkMenu->addAction (connectAction);
0 commit comments