1 #include "askpassphrasedialog.h"
2 #include "ui_askpassphrasedialog.h"
4 #include "guiconstants.h"
5 #include "walletmodel.h"
10 AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) :
12 ui(new Ui::AskPassphraseDialog),
17 ui->passEdit1->setMaxLength(MAX_PASSPHRASE_SIZE);
18 ui->passEdit2->setMaxLength(MAX_PASSPHRASE_SIZE);
19 ui->passEdit3->setMaxLength(MAX_PASSPHRASE_SIZE);
23 case Encrypt: // Ask passphrase x2
24 ui->passLabel1->hide();
25 ui->passEdit1->hide();
26 ui->warningLabel->setText(tr("Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>."));
27 setWindowTitle(tr("Encrypt wallet"));
29 case Unlock: // Ask passphrase
30 ui->warningLabel->setText(tr("This operation needs your wallet passphrase to unlock the wallet."));
31 ui->passLabel2->hide();
32 ui->passEdit2->hide();
33 ui->passLabel3->hide();
34 ui->passEdit3->hide();
35 setWindowTitle(tr("Unlock wallet"));
37 case Decrypt: // Ask passphrase
38 ui->warningLabel->setText(tr("This operation needs your wallet passphrase to decrypt the wallet."));
39 ui->passLabel2->hide();
40 ui->passEdit2->hide();
41 ui->passLabel3->hide();
42 ui->passEdit3->hide();
43 setWindowTitle(tr("Decrypt wallet"));
45 case ChangePass: // Ask old passphrase + new passphrase x2
46 setWindowTitle(tr("Change passphrase"));
47 ui->warningLabel->setText(tr("Enter the old and new passphrase to the wallet."));
52 connect(ui->passEdit1, SIGNAL(textChanged(QString)), this, SLOT(textChanged()));
53 connect(ui->passEdit2, SIGNAL(textChanged(QString)), this, SLOT(textChanged()));
54 connect(ui->passEdit3, SIGNAL(textChanged(QString)), this, SLOT(textChanged()));
57 AskPassphraseDialog::~AskPassphraseDialog()
59 // Attempt to overwrite text so that they do not linger around in memory
60 ui->passEdit1->setText(QString(" ").repeated(ui->passEdit1->text().size()));
61 ui->passEdit2->setText(QString(" ").repeated(ui->passEdit2->text().size()));
62 ui->passEdit3->setText(QString(" ").repeated(ui->passEdit3->text().size()));
66 void AskPassphraseDialog::setModel(WalletModel *model)
71 void AskPassphraseDialog::accept()
73 SecureString oldpass, newpass1, newpass2;
76 oldpass.reserve(MAX_PASSPHRASE_SIZE);
77 newpass1.reserve(MAX_PASSPHRASE_SIZE);
78 newpass2.reserve(MAX_PASSPHRASE_SIZE);
79 // TODO: get rid of this .c_str() by implementing SecureString::operator=(std::string)
80 // Alternately, find a way to make this input mlock()'d to begin with.
81 oldpass.assign(ui->passEdit1->text().toStdString().c_str());
82 newpass1.assign(ui->passEdit2->text().toStdString().c_str());
83 newpass2.assign(ui->passEdit3->text().toStdString().c_str());
88 if(newpass1.empty() || newpass2.empty())
90 // Cannot encrypt with empty passphrase
93 QMessageBox::StandardButton retval = QMessageBox::question(this, tr("Confirm wallet encryption"),
94 tr("WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!\nAre you sure you wish to encrypt your wallet?"),
95 QMessageBox::Yes|QMessageBox::Cancel,
97 if(retval == QMessageBox::Yes)
99 if(newpass1 == newpass2)
101 if(model->setWalletEncrypted(true, newpass1))
103 QMessageBox::warning(this, tr("Wallet encrypted"),
104 tr("Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer."));
105 QApplication::quit();
109 QMessageBox::critical(this, tr("Wallet encryption failed"),
110 tr("Wallet encryption failed due to an internal error. Your wallet was not encrypted."));
112 QDialog::accept(); // Success
116 QMessageBox::critical(this, tr("Wallet encryption failed"),
117 tr("The supplied passphrases do not match."));
122 QDialog::reject(); // Cancelled
126 if(!model->setWalletLocked(false, oldpass))
128 QMessageBox::critical(this, tr("Wallet unlock failed"),
129 tr("The passphrase entered for the wallet decryption was incorrect."));
133 QDialog::accept(); // Success
137 if(!model->setWalletEncrypted(false, oldpass))
139 QMessageBox::critical(this, tr("Wallet decryption failed"),
140 tr("The passphrase entered for the wallet decryption was incorrect."));
144 QDialog::accept(); // Success
148 if(newpass1 == newpass2)
150 if(model->changePassphrase(oldpass, newpass1))
152 QMessageBox::information(this, tr("Wallet encrypted"),
153 tr("Wallet passphrase was succesfully changed."));
154 QDialog::accept(); // Success
158 QMessageBox::critical(this, tr("Wallet encryption failed"),
159 tr("The passphrase entered for the wallet decryption was incorrect."));
164 QMessageBox::critical(this, tr("Wallet encryption failed"),
165 tr("The supplied passphrases do not match."));
171 void AskPassphraseDialog::textChanged()
173 // Validate input, set Ok button to enabled when accepable
174 bool acceptable = false;
177 case Encrypt: // New passphrase x2
178 acceptable = !ui->passEdit2->text().isEmpty() && !ui->passEdit3->text().isEmpty();
180 case Unlock: // Old passphrase x1
182 acceptable = !ui->passEdit1->text().isEmpty();
184 case ChangePass: // Old passphrase x1, new passphrase x2
185 acceptable = !ui->passEdit1->text().isEmpty() && !ui->passEdit2->text().isEmpty() && !ui->passEdit3->text().isEmpty();
188 ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(acceptable);