changeset 1269:fc98f15bed54 draft

Wallet encryption part 1: show wallet encryption status
author Wladimir J. van der Laan <laanwj@gmail.com>
date Tue, 23 Aug 2011 20:08:42 +0200 (2011-08-23)
parents 0d42e6d7078c
children 5785ebf92396
files doc/assets-attribution.txt src/qt/bitcoin.qrc src/qt/bitcoingui.cpp src/qt/bitcoingui.h src/qt/guiconstants.h src/qt/res/icons/lock_closed.png src/qt/res/icons/lock_open.png src/qt/walletmodel.cpp src/qt/walletmodel.h
diffstat 9 files changed, 71 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/doc/assets-attribution.txt
+++ b/doc/assets-attribution.txt
@@ -15,7 +15,7 @@
 License: Creative Commons Attribution (by)
 Site: http://findicons.com/icon/163938/book_open
 
-Icon: src/qt/res/icons/connect*.png, src/qt/res/icons/synced.png
+Icon: src/qt/res/icons/connect*.png, src/qt/res/icons/synced.png, src/qt/res/icons/lock_*.png
 Icon Pack: Human-O2
 Designer: schollidesign
 License: GNU/GPL
--- a/src/qt/bitcoin.qrc
+++ b/src/qt/bitcoin.qrc
@@ -34,6 +34,8 @@
         <file alias="tx_input">res/icons/tx_input.png</file>
         <file alias="tx_output">res/icons/tx_output.png</file>
         <file alias="tx_inout">res/icons/tx_inout.png</file>
+        <file alias="lock_closed">res/icons/lock_closed.png</file>
+        <file alias="lock_open">res/icons/lock_open.png</file>
     </qresource>
     <qresource prefix="/images">
         <file alias="about">res/images/about.png</file>
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -18,6 +18,7 @@
 #include "transactionview.h"
 #include "overviewpage.h"
 #include "bitcoinunits.h"
+#include "guiconstants.h"
 
 #include <QApplication>
 #include <QMainWindow>
@@ -118,9 +119,12 @@
     QHBoxLayout *frameBlocksLayout = new QHBoxLayout(frameBlocks);
     frameBlocksLayout->setContentsMargins(3,0,3,0);
     frameBlocksLayout->setSpacing(3);
+    labelEncryptionIcon = new QLabel();
     labelConnectionsIcon = new QLabel();
     labelBlocksIcon = new QLabel();
     frameBlocksLayout->addStretch();
+    frameBlocksLayout->addWidget(labelEncryptionIcon);
+    frameBlocksLayout->addStretch();
     frameBlocksLayout->addWidget(labelConnectionsIcon);
     frameBlocksLayout->addStretch();
     frameBlocksLayout->addWidget(labelBlocksIcon);
@@ -244,6 +248,9 @@
     receiveCoinsPage->setModel(walletModel->getAddressTableModel());
     sendCoinsPage->setModel(walletModel);
 
+    setEncryptionStatus(walletModel->getEncryptionStatus());
+    connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int)));
+
     // Balloon popup for new transaction
     connect(walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
             this, SLOT(incomingTransaction(QModelIndex,int,int)));
@@ -300,7 +307,7 @@
     case 7: case 8: case 9: icon = ":/icons/connect_3"; break;
     default: icon = ":/icons/connect_4"; break;
     }
-    labelConnectionsIcon->setPixmap(QIcon(icon).pixmap(16,16));
+    labelConnectionsIcon->setPixmap(QIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
     labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Bitcoin network", "", count));
 }
 
@@ -351,7 +358,7 @@
     if(secs < 30*60)
     {
         tooltip = tr("Up to date") + QString("\n") + tooltip;
-        labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(16,16));
+        labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
     }
     else
     {
@@ -531,3 +538,22 @@
     event->acceptProposedAction();
 }
 
+void BitcoinGUI::setEncryptionStatus(int status)
+{
+    switch(status)
+    {
+    case WalletModel::Unencrypted:
+        labelEncryptionIcon->hide();
+        break;
+    case WalletModel::Unlocked:
+        labelEncryptionIcon->show();
+        labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+        labelEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>unlocked</b>"));
+        break;
+    case WalletModel::Locked:
+        labelEncryptionIcon->show();
+        labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_closed").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+        labelEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>locked</b>"));
+        break;
+    }
+}
--- a/src/qt/bitcoingui.h
+++ b/src/qt/bitcoingui.h
@@ -57,6 +57,7 @@
     AddressBookPage *receiveCoinsPage;
     SendCoinsDialog *sendCoinsPage;
 
