From 438b12e5498b641b5b16e853cacc9fabf7692bc8 Mon Sep 17 00:00:00 2001 From: jackjack Date: Fri, 19 Aug 2011 21:42:41 +0200 Subject: [PATCH] No more crash when --web without twisted installed --- pywallet.py | 333 ++++++++++++++++++++++++++-------------------------- 1 file changed, 166 insertions(+), 167 deletions(-) diff --git a/pywallet.py b/pywallet.py index 77641f1..f71d441 100755 --- a/pywallet.py +++ b/pywallet.py @@ -1613,40 +1613,145 @@ def inverse_str(string): ret += string[len(string)-2-2*i+1]; return ret +if 'twisted' not in missing_dep: + class WIInfo(resource.Resource): -class WIInfo(resource.Resource): + def render_GET(self, request): + global addrtype + try: + sec = request.args['key'][0] + format = request.args['format'][0] + addrtype = int(request.args['vers'][0]) + msgIsHex = False + msgIsFile = False + try: + msg = request.args['msg'][0] + if msg[0:4] == "Hex:": + msg = msg[4:] + msgIsHex = True + elif msg[0:5] == "File:": + msg = msg[5:] + if not os.path.isfile(msg): + return '%s doesn\'t exist'%(msg) + filin = open(msg, 'r') + msg = filin.read() + filin.close() + msgIsFile = True - def render_GET(self, request): - global addrtype - try: - sec = request.args['key'][0] - format = request.args['format'][0] - addrtype = int(request.args['vers'][0]) - msgIsHex = False - msgIsFile = False - try: - msg = request.args['msg'][0] - if msg[0:4] == "Hex:": - msg = msg[4:] - msgIsHex = True - elif msg[0:5] == "File:": - msg = msg[5:] - if not os.path.isfile(msg): - return '%s doesn\'t exist'%(msg) - filin = open(msg, 'r') - msg = filin.read() - filin.close() - msgIsFile = True - - sig = request.args['sig'][0] - pubkey = request.args['pubkey'][0] - need = int(request.args['need'][0]) - except: - need = 1 + sig = request.args['sig'][0] + pubkey = request.args['pubkey'][0] + need = int(request.args['need'][0]) + except: + need = 1 - ret = "" + ret = "" - if sec is not '': + if sec is not '': + if format in 'reg': + pkey = regenerate_key(sec) + elif len(sec) == 64: + pkey = EC_KEY(str_to_long(sec.decode('hex'))) + else: + return "Hexadecimal private keys must be 64 characters long" + + if not pkey: + return "Bad private key" + + secret = GetSecret(pkey) + private_key = GetPrivKey(pkey) + public_key = GetPubKey(pkey) + addr = public_key_to_bc_address(public_key) + + if need & 1: + ret += "Address (%s): %s
"%(aversions[addrtype], addr) + ret += "Privkey (%s): %s
"%(aversions[addrtype], SecretToASecret(secret)) + ret += "Hexprivkey: %s
"%(secret.encode('hex')) + ret += "Hash160: %s
"%(bc_address_to_hash_160(addr).encode('hex')) + # ret += "Inverted hexprivkey: %s
"%(inversetxid(secret.encode('hex'))) + ret += "Pubkey: 04%.64x%.64x
"%(pkey.pubkey.point.x(), pkey.pubkey.point.y()) + ret += X_if_else('

