URI: 
       tstore and display signatures of own requests - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit cb2bc54f96fe5863e8038b7f7b6352b14f7e432f
   DIR parent affd64125c3cdbc51cc37c12c1e9fa076670fc69
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Thu,  9 Jul 2015 14:15:30 +0200
       
       store and display signatures of own requests
       
       Diffstat:
         M gui/qt/main_window.py               |      44 +++++++++++++++++++------------
         M lib/paymentrequest.py               |       6 +++++-
         M lib/wallet.py                       |      14 ++++++++++----
         M plugins/email.py                    |      10 ++++------
       
       4 files changed, 46 insertions(+), 28 deletions(-)
       ---
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -629,17 +629,17 @@ class ElectrumWindow(QMainWindow):
                buttons.addWidget(self.new_request_button)
        
                self.receive_requests_label = QLabel(_('My Requests'))
       -        self.receive_list = MyTreeWidget(self, self.receive_list_menu, [_('Date'), _('Account'), _('Address'), _('Description'), _('Amount'), _('Status')], 3)
       +        self.receive_list = MyTreeWidget(self, self.receive_list_menu, [_('Date'), _('Account'), _('Address'), _('Requestor'), _('Description'), _('Amount'), _('Status')], 4)
                self.receive_list.currentItemChanged.connect(self.receive_item_changed)
                self.receive_list.itemClicked.connect(self.receive_item_changed)
                self.receive_list.setSortingEnabled(True)
                self.receive_list.setColumnWidth(0, 180)
       -        self.receive_list.hideColumn(1)     # the update will show it if necessary
       -        self.receive_list.hideColumn(2)     # don't show address
       -        self.receive_list.setColumnWidth(2, 340)
       +        self.receive_list.hideColumn(1)
       +        self.receive_list.hideColumn(2)
       +        #self.receive_list.setColumnWidth(2, 340)
                h = self.receive_list.header()
                h.setStretchLastSection(False)
       -        h.setResizeMode(3, QHeaderView.Stretch)
       +        h.setResizeMode(4, QHeaderView.Stretch)
        
                # layout
                vbox_g = QVBoxLayout()
       t@@ -714,28 +714,34 @@ class ElectrumWindow(QMainWindow):
                    return False
                i = self.expires_combo.currentIndex()
                expiration = map(lambda x: x[1], expiration_values)[i]
       -        self.wallet.add_payment_request(addr, amount, message, expiration, self.config)
       +        req = self.wallet.make_payment_request(addr, amount, message, expiration)
       +        pr, requestor = self.make_bip70_request(req)
       +        if requestor:
       +            req['requestor'] = requestor
       +            req['signature'] = pr.signature.encode('hex')
       +        self.wallet.add_payment_request(req, self.config)
                self.update_receive_tab()
                self.update_address_tab()
                self.save_request_button.setEnabled(False)
       -        return True
       +        return pr
        
       -    def make_payment_request(self, addr):
       +    def make_bip70_request(self, req):
                alias = str(self.config.get('alias'))
                alias_privkey = None
                if alias:
                    alias_info = self.contacts.resolve_openalias(alias)
                    if alias_info:
       -                alias_addr, alias_name = alias_info
       +                alias_addr, alias_name, validated = alias_info
                        if alias_addr and self.wallet.is_mine(alias_addr):
       -                    password = self.password_dialog()
       -                    alias_privkey = self.wallet.get_private_key(alias_addr, password)[0]
       -        r = self.wallet.get_payment_request(addr, self.config)
       -        pr = paymentrequest.make_request(self.config, r, alias, alias_privkey)
       -        return pr
       +                    password = self.password_dialog(_('Please enter your password in order to sign your payment request.'))
       +                    if password:
       +                        alias_privkey = self.wallet.get_private_key(alias_addr, password)[0]
       +        return paymentrequest.make_request(self.config, req, alias, alias_privkey)
        
            def export_payment_request(self, addr):
       -        pr = self.make_payment_request(addr)
       +        r = self.wallet.receive_requests.get(addr)
       +        pr, requestor = paymentrequest.make_request(self.config, r)
       +        pr = pr.SerializeToString()
                name = r['id'] + '.bip70'
                fileName = self.getSaveFileName(_("Select where to save your payment request"), name, "*.bip70")
                if fileName:
       t@@ -828,9 +834,13 @@ class ElectrumWindow(QMainWindow):
                    message = req.get('memo', '')
                    date = format_time(timestamp)
                    status = req.get('status')
       -            account = self.wallet.get_account_name(self.wallet.get_account_from_address(address))
       +            signature = req.get('signature')
       +            requestor = req.get('requestor', '')
                    amount_str = self.format_amount(amount) if amount else ""
       -            item = QTreeWidgetItem([date, account, address, message, amount_str, pr_tooltips.get(status,'')])
       +            account = ''
       +            item = QTreeWidgetItem([date, account, address, requestor, message, amount_str, pr_tooltips.get(status,'')])
       +            if signature is not None:
       +                item.setIcon(3, QIcon(":icons/confirmed.png"))
                    if status is not PR_UNKNOWN:
                        item.setIcon(5, QIcon(pr_icons.get(status)))
                    self.receive_list.addTopLevelItem(item)
   DIR diff --git a/lib/paymentrequest.py b/lib/paymentrequest.py
       t@@ -297,6 +297,7 @@ def make_payment_request(outputs, memo, time, expires, key_path, cert_path, alia
            pr = pb2.PaymentRequest()
            pr.serialized_payment_details = pd.SerializeToString()
            pr.signature = ''
       +    requestor = None
        
            if alias and alias_privkey:
                pr.pki_type = 'dnssec+btc'
       t@@ -306,6 +307,7 @@ def make_payment_request(outputs, memo, time, expires, key_path, cert_path, alia
                address = bitcoin.address_from_private_key(alias_privkey)
                compressed = bitcoin.is_compressed(alias_privkey)
                pr.signature = ec_key.sign_message(message, compressed, address)
       +        requestor = alias
        
            if key_path and cert_path:
                import tlslite
       t@@ -322,7 +324,9 @@ def make_payment_request(outputs, memo, time, expires, key_path, cert_path, alia
                hashBytes = bytearray(hashlib.sha256(msgBytes).digest())
                sig = rsakey.sign(x509.PREFIX_RSA_SHA256 + hashBytes)
                pr.signature = bytes(sig)
       -    return pr.SerializeToString()
       +        requestor = 'x'
       +
       +    return pr, requestor
        
        
        def make_request(config, req, alias=None, alias_privkey=None):
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -1256,16 +1256,22 @@ class Abstract_Wallet(object):
                    status = PR_UNKNOWN
                return status
        
       -    def add_payment_request(self, addr, amount, message, expiration, config):
       -        import paymentrequest, shutil, os
       +    def make_payment_request(self, addr, amount, message, expiration):
                timestamp = int(time.time())
                _id = Hash(addr + "%d"%timestamp).encode('hex')[0:10]
                r = {'timestamp':timestamp, 'amount':amount, 'expiration':expiration, 'address':addr, 'memo':message, 'id':_id}
       -        self.receive_requests[addr] = r
       +        return r
       +
       +    def add_payment_request(self, req, config):
       +        import paymentrequest, shutil, os
       +        addr = req['address']
       +        amount = req.get('amount')
       +        message = req.get('memo')
       +        self.receive_requests[addr] = req
                self.storage.put('payment_requests', self.receive_requests)
                self.set_label(addr, message) # should be a default label
       +
                rdir = config.get('requests_dir')
       -        req = self.get_payment_request(addr, config)
                if rdir and amount is not None:
                    if not os.path.exists(rdir):
                        os.mkdir(rdir)
   DIR diff --git a/plugins/email.py b/plugins/email.py
       t@@ -146,19 +146,17 @@ class Plugin(BasePlugin):
            def send(self):
                addr = str(self.win.receive_address_e.text())
                message = unicode(self.win.receive_message_e.text())
       -        payment_request = self.win.make_payment_request(addr)
       -
       -        if not self.win.save_payment_request():
       +        payment_request = self.win.save_payment_request()
       +        if not payment_request:
                    return
       -
                recipient, ok = QtGui.QInputDialog.getText(self.win, 'Send request', 'Send request to:')
                if not ok:
                    return
       -
                recipient = str(recipient)
       +        payload = payment_request.SerializeToString()
                self.print_error('sending mail to', recipient)
                try:
       -            self.processor.send(recipient, message, payment_request)
       +            self.processor.send(recipient, message, payload)
                except BaseException as e:
                    self.win.show_message(str(e))
                    return