diff options
Diffstat (limited to 'src/qt/verifymessagedialog.cpp')
-rw-r--r-- | src/qt/verifymessagedialog.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/qt/verifymessagedialog.cpp b/src/qt/verifymessagedialog.cpp new file mode 100644 index 0000000000..0bac24820c --- /dev/null +++ b/src/qt/verifymessagedialog.cpp @@ -0,0 +1,104 @@ +#include "verifymessagedialog.h" +#include "ui_verifymessagedialog.h" + +#include <string> +#include <vector> + +#include <QDialogButtonBox> +#include <QAbstractButton> +#include <QClipboard> +#include <QMessageBox> + +#include "main.h" +#include "wallet.h" +#include "walletmodel.h" +#include "addresstablemodel.h" +#include "guiutil.h" + +VerifyMessageDialog::VerifyMessageDialog(AddressTableModel *addressModel, QWidget *parent) : + QDialog(parent), + ui(new Ui::VerifyMessageDialog), + model(addressModel) +{ + ui->setupUi(this); + +#if (QT_VERSION >= 0x040700) + /* Do not move this to the XML file, Qt before 4.7 will choke on it */ + ui->lnSig->setPlaceholderText(tr("Enter Bitcoin signature")); + ui->lnAddress->setPlaceholderText(tr("Click \"Verify Message\" to obtain address")); +#endif + + GUIUtil::setupAddressWidget(ui->lnAddress, this); + ui->lnAddress->installEventFilter(this); + + ui->edMessage->setFocus(); +} + +VerifyMessageDialog::~VerifyMessageDialog() +{ + delete ui; +} + +bool VerifyMessageDialog::checkAddress() +{ + CDataStream ss(SER_GETHASH, 0); + ss << strMessageMagic; + ss << ui->edMessage->document()->toPlainText().toStdString(); + uint256 hash = Hash(ss.begin(), ss.end()); + + bool invalid = true; + std::vector<unsigned char> vchSig = DecodeBase64(ui->lnSig->text().toStdString().c_str(), &invalid); + + if(invalid) + { + QMessageBox::warning(this, tr("Invalid Signature"), tr("The signature could not be decoded. Please check the signature and try again.")); + return false; + } + + CKey key; + if(!key.SetCompactSignature(hash, vchSig)) + { + QMessageBox::warning(this, tr("Invalid Signature"), tr("The signature did not match the message digest. Please check the signature and try again.")); + return false; + } + + CBitcoinAddress address(key.GetPubKey()); + QString qStringAddress = QString::fromStdString(address.ToString()); + ui->lnAddress->setText(qStringAddress); + ui->copyToClipboard->setEnabled(true); + + QString label = model->labelForAddress(qStringAddress); + ui->lblStatus->setText(label.isEmpty() ? tr("Address not found in address book.") : tr("Address found in address book: %1").arg(label)); + return true; +} + +void VerifyMessageDialog::on_verifyMessage_clicked() +{ + checkAddress(); +} + +void VerifyMessageDialog::on_copyToClipboard_clicked() +{ + QApplication::clipboard()->setText(ui->lnAddress->text()); +} + +void VerifyMessageDialog::on_clearButton_clicked() +{ + ui->edMessage->clear(); + ui->lnSig->clear(); + ui->lnAddress->clear(); + ui->lblStatus->clear(); + + ui->edMessage->setFocus(); +} + +bool VerifyMessageDialog::eventFilter(QObject *object, QEvent *event) +{ + if(object == ui->lnAddress && (event->type() == QEvent::MouseButtonPress || + event->type() == QEvent::FocusIn)) + { + ui->lnAddress->selectAll(); + return true; + } + return QDialog::eventFilter(object, event); +} |