diff --git a/client/electrum b/client/electrum index a25eb673..6048cce0 100755 --- a/client/electrum +++ b/client/electrum @@ -28,25 +28,6 @@ _ud = re.compile('%([0-9a-hA-H]{2})', re.MULTILINE) urldecode = lambda x: _ud.sub(lambda m: chr(int(m.group(1), 16)), x) -def alias(x): - import urllib - if wallet.is_valid(x): - xx = x - else: - m = re.match('([\w\-\.]+)@((\w[\w\-]+\.)+[\w\-]+)', x) - if m: - url = 'http://' + m.group(2) + '/bitcoin.id/' + m.group(1) - else: - url = 'http://' + x + '/bitcoin.id' - print url - try: - xx = urllib.urlopen(url).read().strip() - except: - xx = '' - if not wallet.is_valid(xx): - xx = '' - return xx - if __name__ == '__main__': known_commands = ['help', 'validateaddress', 'balance', 'contacts', 'create', 'payto', 'sendtx', 'password', 'newaddress', 'addresses', 'history', 'label', 'gui', 'mktx','seed','import','signmessage','verifymessage'] @@ -81,7 +62,7 @@ if __name__ == '__main__': if re.match('^bitcoin:', cmd): o = cmd[8:].split('?') - address = alias(o[0]) + address = o[0] if len(o)>1: params = o[1].split('&') else: @@ -95,20 +76,11 @@ if __name__ == '__main__': elif k == 'label': label = uv elif k == 'signature': identity, signature = uv.split(':') - signing_address = alias(identity) cmd = cmd.replace('&%s=%s'%(k,v),'') else: print k,v - if signature: - try: - wallet.verify_message(signing_address, signature, cmd ) - except: - gui.show_message('Warning: the URI contains a bad signature.\nThe identity of the recipient cannot be verified.\nContinue at your own risks!') - address = amount = label = identity = '' - - if address: - gui.set_send_tab(address, amount, label, identity) + gui.set_send_tab(address, amount, label, identity, signature, cmd) gui.main() wallet.save() diff --git a/client/gui.py b/client/gui.py index cb0dee5e..a619370f 100644 --- a/client/gui.py +++ b/client/gui.py @@ -17,7 +17,7 @@ # along with this program. If not, see . import datetime -import thread, time, ast, sys +import thread, time, ast, sys, re import socket, traceback import pygtk pygtk.require('2.0') @@ -580,6 +580,21 @@ class BitcoinGUI: gobject.idle_add( self.update_status_bar ) time.sleep(0.5) + + def check_recipient_thread(): + old_r = '' + while True: + time.sleep(0.5) + r = self.payto_entry.get_text() + if r != old_r: + old_r = r + if re.match('^(|([\w\-\.]+)@)((\w[\w\-]+\.)+[\w\-]+)$', r): + to_address = self.wallet.get_alias(r) + if to_address: + s = r+ ' <'+to_address+'>' + gobject.idle_add( lambda: self.payto_entry.set_text(s) ) + + def update_wallet_thread(): while True: try: @@ -627,6 +642,7 @@ class BitcoinGUI: thread.start_new_thread(update_wallet_thread, ()) thread.start_new_thread(update_status_bar_thread, ()) + thread.start_new_thread(check_recipient_thread, ()) self.notebook.set_current_page(0) @@ -649,10 +665,10 @@ class BitcoinGUI: payto = gtk.HBox() payto_label = gtk.Label('Pay to:') payto_label.set_size_request(100,-1) - payto_label.show() + #payto_label.show() payto.pack_start(payto_label, False) payto_entry = gtk.Entry() - payto_entry.set_size_request(350, 26) + payto_entry.set_size_request(450, 26) payto_entry.show() payto.pack_start(payto_entry, False) vbox.pack_start(payto, False, False, 5) @@ -663,7 +679,7 @@ class BitcoinGUI: label_label.show() label.pack_start(label_label, False) label_entry = gtk.Entry() - label_entry.set_size_request(350, 26) + label_entry.set_size_request(450, 26) label_entry.show() label.pack_start(label_entry, False) vbox.pack_start(label, False, False, 5) @@ -736,7 +752,7 @@ class BitcoinGUI: self.error = 'Not enough funds' amount_entry.connect('changed', entry_changed, False) - fee_entry.connect('changed', entry_changed, True) + fee_entry.connect('changed', entry_changed, True) self.payto_entry = payto_entry self.payto_fee_entry = fee_entry @@ -757,9 +773,17 @@ class BitcoinGUI: entry.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#ffffff")) - def set_send_tab(self, address, amount, label, identity): + def set_send_tab(self, payto, amount, label, identity, signature, cmd): + if signature: + try: + signing_address = self.wallet.get_alias(identity) + self.wallet.verify_message(signing_address, signature, cmd ) + except: + self.show_message('Warning: the URI contains a bad signature.\nThe identity of the recipient cannot be verified.\nContinue at your own risks!') + address = amount = label = identity = '' + self.notebook.set_current_page(1) - self.payto_entry.set_text(address) + self.payto_entry.set_text(payto) self.payto_label_entry.set_text(label) self.payto_amount_entry.set_text(amount) if identity: @@ -788,16 +812,19 @@ class BitcoinGUI: for entry in [self.payto_entry,self.payto_amount_entry,self.payto_label_entry]: self.set_frozen(entry,False) entry.set_text('') - + def do_send(self, w, data): payto_entry, label_entry, amount_entry, fee_entry = data - label = label_entry.get_text() - - to_address = payto_entry.get_text() + r = payto_entry.get_text() + m = re.match('(|([\w\-\.]+)@)((\w[\w\-]+\.)+[\w\-]+) \<([1-9A-HJ-NP-Za-km-z]{26,})\>', r) + if m: + to_address = m.group(5) + else: + to_address = r if not self.wallet.is_valid(to_address): - self.show_message( "invalid bitcoin address") + self.show_message( "invalid bitcoin address:\n"+to_address) return try: diff --git a/client/interface.py b/client/interface.py index 0ba94817..b9aa2979 100644 --- a/client/interface.py +++ b/client/interface.py @@ -19,6 +19,9 @@ import random, socket, ast + + + class Interface: def __init__(self): self.servers = ['ecdsa.org','electrum.novit.ro'] # list of default servers diff --git a/client/wallet.py b/client/wallet.py index e34e85bc..c8881c1a 100644 --- a/client/wallet.py +++ b/client/wallet.py @@ -218,6 +218,7 @@ from version import ELECTRUM_VERSION, SEED_VERSION + class Wallet: def __init__(self, interface): @@ -703,3 +704,25 @@ class Wallet: return False, "error: " + out return True, out + def get_alias(self, x): + # this might not be the right place for this function. + import urllib + if self.is_valid(x): + return x + else: + m1 = re.match('([\w\-\.]+)@((\w[\w\-]+\.)+[\w\-]+)', x) + m2 = re.match('((\w[\w\-]+\.)+[\w\-]+)', x) + if m1: + url = 'http://' + m1.group(2) + '/bitcoin.id/' + m1.group(1) + elif m2: + url = 'http://' + x + '/bitcoin.id' + else: + return '' + try: + print url + xx = urllib.urlopen(url).read().strip() + except: + return '' + if not self.is_valid(xx): + return '' + return xx