Skip to content

Commit 81a0f4d

Browse files
committed
refactor: update node alias sanitization
What this commit does: + Updates the sanitization function for node alias to return NodeAlias + Updates the node alias type in the configuration to NodeAlias and implements a conversion to/from String for bindings + With this update, regardless of where the alias is set, i.e. in the set_node_alias or directly, sanitization occurs.
1 parent 7ad7029 commit 81a0f4d

File tree

4 files changed

+55
-28
lines changed

4 files changed

+55
-28
lines changed

bindings/ldk_node.udl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ dictionary Config {
1616
LogLevel log_level;
1717
AnchorChannelsConfig? anchor_channels_config;
1818
SendingParameters? sending_parameters;
19-
string? node_alias;
19+
NodeAlias? node_alias;
2020
};
2121

2222
dictionary AnchorChannelsConfig {
@@ -205,6 +205,7 @@ enum NodeError {
205205
"InvalidNetwork",
206206
"InvalidUri",
207207
"InvalidQuantity",
208+
"InvalidNodeAlias",
208209
"DuplicatePayment",
209210
"UnsupportedCurrency",
210211
"InsufficientFunds",
@@ -235,6 +236,7 @@ enum BuildError {
235236
"InvalidSystemTime",
236237
"InvalidChannelMonitor",
237238
"InvalidListeningAddresses",
239+
"InvalidNodeAlias",
238240
"ReadFailed",
239241
"WriteFailed",
240242
"StoragePathAccessFailed",
@@ -533,3 +535,6 @@ typedef string Mnemonic;
533535

534536
[Custom]
535537
typedef string UntrustedString;
538+
539+
[Custom]
540+
typedef string NodeAlias;

src/builder.rs

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use lightning::chain::{chainmonitor, BestBlock, Watch};
3232
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManagerReadArgs};
3333
use lightning::ln::msgs::{RoutingMessageHandler, SocketAddress};
3434
use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler};
35+
use lightning::routing::gossip::NodeAlias;
3536
use lightning::routing::router::DefaultRouter;
3637
use lightning::routing::scoring::{
3738
ProbabilisticScorer, ProbabilisticScoringDecayParameters, ProbabilisticScoringFeeParameters,
@@ -121,7 +122,7 @@ pub enum BuildError {
121122
InvalidChannelMonitor,
122123
/// The given listening addresses are invalid, e.g. too many were passed.
123124
InvalidListeningAddresses,
124-
/// The provided alias is invalid
125+
/// The provided alias is invalid.
125126
InvalidNodeAlias,
126127
/// We failed to read data from the [`KVStore`].
127128
///
@@ -315,7 +316,7 @@ impl NodeBuilder {
315316
/// Sets the alias the [`Node`] will use in its announcement. The provided
316317
/// alias must be a valid UTF-8 string.
317318
pub fn set_node_alias(&mut self, node_alias: String) -> Result<&mut Self, BuildError> {
318-
let node_alias = sanitize_alias(node_alias).map_err(|e| e)?;
319+
let node_alias = sanitize_alias(&node_alias)?;
319320

320321
self.config.node_alias = Some(node_alias);
321322
Ok(self)
@@ -1069,51 +1070,58 @@ fn seed_bytes_from_config(
10691070
}
10701071

10711072
/// Sanitize the user-provided node alias to ensure that it is a valid protocol-specified UTF-8 string.
1072-
fn sanitize_alias<T: Into<String>>(node_alias: T) -> Result<String, BuildError> {
1073-
// Alias is convertible into UTF-8 encoded string
1074-
let node_alias: String = node_alias.into();
1075-
let alias = node_alias.trim();
1073+
pub fn sanitize_alias(alias_str: &str) -> Result<NodeAlias, BuildError> {
1074+
let alias = alias_str.trim();
10761075

1077-
// Alias must be 32-bytes long or less
1076+
// Alias must be 32-bytes long or less.
10781077
if alias.as_bytes().len() > 32 {
10791078
return Err(BuildError::InvalidNodeAlias);
10801079
}
10811080

1082-
Ok(alias.to_string())
1081+
let mut bytes = [0u8; 32];
1082+
bytes[..alias.as_bytes().len()].copy_from_slice(alias.as_bytes());
1083+
Ok(NodeAlias(bytes))
10831084
}
10841085

10851086
#[cfg(test)]
10861087
mod tests {
1087-
use crate::{BuildError, Node};
1088+
use lightning::routing::gossip::NodeAlias;
10881089

1089-
use super::NodeBuilder;
1090-
1091-
fn create_node_with_alias(alias: String) -> Result<Node, BuildError> {
1092-
NodeBuilder::new().set_node_alias(alias)?.build()
1093-
}
1090+
use crate::{builder::sanitize_alias, BuildError};
10941091

10951092
#[test]
1096-
fn empty_node_alias() {
1093+
fn sanitize_empty_node_alias() {
10971094
// Empty node alias
10981095
let alias = "";
1099-
let node = create_node_with_alias(alias.to_string());
1100-
assert_eq!(node.err().unwrap(), BuildError::InvalidNodeAlias);
1096+
let mut buf = [0u8; 32];
1097+
buf[..alias.as_bytes().len()].copy_from_slice(alias.as_bytes());
1098+
1099+
let expected_node_alias = NodeAlias([0; 32]);
1100+
let node_alias = sanitize_alias(alias).unwrap();
1101+
assert_eq!(node_alias, expected_node_alias);
11011102
}
11021103

11031104
#[test]
1104-
fn node_alias_with_sandwiched_null() {
1105+
fn sanitize_alias_with_sandwiched_null() {
11051106
// Alias with emojis
1106-
let expected_alias = "I\u{1F496}LDK-Node!";
1107+
let alias = "I\u{1F496}LDK-Node!";
1108+
let mut buf = [0u8; 32];
1109+
buf[..alias.as_bytes().len()].copy_from_slice(alias.as_bytes());
1110+
let expected_alias = NodeAlias(buf);
1111+
11071112
let user_provided_alias = "I\u{1F496}LDK-Node!\0\u{26A1}";
1108-
let node = create_node_with_alias(user_provided_alias.to_string()).unwrap();
1113+
let node_alias = sanitize_alias(user_provided_alias).unwrap();
1114+
1115+
let node_alias_display = format!("{}", node_alias);
11091116

1110-
assert_eq!(expected_alias, node.config().node_alias.unwrap());
1117+
assert_eq!(alias, &node_alias_display);
1118+
assert_ne!(expected_alias, node_alias);
11111119
}
11121120

11131121
#[test]
1114-
fn node_alias_longer_than_32_bytes() {
1122+
fn sanitize_alias_gt_32_bytes() {
11151123
let alias = "This is a string longer than thirty-two bytes!"; // 46 bytes
1116-
let node = create_node_with_alias(alias.to_string());
1124+
let node = sanitize_alias(alias);
11171125
assert_eq!(node.err().unwrap(), BuildError::InvalidNodeAlias);
11181126
}
11191127
}

src/config.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use crate::payment::SendingParameters;
99

1010
use lightning::ln::msgs::SocketAddress;
11+
use lightning::routing::gossip::NodeAlias;
1112
use lightning::util::config::UserConfig;
1213
use lightning::util::logger::Level as LogLevel;
1314

@@ -165,9 +166,9 @@ pub struct Config {
165166
pub sending_parameters: Option<SendingParameters>,
166167
/// The node alias to be used in announcements.
167168
///
168-
/// **Note**: This is required if, alongside a valid public socket address, node announcements
169-
/// are to be broadcast.
170-
pub node_alias: Option<String>,
169+
/// **Note**: Node announcements will only be broadcast if the node_alias and the
170+
/// listening_addresses are set.
171+
pub node_alias: Option<NodeAlias>,
171172
}
172173

173174
impl Default for Config {

src/uniffi_types.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub use lightning::ln::{ChannelId, PaymentHash, PaymentPreimage, PaymentSecret};
1919
pub use lightning::offers::invoice::Bolt12Invoice;
2020
pub use lightning::offers::offer::{Offer, OfferId};
2121
pub use lightning::offers::refund::Refund;
22-
pub use lightning::routing::gossip::{NodeId, RoutingFees};
22+
pub use lightning::routing::gossip::{NodeAlias, NodeId, RoutingFees};
2323
pub use lightning::util::string::UntrustedString;
2424

2525
pub use lightning_invoice::Bolt11Invoice;
@@ -30,6 +30,7 @@ pub use bip39::Mnemonic;
3030

3131
use crate::UniffiCustomTypeConverter;
3232

33+
use crate::builder::sanitize_alias;
3334
use crate::error::Error;
3435
use crate::hex_utils;
3536
use crate::{SocketAddress, UserChannelId};
@@ -324,3 +325,15 @@ impl UniffiCustomTypeConverter for UntrustedString {
324325
obj.to_string()
325326
}
326327
}
328+
329+
impl UniffiCustomTypeConverter for NodeAlias {
330+
type Builtin = String;
331+
332+
fn into_custom(val: Self::Builtin) -> uniffi::Result<Self> {
333+
Ok(sanitize_alias(&val).map_err(|_| Error::InvalidNodeAlias)?)
334+
}
335+
336+
fn from_custom(obj: Self) -> Self::Builtin {
337+
obj.to_string()
338+
}
339+
}

0 commit comments

Comments
 (0)