Merge #933: Fix error message when importing desc for wrong network

24f67d2a85b12730c669c4c7e311a534f75cc0ad Fix error message when importing desc for wrong network (edouardparis)

Pull request description:

  close #781

ACKs for top commit:
  edouardparis:
    Self-ACK 24f67d2a85b12730c669c4c7e311a534f75cc0ad

Tree-SHA512: a2e82e20144e2eebf08897e6c64f8426a30dba1d062553238e28a4b5d9abc12c981917a1f6c5a57d99fdf714c62cbc1de7fba061fcad92aee444d4e642ffcc10
This commit is contained in:
edouardparis 2024-01-24 14:15:04 +01:00
commit 5a56fdb108
No known key found for this signature in database
GPG Key ID: E65F7A089C20DC8F
2 changed files with 33 additions and 23 deletions

View File

@ -1241,6 +1241,7 @@ pub struct ImportDescriptor {
change_network: bool,
data_dir: Option<PathBuf>,
imported_descriptor: form::Value<String>,
wrong_network: bool,
error: Option<String>,
}
@ -1252,21 +1253,35 @@ impl ImportDescriptor {
network_valid: true,
data_dir: None,
imported_descriptor: form::Value::default(),
wrong_network: false,
error: None,
}
}
fn check_descriptor(&mut self) {
fn check_descriptor(&mut self, network: Network) -> Option<LianaDescriptor> {
if !self.imported_descriptor.value.is_empty() {
if let Ok(desc) = LianaDescriptor::from_str(&self.imported_descriptor.value) {
if self.network == Network::Bitcoin {
self.imported_descriptor.valid = desc.all_xpubs_net_is(self.network);
if network == Network::Bitcoin {
self.imported_descriptor.valid = desc.all_xpubs_net_is(network);
} else {
self.imported_descriptor.valid = desc.all_xpubs_net_is(Network::Testnet);
}
if self.imported_descriptor.valid {
self.wrong_network = false;
Some(desc)
} else {
self.wrong_network = true;
None
}
} else {
self.imported_descriptor.valid = false;
self.wrong_network = false;
None
}
} else {
self.wrong_network = false;
self.imported_descriptor.valid = true;
None
}
}
}
@ -1281,11 +1296,11 @@ impl Step for ImportDescriptor {
let mut network_datadir = self.data_dir.clone().unwrap();
network_datadir.push(self.network.to_string());
self.network_valid = !network_datadir.exists();
self.check_descriptor();
self.check_descriptor(self.network);
}
Message::DefineDescriptor(message::DefineDescriptor::ImportDescriptor(desc)) => {
self.imported_descriptor.value = desc;
self.check_descriptor();
self.check_descriptor(self.network);
}
_ => {}
};
@ -1293,6 +1308,9 @@ impl Step for ImportDescriptor {
}
fn load_context(&mut self, ctx: &Context) {
if ctx.bitcoin_config.network != self.network {
self.check_descriptor(ctx.bitcoin_config.network);
}
self.network = ctx.bitcoin_config.network;
self.data_dir = Some(ctx.data_dir.clone());
let mut network_datadir = ctx.data_dir.clone();
@ -1305,26 +1323,12 @@ impl Step for ImportDescriptor {
// Set to true in order to force the registration process to be shown to user.
ctx.hw_is_used = true;
// descriptor forms for import or creation cannot be both empty or filled.
if !self.imported_descriptor.value.is_empty() {
if let Ok(desc) = LianaDescriptor::from_str(&self.imported_descriptor.value) {
if self.network == Network::Bitcoin {
self.imported_descriptor.valid = desc.all_xpubs_net_is(self.network);
} else {
self.imported_descriptor.valid = desc.all_xpubs_net_is(Network::Testnet);
}
if self.imported_descriptor.valid {
if let Some(desc) = self.check_descriptor(self.network) {
ctx.descriptor = Some(desc);
true
} else {
false
}
} else {
self.imported_descriptor.valid = false;
false
}
} else {
false
}
}
fn view(&self, _hws: &HardwareWallets, progress: (usize, usize)) -> Element<Message> {
@ -1334,6 +1338,7 @@ impl Step for ImportDescriptor {
self.network,
self.network_valid,
&self.imported_descriptor,
self.wrong_network,
self.error.as_ref(),
)
}

View File

@ -364,6 +364,7 @@ pub fn import_descriptor<'a>(
network: bitcoin::Network,
network_valid: bool,
imported_descriptor: &form::Value<String>,
wrong_network: bool,
error: Option<&String>,
) -> Element<'a, Message> {
let row_network = Row::new()
@ -392,7 +393,11 @@ pub fn import_descriptor<'a>(
form::Form::new_trimmed("Descriptor", imported_descriptor, |msg| {
Message::DefineDescriptor(message::DefineDescriptor::ImportDescriptor(msg))
})
.warning("Incompatible descriptor.")
.warning(if wrong_network {
"The descriptor is for another network"
} else {
"Failed to read the descriptor"
})
.size(20)
.padding(10),
)