1
0

Merge pull request #9285 from accumulator/qt_wizard_validate_master_key

qt: additional validation for master keys in WCHaveMasterKey in wallet wizard
This commit is contained in:
ThomasV
2024-11-13 10:27:12 +01:00
committed by GitHub
2 changed files with 42 additions and 4 deletions

View File

@@ -837,7 +837,10 @@ class WCHaveMasterKey(WalletWizardComponent):
self.label.setText(self.message_create)
def is_valid(x) -> bool:
return bool(keystore.from_master_key(x))
self.apply()
key_valid, message = self.wizard.validate_master_key(x, self.wizard_data['wallet_type'])
self.warn_label.setText(message)
return key_valid
elif self.wizard_data['wallet_type'] == 'multisig':
if 'multisig_current_cosigner' in self.wizard_data:
self.title = _("Add Cosigner {}").format(self.wizard_data['multisig_current_cosigner'])
@@ -846,10 +849,11 @@ class WCHaveMasterKey(WalletWizardComponent):
self.label.setText(self.message_create)
def is_valid(x) -> bool:
if not keystore.is_bip32_key(x):
self.warn_label.setText(_('Invalid key'))
return False
self.apply()
key_valid, message = self.wizard.validate_master_key(x, self.wizard_data['wallet_type'])
if not key_valid:
self.warn_label.setText(message)
return False
musig_valid, errortext = self.wizard.check_multisig_constraints(self.wizard_data)
self.warn_label.setText(errortext)
if not musig_valid:

View File

@@ -525,6 +525,40 @@ class NewWalletWizard(AbstractWizard):
return seed_valid, seed_type, validation_message, can_passphrase
def validate_master_key(self, key: str, wallet_type: str):
# TODO: deduplicate with master key check in create_storage()
validation_message = ''
key_valid = False
if not keystore.is_master_key(key):
validation_message = _('Not a master key')
else:
k = keystore.from_master_key(key)
if wallet_type == 'standard':
if isinstance(k, keystore.Xpub): # has bip32 xpub
t1 = xpub_type(k.xpub)
if t1 not in ['standard', 'p2wpkh', 'p2wpkh-p2sh']: # disallow Ypub/Zpub
validation_message = '%s: %s' % (_('Wrong key type'), t1)
else:
key_valid = True
elif isinstance(k, keystore.Old_KeyStore):
key_valid = True
else:
self._logger.error(f"unexpected keystore type: {type(keystore)}")
elif wallet_type == 'multisig':
if not isinstance(k, keystore.Xpub): # old mpk?
validation_message = '%s: %s' % (_('Wrong key type'), "not bip32")
t1 = xpub_type(k.xpub)
if t1 not in ['standard', 'p2wsh', 'p2wsh-p2sh']: # disallow ypub/zpub
validation_message = '%s: %s' % (_('Wrong key type'), t1)
else:
key_valid = True
else:
validation_message = '%s: %s' % (_('Unsupported wallet type'), wallet_type)
self._logger.error(f'Unsupported wallet type: {wallet_type}')
return key_valid, validation_message
def create_storage(self, path: str, data: dict):
assert data['wallet_type'] in ['standard', '2fa', 'imported', 'multisig']