Beware, 0x%s is equivalent to 0x%.33x'%(secret.encode('hex'), int(secret.encode('hex'), 16)-_r), (int(secret.encode('hex'), 16)>_r), '') + + if 'ecdsa' not in missing_dep and need & 2: + if sec is not '' and msg is not '': + if need & 1: + ret += "
" + ret += "Signature of '%s' by %s: %s
Pubkey: 04%.64x%.64x
"%(X_if_else(msg, not msgIsFile, request.args['msg'][0]), addr, sign_message(secret, msg, msgIsHex), pkey.pubkey.point.x(), pkey.pubkey.point.y()) + + if sig is not '' and msg is not '' and pubkey is not '': + addr = public_key_to_bc_address(pubkey.decode('hex')) + try: + verify_message_signature(pubkey, sig, msg, msgIsHex) + ret += "
Signature of '%s' by %s is %s
"%(X_if_else(msg, not msgIsFile, request.args['msg'][0]), addr, sig) + except: + ret += "
Signature of '%s' by %s is NOT %s
"%(X_if_else(msg, not msgIsFile, request.args['msg'][0]), addr, sig) + + return ret + + except: + log.err() + return 'Error in info page' + + def render_POST(self, request): + 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] + d = {} + + if not os.path.isfile(wdir+"/"+wname): + return '%s/%s doesn\'t exist'%(wdir, wname) + + if txk not in "file": + dd = [{'tx_k':txk, 'tx_v':txv}] + else: + if not os.path.isfile(txv): + return '%s doesn\'t exist'%(txv) + dd = read_jsonfile(txv) + + + db_env = create_env(wdir) + read_wallet(json_db, db_env, wname, True, True, "", None) + db = open_wallet(db_env, wname, writable=True) + + i=0 + for tx in dd: + d = {'txi':tx['tx_k'], 'txv':tx['tx_v']} + print(d) + update_wallet(db, "tx", d) + i+=1 + + db.close() + + return "
hash: %s\n%d transaction%s imported in %s/%s
" % (inverse_str(txk[6:]), i, iais(i), 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):
+		     global addrtype
+		     try:
+					sec = request.args['key'][0]
+					format = request.args['format'][0]
+					addrtype = int(request.args['vers'][0])
+					wdir=request.args['dir'][0]
+					wname=request.args['name'][0]
+					reserve=request.args.has_key('reserve')
+					label=request.args['label'][0]
+				
 					if format in 'reg':
 						pkey = regenerate_key(sec)
 					elif len(sec) == 64:
@@ -1657,146 +1762,41 @@ class WIInfo(resource.Resource):
 					if not pkey:
 						return "Bad private key"
 
+					if not os.path.isfile(wdir+"/"+wname):
+						return '%s/%s doesn\'t exist'%(wdir, wname)
+
+
 					secret = GetSecret(pkey)
 					private_key = GetPrivKey(pkey)
 					public_key = GetPubKey(pkey)
 					addr = public_key_to_bc_address(public_key)
 
-					if need & 1:
-						ret += "Address (%s): %s
"%(aversions[addrtype], addr) - ret += "Privkey (%s): %s
"%(aversions[addrtype], SecretToASecret(secret)) - ret += "Hexprivkey: %s
"%(secret.encode('hex')) - ret += "Hash160: %s
"%(bc_address_to_hash_160(addr).encode('hex')) -# ret += "Inverted hexprivkey: %s
"%(inversetxid(secret.encode('hex'))) - ret += "Pubkey: 04%.64x%.64x
"%(pkey.pubkey.point.x(), pkey.pubkey.point.y()) - ret += X_if_else('

Beware, 0x%s is equivalent to 0x%.33x'%(secret.encode('hex'), int(secret.encode('hex'), 16)-_r), (int(secret.encode('hex'), 16)>_r), '') + db_env = create_env(wdir) + read_wallet(json_db, db_env, wname, True, True, "", None) + db = open_wallet(db_env, wname, writable=True) - if 'ecdsa' not in missing_dep and need & 2: - if sec is not '' and msg is not '': - if need & 1: - ret += "
" - ret += "Signature of '%s' by %s: %s
Pubkey: 04%.64x%.64x
"%(X_if_else(msg, not msgIsFile, request.args['msg'][0]), addr, sign_message(secret, msg, msgIsHex), pkey.pubkey.point.x(), pkey.pubkey.point.y()) + if (format in 'reg' and sec in private_keys) or (format not in 'reg' and sec in private_hex_keys): + return "Already exists" - if sig is not '' and msg is not '' and pubkey is not '': - addr = public_key_to_bc_address(pubkey.decode('hex')) - try: - verify_message_signature(pubkey, sig, msg, msgIsHex) - ret += "
Signature of '%s' by %s is %s
"%(X_if_else(msg, not msgIsFile, request.args['msg'][0]), addr, sig) - except: - ret += "
Signature of '%s' by %s is NOT %s
"%(X_if_else(msg, not msgIsFile, request.args['msg'][0]), addr, sig) - - return ret - - except: - log.err() - return 'Error in info page' - - def render_POST(self, request): - 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] - d = {} - - if not os.path.isfile(wdir+"/"+wname): - return '%s/%s doesn\'t exist'%(wdir, wname) - - if txk not in "file": - dd = [{'tx_k':txk, 'tx_v':txv}] - else: - if not os.path.isfile(txv): - return '%s doesn\'t exist'%(txv) - dd = read_jsonfile(txv) - - - db_env = create_env(wdir) - read_wallet(json_db, db_env, wname, True, True, "", None) - db = open_wallet(db_env, wname, writable=True) - - i=0 - for tx in dd: - d = {'txi':tx['tx_k'], 'txv':tx['tx_v']} - print(d) - update_wallet(db, "tx", d) - i+=1 + update_wallet(db, 'key', { 'public_key' : public_key, 'private_key' : private_key }) + if not reserve: + update_wallet(db, 'name', { 'hash' : addr, 'name' : label }) - db.close() + db.close() - return "
hash: %s\n%d transaction%s imported in %s/%s
" % (inverse_str(txk[6:]), i, iais(i), wdir, wname)
+					return "
Address: %s\nPrivkey: %s\nHexkey: %s\nKey imported in %s/%s
" % (addr, SecretToASecret(secret), secret.encode('hex'), wdir, wname)
 