+    QLabel *labelEncryptionIcon;
     QLabel *labelConnectionsIcon;
     QLabel *labelBlocksIcon;
     QLabel *progressBarLabel;
@@ -85,6 +86,8 @@
 public slots:
     void setNumConnections(int count);
     void setNumBlocks(int count);
+    void setEncryptionStatus(int status);
+
     void error(const QString &title, const QString &message);
     /* It is currently not possible to pass a return value to another thread through
        BlockingQueuedConnection, so use an indirected pointer.
--- a/src/qt/guiconstants.h
+++ b/src/qt/guiconstants.h
@@ -1,9 +1,12 @@
 #ifndef GUICONSTANTS_H
 #define GUICONSTANTS_H
 
-/* milliseconds between model updates */
+/* Milliseconds between model updates */
 static const int MODEL_UPDATE_DELAY = 500;
 
+/* Size of icons in status bar */
+static const int STATUSBAR_ICONSIZE = 16;
+
 /* Invalid field background style */
 #define STYLE_INVALID "background:#FF8080"
 
new file mode 100644
index 0000000000000000000000000000000000000000..ce8da0bec7df7b25f2eded2ff7e5be5995c55f7b
GIT binary patch
literal 1237
zc$@*%1S<Q9P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS000DxNkl<ZScS!x&x;gC6vscWe)Rm%9XEzZA|4D;Nbn#bkVA5Ek3kR*5<zpw
zC4`_S&+%aX0AYm?@Q{B%$srKMA31mmo;)R&g+v%)+;ujy)4R^j^mM%(s(W_W?EF|Y
zq?tEe)Ajn*=e_z?6(j8Ox_9s1!EU#Ev0kr#k|fDt5uw-X{n2bTf3ntIJAeNCpSy`C
zyK%mA=g#NOxoee5WzWjW3f*p(5CYX|m7_<G((Cm$n$70L)2B~=|H=XG-o5*!bMD)A
zyDe#&QmfTMp69>kd5(y@-EOx{p64tqEa>v`@>eHLocL~*xMmioTeof<6OqMMt0kM8
zo78Hx>mh_gXV0EJa_-!@Bde>cheYIhqtW2@?b~wTz=6d_j~*SHCAOQzDTHu2%QD~T
zbeNl)`{vA<GnYsEFI>3r1o&ccaq+Kewfc3l+4S@C^Ou27r^TLHfg3k&)PPfIngT4<
zYPBole6uXOVvJc@T3VuBub;Yq|9<VI0Xm(|aqoR4O;hqbzj^ZH$-y|^OP4MUvMjrq
zrYWjg5s~As0-)i&r{C`*B9Eu}tLkG_rQ7WyB8`^@5D_mTBuRqzer)#Tl_bf)TFYQC
z0PxfNXA&Vmy<VTmuK=Aj?Ct=Hto|Q>N~MCx^nL3;1yI%L0iDCSnZxe975}*S*?aGQ
z)c?7gKCM4|u$rVDZxJJ?=0Fe;N;AeF0@gab_xL0cpCm4+cx}9v<cB|ax8GWBJ%8}S
zFAEp1KK$)pz+=EX@aExnEC=_ku-^Kcm1ha<HSaby60*#a2ZM;g7{S><;)TR3bB&C~
z{yuNKwa%VHAN#!VVYRig+F;Cz7+Wh<$a5hZSgeD6^P7n6QLhNyE(A4LBRC7zLE^wU
zrLtG4)fJUMKeLdBiBmTgKm@E&yvq?gAh$VHE2snYkmq0ooE5B5oB=0-qiEZJvw>h_
zqIf4(Kvf7q2x<r@IYJ&F0J#DJK?MO+01ILiBOpl30$_r6C(2cUpj$8+6jac>Bosgq
zG^#nomsCN^#uS2y03vajm^e->rD(Bsq!=s?p9e6eWKc8|Xj4}1<O*mUNKu4<5y6-U
zq@sucBZ?8h8O2IGT#SGWPnpRC<3&gj+=Mt-NfbXt;mhzkd`UzRDRdx;F(X>o;TnG$
zj_4;YqwSgKa2FePm%>$HYl?PwbtZr!)2MM7w#sbE!A0Vimb4Iss-s>nC_)Mml|l;&
z8X`<k0o9^^Yf1z~B<cp4;p`aK5lbI4G$x906ikTa6C?^xwfGGpq1X#1PXA<pQiNp|
zB3p{L61M;;#5o+OcwVj?VB1ve0-%f>gKJ>`T8L7H*+#f%R?4aYqQ&0v0u>kqkrA^d
z23OU%ClprpkFd}5w`)g$r>*s0*HR7!?aBJnfo!x@);dUg4YRQh-AyFRVsh3-t9Uf=
zuxBqiw;!E<9c?`C2DiVhYinJ7^6dGuG5HNad|}D9`}Vdg%oYa4`2-9K%eGm6<lY~7
zJ{T@%qNvNDZj9LxD@6~*xwQ>s6llBUg|Get^IH6RWVu+U00000NkvXXu0mjfxUEVa
new file mode 100644
index 0000000000000000000000000000000000000000..6a3a8edb2377721e37e0a0b6d9d52b4ee7b97b6e
GIT binary patch
literal 1442
zc$@*E1zq}yP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS000G9Nkl<ZScR=sL5m#M5&o*`b#G74TFR~^SvZPyNqh?g1UX0tL5!m4BIAWz
z0*moAS6y^51afc)2!n0>4}1uYl0!hqVpq8&rwzJ<U?O9KuoNuqO1qk!-8bF+s>+A%
z8Luqu?5?7M=DpWbUGJ-}zN#S{z;52WiMp=QG!4fXix^|kG!0aB#LT0jC~R?Y@gN~V
z2XS6rUY5G9&$#=q^F04~Q546C2vt>mv$3(UvcA6l>D=7hKNl7j(hCQ$yu5rQrS$uv
zC>8<qhr=OajBt09Wr<_Qjv>$Utvh$_e3E6^yB988c<@31+_-TAA~I)YpM((3udc3A
zRaIbSxI0u801#uO(P)ITXV2Q^=H^le;WwvGpMJPkeBR5!%raGd55TYP-MdGsTIYHG
z7iRvYyT4pj)%@1h);S{jbbfw*bp85uo|&0BCnA5ib?a9Ce=%_N>Q#uy>3+Ze*~Z4k
z?DqC{>i7GXnfb$og@t;j@0BZ8@({vrd%fNtQ%c#HGiSC_O6O0VI`xm|W?+4N9jdzM
z?z4lz0L=X7JkQ_%{^bC0>C&Y-#`r<gG=GXQVlWt#s`~b{_<I7V>l)1bMqSs4G1kod
z(Z!1wZ8!hRmoJ-{eJmoQwY4>*l+G<JElp)PO#4w);qE6>N>J5DM09(4KET@A+JCF6
z`Xa`7d^j8ybzL(6eJ%i<F#u#)R)r9D4K%ium6i1v;~UJ(y<QK~F5fQzhzQEEgoy0v
zd+pja2e7)IxWGQz@Sp$=YWrd!gn+Uv;qEUSz%v#4w+|Ni^`GidZeEkmhd;a1pPdbE
zdbj%KU+3ffe{aM%!YFP}Msc3!D2f6_uZLb)qF40LEBom8OY{%-vC-Vu&sT1*z4N=j
zKc$D=7&yvee|`Dr-B*A7^#h3m!Enour{Ul;B2^*-;2`qJN@QR%2sg+wLRr>0bObnb
z;s_ppiTeQF0`R|m0&oHR)!9Q2PyXnY|DYK>L@X_A7II>^C5VyGG!A!%Fpy=0JOlEK
z&_AS@omadx&&Xf-1)Ba(KwnV+@Js<s)qpv{T>v=136O*!ge(9|1R_EvKnOq<fGjvd
z1_&EK8654W)1<QtfL0nr4&el2MIb{)K*K-~0y{tiWCDl~L>$aOAb{B+tYC5w0ifLx
z?AeCyEf|NlnK%G<7<{~id$*^yEKg^>`!wE71CzxZFk`qg+yOPf3@~luDg$r=n?sGE
z4yZX)8Da$M038rOhnw13w^TZa0p{=Cw<{prt<;J#up@LOVQ&2n2%!DKoLU9|_)Z$B
zLr3l2(e1r0lYu7XfqPf1=VHLS-Zl_yeBT5Ljm0{S&j2yT*LRuI#P3<QiwOP6#djQt
zIw3ykN-Y(wD6vDh(=x<f{{;jPjd>>cq$E7S(5jy%7m+&{<0?(B{}cdS2IC8j;9!_{
zZP^Li96MSOEy!_ug2r@US{qE)KsV<_6v7H2OdcP10041<beRj<_e|RAbPoomYJj?G
z5-?7&75n$NqHf~R6AGoSL#Eq4G~he-n1J|B+1}N<ea|$W72YK<orb3XFf%=R9HAzw
zYM4n1Bm=3nQ&1hG4roWYb(4>+ZNa4Qq(D-D)Lqq}>JJ_dYlsM`>NAIQVCJkSij0Wz
zqjUY@&GSDzarg&KG1`2X)uT~X*U0LcLz5(^QZN^3@d8XRCRJunA=8x4SeogfnR)3%
zBjw5F!QDrr>r1!qt*yssW_49njhQt7(xhU{Od`S}5=4ZVIRKFEEX*tbgqekixO+Nz
wxVyW#yP25*P%}%~TH0|oRZXgDX669=Tb!)P&su^EGXMYp07*qoM6N<$f>7J9+5i9m
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -12,7 +12,8 @@
 WalletModel::WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent) :
     QObject(parent), wallet(wallet), optionsModel(optionsModel), addressTableModel(0),
     transactionTableModel(0),
-    cachedBalance(0), cachedUnconfirmedBalance(0), cachedNumTransactions(0)
+    cachedBalance(0), cachedUnconfirmedBalance(0), cachedNumTransactions(0),
+    cachedEncryptionStatus(Unencrypted)
 {
     // Until signal notifications is built into the bitcoin core,
     //  simply update everything after polling using a timer.
@@ -49,6 +50,7 @@
     qint64 newBalance = getBalance();
     qint64 newUnconfirmedBalance = getUnconfirmedBalance();
     int newNumTransactions = getNumTransactions();
+    EncryptionStatus newEncryptionStatus = getEncryptionStatus();
 
     if(cachedBalance != newBalance || cachedUnconfirmedBalance != newUnconfirmedBalance)
         emit balanceChanged(newBalance, newUnconfirmedBalance);
@@ -56,6 +58,9 @@
     if(cachedNumTransactions != newNumTransactions)
         emit numTransactionsChanged(newNumTransactions);
 
+    if(cachedEncryptionStatus != newEncryptionStatus)
+        emit encryptionStatusChanged(newEncryptionStatus);
+
     cachedBalance = newBalance;
     cachedUnconfirmedBalance = newUnconfirmedBalance;
     cachedNumTransactions = newNumTransactions;
@@ -179,4 +184,18 @@
     return transactionTableModel;
 }
 
-
+WalletModel::EncryptionStatus WalletModel::getEncryptionStatus() const
+{
+    if(!wallet->IsCrypted())
+    {
+        return Unencrypted;
+    }
+    else if(wallet->IsLocked())
+    {
+        return Locked;
+    }
+    else
+    {
+        return Unlocked;
+    }
+}
--- a/src/qt/walletmodel.h
+++ b/src/qt/walletmodel.h
@@ -36,6 +36,13 @@
         MiscError
     };
 
+    enum EncryptionStatus
+    {
+        Unencrypted,  // !wallet->IsCrypted()
+        Locked,       // wallet->IsCrypted() && wallet->IsLocked()
+        Unlocked      // wallet->IsCrypted() && !wallet->IsLocked()
+    };
+
     OptionsModel *getOptionsModel();
     AddressTableModel *getAddressTableModel();
     TransactionTableModel *getTransactionTableModel();
@@ -43,6 +50,9 @@
     qint64 getBalance() const;
     qint64 getUnconfirmedBalance() const;
     int getNumTransactions() const;
+    EncryptionStatus getEncryptionStatus() const;
+
+    bool isEncrypted() const;
 
     // Check address for validity
     bool validateAddress(const QString &address);
@@ -74,10 +84,12 @@
     qint64 cachedBalance;
     qint64 cachedUnconfirmedBalance;
     qint64 cachedNumTransactions;
+    EncryptionStatus cachedEncryptionStatus;
 
 signals:
     void balanceChanged(qint64 balance, qint64 unconfirmedBalance);
     void numTransactionsChanged(int count);
+    void encryptionStatusChanged(int status);
 
     // Asynchronous error notification
     void error(const QString &title, const QString &message);