Bitcoin-Qt signmessage GUI (pull request #582)
[novacoin.git] / src / qt / messagepage.cpp
1 #include <string>
2 #include <vector>
3
4 #include "main.h"
5 #include "wallet.h"
6 #include "init.h"
7 #include "util.h"
8
9 #include "messagepage.h"
10 #include "ui_messagepage.h"
11
12 #include "addressbookpage.h"
13 #include "guiutil.h"
14 #include "walletmodel.h"
15
16 #include <QClipboard>
17 #include <QInputDialog>
18 #include <QList>
19 #include <QListWidgetItem>
20 #include <QMessageBox>
21
22 MessagePage::MessagePage(QWidget *parent) :
23     QDialog(parent),
24     ui(new Ui::MessagePage)
25 {
26     ui->setupUi(this);
27
28     GUIUtil::setupAddressWidget(ui->signFrom, this);
29 }
30
31 MessagePage::~MessagePage()
32 {
33     delete ui;
34 }
35
36 void MessagePage::setModel(WalletModel *model)
37 {
38     this->model = model;
39 }
40
41 void MessagePage::setAddress(QString addr)
42 {
43     ui->signFrom->setText(addr);
44     ui->message->setFocus();
45 }
46
47 void MessagePage::on_pasteButton_clicked()
48 {
49     setAddress(QApplication::clipboard()->text());
50 }
51
52 void MessagePage::on_addressBookButton_clicked()
53 {
54     AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::ReceivingTab, this);
55     dlg.setModel(model->getAddressTableModel());
56     if(dlg.exec())
57     {
58         setAddress(dlg.getReturnValue());
59     }
60 }
61
62 void MessagePage::on_copyToClipboard_clicked()
63 {
64     QApplication::clipboard()->setText(ui->signature->text());
65 }
66
67 void MessagePage::on_signMessage_clicked()
68 {
69     QString address = ui->signFrom->text();
70
71     CBitcoinAddress addr(address.toStdString());
72     if (!addr.IsValid())
73     {
74         QMessageBox::critical(this, tr("Error signing"), tr("%1 is not a valid address.").arg(address),
75                               QMessageBox::Abort, QMessageBox::Abort);
76         return;
77     }
78
79     WalletModel::UnlockContext ctx(model->requestUnlock());
80     if(!ctx.isValid())
81     {
82         // Unlock wallet was cancelled
83         return;
84     }
85
86     CKey key;
87     if (!pwalletMain->GetKey(addr, key))
88     {
89         QMessageBox::critical(this, tr("Error signing"), tr("Private key for %1 is not available.").arg(address),
90                               QMessageBox::Abort, QMessageBox::Abort);
91         return;
92     }
93
94     CDataStream ss(SER_GETHASH);
95     ss << strMessageMagic;
96     ss << ui->message->document()->toPlainText().toStdString();
97
98     std::vector<unsigned char> vchSig;
99     if (!key.SignCompact(Hash(ss.begin(), ss.end()), vchSig))
100     {
101         QMessageBox::critical(this, tr("Error signing"), tr("Sign failed"),
102                               QMessageBox::Abort, QMessageBox::Abort);
103     }
104
105     ui->signature->setText(QString::fromStdString(EncodeBase64(&vchSig[0], vchSig.size())));
106     ui->signature->setFont(GUIUtil::bitcoinAddressFont());
107 }