-        except:
-            log.err()
-            return 'Error in importtx page'
+		     except:
+		         log.err()
+		         return 'Error in import page'
 
-        def render_POST(self, request):
-            return self.render_GET(request)
+		     def render_POST(self, request):
+		         return self.render_GET(request)
 
-class WIImport(resource.Resource):
+	class WI404(resource.Resource):
 
-    def render_GET(self, request):
-        global addrtype
-        try:
-				sec = request.args['key'][0]
-				format = request.args['format'][0]
-				addrtype = int(request.args['vers'][0])
-				wdir=request.args['dir'][0]
-				wname=request.args['name'][0]
-				reserve=request.args.has_key('reserve')
-				label=request.args['label'][0]
-				
-				if format in 'reg':
-					pkey = regenerate_key(sec)
-				elif len(sec) == 64:
-					pkey = EC_KEY(str_to_long(sec.decode('hex')))
-				else:
-					return "Hexadecimal private keys must be 64 characters long"
-
-				if not pkey:
-					return "Bad private key"
-
-				if not os.path.isfile(wdir+"/"+wname):
-					return '%s/%s doesn\'t exist'%(wdir, wname)
-
-
-				secret = GetSecret(pkey)
-				private_key = GetPrivKey(pkey)
-				public_key = GetPubKey(pkey)
-				addr = public_key_to_bc_address(public_key)
-
-				db_env = create_env(wdir)
-				read_wallet(json_db, db_env, wname, True, True, "", None)
-				db = open_wallet(db_env, wname, writable=True)
-
-				if (format in 'reg' and sec in private_keys) or (format not in 'reg' and sec in private_hex_keys):
-					return "Already exists"
-
-				update_wallet(db, 'key', { 'public_key' : public_key, 'private_key' : private_key })
-				if not reserve:
-					update_wallet(db, 'name', { 'hash' : addr, 'name' : label })
-	
-				db.close()
-
-				return "
Address: %s\nPrivkey: %s\nHexkey: %s\nKey imported in %s/%s
" % (addr, SecretToASecret(secret), secret.encode('hex'), wdir, wname)
-
-        except:
-            log.err()
-            return 'Error in import page'
-
-        def render_POST(self, request):
-            return self.render_GET(request)
-
-class WI404(resource.Resource):
-
-    def render_GET(self, request):
-        return 'Page Not Found'
+		 def render_GET(self, request):
+		     return 'Page Not Found'
 
 
 from optparse import OptionParser
@@ -1870,16 +1870,6 @@ if __name__ == '__main__':
 
 	(options, args) = parser.parse_args()
 
-	VIEWS = {
-		 'DumpWallet': WIDumpWallet(),
-		 'Import': WIImport(),
-		 'ImportTx': WIImportTx(),
-		 'DumpTx': WIDumpTx(),
-		 'Info': WIInfo(),
-		 'Delete': WIDelete(),
-		 'Balance': WIBalance()
-	}
-
 #	a=Popen("ps xa | grep ' bitcoin'", shell=True, bufsize=-1, stdout=PIPE).stdout
 #	aread=a.read()
 #	nl = aread.count("\n")
@@ -1930,6 +1920,15 @@ if __name__ == '__main__':
 	if 'ecdsa' in missing_dep:
 		print("'ecdsa' package is not installed, pywallet won't be able to sign/verify messages")
 
+	VIEWS = {
+		 'DumpWallet': WIDumpWallet(),
+		 'Import': WIImport(),
+		 'ImportTx': WIImportTx(),
+		 'DumpTx': WIDumpTx(),
+		 'Info': WIInfo(),
+		 'Delete': WIDelete(),
+		 'Balance': WIBalance()
+	}
 
 	if options.datadir is not None:
 		wallet_dir = options.datadir