quote_currency setting can be None on first time use. Remove assert.
[electrum-nvc.git] / upgrade.py
1 import electrum, base64, ast, sys, os
2 from version import SEED_VERSION
3
4 try:
5     from lib import prompt_password
6 except ImportError:
7     from electrum import prompt_password
8
9 from lib.uril import print_error
10
11
12
13
14 if __name__ == "__main__":
15     try:
16         path = sys.argv[1]
17     except:
18         # backward compatibility: look for wallet file in the default data directory
19         if "HOME" in os.environ:
20             wallet_dir = os.path.join( os.environ["HOME"], '.electrum')
21         elif "LOCALAPPDATA" in os.environ:
22             wallet_dir = os.path.join( os.environ["LOCALAPPDATA"], 'Electrum' )
23         elif "APPDATA" in os.environ:
24             wallet_dir = os.path.join( os.environ["APPDATA"],  'Electrum' )
25         else:
26             raise BaseException("No home directory found in environment variables.")
27         path = os.path.join( wallet_dir, 'electrum.dat')
28
29     try:
30         f = open(path,"r")
31         data = f.read()
32         f.close()
33     except:
34         print_error("Error: File not found: " + path)
35         exit(1)
36
37     try:
38         x = ast.literal_eval(data)
39     except:
40         print_error("Error: Could not parse wallet")
41         exit(1)
42
43     # version <= 0.33 uses a tuple
44     if type(x) == tuple:
45         seed_version, use_encryption, fee, host, port, blocks, seed, all_addresses, private_keys, change_indexes, status, history, labels, addressbook = x
46
47         print "walet path =",path
48         print "seed version =", seed_version
49
50         if seed_version == 1 and use_encryption:
51             # version 1 used pycrypto for wallet encryption
52             import Crypto
53             from Crypto.Cipher import AES
54             BLOCK_SIZE = 32
55             PADDING = '{'
56             pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
57             EncodeAES = lambda secret, s: base64.b64encode(AES.new(secret).encrypt(pad(s)))
58             DecodeAES = lambda secret, e: AES.new(secret).decrypt(base64.b64decode(e)).rstrip(PADDING)
59
60             print "Please enter your password"
61             password = prompt_password("Password:")
62             secret = electrum.Hash(password)
63             try:
64                 seed = DecodeAES( secret, wallet.seed )
65                 private_keys = ast.literal_eval( DecodeAES( secret, wallet.private_keys ) )
66             except:
67                 print_error("Error: Password does not decrypt this wallet.")
68                 exit(1)
69             seed_version = 2
70             s = repr( (seed_version, use_encryption, fee, host, port, blocks, seed, all_addresses, private_keys, change_indexes, status, history, labels, addressbook ))
71             f = open(path,"w")
72             data = f.read()
73             f.close()
74             print "Wallet is now unencrypted."
75
76         print """This wallet is deprecated.
77 Please create a new wallet, open the old wallet with Electrum 0.33, and send your coins to your new wallet.
78 We apologize for the inconvenience. We try to keep this kind of upgrades as rare as possible."""
79
80     
81         
82