tseparate commands from transport - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 789639ff74b0522576df44526b531d5389249fcf DIR parent c8ddf49833b03ba064e7e27847767bb4e65dbe8f HTML Author: ThomasV <thomasv@gitorious> Date: Thu, 22 Dec 2011 22:16:14 +0300 separate commands from transport Diffstat: M server/server.py | 317 +++++++++++++++++-------------- 1 file changed, 171 insertions(+), 146 deletions(-) --- DIR diff --git a/server/server.py b/server/server.py t@@ -358,171 +358,196 @@ def client_thread(ipaddr,conn): conn.close() return - if cmd=='b': - out = "%d"%block_number - - elif cmd in ['session','new_session']: - session_id = random_string(10) + out = do_command(cmd, data, ipaddr) + if out: + #print ipaddr, cmd, len(out) try: - if cmd == 'session': - addresses = ast.literal_eval(data) - version = "old" - else: - version, addresses = ast.literal_eval(data) - if version[0]=="0": version = "v" + version + conn.send(out) except: - print "error", data - conn.close() - return + print "error, could not send" - print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "new session", ipaddr, addresses[0] if addresses else addresses, len(addresses), version + finally: + conn.close() + - sessions[session_id] = { 'addresses':{}, 'version':version, 'ip':ipaddr } - for a in addresses: - sessions[session_id]['addresses'][a] = '' - out = repr( (session_id, config.get('server','banner').replace('\\n','\n') ) ) - sessions[session_id]['last_time'] = time.time() - elif cmd=='update_session': - try: - session_id, addresses = ast.literal_eval(data) - except: - print "error" - conn.close() - return +def do_command(cmd, data, ipaddr): - print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "update session", ipaddr, addresses[0] if addresses else addresses, len(addresses) + if cmd=='b': + out = "%d"%block_number - sessions[session_id]['addresses'] = {} - for a in addresses: - sessions[session_id]['addresses'][a] = '' - out = 'ok' - sessions[session_id]['last_time'] = time.time() - - elif cmd == 'bccapi_login': - import electrum - print "data",data - v, k = ast.literal_eval(data) - master_public_key = k.decode('hex') # todo: sanitize. no need to decode twice... - print master_public_key - wallet_id = random_string(10) - w = electrum.Wallet() - w.master_public_key = master_public_key.decode('hex') - w.synchronize() - wallets[wallet_id] = w - out = wallet_id - print "wallets", wallets - - elif cmd == 'bccapi_getAccountInfo': - import electrum - v, wallet_id = ast.literal_eval(data) - w = wallets.get(wallet_id) - if w is not None: - num = len(w.addresses) - c, u = w.get_balance() - out = electrum.int_to_hex(num,4) + electrum.int_to_hex(c,8) + electrum.int_to_hex( c+u, 8 ) - out = out.decode('hex') - else: - print "error",data - out = "error" - - elif cmd=='poll': - session_id = data - session = sessions.get(session_id) - if session is None: - print time.asctime(), "session not found", session_id, ipaddr - out = repr( (-1, {})) - else: - t1 = time.time() - addresses = session['addresses'] - session['last_time'] = time.time() - ret = {} - k = 0 - for addr in addresses: - if store.tx_cache.get( addr ) is not None: k += 1 - - # get addtess status, i.e. the last block for that address. - tx_points = store.get_history(addr) - if not tx_points: - status = None - else: - lastpoint = tx_points[-1] - status = lastpoint['blk_hash'] - # this is a temporary hack; move it up once old clients have disappeared - if status == 'mempool' and session['version'] != "old": - status = status + ':%d'% len(tx_points) - - last_status = addresses.get( addr ) - if last_status != status: - addresses[addr] = status - ret[addr] = status - if ret: - sessions[session_id]['addresses'] = addresses - out = repr( (block_number, ret ) ) - t2 = time.time() - t1 - if t2 > 10: - print "high load:", session_id, "%d/%d"%(k,len(addresses)), t2 - - elif cmd == 'h': - # history - address = data - out = repr( store.get_history( address ) ) - - elif cmd == 'load': - if config.get('server','password') == data: - out = repr( len(sessions) ) + elif cmd in ['session','new_session']: + session_id = random_string(10) + try: + if cmd == 'session': + addresses = ast.literal_eval(data) + version = "old" else: - out = 'wrong password' + version, addresses = ast.literal_eval(data) + if version[0]=="0": version = "v" + version + except: + print "error", data + return None - elif cmd =='tx': - out = send_tx(data) - print "sent tx:", out + print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "new session", ipaddr, addresses[0] if addresses else addresses, len(addresses), version - elif cmd =='clear_cache': - if config.get('server','password') == data: - store.tx_cache = {} - out = 'ok' - else: - out = 'wrong password' + sessions[session_id] = { 'addresses':{}, 'version':version, 'ip':ipaddr } + for a in addresses: + sessions[session_id]['addresses'][a] = '' + out = repr( (session_id, config.get('server','banner').replace('\\n','\n') ) ) + sessions[session_id]['last_time'] = time.time() - elif cmd =='get_cache': - try: - pw, addr = data - except: - addr = None - if addr: - if config.get('server','password') == pw: - out = store.tx_cache.get(addr) - out = repr(out) + elif cmd=='update_session': + try: + session_id, addresses = ast.literal_eval(data) + except: + print "error" + return None + + print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "update session", ipaddr, addresses[0] if addresses else addresses, len(addresses) + + sessions[session_id]['addresses'] = {} + for a in addresses: + sessions[session_id]['addresses'][a] = '' + out = 'ok' + sessions[session_id]['last_time'] = time.time() + + elif cmd == 'bccapi_login': + import electrum + print "data",data + v, k = ast.literal_eval(data) + master_public_key = k.decode('hex') # todo: sanitize. no need to decode twice... + print master_public_key + wallet_id = random_string(10) + w = electrum.Wallet() + w.master_public_key = master_public_key.decode('hex') + w.synchronize() + wallets[wallet_id] = w + out = wallet_id + print "wallets", wallets + + elif cmd == 'bccapi_getAccountInfo': + from electrum import int_to_hex + v, wallet_id = ast.literal_eval(data) + w = wallets.get(wallet_id) + if w is not None: + num = len(w.addresses) + c, u = w.get_balance() + out = int_to_hex(num,4) + int_to_hex(c,8) + int_to_hex( c+u, 8 ) + out = out.decode('hex') + else: + print "error",data + out = "error" + + elif cmd == 'bccapi_getAccountStatement': + from electrum import int_to_hex + v, wallet_id = ast.literal_eval(data) + w = wallets.get(wallet_id) + if w is not None: + num = len(w.addresses) + c, u = w.get_balance() + total_records = num_records = 0 + out = int_to_hex(num,4) + int_to_hex(c,8) + int_to_hex( c+u, 8 ) + int_to_hex( total_records ) + int_to_hex( num_records ) + out = out.decode('hex') + else: + print "error",data + out = "error" + + elif cmd == 'bccapi_getSendCoinForm': + out = '' + + elif cmd == 'bccapi_submitTransaction': + out = '' + + elif cmd=='poll': + session_id = data + session = sessions.get(session_id) + if session is None: + print time.asctime(), "session not found", session_id, ipaddr + out = repr( (-1, {})) + else: + t1 = time.time() + addresses = session['addresses'] + session['last_time'] = time.time() + ret = {} + k = 0 + for addr in addresses: + if store.tx_cache.get( addr ) is not None: k += 1 + + # get addtess status, i.e. the last block for that address. + tx_points = store.get_history(addr) + if not tx_points: + status = None else: - out = 'wrong password' - else: - out = "error: "+ repr(data) + lastpoint = tx_points[-1] + status = lastpoint['blk_hash'] + # this is a temporary hack; move it up once old clients have disappeared + if status == 'mempool' and session['version'] != "old": + status = status + ':%d'% len(tx_points) + + last_status = addresses.get( addr ) + if last_status != status: + addresses[addr] = status + ret[addr] = status + if ret: + sessions[session_id]['addresses'] = addresses + out = repr( (block_number, ret ) ) + t2 = time.time() - t1 + if t2 > 10: + print "high load:", session_id, "%d/%d"%(k,len(addresses)), t2 + + elif cmd == 'h': + # history + address = data + out = repr( store.get_history( address ) ) + + elif cmd == 'load': + if config.get('server','password') == data: + out = repr( len(sessions) ) + else: + out = 'wrong password' - elif cmd == 'stop': - global stopping - if config.get('server','password') == data: - stopping = True - out = 'ok' + elif cmd =='tx': + out = send_tx(data) + print "sent tx:", out + + elif cmd =='clear_cache': + if config.get('server','password') == data: + store.tx_cache = {} + out = 'ok' + else: + out = 'wrong password' + + elif cmd =='get_cache': + try: + pw, addr = data + except: + addr = None + if addr: + if config.get('server','password') == pw: + out = store.tx_cache.get(addr) + out = repr(out) else: out = 'wrong password' + else: + out = "error: "+ repr(data) - elif cmd == 'peers': - out = repr(peer_list.values()) - + elif cmd == 'stop': + global stopping + if config.get('server','password') == data: + stopping = True + out = 'ok' else: - out = None + out = 'wrong password' - if out: - #print ipaddr, cmd, len(out) - try: - conn.send(out) - except: - print "error, could not send" + elif cmd == 'peers': + out = repr(peer_list.values()) + + else: + out = None + + return out - finally: - conn.close() -