1 #include "signverifymessagedialog.h"
2 #include "ui_signverifymessagedialog.h"
4 #include "addressbookpage.h"
9 #include "optionsmodel.h"
10 #include "walletmodel.h"
18 SignVerifyMessageDialog::SignVerifyMessageDialog(QWidget *parent) :
20 ui(new Ui::SignVerifyMessageDialog),
25 #if (QT_VERSION >= 0x040700)
26 /* Do not move this to the XML file, Qt before 4.7 will choke on it */
27 ui->addressIn_SM->setPlaceholderText(tr("Enter a NovaCoin address (e.g. 4Zo1ga6xuKuQ7JV7M9rGDoxdbYwV5zgQJ5)"));
28 ui->signatureOut_SM->setPlaceholderText(tr("Click \"Sign Message\" to generate signature"));
30 ui->addressIn_VM->setPlaceholderText(tr("Enter a NovaCoin address (e.g. 4Zo1ga6xuKuQ7JV7M9rGDoxdbYwV5zgQJ5)"));
31 ui->signatureIn_VM->setPlaceholderText(tr("Enter NovaCoin signature"));
34 GUIUtil::setupAddressWidget(ui->addressIn_SM, this);
35 GUIUtil::setupAddressWidget(ui->addressIn_VM, this);
37 ui->addressIn_SM->installEventFilter(this);
38 ui->messageIn_SM->installEventFilter(this);
39 ui->signatureOut_SM->installEventFilter(this);
40 ui->addressIn_VM->installEventFilter(this);
41 ui->messageIn_VM->installEventFilter(this);
42 ui->signatureIn_VM->installEventFilter(this);
44 ui->signatureOut_SM->setFont(GUIUtil::bitcoinAddressFont());
45 ui->signatureIn_VM->setFont(GUIUtil::bitcoinAddressFont());
48 SignVerifyMessageDialog::~SignVerifyMessageDialog()
53 void SignVerifyMessageDialog::setModel(WalletModel *model)
58 void SignVerifyMessageDialog::setAddress_SM(QString address)
60 ui->addressIn_SM->setText(address);
61 ui->messageIn_SM->setFocus();
64 void SignVerifyMessageDialog::setAddress_VM(QString address)
66 ui->addressIn_VM->setText(address);
67 ui->messageIn_VM->setFocus();
70 void SignVerifyMessageDialog::showTab_SM(bool fShow)
72 ui->tabWidget->setCurrentIndex(0);
78 void SignVerifyMessageDialog::showTab_VM(bool fShow)
80 ui->tabWidget->setCurrentIndex(1);
85 void SignVerifyMessageDialog::on_addressBookButton_SM_clicked()
87 if (model && model->getAddressTableModel())
89 AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::ReceivingTab, this);
90 dlg.setModel(model->getAddressTableModel());
93 setAddress_SM(dlg.getReturnValue());
98 void SignVerifyMessageDialog::on_pasteButton_SM_clicked()
100 setAddress_SM(QApplication::clipboard()->text());
103 void SignVerifyMessageDialog::on_signMessageButton_SM_clicked()
105 /* Clear old signature to ensure users don't get confused on error with an old signature displayed */
106 ui->signatureOut_SM->clear();
108 CBitcoinAddress addr(ui->addressIn_SM->text().toStdString());
111 ui->addressIn_SM->setValid(false);
112 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
113 ui->statusLabel_SM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
117 if (!addr.GetKeyID(keyID))
119 ui->addressIn_SM->setValid(false);
120 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
121 ui->statusLabel_SM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
125 WalletModel::UnlockContext ctx(model->requestUnlock());
128 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
129 ui->statusLabel_SM->setText(tr("Wallet unlock was cancelled."));
134 if (!pwalletMain->GetKey(keyID, key))
136 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
137 ui->statusLabel_SM->setText(tr("Private key for the entered address is not available."));
141 CDataStream ss(SER_GETHASH, 0);
142 ss << strMessageMagic;
143 ss << ui->messageIn_SM->document()->toPlainText().toStdString();
145 std::vector<unsigned char> vchSig;
146 if (!key.SignCompact(Hash(ss.begin(), ss.end()), vchSig))
148 ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
149 ui->statusLabel_SM->setText(QString("<nobr>") + tr("Message signing failed.") + QString("</nobr>"));
153 ui->statusLabel_SM->setStyleSheet("QLabel { color: green; }");
154 ui->statusLabel_SM->setText(QString("<nobr>") + tr("Message signed.") + QString("</nobr>"));
156 ui->signatureOut_SM->setText(QString::fromStdString(EncodeBase64(&vchSig[0], vchSig.size())));
159 void SignVerifyMessageDialog::on_copySignatureButton_SM_clicked()
161 QApplication::clipboard()->setText(ui->signatureOut_SM->text());
164 void SignVerifyMessageDialog::on_clearButton_SM_clicked()
166 ui->addressIn_SM->clear();
167 ui->messageIn_SM->clear();
168 ui->signatureOut_SM->clear();
169 ui->statusLabel_SM->clear();
171 ui->addressIn_SM->setFocus();
174 void SignVerifyMessageDialog::on_addressBookButton_VM_clicked()
176 if (model && model->getAddressTableModel())
178 AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::SendingTab, this);
179 dlg.setModel(model->getAddressTableModel());
182 setAddress_VM(dlg.getReturnValue());
187 void SignVerifyMessageDialog::on_verifyMessageButton_VM_clicked()
189 CBitcoinAddress addr(ui->addressIn_VM->text().toStdString());
192 ui->addressIn_VM->setValid(false);
193 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
194 ui->statusLabel_VM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
198 if (!addr.GetKeyID(keyID))
200 ui->addressIn_VM->setValid(false);
201 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
202 ui->statusLabel_VM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
206 bool fInvalid = false;
207 std::vector<unsigned char> vchSig = DecodeBase64(ui->signatureIn_VM->text().toStdString().c_str(), &fInvalid);
211 ui->signatureIn_VM->setValid(false);
212 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
213 ui->statusLabel_VM->setText(tr("The signature could not be decoded.") + QString(" ") + tr("Please check the signature and try again."));
217 CDataStream ss(SER_GETHASH, 0);
218 ss << strMessageMagic;
219 ss << ui->messageIn_VM->document()->toPlainText().toStdString();
222 if (!key.SetCompactSignature(Hash(ss.begin(), ss.end()), vchSig))
224 ui->signatureIn_VM->setValid(false);
225 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
226 ui->statusLabel_VM->setText(tr("The signature did not match the message digest.") + QString(" ") + tr("Please check the signature and try again."));
230 if (!(CBitcoinAddress(key.GetPubKey().GetID()) == addr))
232 ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
233 ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verification failed.") + QString("</nobr>"));
237 ui->statusLabel_VM->setStyleSheet("QLabel { color: green; }");
238 ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verified.") + QString("</nobr>"));
241 void SignVerifyMessageDialog::on_clearButton_VM_clicked()
243 ui->addressIn_VM->clear();
244 ui->signatureIn_VM->clear();
245 ui->messageIn_VM->clear();
246 ui->statusLabel_VM->clear();
248 ui->addressIn_VM->setFocus();
251 bool SignVerifyMessageDialog::eventFilter(QObject *object, QEvent *event)
253 if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::FocusIn)
255 if (ui->tabWidget->currentIndex() == 0)
257 /* Clear status message on focus change */
258 ui->statusLabel_SM->clear();
260 /* Select generated signature */
261 if (object == ui->signatureOut_SM)
263 ui->signatureOut_SM->selectAll();
267 else if (ui->tabWidget->currentIndex() == 1)
269 /* Clear status message on focus change */
270 ui->statusLabel_VM->clear();
273 return QDialog::eventFilter(object, event);