@@ -32,6 +32,7 @@ use lightning::chain::{chainmonitor, BestBlock, Watch};
32
32
use lightning:: ln:: channelmanager:: { self , ChainParameters , ChannelManagerReadArgs } ;
33
33
use lightning:: ln:: msgs:: { RoutingMessageHandler , SocketAddress } ;
34
34
use lightning:: ln:: peer_handler:: { IgnoringMessageHandler , MessageHandler } ;
35
+ use lightning:: routing:: gossip:: NodeAlias ;
35
36
use lightning:: routing:: router:: DefaultRouter ;
36
37
use lightning:: routing:: scoring:: {
37
38
ProbabilisticScorer , ProbabilisticScoringDecayParameters , ProbabilisticScoringFeeParameters ,
@@ -121,7 +122,7 @@ pub enum BuildError {
121
122
InvalidChannelMonitor ,
122
123
/// The given listening addresses are invalid, e.g. too many were passed.
123
124
InvalidListeningAddresses ,
124
- /// The provided alias is invalid
125
+ /// The provided alias is invalid.
125
126
InvalidNodeAlias ,
126
127
/// We failed to read data from the [`KVStore`].
127
128
///
@@ -315,7 +316,7 @@ impl NodeBuilder {
315
316
/// Sets the alias the [`Node`] will use in its announcement. The provided
316
317
/// alias must be a valid UTF-8 string.
317
318
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) ?;
319
320
320
321
self . config . node_alias = Some ( node_alias) ;
321
322
Ok ( self )
@@ -1069,51 +1070,58 @@ fn seed_bytes_from_config(
1069
1070
}
1070
1071
1071
1072
/// 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 ( ) ;
1076
1075
1077
- // Alias must be 32-bytes long or less
1076
+ // Alias must be 32-bytes long or less.
1078
1077
if alias. as_bytes ( ) . len ( ) > 32 {
1079
1078
return Err ( BuildError :: InvalidNodeAlias ) ;
1080
1079
}
1081
1080
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) )
1083
1084
}
1084
1085
1085
1086
#[ cfg( test) ]
1086
1087
mod tests {
1087
- use crate :: { BuildError , Node } ;
1088
+ use lightning :: routing :: gossip :: NodeAlias ;
1088
1089
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 } ;
1094
1091
1095
1092
#[ test]
1096
- fn empty_node_alias ( ) {
1093
+ fn sanitize_empty_node_alias ( ) {
1097
1094
// Empty node alias
1098
1095
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) ;
1101
1102
}
1102
1103
1103
1104
#[ test]
1104
- fn node_alias_with_sandwiched_null ( ) {
1105
+ fn sanitize_alias_with_sandwiched_null ( ) {
1105
1106
// 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
+
1107
1112
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) ;
1109
1116
1110
- assert_eq ! ( expected_alias, node. config( ) . node_alias. unwrap( ) ) ;
1117
+ assert_eq ! ( alias, & node_alias_display) ;
1118
+ assert_ne ! ( expected_alias, node_alias) ;
1111
1119
}
1112
1120
1113
1121
#[ test]
1114
- fn node_alias_longer_than_32_bytes ( ) {
1122
+ fn sanitize_alias_gt_32_bytes ( ) {
1115
1123
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) ;
1117
1125
assert_eq ! ( node. err( ) . unwrap( ) , BuildError :: InvalidNodeAlias ) ;
1118
1126
}
1119
1127
}
0 commit comments