Skip to content

Commit 63e791a

Browse files
committed
fix: correct node announcement, simplify setting alias, clean
alias sanitization - Skips broadcasting node announcement in the event that either the node alias or the listening addresses are not set. - Aligns the InvalidNodeAlias error variant with the others to make it work with language bindings. - Simplifies the method to set the node alias. - Cleans up the alias sanitizing function to ensure that protocol- compliant aliases (in this case, empty strings) are not flagged. Additionally, removes the check for sandwiched null byte. - Finally, adds the relevant update to struct and interface to reflect changes in Rust types.
1 parent 202154d commit 63e791a

File tree

3 files changed

+33
-45
lines changed

3 files changed

+33
-45
lines changed

bindings/ldk_node.udl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ dictionary Config {
1616
u64 probing_liquidity_limit_multiplier;
1717
LogLevel log_level;
1818
AnchorChannelsConfig? anchor_channels_config;
19+
string? node_alias;
1920
};
2021

2122
dictionary AnchorChannelsConfig {
@@ -40,6 +41,8 @@ interface Builder {
4041
[Throws=BuildError]
4142
void set_listening_addresses(sequence<SocketAddress> listening_addresses);
4243
[Throws=BuildError]
44+
void set_node_alias(string node_alias);
45+
[Throws=BuildError]
4346
Node build();
4447
[Throws=BuildError]
4548
Node build_with_fs_store();
@@ -237,6 +240,7 @@ enum BuildError {
237240
"KVStoreSetupFailed",
238241
"WalletSetupFailed",
239242
"LoggerSetupFailed",
243+
"InvalidNodeAlias"
240244
};
241245

242246
[Enum]

src/builder.rs

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ pub enum BuildError {
114114
InvalidChannelMonitor,
115115
/// The given listening addresses are invalid, e.g. too many were passed.
116116
InvalidListeningAddresses,
117+
/// The provided alias is invalid
118+
InvalidNodeAlias,
117119
/// We failed to read data from the [`KVStore`].
118120
///
119121
/// [`KVStore`]: lightning::util::persist::KVStore
@@ -132,8 +134,6 @@ pub enum BuildError {
132134
WalletSetupFailed,
133135
/// We failed to setup the logger.
134136
LoggerSetupFailed,
135-
/// The provided alias is invalid
136-
InvalidNodeAlias(String),
137137
}
138138

139139
impl fmt::Display for BuildError {
@@ -154,9 +154,7 @@ impl fmt::Display for BuildError {
154154
Self::KVStoreSetupFailed => write!(f, "Failed to setup KVStore."),
155155
Self::WalletSetupFailed => write!(f, "Failed to setup onchain wallet."),
156156
Self::LoggerSetupFailed => write!(f, "Failed to setup the logger."),
157-
Self::InvalidNodeAlias(ref reason) => {
158-
write!(f, "Given node alias is invalid: {}", reason)
159-
},
157+
Self::InvalidNodeAlias => write!(f, "Given node alias is invalid."),
160158
}
161159
}
162160
}
@@ -309,9 +307,7 @@ impl NodeBuilder {
309307

310308
/// Sets the alias the [`Node`] will use in its announcement. The provided
311309
/// alias must be a valid UTF-8 string.
312-
pub fn set_node_alias<T: Into<String>>(
313-
&mut self, node_alias: T,
314-
) -> Result<&mut Self, BuildError> {
310+
pub fn set_node_alias(&mut self, node_alias: String) -> Result<&mut Self, BuildError> {
315311
let node_alias = sanitize_alias(node_alias).map_err(|e| e)?;
316312

317313
self.config.node_alias = Some(node_alias);
@@ -515,6 +511,11 @@ impl ArcedNodeBuilder {
515511
self.inner.write().unwrap().set_log_level(level);
516512
}
517513

514+
/// Sets the node alias.
515+
pub fn set_node_alias(&self, node_alias: String) -> Result<(), BuildError> {
516+
self.inner.write().unwrap().set_node_alias(node_alias).map(|_| ())
517+
}
518+
518519
/// Builds a [`Node`] instance with a [`SqliteStore`] backend and according to the options
519520
/// previously configured.
520521
pub fn build(&self) -> Result<Arc<Node>, BuildError> {
@@ -1066,21 +1067,12 @@ fn sanitize_alias<T: Into<String>>(node_alias: T) -> Result<String, BuildError>
10661067
let node_alias: String = node_alias.into();
10671068
let alias = node_alias.trim();
10681069

1069-
// Alias is non-empty
1070-
if alias.is_empty() {
1071-
return Err(BuildError::InvalidNodeAlias("Node alias cannot be empty.".to_string()));
1072-
}
1073-
1074-
// Alias valid up to first null byte
1075-
let first_null = alias.as_bytes().iter().position(|b| *b == 0).unwrap_or(alias.len());
1076-
let actual_alias = alias.split_at(first_null).0;
1077-
10781070
// Alias must be 32-bytes long or less
1079-
if actual_alias.as_bytes().len() > 32 {
1080-
return Err(BuildError::InvalidNodeAlias("Node alias cannot exceed 32 bytes.".to_string()));
1071+
if alias.as_bytes().len() > 32 {
1072+
return Err(BuildError::InvalidNodeAlias);
10811073
}
10821074

1083-
Ok(actual_alias.to_string())
1075+
Ok(alias.to_string())
10841076
}
10851077

10861078
#[cfg(test)]
@@ -1089,38 +1081,32 @@ mod tests {
10891081

10901082
use super::NodeBuilder;
10911083

1092-
fn create_node_with_alias<T: Into<String>>(alias: T) -> Result<Node, BuildError> {
1093-
NodeBuilder::new().set_node_alias(&alias.into())?.build()
1084+
fn create_node_with_alias(alias: String) -> Result<Node, BuildError> {
1085+
NodeBuilder::new().set_node_alias(alias)?.build()
10941086
}
10951087

10961088
#[test]
10971089
fn empty_node_alias() {
10981090
// Empty node alias
10991091
let alias = "";
1100-
let node = create_node_with_alias(alias);
1101-
assert_eq!(
1102-
node.err().unwrap(),
1103-
BuildError::InvalidNodeAlias("Node alias cannot be empty.".to_string())
1104-
);
1092+
let node = create_node_with_alias(alias.to_string());
1093+
assert_eq!(node.err().unwrap(), BuildError::InvalidNodeAlias);
11051094
}
11061095

11071096
#[test]
11081097
fn node_alias_with_sandwiched_null() {
11091098
// Alias with emojis
11101099
let expected_alias = "I\u{1F496}LDK-Node!";
11111100
let user_provided_alias = "I\u{1F496}LDK-Node!\0\u{26A1}";
1112-
let node = create_node_with_alias(user_provided_alias).unwrap();
1101+
let node = create_node_with_alias(user_provided_alias.to_string()).unwrap();
11131102

11141103
assert_eq!(expected_alias, node.config().node_alias.unwrap());
11151104
}
11161105

11171106
#[test]
11181107
fn node_alias_longer_than_32_bytes() {
11191108
let alias = "This is a string longer than thirty-two bytes!"; // 46 bytes
1120-
let node = create_node_with_alias(alias);
1121-
assert_eq!(
1122-
node.err().unwrap(),
1123-
BuildError::InvalidNodeAlias("Node alias cannot exceed 32 bytes.".to_string())
1124-
);
1109+
let node = create_node_with_alias(alias.to_string());
1110+
assert_eq!(node.err().unwrap(), BuildError::InvalidNodeAlias);
11251111
}
11261112
}

src/lib.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -647,22 +647,20 @@ impl Node {
647647
}
648648

649649
let addresses = bcast_config.listening_addresses.clone().unwrap_or(Vec::new());
650-
651-
if addresses.is_empty() {
652-
// Skip if we are not listening on any addresses.
653-
continue;
654-
}
655-
656-
// Extract alias if set, else select the default
657-
let alias = if let Some(ref alias) = node_alias {
650+
let alias = node_alias.clone().map(|alias| {
658651
let mut buf = [0_u8; 32];
659652
buf[..alias.as_bytes().len()].copy_from_slice(alias.as_bytes());
660653
buf
661-
} else {
662-
[0; 32]
663-
};
654+
});
655+
656+
if addresses.is_empty() || alias.is_none() {
657+
// Skip if we are not listening on any addresses or if the node alias is not set.
658+
continue;
659+
}
664660

665-
bcast_pm.broadcast_node_announcement([0; 3], alias, addresses);
661+
662+
663+
bcast_pm.broadcast_node_announcement([0; 3], alias.unwrap(), addresses);
666664

667665
let unix_time_secs_opt =
668666
SystemTime::now().duration_since(UNIX_EPOCH).ok().map(|d| d.as_secs());

0 commit comments

Comments
 (0)