improved install wizard
This commit is contained in:
parent
1606bd3106
commit
3e14b7dd72
|
@ -23,14 +23,56 @@ class InstallWizard(QDialog):
|
||||||
|
|
||||||
|
|
||||||
def restore_or_create(self):
|
def restore_or_create(self):
|
||||||
|
|
||||||
|
d = QDialog()
|
||||||
|
d.setModal(1)
|
||||||
|
|
||||||
|
grid = QGridLayout()
|
||||||
|
grid.setSpacing(5)
|
||||||
|
|
||||||
msg = _("Wallet file not found.")+"\n"+_("Do you want to create a new wallet, or to restore an existing one?")
|
msg = _("Wallet file not found.")+"\n"+_("Do you want to create a new wallet, or to restore an existing one?")
|
||||||
r = QMessageBox.question(None, _('Message'), msg, _('Create'), _('Restore'), _('Cancel'), 0, 2)
|
label = QLabel(msg)
|
||||||
if r==2: return None
|
label.setWordWrap(True)
|
||||||
return 'restore' if r==1 else 'create'
|
grid.addWidget(label, 0, 0)
|
||||||
|
|
||||||
|
gb = QGroupBox()
|
||||||
|
|
||||||
|
b1 = QRadioButton(gb)
|
||||||
|
b1.setText(_("Create new wallet"))
|
||||||
|
b1.setChecked(True)
|
||||||
|
|
||||||
|
b2 = QRadioButton(gb)
|
||||||
|
b2.setText(_("Restore wallet from seed"))
|
||||||
|
|
||||||
|
b3 = QRadioButton(gb)
|
||||||
|
b3.setText(_("Restore wallet from master public key"))
|
||||||
|
|
||||||
|
grid.addWidget(b1,1,0)
|
||||||
|
grid.addWidget(b2,2,0)
|
||||||
|
grid.addWidget(b3,3,0)
|
||||||
|
|
||||||
|
vbox = QVBoxLayout()
|
||||||
|
vbox.addLayout(grid)
|
||||||
|
vbox.addLayout(ok_cancel_buttons(d, _('Next')))
|
||||||
|
d.setLayout(vbox)
|
||||||
|
|
||||||
|
if not d.exec_():
|
||||||
|
return
|
||||||
|
|
||||||
|
if b1.isChecked():
|
||||||
|
return 'create'
|
||||||
|
elif b2.isChecked():
|
||||||
|
return 'restore'
|
||||||
|
else:
|
||||||
|
return 'watching'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def verify_seed(self, wallet):
|
def verify_seed(self, wallet):
|
||||||
r = self.seed_dialog(False)
|
r = self.seed_dialog(False)
|
||||||
|
if not r:
|
||||||
|
return
|
||||||
|
|
||||||
if r != wallet.seed:
|
if r != wallet.seed:
|
||||||
QMessageBox.warning(None, _('Error'), 'incorrect seed', 'OK')
|
QMessageBox.warning(None, _('Error'), 'incorrect seed', 'OK')
|
||||||
return False
|
return False
|
||||||
|
@ -68,7 +110,7 @@ class InstallWizard(QDialog):
|
||||||
grid.addWidget(HelpButton(_('Keep the default value unless you modified this parameter in your wallet.')), 2, 3)
|
grid.addWidget(HelpButton(_('Keep the default value unless you modified this parameter in your wallet.')), 2, 3)
|
||||||
vbox.addLayout(grid)
|
vbox.addLayout(grid)
|
||||||
|
|
||||||
vbox.addLayout(ok_cancel_buttons(d))
|
vbox.addLayout(ok_cancel_buttons(d, _('Next')))
|
||||||
d.setLayout(vbox)
|
d.setLayout(vbox)
|
||||||
|
|
||||||
if not d.exec_(): return
|
if not d.exec_(): return
|
||||||
|
@ -99,7 +141,52 @@ class InstallWizard(QDialog):
|
||||||
|
|
||||||
|
|
||||||
def network_dialog(self):
|
def network_dialog(self):
|
||||||
return NetworkDialog(self.interface, self.config, None).do_exec()
|
|
||||||
|
d = QDialog()
|
||||||
|
d.setModal(1)
|
||||||
|
|
||||||
|
grid = QGridLayout()
|
||||||
|
grid.setSpacing(5)
|
||||||
|
|
||||||
|
label = QLabel(_("Network") + ":")
|
||||||
|
grid.addWidget(label, 0, 0)
|
||||||
|
|
||||||
|
gb = QGroupBox()
|
||||||
|
|
||||||
|
b1 = QRadioButton(gb)
|
||||||
|
b1.setText(_("Auto connect"))
|
||||||
|
b1.setChecked(True)
|
||||||
|
|
||||||
|
b2 = QRadioButton(gb)
|
||||||
|
b2.setText(_("Select server manually"))
|
||||||
|
|
||||||
|
b3 = QRadioButton(gb)
|
||||||
|
b3.setText(_("Stay offline"))
|
||||||
|
|
||||||
|
grid.addWidget(b1,1,0)
|
||||||
|
grid.addWidget(b2,2,0)
|
||||||
|
grid.addWidget(b3,3,0)
|
||||||
|
|
||||||
|
vbox = QVBoxLayout()
|
||||||
|
vbox.addLayout(grid)
|
||||||
|
vbox.addLayout(ok_cancel_buttons(d, _('Next')))
|
||||||
|
d.setLayout(vbox)
|
||||||
|
|
||||||
|
if not d.exec_():
|
||||||
|
return
|
||||||
|
|
||||||
|
if b2.isChecked():
|
||||||
|
return NetworkDialog(self.interface, self.config, None).do_exec()
|
||||||
|
|
||||||
|
elif b1.isChecked():
|
||||||
|
self.config.set_key('auto_cycle', True, True)
|
||||||
|
return
|
||||||
|
|
||||||
|
else:
|
||||||
|
self.config.set_key("server", None, True)
|
||||||
|
self.config.set_key('auto_cycle', False, True)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def show_seed(self, wallet):
|
def show_seed(self, wallet):
|
||||||
|
@ -153,15 +240,12 @@ class InstallWizard(QDialog):
|
||||||
action = self.restore_or_create()
|
action = self.restore_or_create()
|
||||||
if not action: exit()
|
if not action: exit()
|
||||||
|
|
||||||
# select a server.
|
#if not self.config.get('server'):
|
||||||
s = self.network_dialog()
|
self.network_dialog()
|
||||||
if s is None:
|
|
||||||
self.config.set_key("server", None, True)
|
|
||||||
self.config.set_key('auto_cycle', False, True)
|
|
||||||
|
|
||||||
wallet = Wallet(self.storage)
|
wallet = Wallet(self.storage)
|
||||||
|
|
||||||
if action =='create':
|
if action == 'create':
|
||||||
wallet.init_seed(None)
|
wallet.init_seed(None)
|
||||||
self.show_seed(wallet)
|
self.show_seed(wallet)
|
||||||
if self.verify_seed(wallet):
|
if self.verify_seed(wallet):
|
||||||
|
@ -181,22 +265,28 @@ class InstallWizard(QDialog):
|
||||||
if not seed:
|
if not seed:
|
||||||
return
|
return
|
||||||
wallet.gap_limit = gap
|
wallet.gap_limit = gap
|
||||||
|
wallet.init_seed(str(seed))
|
||||||
|
wallet.save_seed()
|
||||||
|
|
||||||
if len(seed) == 128:
|
elif action == 'watching':
|
||||||
wallet.seed = ''
|
# ask for seed and gap.
|
||||||
wallet.init_sequence(str(seed))
|
sg = self.seed_dialog()
|
||||||
else:
|
if not sg:
|
||||||
wallet.init_seed(str(seed))
|
return
|
||||||
wallet.save_seed()
|
seed, gap = sg
|
||||||
|
if not seed:
|
||||||
|
return
|
||||||
|
wallet.gap_limit = gap
|
||||||
|
wallet.seed = ''
|
||||||
|
wallet.init_sequence(str(seed))
|
||||||
|
|
||||||
|
else: raise
|
||||||
|
|
||||||
|
|
||||||
# start wallet threads
|
# start wallet threads
|
||||||
wallet.start_threads(self.interface, self.blockchain)
|
wallet.start_threads(self.interface, self.blockchain)
|
||||||
|
|
||||||
# if it is a creation, use 5
|
if action == 'restore':
|
||||||
# if restore, use 4 then 5
|
|
||||||
|
|
||||||
if action == 'restore' and s is not None:
|
|
||||||
try:
|
try:
|
||||||
keep_it = self.restore_wallet(wallet)
|
keep_it = self.restore_wallet(wallet)
|
||||||
wallet.fill_addressbook()
|
wallet.fill_addressbook()
|
||||||
|
|
|
@ -69,7 +69,7 @@ class PasswordDialog(QDialog):
|
||||||
wallet = self.wallet
|
wallet = self.wallet
|
||||||
|
|
||||||
if not wallet.seed:
|
if not wallet.seed:
|
||||||
QMessageBox.information(parent, _('Error'), _('No seed'), _('OK'))
|
QMessageBox.information(self.parent, _('Error'), _('No seed'), _('OK'))
|
||||||
return
|
return
|
||||||
|
|
||||||
if not self.exec_(): return
|
if not self.exec_(): return
|
||||||
|
|
|
@ -158,8 +158,8 @@ class Wallet:
|
||||||
|
|
||||||
self.first_addresses = storage.get('first_addresses',{})
|
self.first_addresses = storage.get('first_addresses',{})
|
||||||
|
|
||||||
#if self.seed_version != SEED_VERSION:
|
if self.seed_version < 4:
|
||||||
# raise ValueError("This wallet seed is deprecated. Please restore from seed.")
|
raise ValueError("This wallet seed is deprecated.")
|
||||||
|
|
||||||
self.load_accounts()
|
self.load_accounts()
|
||||||
|
|
||||||
|
@ -254,6 +254,7 @@ class Wallet:
|
||||||
k5, c5, K5, cK5 = bip32_private_derivation(master_k, master_c, "m/", "m/5'/")
|
k5, c5, K5, cK5 = bip32_private_derivation(master_k, master_c, "m/", "m/5'/")
|
||||||
|
|
||||||
self.master_public_keys = {
|
self.master_public_keys = {
|
||||||
|
"m/": (master_c, master_K, master_cK),
|
||||||
"m/0'/": (c0, K0, cK0),
|
"m/0'/": (c0, K0, cK0),
|
||||||
"m/1'/": (c1, K1, cK1),
|
"m/1'/": (c1, K1, cK1),
|
||||||
"m/2'/": (c2, K2, cK2),
|
"m/2'/": (c2, K2, cK2),
|
||||||
|
@ -419,8 +420,10 @@ class Wallet:
|
||||||
return s[0] == 1
|
return s[0] == 1
|
||||||
|
|
||||||
def get_master_public_key(self):
|
def get_master_public_key(self):
|
||||||
raise
|
if self.seed_version == 4:
|
||||||
return self.storage.get("master_public_key")
|
return self.storage.get("master_public_key")
|
||||||
|
else:
|
||||||
|
return self.storage.get("master_public_keys")["m/"]
|
||||||
|
|
||||||
def get_master_private_key(self, account, password):
|
def get_master_private_key(self, account, password):
|
||||||
master_k = pw_decode( self.master_private_keys[account], password)
|
master_k = pw_decode( self.master_private_keys[account], password)
|
||||||
|
|
Loading…
Reference in New Issue