1 #include "signverifymessagedialog.h"
2 #include "ui_signverifymessagedialog.h"
4 #include "addressbookpage.h"
7 #include "dialogwindowflags.h"
10 #include "optionsmodel.h"
11 #include "walletmodel.h"
20 SignVerifyMessageDialog::SignVerifyMessageDialog(QWidget *parent) :
21 QWidget(parent, DIALOGWINDOWHINTS),
22 ui(new Ui::SignVerifyMessageDialog),
27 #if (QT_VERSION >= 0x040700)
28 /* Do not move this to the XML file, Qt before 4.7 will choke on it */
29 ui->addressIn_SM->setPlaceholderText(tr("Enter a NovaCoin address (e.g. 4Zo1ga6xuKuQ7JV7M9rGDoxdbYwV5zgQJ5)"));
30 ui->signatureOut_SM->setPlaceholderText(tr("Click \"Sign Message\" to generate signature"));
32 ui->addressIn_VM->setPlaceholderText(tr("Enter a NovaCoin address (e.g. 4Zo1ga6xuKuQ7JV7M9rGDoxdbYwV5zgQJ5)"));
33 ui->signatureIn_VM->setPlaceholderText(tr("Enter NovaCoin signature"));
36 GUIUtil::setupAddressWidget(ui->addressIn_SM, this);
37 GUIUtil::setupAddressWidget(ui->addressIn_VM, this);
39 ui->addressIn_SM->installEventFilter(this);
40 ui->messageIn_SM->installEventFilter(this);
41 ui->signatureOut_SM->installEventFilter(this);
42 ui->addressIn_VM->installEventFilter(this);
43 ui->messageIn_VM->installEventFilter(this);
44 ui->signatureIn_VM->installEventFilter(this);
46 ui->signatureOut_SM->setFont(GUIUtil::bitcoinAddressFont());
47 ui->signatureIn_VM->setFont(GUIUtil::bitcoinAddressFont());
50 SignVerifyMessageDialog::~SignVerifyMessageDialog()
55 void SignVerifyMessageDialog::setModel(WalletModel *model)
60 void SignVerifyMessageDialog::setAddress_SM(QString address)
62 ui->addressIn_SM->setText(address);
63 ui->messageIn_SM->setFocus();
66 void SignVerifyMessageDialog::setAddress_VM(QString address)
68 ui->addressIn_VM->setText(address);
69 ui->messageIn_VM->setFocus();
72 void SignVerifyMessageDialog::showTab_SM(bool fShow)
74 ui->tabWidget->setCurrentIndex(0);
80 void SignVerifyMessageDialog::showTab_VM(bool fShow)
82 ui->tabWidget->setCurrentIndex(1);
87 void SignVerifyMessageDialog::on_addressBookButton_SM_clicked()
89 if (model && model->getAddressTableModel())
91 AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::ReceivingTab, this);
92 dlg.setModel(model->getAddressTableModel());
95 setAddress_SM(dlg.getReturnValue());
100 void SignVerifyMessageDialog::on_pasteButton_SM_clicked()
102 setAddress_SM(QApplication::clipboard()->text());
105 void SignVerifyMessageDialog::on_signMessageButton_SM_clicked()
107 /* Clear old signature to ensure users don't get confused on error with an old signature displayed */
108 ui->signatureOut_SM->clear();
110 CBitcoinAddress addr(ui->addressIn_SM->text().toStdString());
113 ui->addressIn_SM->setValid(false);
114 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
115 ui->statusLabel_SM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
119 if (!addr.GetKeyID(keyID))
121 ui->addressIn_SM->setValid(false);
122 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
123 ui->statusLabel_SM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
127 WalletModel::UnlockContext ctx(model->requestUnlock());
130 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
131 ui->statusLabel_SM->setText(tr("Wallet unlock was cancelled."));
136 if (!pwalletMain->GetKey(keyID, key))
138 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
139 ui->statusLabel_SM->setText(tr("Private key for the entered address is not available."));
143 CDataStream ss(SER_GETHASH, 0);
144 ss << strMessageMagic;
145 ss << ui->messageIn_SM->document()->toPlainText().toStdString();
147 std::vector<unsigned char> vchSig;
148 if (!key.SignCompact(Hash(ss.begin(), ss.end()), vchSig))
150 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
151 ui->statusLabel_SM->setText(QString("<nobr>") + tr("Message signing failed.") + QString("</nobr>"));
155 ui->statusLabel_SM->setStyleSheet("QLabel { color: green; }");
156 ui->statusLabel_SM->setText(QString("<nobr>") + tr("Message signed.") + QString("</nobr>"));
158 ui->signatureOut_SM->setText(QString::fromStdString(EncodeBase64(&vchSig[0], vchSig.size())));
161 void SignVerifyMessageDialog::on_copySignatureButton_SM_clicked()
163 QApplication::clipboard()->setText(ui->signatureOut_SM->text());
166 void SignVerifyMessageDialog::on_clearButton_SM_clicked()
168 ui->addressIn_SM->clear();
169 ui->messageIn_SM->clear();
170 ui->signatureOut_SM->clear();
171 ui->statusLabel_SM->clear();
173 ui->addressIn_SM->setFocus();
176 void SignVerifyMessageDialog::on_addressBookButton_VM_clicked()
178 if (model && model->getAddressTableModel())
180 AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::SendingTab, this);
181 dlg.setModel(model->getAddressTableModel());
184 setAddress_VM(dlg.getReturnValue());
189 void SignVerifyMessageDialog::on_verifyMessageButton_VM_clicked()
191 CBitcoinAddress addr(ui->addressIn_VM->text().toStdString());
194 ui->addressIn_VM->setValid(false);
195 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
196 ui->statusLabel_VM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
200 if (!addr.GetKeyID(keyID))
202 ui->addressIn_VM->setValid(false);
203 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
204 ui->statusLabel_VM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
208 bool fInvalid = false;
209 std::vector<unsigned char> vchSig = DecodeBase64(ui->signatureIn_VM->text().toStdString().c_str(), &fInvalid);
213 ui->signatureIn_VM->setValid(false);
214 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
215 ui->statusLabel_VM->setText(tr("The signature could not be decoded.") + QString(" ") + tr("Please check the signature and try again."));
219 CDataStream ss(SER_GETHASH, 0);
220 ss << strMessageMagic;
221 ss << ui->messageIn_VM->document()->toPlainText().toStdString();
224 if (!key.SetCompactSignature(Hash(ss.begin(), ss.end()), vchSig))
226 ui->signatureIn_VM->setValid(false);
227 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
228 ui->statusLabel_VM->setText(tr("The signature did not match the message digest.") + QString(" ") + tr("Please check the signature and try again."));
232 if (!(CBitcoinAddress(key.GetID()) == addr))
234 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
235 ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verification failed.") + QString("</nobr>"));
239 ui->statusLabel_VM->setStyleSheet("QLabel { color: green; }");
240 ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verified.") + QString("</nobr>"));
243 void SignVerifyMessageDialog::on_clearButton_VM_clicked()
245 ui->addressIn_VM->clear();
246 ui->signatureIn_VM->clear();
247 ui->messageIn_VM->clear();
248 ui->statusLabel_VM->clear();
250 ui->addressIn_VM->setFocus();
253 bool SignVerifyMessageDialog::eventFilter(QObject *object, QEvent *event)
255 if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::FocusIn)
257 if (ui->tabWidget->currentIndex() == 0)
259 /* Clear status message on focus change */
260 ui->statusLabel_SM->clear();
262 /* Select generated signature */
263 if (object == ui->signatureOut_SM)
265 ui->signatureOut_SM->selectAll();
269 else if (ui->tabWidget->currentIndex() == 1)
271 /* Clear status message on focus change */
272 ui->statusLabel_VM->clear();
275 return QWidget::eventFilter(object, event);
278 void SignVerifyMessageDialog::keyPressEvent(QKeyEvent *event)
281 if(event->key() == Qt::Key_Back)
286 if(event->key() == Qt::Key_Escape)