Skip to content

Commit 5bd4a88

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 e54bfe0 commit 5bd4a88

File tree

3 files changed

+31
-45
lines changed

3 files changed

+31
-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
LogLevel log_level;
1717
AnchorChannelsConfig? anchor_channels_config;
1818
SendingParameters? sending_parameters;
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();
@@ -238,6 +241,7 @@ enum BuildError {
238241
"KVStoreSetupFailed",
239242
"WalletSetupFailed",
240243
"LoggerSetupFailed",
244+
"InvalidNodeAlias"
241245
};
242246

243247
[Enum]

src/builder.rs

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ pub enum BuildError {
121121
InvalidChannelMonitor,
122122
/// The given listening addresses are invalid, e.g. too many were passed.
123123
InvalidListeningAddresses,
124+
/// The provided alias is invalid
125+
InvalidNodeAlias,
124126
/// We failed to read data from the [`KVStore`].
125127
///
126128
/// [`KVStore`]: lightning::util::persist::KVStore
@@ -139,8 +141,6 @@ pub enum BuildError {
139141
WalletSetupFailed,
140142
/// We failed to setup the logger.
141143
LoggerSetupFailed,
142-
/// The provided alias is invalid
143-
InvalidNodeAlias(String),
144144
}
145145

146146
impl fmt::Display for BuildError {
@@ -161,9 +161,7 @@ impl fmt::Display for BuildError {
161161
Self::KVStoreSetupFailed => write!(f, "Failed to setup KVStore."),
162162
Self::WalletSetupFailed => write!(f, "Failed to setup onchain wallet."),
163163
Self::LoggerSetupFailed => write!(f, "Failed to setup the logger."),
164-
Self::InvalidNodeAlias(ref reason) => {
165-
write!(f, "Given node alias is invalid: {}", reason)
166-
},
164+
Self::InvalidNodeAlias => write!(f, "Given node alias is invalid."),
167165
}
168166
}
169167
}
@@ -316,9 +314,7 @@ impl NodeBuilder {
316314

317315
/// Sets the alias the [`Node`] will use in its announcement. The provided
318316
/// alias must be a valid UTF-8 string.
319-
pub fn set_node_alias<T: Into<String>>(
320-
&mut self, node_alias: T,
321-
) -> Result<&mut Self, BuildError> {
317+
pub fn set_node_alias(&mut self, node_alias: String) -> Result<&mut Self, BuildError> {
322318
let node_alias = sanitize_alias(node_alias).map_err(|e| e)?;
323319

324320
self.config.node_alias = Some(node_alias);
@@ -522,6 +518,11 @@ impl ArcedNodeBuilder {
522518
self.inner.write().unwrap().set_log_level(level);
523519
}
524520

521+
/// Sets the node alias.
522+
pub fn set_node_alias(&self, node_alias: String) -> Result<(), BuildError> {
523+
self.inner.write().unwrap().set_node_alias(node_alias).map(|_| ())
524+
}
525+
525526
/// Builds a [`Node`] instance with a [`SqliteStore`] backend and according to the options
526527
/// previously configured.
527528
pub fn build(&self) -> Result<Arc<Node>, BuildError> {
@@ -1073,21 +1074,12 @@ fn sanitize_alias<T: Into<String>>(node_alias: T) -> Result<String, BuildError>
10731074
let node_alias: String = node_alias.into();
10741075
let alias = node_alias.trim();
10751076

1076-
// Alias is non-empty
1077-
if alias.is_empty() {
1078-
return Err(BuildError::InvalidNodeAlias("Node alias cannot be empty.".to_string()));
1079-
}
1080-
1081-
// Alias valid up to first null byte
1082-
let first_null = alias.as_bytes().iter().position(|b| *b == 0).unwrap_or(alias.len());
1083-
let actual_alias = alias.split_at(first_null).0;
1084-
10851077
// Alias must be 32-bytes long or less
1086-
if actual_alias.as_bytes().len() > 32 {
1087-
return Err(BuildError::InvalidNodeAlias("Node alias cannot exceed 32 bytes.".to_string()));
1078+
if alias.as_bytes().len() > 32 {
1079+
return Err(BuildError::InvalidNodeAlias);
10881080
}
10891081

1090-
Ok(actual_alias.to_string())
1082+
Ok(alias.to_string())
10911083
}
10921084

10931085
#[cfg(test)]
@@ -1096,38 +1088,32 @@ mod tests {
10961088

10971089
use super::NodeBuilder;
10981090

1099-
fn create_node_with_alias<T: Into<String>>(alias: T) -> Result<Node, BuildError> {
1100-
NodeBuilder::new().set_node_alias(&alias.into())?.build()
1091+
fn create_node_with_alias(alias: String) -> Result<Node, BuildError> {
1092+
NodeBuilder::new().set_node_alias(alias)?.build()
11011093
}
11021094

11031095
#[test]
11041096
fn empty_node_alias() {
11051097
// Empty node alias
11061098
let alias = "";
1107-
let node = create_node_with_alias(alias);
1108-
assert_eq!(
1109-
node.err().unwrap(),
1110-
BuildError::InvalidNodeAlias("Node alias cannot be empty.".to_string())
1111-
);
1099+
let node = create_node_with_alias(alias.to_string());
1100+
assert_eq!(node.err().unwrap(), BuildError::InvalidNodeAlias);
11121101
}
11131102

11141103
#[test]
11151104
fn node_alias_with_sandwiched_null() {
11161105
// Alias with emojis
11171106
let expected_alias = "I\u{1F496}LDK-Node!";
11181107
let user_provided_alias = "I\u{1F496}LDK-Node!\0\u{26A1}";
1119-
let node = create_node_with_alias(user_provided_alias).unwrap();
1108+
let node = create_node_with_alias(user_provided_alias.to_string()).unwrap();
11201109

11211110
assert_eq!(expected_alias, node.config().node_alias.unwrap());
11221111
}
11231112

11241113
#[test]
11251114
fn node_alias_longer_than_32_bytes() {
11261115
let alias = "This is a string longer than thirty-two bytes!"; // 46 bytes
1127-
let node = create_node_with_alias(alias);
1128-
assert_eq!(
1129-
node.err().unwrap(),
1130-
BuildError::InvalidNodeAlias("Node alias cannot exceed 32 bytes.".to_string())
1131-
);
1116+
let node = create_node_with_alias(alias.to_string());
1117+
assert_eq!(node.err().unwrap(), BuildError::InvalidNodeAlias);
11321118
}
11331119
}

src/lib.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -645,22 +645,18 @@ impl Node {
645645
}
646646

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

663-
bcast_pm.broadcast_node_announcement([0; 3], alias, addresses);
659+
bcast_pm.broadcast_node_announcement([0; 3], alias.unwrap(), addresses);
664660

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

0 commit comments

Comments
 (0)