fix csv file import bug and allow multiple deletions at once
This commit is contained in:
parent
2b7b67dd60
commit
5d3f08edf5
103
pywallet.py
103
pywallet.py
@ -1086,12 +1086,12 @@ def hash_160(public_key):
|
||||
md.update(hashlib.sha256(public_key).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)
|
||||
return hash_160_to_bc_address(h160)
|
||||
return hash_160_to_bc_address(h160, v)
|
||||
|
||||
def hash_160_to_bc_address(h160):
|
||||
vh160 = chr(addrtype) + h160
|
||||
def hash_160_to_bc_address(h160, v=addrtype):
|
||||
vh160 = chr(v) + h160
|
||||
h = Hash(vh160)
|
||||
addr = vh160 + h[0:4]
|
||||
return b58encode(addr)
|
||||
@ -1766,37 +1766,44 @@ def parse_wallet(db, item_callback):
|
||||
print("value data in hex: %s"%value.encode('hex_codec'))
|
||||
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)
|
||||
kds = BCDataStream()
|
||||
vds = BCDataStream()
|
||||
|
||||
deleted_items = 0
|
||||
for (key, value) in db.items():
|
||||
kds.clear(); kds.write(key)
|
||||
vds.clear(); vds.write(value)
|
||||
type = kds.read_string()
|
||||
|
||||
if typedel == "tx":
|
||||
if type == "tx":
|
||||
if keydel == inversetxid(kds.read_bytes(32).encode('hex_codec')) or keydel == "all":
|
||||
db.delete(key)
|
||||
deleted_items+=1
|
||||
elif typedel == "key":
|
||||
if type == "key" or type == "ckey":
|
||||
if keydel == public_key_to_bc_address(kds.read_bytes(kds.read_compact_size())):
|
||||
db.delete(key)
|
||||
deleted_items+=1
|
||||
elif type == "pool":
|
||||
vds.read_int32()
|
||||
vds.read_int64()
|
||||
if keydel == public_key_to_bc_address(vds.read_bytes(vds.read_compact_size())):
|
||||
db.delete(key)
|
||||
deleted_items+=1
|
||||
elif type == "name":
|
||||
if keydel == kds.read_string():
|
||||
db.delete(key)
|
||||
deleted_items+=1
|
||||
if not isinstance(kd, list):
|
||||
kd=[kd]
|
||||
print kd
|
||||
|
||||
for i in range(len(kd)):
|
||||
keydel=kd[i]
|
||||
for (key, value) in db.items():
|
||||
kds.clear(); kds.write(key)
|
||||
vds.clear(); vds.write(value)
|
||||
type = kds.read_string()
|
||||
|
||||
if typedel == "tx":
|
||||
if type == "tx":
|
||||
if keydel == inversetxid(kds.read_bytes(32).encode('hex_codec')) or keydel == "all":
|
||||
db.delete(key)
|
||||
deleted_items+=1
|
||||
elif typedel == "key":
|
||||
if type == "key" or type == "ckey":
|
||||
if keydel == public_key_to_bc_address(kds.read_bytes(kds.read_compact_size())):
|
||||
db.delete(key)
|
||||
deleted_items+=1
|
||||
elif type == "pool":
|
||||
vds.read_int32()
|
||||
vds.read_int64()
|
||||
if keydel == public_key_to_bc_address(vds.read_bytes(vds.read_compact_size())):
|
||||
db.delete(key)
|
||||
deleted_items+=1
|
||||
elif type == "name":
|
||||
if keydel == kds.read_string():
|
||||
db.delete(key)
|
||||
deleted_items+=1
|
||||
|
||||
|
||||
db.close()
|
||||
@ -2182,10 +2189,10 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact
|
||||
crypted = 'salt' in json_db['mkey']
|
||||
|
||||
if not crypted:
|
||||
print "The wallet is not crypted"
|
||||
print "The wallet is not encrypted"
|
||||
|
||||
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:
|
||||
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')
|
||||
crypter.SetIV(Hash(public_key))
|
||||
secret = crypter.Decrypt(ckey)
|
||||
compressed = public_key[0] != '\x04'
|
||||
compressed = public_key[0] != '\04'
|
||||
|
||||
|
||||
if check:
|
||||
check = False
|
||||
pkey = EC_KEY(int('0x' + secret.encode('hex'), 16))
|
||||
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
|
||||
break
|
||||
|
||||
@ -2218,7 +2225,7 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact
|
||||
# del(k['pubkey'])
|
||||
private_keys.append(sec)
|
||||
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']:
|
||||
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:
|
||||
pkey = regenerate_key(sec)
|
||||
compressed = is_compressed(sec)
|
||||
@ -2253,14 +2260,14 @@ def importprivkey(db, sec, label, reserve, keyishex, verbose=True):
|
||||
secret = GetSecret(pkey)
|
||||
private_key = GetPrivKey(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:
|
||||
print "Address (%s): %s"%(aversions[addrtype], addr)
|
||||
print "Privkey (%s): %s"%(aversions[addrtype], SecretToASecret(secret, compressed))
|
||||
print "Address (%s): %s"%(aversions[addrv], addr)
|
||||
print "Privkey (%s): %s"%(aversions[addrv], SecretToASecret(secret, compressed))
|
||||
print "Hexprivkey: %s"%(secret.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())
|
||||
else:
|
||||
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]
|
||||
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]!="#":
|
||||
sec,label=c.split(';')
|
||||
cs=c.split(';')
|
||||
sec,label=cs[0:2]
|
||||
v=addrtype
|
||||
if len(cs)>2:
|
||||
v=int(cs[2])
|
||||
reserve=False
|
||||
if label=="#Reserve":
|
||||
reserve=True
|
||||
keyishex=False
|
||||
keyishex=None
|
||||
if abs(len(sec)-65)==1:
|
||||
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.", ""]
|
||||
|
||||
@ -3120,12 +3131,12 @@ if 'twisted' not in missing_dep:
|
||||
WI_ReturnDiv('ImportRODiv') + \
|
||||
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 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 />" + \
|
||||
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_Submit('Delete', 'DeleteDiv', 'd-close', 'ajaxDelete') + \
|
||||
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):
|
||||
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))
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user