perform get_alias in a thread

This commit is contained in:
thomasv 2012-02-03 15:45:41 +01:00
parent a041b48f4d
commit 25e3993a53
4 changed files with 67 additions and 42 deletions

View File

@ -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) 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__': if __name__ == '__main__':
known_commands = ['help', 'validateaddress', 'balance', 'contacts', 'create', 'payto', 'sendtx', 'password', 'newaddress', 'addresses', 'history', 'label', 'gui', 'mktx','seed','import','signmessage','verifymessage'] 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): if re.match('^bitcoin:', cmd):
o = cmd[8:].split('?') o = cmd[8:].split('?')
address = alias(o[0]) address = o[0]
if len(o)>1: if len(o)>1:
params = o[1].split('&') params = o[1].split('&')
else: else:
@ -95,20 +76,11 @@ if __name__ == '__main__':
elif k == 'label': label = uv elif k == 'label': label = uv
elif k == 'signature': elif k == 'signature':
identity, signature = uv.split(':') identity, signature = uv.split(':')
signing_address = alias(identity)
cmd = cmd.replace('&%s=%s'%(k,v),'') cmd = cmd.replace('&%s=%s'%(k,v),'')
else: else:
print k,v print k,v
if signature: gui.set_send_tab(address, amount, label, identity, signature, cmd)
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.main() gui.main()
wallet.save() wallet.save()

View File

@ -17,7 +17,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import datetime import datetime
import thread, time, ast, sys import thread, time, ast, sys, re
import socket, traceback import socket, traceback
import pygtk import pygtk
pygtk.require('2.0') pygtk.require('2.0')
@ -580,6 +580,21 @@ class BitcoinGUI:
gobject.idle_add( self.update_status_bar ) gobject.idle_add( self.update_status_bar )
time.sleep(0.5) 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(): def update_wallet_thread():
while True: while True:
try: try:
@ -627,6 +642,7 @@ class BitcoinGUI:
thread.start_new_thread(update_wallet_thread, ()) thread.start_new_thread(update_wallet_thread, ())
thread.start_new_thread(update_status_bar_thread, ()) thread.start_new_thread(update_status_bar_thread, ())
thread.start_new_thread(check_recipient_thread, ())
self.notebook.set_current_page(0) self.notebook.set_current_page(0)
@ -649,10 +665,10 @@ class BitcoinGUI:
payto = gtk.HBox() payto = gtk.HBox()
payto_label = gtk.Label('Pay to:') payto_label = gtk.Label('Pay to:')
payto_label.set_size_request(100,-1) payto_label.set_size_request(100,-1)
payto_label.show() #payto_label.show()
payto.pack_start(payto_label, False) payto.pack_start(payto_label, False)
payto_entry = gtk.Entry() payto_entry = gtk.Entry()
payto_entry.set_size_request(350, 26) payto_entry.set_size_request(450, 26)
payto_entry.show() payto_entry.show()
payto.pack_start(payto_entry, False) payto.pack_start(payto_entry, False)
vbox.pack_start(payto, False, False, 5) vbox.pack_start(payto, False, False, 5)
@ -663,7 +679,7 @@ class BitcoinGUI:
label_label.show() label_label.show()
label.pack_start(label_label, False) label.pack_start(label_label, False)
label_entry = gtk.Entry() label_entry = gtk.Entry()
label_entry.set_size_request(350, 26) label_entry.set_size_request(450, 26)
label_entry.show() label_entry.show()
label.pack_start(label_entry, False) label.pack_start(label_entry, False)
vbox.pack_start(label, False, False, 5) vbox.pack_start(label, False, False, 5)
@ -736,7 +752,7 @@ class BitcoinGUI:
self.error = 'Not enough funds' self.error = 'Not enough funds'
amount_entry.connect('changed', entry_changed, False) 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_entry = payto_entry
self.payto_fee_entry = fee_entry self.payto_fee_entry = fee_entry
@ -757,9 +773,17 @@ class BitcoinGUI:
entry.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#ffffff")) 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.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_label_entry.set_text(label)
self.payto_amount_entry.set_text(amount) self.payto_amount_entry.set_text(amount)
if identity: if identity:
@ -788,16 +812,19 @@ class BitcoinGUI:
for entry in [self.payto_entry,self.payto_amount_entry,self.payto_label_entry]: for entry in [self.payto_entry,self.payto_amount_entry,self.payto_label_entry]:
self.set_frozen(entry,False) self.set_frozen(entry,False)
entry.set_text('') entry.set_text('')
def do_send(self, w, data): def do_send(self, w, data):
payto_entry, label_entry, amount_entry, fee_entry = data payto_entry, label_entry, amount_entry, fee_entry = data
label = label_entry.get_text() label = label_entry.get_text()
r = payto_entry.get_text()
to_address = 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): if not self.wallet.is_valid(to_address):
self.show_message( "invalid bitcoin address") self.show_message( "invalid bitcoin address:\n"+to_address)
return return
try: try:

View File

@ -19,6 +19,9 @@
import random, socket, ast import random, socket, ast
class Interface: class Interface:
def __init__(self): def __init__(self):
self.servers = ['ecdsa.org','electrum.novit.ro'] # list of default servers self.servers = ['ecdsa.org','electrum.novit.ro'] # list of default servers

View File

@ -218,6 +218,7 @@ from version import ELECTRUM_VERSION, SEED_VERSION
class Wallet: class Wallet:
def __init__(self, interface): def __init__(self, interface):
@ -703,3 +704,25 @@ class Wallet:
return False, "error: " + out return False, "error: " + out
return True, 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