diff --git a/pywallet.py b/pywallet.py index 7cd6881..812acb3 100755 --- a/pywallet.py +++ b/pywallet.py @@ -571,7 +571,8 @@ def open_wallet(db_env, walletfile, writable=False): def inversetxid(txid): if len(txid) is not 64: print("Bad txid") - exit(0) + return "CORRUPTEDTXID:"+txid +# exit(0) new_txid = "" for i in range(32): new_txid += txid[62-2*i]; @@ -625,7 +626,9 @@ def parse_wallet(db, item_callback): for i in xrange(n_vout): d['txOut'].append(parse_TxOut(vds)) d['lockTime'] = vds.read_uint32() - d['tx'] = vds.input[start:vds.read_cursor] + d['tx'] = vds.input[start:vds.read_cursor].encode('hex_codec') + d['txv'] = value.encode('hex_codec') + d['txk'] = key.encode('hex_codec') elif type == "name": d['hash'] = kds.read_string() d['name'] = vds.read_string() @@ -729,8 +732,9 @@ def update_wallet(db, type, data): try: if type == "tx": - raise NotImplementedError("Writing items of type 'tx'") - kds.write(d['tx_id']) +# raise NotImplementedError("Writing items of type 'tx'") + kds.write(d['txi'][6:].decode('hex_codec')) + vds.write(d['txv'].decode('hex_codec')) elif type == "name": kds.write_string(d['hash']) vds.write_string(d['name']) @@ -815,7 +819,7 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact def item_callback(type, d): if type == "tx": - json_db['tx'].append({"txid" : d['tx_id'], "txin" : d['txIn'], "txout" : d['txOut']}) + json_db['tx'].append({"tx_id" : d['tx_id'], "txin" : d['txIn'], "txout" : d['txOut'], "tx_v" : d['txv'], "tx_k" : d['txk']}) elif type == "name": json_db['names'][d['hash']] = d['name'] @@ -966,7 +970,7 @@ class WIRoot(resource.Resource): \
' - ImportForm = '

Import a key in your wallet:

\ + ImportForm = '

Import a key into your wallet:

\ Wallet Directory:
\ Wallet Filename:
\ Key:
\ @@ -993,6 +997,16 @@ class WIRoot(resource.Resource): \

' + ImportTxForm = '

Import a transaction into your wallet:

\ + Wallet Directory:
\ + Wallet Filename:
\ + Txk:
\ + Txv:
\ + \ + \ + \ +

' + BalanceForm = '

Print the balance of a Bitcoin address:

\ Key:
\

\ @@ -1141,9 +1155,35 @@ class WIRoot(resource.Resource): document.getElementById("DeleteDiv").innerHTML = "Loading...";\ ajaxRequest.send(null);\ }\ + function ajaxImportTx(){\ + var ajaxRequest;\ + try{\ + ajaxRequest = new XMLHttpRequest();\ + } catch (e){\ + try{\ + ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");\ + } catch (e) {\ + try{\ + ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");\ + } catch (e){\ + alert("Your browser broke!");\ + return false;\ + }\ + }\ + }\ + ajaxRequest.onreadystatechange = function(){\ + if(ajaxRequest.readyState == 4){\ + document.getElementById("ImportTxDiv").innerHTML = ajaxRequest.responseText;\ + }\ + };\ + var queryString = "/ImportTx?dir="+document.getElementById("it-dir").value+"&name="+document.getElementById("it-name").value+"&txk="+document.getElementById("it-txk").value+"&txv="+document.getElementById("it-txv").value;\n\ + ajaxRequest.open("GET", queryString, true);\n\ + document.getElementById("ImportTxDiv").innerHTML = "Loading...";\ + ajaxRequest.send(null);\ + }\ ' - page = 'Pywallet Web Interface' + header + Javascript + DWForm + InfoForm + ImportForm + DeleteForm + BalanceForm + Misc + '' + page = 'Pywallet Web Interface' + header + Javascript + DWForm + InfoForm + ImportForm + ImportTxForm + DeleteForm + BalanceForm + Misc + '' return page def getChild(self, name, request): @@ -1246,6 +1286,39 @@ class WIInfo(resource.Resource): return self.render_GET(request) +class WIImportTx(resource.Resource): + + def render_GET(self, request): + global addrtype + try: + wdir=request.args['dir'][0] + wname=request.args['name'][0] + txk=request.args['txk'][0] + txv=request.args['txv'][0] + + if not os.path.isfile(wdir+"/"+wname): + return '%s/%s doesn\'t exist'%(wdir, wname) + + db_env = create_env(wdir) + read_wallet(json_db, db_env, wname, True, True, "", None) + db = open_wallet(db_env, wname, writable=True) + + d = {} + d['txi'] = txk + d['txv'] = txv + update_wallet(db, "tx", d) + + db.close() + + return "
txk: %s\nTransaction imported in %s/%s
" % (txk, wdir, wname)
+
+        except:
+            log.err()
+            return 'Error in importtx page'
+
+        def render_POST(self, request):
+            return self.render_GET(request)
+
 class WIImport(resource.Resource):
 
     def render_GET(self, request):
@@ -1366,6 +1439,7 @@ if __name__ == '__main__':
 	VIEWS = {
 		 'DumpWallet': WIDumpWallet(),
 		 'Import': WIImport(),
+		 'ImportTx': WIImportTx(),
 		 'Info': WIInfo(),
 		 'Delete': WIDelete(),
 		 'Balance': WIBalance()