multi seed and mpk dialogs

This commit is contained in:
ThomasV 2014-05-12 10:53:04 +02:00
parent a638127185
commit a66df2a3fa
2 changed files with 63 additions and 48 deletions

View File

@ -192,66 +192,53 @@ class InstallWizard(QDialog):
return self.get_seed_text(seed_e)
def cold_mpk_dialog(self, xpub_hot):
vbox = QVBoxLayout()
vbox1, seed_e1 = seed_dialog.enter_seed_box(MSG_SHOW_MPK, 'hot')
seed_e1.setText(xpub_hot)
seed_e1.setReadOnly(True)
vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_COLD_MPK, 'cold')
vbox.addLayout(vbox1)
vbox.addLayout(vbox2)
vbox.addStretch(1)
hbox, button = ok_cancel_buttons2(self, _('Next'))
vbox.addLayout(hbox)
button.setEnabled(False)
f = lambda: button.setEnabled(self.is_mpk(seed_e2))
seed_e2.textChanged.connect(f)
self.set_layout(vbox)
if not self.exec_():
return
return self.get_seed_text(seed_e2)
def cold_mpk2_dialog(self, xpub_hot):
def multi_mpk_dialog(self, xpub_hot, n):
vbox = QVBoxLayout()
vbox0, seed_e0 = seed_dialog.enter_seed_box(MSG_SHOW_MPK, 'hot')
vbox.addLayout(vbox0)
seed_e0.setText(xpub_hot)
seed_e0.setReadOnly(True)
vbox1, seed_e1 = seed_dialog.enter_seed_box(MSG_ENTER_COLD_MPK, 'cold')
vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_COLD_MPK, 'cold')
vbox.addLayout(vbox0)
vbox.addLayout(vbox1)
vbox.addLayout(vbox2)
entries = []
for i in range(n):
vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_COLD_MPK, 'cold')
vbox.addLayout(vbox2)
entries.append(seed_e2)
vbox.addStretch(1)
hbox, button = ok_cancel_buttons2(self, _('Next'))
vbox.addLayout(hbox)
button.setEnabled(False)
f = lambda: button.setEnabled(self.is_mpk(seed_e1) and self.is_mpk(seed_e2))
seed_e1.textChanged.connect(f)
seed_e2.textChanged.connect(f)
f = lambda: button.setEnabled( map(lambda e: self.is_mpk(e), entries) == [True]*len(entries))
for e in entries:
e.textChanged.connect(f)
self.set_layout(vbox)
if not self.exec_():
return
return self.get_seed_text(seed_e1), self.get_seed_text(seed_e2)
return map(lambda e: self.get_seed_text(e), entries)
def double_seed_dialog(self):
def multi_seed_dialog(self, n):
vbox = QVBoxLayout()
vbox1, seed_e1 = seed_dialog.enter_seed_box(MSG_ENTER_SEED_OR_MPK, 'hot')
vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_SEED_OR_MPK, 'cold')
vbox.addLayout(vbox1)
vbox.addLayout(vbox2)
entries = [seed_e1]
for i in range(n):
vbox2, seed_e2 = seed_dialog.enter_seed_box(MSG_ENTER_SEED_OR_MPK, 'cold')
vbox.addLayout(vbox2)
entries.append(seed_e2)
vbox.addStretch(1)
hbox, button = ok_cancel_buttons2(self, _('Next'))
vbox.addLayout(hbox)
button.setEnabled(False)
f = lambda: button.setEnabled(self.is_any(seed_e1) and self.is_any(seed_e2))
seed_e1.textChanged.connect(f)
seed_e2.textChanged.connect(f)
f = lambda: button.setEnabled( map(lambda e: self.is_any(e), entries) == [True]*len(entries))
for e in entries:
e.textChanged.connect(f)
self.set_layout(vbox)
if not self.exec_():
return
return self.get_seed_text(seed_e1), self.get_seed_text(seed_e2)
return map(lambda e: self.get_seed_text(e), entries)
@ -418,7 +405,7 @@ class InstallWizard(QDialog):
action = 'create_2of3_1'
if action == 'create_2fa_2':
if action in ['create_2fa_2', 'create_2of3_2']:
wallet = Wallet_2of3(self.storage)
if action in ['create', 'create_2of2_1', 'create_2fa_2', 'create_2of3_1']:
@ -442,7 +429,9 @@ class InstallWizard(QDialog):
if action == 'create_2of2_2':
xpub_hot = wallet.master_public_keys.get("m/")
xpub = self.cold_mpk_dialog(xpub_hot)
xpub = self.multi_mpk_dialog(xpub_hot, 1)
if not xpub:
return
wallet.add_master_public_key("cold/", xpub)
wallet.create_account()
self.waiting_dialog(wallet.synchronize)
@ -450,7 +439,10 @@ class InstallWizard(QDialog):
if action == 'create_2of3_2':
xpub_hot = wallet.master_public_keys.get("m/")
xpub1, xpub2 = self.cold_mpk2_dialog(xpub_hot)
r = self.multi_mpk_dialog(xpub_hot, 2)
if not r:
return
xpub1, xpub2 = r
wallet.add_master_public_key("cold/", xpub1)
wallet.add_master_public_key("remote/", xpub2)
wallet.create_account()
@ -485,8 +477,8 @@ class InstallWizard(QDialog):
else:
raise
elif t in ['2fa', '2of2','2of3']:
r = self.double_seed_dialog()
elif t in ['2fa', '2of2']:
r = self.multi_seed_dialog(1)
if not r:
return
text1, text2 = r
@ -513,11 +505,36 @@ class InstallWizard(QDialog):
wallet.add_master_public_key("m/", text1)
wallet.add_master_public_key("cold/", text2)
if t == '2of3':
if t == '2fa':
run_hook('restore_third_key', wallet, self)
wallet.create_account()
elif t in ['2of3']:
r = self.multi_seed_dialog(2)
if not r:
return
text1, text2, text3 = r
password = self.password_dialog()
wallet = Wallet_2of3(self.storage)
if Wallet.is_seed(text1):
wallet.add_seed(text1, password)
if Wallet.is_seed(text2):
wallet.add_cold_seed(text2, password)
else:
wallet.add_master_public_key("cold/", text2)
elif Wallet.is_mpk(text1):
if Wallet.is_seed(text2):
wallet.add_seed(text2, password)
wallet.add_master_public_key("cold/", text1)
else:
wallet.add_master_public_key("m/", text1)
wallet.add_master_public_key("cold/", text2)
wallet.create_account()
else:
raise

View File

@ -1511,12 +1511,10 @@ class Wallet_2of3(Wallet_2of2):
# fixme: we use order of creation
if xpub2 and xpub1 is None:
return 'create_2fa_2'
if xpub2 is None:
return 'create_2of3_1'
if xpub1 is None:
return 'create_2of3_1'
if xpub2 is None or xpub3 is None:
return 'create_2of3_2'
if xpub3 is None:
return 'create_2of3_3'