fix csv file import bug and allow multiple deletions at once

This commit is contained in:
jackjack-jj 2013-05-21 23:30:20 +02:00
parent 2b7b67dd60
commit 5d3f08edf5

View File

@ -1086,12 +1086,12 @@ def hash_160(public_key):
md.update(hashlib.sha256(public_key).digest()) md.update(hashlib.sha256(public_key).digest())
return md.digest() return md.digest()
def public_key_to_bc_address(public_key): def public_key_to_bc_address(public_key, v=addrtype):
h160 = hash_160(public_key) h160 = hash_160(public_key)
return hash_160_to_bc_address(h160) return hash_160_to_bc_address(h160, v)
def hash_160_to_bc_address(h160): def hash_160_to_bc_address(h160, v=addrtype):
vh160 = chr(addrtype) + h160 vh160 = chr(v) + h160
h = Hash(vh160) h = Hash(vh160)
addr = vh160 + h[0:4] addr = vh160 + h[0:4]
return b58encode(addr) return b58encode(addr)
@ -1766,12 +1766,19 @@ def parse_wallet(db, item_callback):
print("value data in hex: %s"%value.encode('hex_codec')) print("value data in hex: %s"%value.encode('hex_codec'))
sys.exit(1) sys.exit(1)
def delete_from_wallet(db_env, walletfile, typedel, keydel): def delete_from_wallet(db_env, walletfile, typedel, kd):
db = open_wallet(db_env, walletfile, True) db = open_wallet(db_env, walletfile, True)
kds = BCDataStream() kds = BCDataStream()
vds = BCDataStream() vds = BCDataStream()
deleted_items = 0 deleted_items = 0
if not isinstance(kd, list):
kd=[kd]
print kd
for i in range(len(kd)):
keydel=kd[i]
for (key, value) in db.items(): for (key, value) in db.items():
kds.clear(); kds.write(key) kds.clear(); kds.write(key)
vds.clear(); vds.write(value) vds.clear(); vds.write(value)
@ -2182,10 +2189,10 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact
crypted = 'salt' in json_db['mkey'] crypted = 'salt' in json_db['mkey']
if not crypted: if not crypted:
print "The wallet is not crypted" print "The wallet is not encrypted"
if crypted and not passphrase: if crypted and not passphrase:
print "The wallet is crypted but no passphrase is used" print "The wallet is encrypted but no passphrase is used"
if crypted and passphrase: if crypted and passphrase:
check = True check = True
@ -2196,14 +2203,14 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact
public_key = k['pubkey'].decode('hex') public_key = k['pubkey'].decode('hex')
crypter.SetIV(Hash(public_key)) crypter.SetIV(Hash(public_key))
secret = crypter.Decrypt(ckey) secret = crypter.Decrypt(ckey)
compressed = public_key[0] != '\x04' compressed = public_key[0] != '\04'
if check: if check:
check = False check = False
pkey = EC_KEY(int('0x' + secret.encode('hex'), 16)) pkey = EC_KEY(int('0x' + secret.encode('hex'), 16))
if public_key != GetPubKey(pkey, compressed): if public_key != GetPubKey(pkey, compressed):
print "The wallet is crypted and the passphrase is incorrect" print "The wallet is encrypted and the passphrase is incorrect"
ppcorrect=False ppcorrect=False
break break
@ -2218,7 +2225,7 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact
# del(k['pubkey']) # del(k['pubkey'])
private_keys.append(sec) private_keys.append(sec)
if ppcorrect: if ppcorrect:
print "The wallet is crypted and the passphrase is correct" print "The wallet is encrypted and the passphrase is correct"
for k in json_db['keys']: for k in json_db['keys']:
if k['compressed'] and 'secret' in k: if k['compressed'] and 'secret' in k:
@ -2233,7 +2240,7 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact
def importprivkey(db, sec, label, reserve, keyishex, verbose=True): def importprivkey(db, sec, label, reserve, keyishex, verbose=True, addrv=addrtype):
if keyishex is None: if keyishex is None:
pkey = regenerate_key(sec) pkey = regenerate_key(sec)
compressed = is_compressed(sec) compressed = is_compressed(sec)
@ -2253,14 +2260,14 @@ def importprivkey(db, sec, label, reserve, keyishex, verbose=True):
secret = GetSecret(pkey) secret = GetSecret(pkey)
private_key = GetPrivKey(pkey, compressed) private_key = GetPrivKey(pkey, compressed)
public_key = GetPubKey(pkey, compressed) public_key = GetPubKey(pkey, compressed)
addr = public_key_to_bc_address(public_key) addr = public_key_to_bc_address(public_key, addrv)
if verbose: if verbose:
print "Address (%s): %s"%(aversions[addrtype], addr) print "Address (%s): %s"%(aversions[addrv], addr)
print "Privkey (%s): %s"%(aversions[addrtype], SecretToASecret(secret, compressed)) print "Privkey (%s): %s"%(aversions[addrv], SecretToASecret(secret, compressed))
print "Hexprivkey: %s"%(secret.encode('hex')) print "Hexprivkey: %s"%(secret.encode('hex'))
print "Hash160: %s"%(bc_address_to_hash_160(addr).encode('hex')) print "Hash160: %s"%(bc_address_to_hash_160(addr).encode('hex'))
if compressed: if not compressed:
print "Pubkey: 04%.64x%.64x"%(pkey.pubkey.point.x(), pkey.pubkey.point.y()) print "Pubkey: 04%.64x%.64x"%(pkey.pubkey.point.x(), pkey.pubkey.point.y())
else: else:
print "Pubkey: 0%d%.64x"%(2+(pkey.pubkey.point.y()&1), pkey.pubkey.point.x()) print "Pubkey: 0%d%.64x"%(2+(pkey.pubkey.point.y()&1), pkey.pubkey.point.x())
@ -2944,14 +2951,18 @@ def import_csv_keys(filename, wdir, wname, nbremax=9999999):
c=content[i] c=content[i]
global_merging_message = ["Merging: "+str(round(100.0*(i+1)/len(content),1))+"%" for j in range(2)] global_merging_message = ["Merging: "+str(round(100.0*(i+1)/len(content),1))+"%" for j in range(2)]
if ';' in c and len(c)>0 and c[0]!="#": if ';' in c and len(c)>0 and c[0]!="#":
sec,label=c.split(';') cs=c.split(';')
sec,label=cs[0:2]
v=addrtype
if len(cs)>2:
v=int(cs[2])
reserve=False reserve=False
if label=="#Reserve": if label=="#Reserve":
reserve=True reserve=True
keyishex=False keyishex=None
if abs(len(sec)-65)==1: if abs(len(sec)-65)==1:
keyishex=True keyishex=True
importprivkey(db, sec, label, reserve, keyishex, verbose=False) importprivkey(db, sec, label, reserve, keyishex, verbose=False, addrv=v)
global_merging_message = ["Merging done.", ""] global_merging_message = ["Merging done.", ""]
@ -3120,12 +3131,12 @@ if 'twisted' not in missing_dep:
WI_ReturnDiv('ImportRODiv') + \ WI_ReturnDiv('ImportRODiv') + \
WI_FormEnd() WI_FormEnd()
DeleteForm = WI_FormInit('Delete a key from your wallet:', 'Delete', 'divformdelete') + \ DeleteForm = WI_FormInit('Delete keys from your wallet:', 'Delete', 'divformdelete') + \
WI_InputText('Wallet Directory: ', 'dir', 'd-dir', determine_db_dir(), 40) + \ WI_InputText('Wallet Directory: ', 'dir', 'd-dir', determine_db_dir(), 40) + \
WI_InputText('Wallet Filename:', 'name', 'd-name', determine_db_name()) + \ WI_InputText('Wallet Filename:', 'name', 'd-name', determine_db_name()) + \
WI_InputText('Key:', 'key', 'd-key', '', 65) + \ WI_InputText('<span style="border: 0 dashed;border-bottom-width:1px;" title="divided by \'-\'">Keys</span>:', 'key', 'd-key', '', 65) + \
"Type:<br />" + \ "Type:<br />" + \
WI_RadioButton('d-type', 'tx', 'd-r-tx', 'CHECKED', ' Transaction (type "all" in "Key" to delete them all)') + \ WI_RadioButton('d-type', 'tx', 'd-r-tx', 'CHECKED', ' Transaction (type "all" in "Keys" to delete them all)') + \
WI_RadioButton('d-type', 'key', 'd-r-key', '', ' Bitcoin address') + \ WI_RadioButton('d-type', 'key', 'd-r-key', '', ' Bitcoin address') + \
WI_Submit('Delete', 'DeleteDiv', 'd-close', 'ajaxDelete') + \ WI_Submit('Delete', 'DeleteDiv', 'd-close', 'ajaxDelete') + \
WI_CloseButton('DeleteDiv', 'd-close') + \ WI_CloseButton('DeleteDiv', 'd-close') + \
@ -3397,7 +3408,7 @@ To support pywallet's development or if you think it's worth something, you can
if not os.path.isfile(wdir+"/"+wname): if not os.path.isfile(wdir+"/"+wname):
return '%s/%s doesn\'t exist'%(wdir, wname) return '%s/%s doesn\'t exist'%(wdir, wname)
deleted_items = delete_from_wallet(db_env, wname, typedel, keydel) deleted_items = delete_from_wallet(db_env, wname, typedel, keydel.split('-'))
return "%s:%s has been successfully deleted from %s/%s, resulting in %d deleted item%s"%(typedel, keydel, wdir, wname, deleted_items, iais(deleted_items)) return "%s:%s has been successfully deleted from %s/%s, resulting in %d deleted item%s"%(typedel, keydel, wdir, wname, deleted_items, iais(deleted_items))