From: CryptoManiac Date: Fri, 20 Jun 2014 18:55:53 +0000 (+0400) Subject: Create wallet security menu X-Git-Tag: v0.4.4.6-nvc-update4~1^2~11 X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=2c2107310f7c2f50fbb257283f223ec9b7007f41 Create wallet security menu --- diff --git a/src/keystore.cpp b/src/keystore.cpp index e0cf805..18a3942 100644 --- a/src/keystore.cpp +++ b/src/keystore.cpp @@ -6,6 +6,8 @@ #include "keystore.h" #include "script.h" +extern bool fWalletUnlockMintOnly; + bool CKeyStore::GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const { CKey key; @@ -81,6 +83,7 @@ bool CCryptoKeyStore::Lock() { LOCK(cs_KeyStore); vMasterKey.clear(); + fWalletUnlockMintOnly = false; } NotifyStatusChanged(this); diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp index 1ae43c1..adaf0f4 100644 --- a/src/qt/askpassphrasedialog.cpp +++ b/src/qt/askpassphrasedialog.cpp @@ -8,6 +8,8 @@ #include #include +extern bool fWalletUnlockMintOnly; + AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : QDialog(parent), ui(new Ui::AskPassphraseDialog), @@ -34,6 +36,7 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : setWindowTitle(tr("Encrypt wallet")); break; case Unlock: // Ask passphrase + case UnlockMining: ui->warningLabel->setText(tr("This operation needs your wallet passphrase to unlock the wallet.")); ui->passLabel2->hide(); ui->passEdit2->hide(); @@ -149,6 +152,18 @@ void AskPassphraseDialog::accept() QDialog::accept(); // Success } break; + case UnlockMining: + if(!model->setWalletLocked(false, oldpass)) + { + QMessageBox::critical(this, tr("Wallet unlock failed"), + tr("The passphrase entered for the wallet decryption was incorrect.")); + } + else + { + QDialog::accept(); // Success + fWalletUnlockMintOnly = true; + } + break; case Decrypt: if(!model->setWalletEncrypted(false, oldpass)) { @@ -194,6 +209,7 @@ void AskPassphraseDialog::textChanged() acceptable = !ui->passEdit2->text().isEmpty() && !ui->passEdit3->text().isEmpty(); break; case Unlock: // Old passphrase x1 + case UnlockMining: case Decrypt: acceptable = !ui->passEdit1->text().isEmpty(); break; diff --git a/src/qt/askpassphrasedialog.h b/src/qt/askpassphrasedialog.h index b500ff4..5909fb6 100644 --- a/src/qt/askpassphrasedialog.h +++ b/src/qt/askpassphrasedialog.h @@ -17,10 +17,11 @@ class AskPassphraseDialog : public QDialog public: enum Mode { - Encrypt, /**< Ask passphrase twice and encrypt */ - Unlock, /**< Ask passphrase and unlock */ - ChangePass, /**< Ask old passphrase + new passphrase twice */ - Decrypt /**< Ask passphrase and decrypt wallet */ + Encrypt, /**< Ask passphrase twice and encrypt */ + Unlock, /**< Ask passphrase and unlock */ + UnlockMining, /**< Ask passphrase and unlock for mining */ + ChangePass, /**< Ask old passphrase + new passphrase twice */ + Decrypt /**< Ask passphrase and decrypt wallet */ }; explicit AskPassphraseDialog(Mode mode, QWidget *parent = 0); diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 3979b90..0ef3edf 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -58,11 +58,16 @@ #include +extern bool fWalletUnlockMintOnly; + BitcoinGUI::BitcoinGUI(QWidget *parent): QMainWindow(parent), clientModel(0), walletModel(0), encryptWalletAction(0), + lockWalletAction(0), + unlockWalletAction(0), + unlockWalletMiningAction(0), changePassphraseAction(0), aboutQtAction(0), trayIcon(0), @@ -265,6 +270,18 @@ void BitcoinGUI::createActions() signMessageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message..."), this); verifyMessageAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Verify message..."), this); + lockWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Lock wallet"), this); + lockWalletAction->setToolTip(tr("Lock wallet")); + lockWalletAction->setCheckable(true); + + unlockWalletAction = new QAction(QIcon(":/icons/lock_open"), tr("Unlo&ck wallet"), this); + unlockWalletAction->setToolTip(tr("Unlock wallet")); + unlockWalletAction->setCheckable(true); + + unlockWalletMiningAction = new QAction(QIcon(":/icons/mining_active"), tr("Unlo&ck wallet for mining"), this); + unlockWalletMiningAction->setToolTip(tr("Unlock wallet for mining")); + unlockWalletMiningAction->setCheckable(true); + exportAction = new QAction(QIcon(":/icons/export"), tr("&Export..."), this); exportAction->setToolTip(tr("Export the data in the current tab to a file")); openRPCConsoleAction = new QAction(QIcon(":/icons/debugwindow"), tr("&Debug window"), this); @@ -276,6 +293,9 @@ void BitcoinGUI::createActions() connect(optionsAction, SIGNAL(triggered()), this, SLOT(optionsClicked())); connect(toggleHideAction, SIGNAL(triggered()), this, SLOT(toggleHidden())); connect(encryptWalletAction, SIGNAL(triggered(bool)), this, SLOT(encryptWallet(bool))); + connect(lockWalletAction, SIGNAL(triggered(bool)), this, SLOT(lockWallet())); + connect(unlockWalletAction, SIGNAL(triggered(bool)), this, SLOT(unlockWallet())); + connect(unlockWalletMiningAction, SIGNAL(triggered(bool)), this, SLOT(unlockWalletMining(bool))); connect(backupWalletAction, SIGNAL(triggered()), this, SLOT(backupWallet())); connect(dumpWalletAction, SIGNAL(triggered()), this, SLOT(dumpWallet())); connect(importWalletAction, SIGNAL(triggered()), this, SLOT(importWallet())); @@ -307,8 +327,12 @@ void BitcoinGUI::createMenuBar() file->addAction(quitAction); QMenu *settings = appMenuBar->addMenu(tr("&Settings")); - settings->addAction(encryptWalletAction); - settings->addAction(changePassphraseAction); + QMenu *securityMenu = settings->addMenu(QIcon(":/icons/key"), tr("&Wallet security")); + securityMenu->addAction(encryptWalletAction); + securityMenu->addAction(changePassphraseAction); + securityMenu->addAction(unlockWalletAction); + securityMenu->addAction(unlockWalletMiningAction); + securityMenu->addAction(lockWalletAction); settings->addSeparator(); settings->addAction(optionsAction); @@ -905,6 +929,9 @@ void BitcoinGUI::setEncryptionStatus(int status) labelEncryptionIcon->hide(); encryptWalletAction->setChecked(false); changePassphraseAction->setEnabled(false); + lockWalletAction->setEnabled(false); + unlockWalletAction->setEnabled(false); + unlockWalletMiningAction->setEnabled(false); encryptWalletAction->setEnabled(true); break; case WalletModel::Unlocked: @@ -914,6 +941,17 @@ void BitcoinGUI::setEncryptionStatus(int status) encryptWalletAction->setChecked(true); changePassphraseAction->setEnabled(true); encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + + lockWalletAction->setEnabled(true); + lockWalletAction->setChecked(false); + unlockWalletAction->setEnabled(false); + unlockWalletMiningAction->setEnabled(false); + + if (fWalletUnlockMintOnly) + unlockWalletMiningAction->setEnabled(true); + else + unlockWalletAction->setChecked(true); + break; case WalletModel::Locked: labelEncryptionIcon->show(); @@ -922,6 +960,14 @@ void BitcoinGUI::setEncryptionStatus(int status) encryptWalletAction->setChecked(true); changePassphraseAction->setEnabled(true); encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + + lockWalletAction->setChecked(true); + unlockWalletAction->setChecked(false); + unlockWalletMiningAction->setChecked(false); + + lockWalletAction->setEnabled(false); + unlockWalletAction->setEnabled(true); + unlockWalletMiningAction->setEnabled(true); break; } } @@ -938,6 +984,20 @@ void BitcoinGUI::encryptWallet(bool status) setEncryptionStatus(walletModel->getEncryptionStatus()); } +void BitcoinGUI::unlockWalletMining(bool status) +{ + if(!walletModel) + return; + + // Unlock wallet when requested by wallet model + if(walletModel->getEncryptionStatus() == WalletModel::Locked) + { + AskPassphraseDialog dlg(AskPassphraseDialog::UnlockMining, this); + dlg.setModel(walletModel); + dlg.exec(); + } +} + void BitcoinGUI::backupWallet() { QString saveDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); @@ -1037,6 +1097,14 @@ void BitcoinGUI::unlockWallet() } } +void BitcoinGUI::lockWallet() +{ + if(!walletModel) + return; + + walletModel->setWalletLocked(true); +} + void BitcoinGUI::showNormalIfMinimized(bool fToggleHidden) { // activateWindow() (sometimes) helps with keyboard focus on Windows diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 8d5266b..0f85654 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -87,6 +87,9 @@ private: QAction *toggleHideAction; QAction *exportAction; QAction *encryptWalletAction; + QAction *lockWalletAction; + QAction *unlockWalletAction; + QAction *unlockWalletMiningAction; QAction *backupWalletAction; QAction *dumpWalletAction; QAction *importWalletAction; @@ -179,7 +182,9 @@ private slots: void changePassphrase(); /** Ask for passphrase to unlock wallet temporarily */ + void lockWallet(); void unlockWallet(); + void unlockWalletMining(bool status); /** Show window if hidden, unminimize when minimized, rise when obscured or show if hidden and fToggleHidden is true */ void showNormalIfMinimized(bool fToggleHidden = false);