File tree 7 files changed +34
-10
lines changed
7 files changed +34
-10
lines changed Original file line number Diff line number Diff line change @@ -225,7 +225,8 @@ impl ClientCommand {
225
225
LookupError :: NoSuchChannelName ( name) => Some ( make_numeric ! ( NoSuchChannel , & name) ) ,
226
226
_ => None ,
227
227
} ,
228
- CommandError :: InvalidNick ( name) => Some ( make_numeric ! ( ErroneousNickname , & name) ) ,
228
+ CommandError :: InvalidNickname ( name) => Some ( make_numeric ! ( ErroneousNickname , & name) ) ,
229
+ CommandError :: InvalidUsername ( _name) => Some ( make_numeric ! ( InvalidUsername ) ) ,
229
230
CommandError :: InvalidChannelName ( name) => {
230
231
Some ( make_numeric ! ( InvalidChannelName , & name) )
231
232
}
Original file line number Diff line number Diff line change @@ -27,7 +27,9 @@ pub enum CommandError {
27
27
/// A required object wasn't found in the network state
28
28
LookupError ( LookupError ) ,
29
29
/// A nickname parameter wasn't a valid nick
30
- InvalidNick ( String ) ,
30
+ InvalidNickname ( String ) ,
31
+ /// A username parameter wasn't a valid username
32
+ InvalidUsername ( String ) ,
31
33
/// A channel name parameter wasn't a valid channel name
32
34
InvalidChannelName ( String ) ,
33
35
/// A services command was executed, but services aren't currently running
@@ -120,7 +122,13 @@ impl From<LookupError> for CommandError {
120
122
121
123
impl From < InvalidNicknameError > for CommandError {
122
124
fn from ( e : InvalidNicknameError ) -> Self {
123
- Self :: InvalidNick ( e. 0 )
125
+ Self :: InvalidNickname ( e. 0 )
126
+ }
127
+ }
128
+
129
+ impl From < InvalidUsernameError > for CommandError {
130
+ fn from ( e : InvalidUsernameError ) -> Self {
131
+ Self :: InvalidUsername ( e. 0 )
124
132
}
125
133
}
126
134
Original file line number Diff line number Diff line change @@ -105,9 +105,12 @@ impl<'a> Command for ServicesCommand<'a> {
105
105
}
106
106
}
107
107
}
108
- CommandError :: InvalidNick ( name) => {
108
+ CommandError :: InvalidNickname ( name) => {
109
109
self . notice ( format_args ! ( "Invalid nickname {}" , name) ) ;
110
110
}
111
+ CommandError :: InvalidUsername ( name) => {
112
+ self . notice ( format_args ! ( "Invalid username {}" , name) ) ;
113
+ }
111
114
CommandError :: InvalidChannelName ( name) => {
112
115
self . notice ( format_args ! ( "Invalid channel name {}" , name) ) ;
113
116
}
Original file line number Diff line number Diff line change @@ -5,14 +5,14 @@ fn handle_user(
5
5
server : & ClientServer ,
6
6
source : PreClientSource ,
7
7
cmd : & dyn Command ,
8
- username : & str ,
8
+ username : Username ,
9
9
_unused1 : & str ,
10
10
_unused2 : & str ,
11
11
realname : & str ,
12
12
) -> CommandResult {
13
13
// Ignore these results; they'll only fail if USER was already successfully processed
14
14
// from this pre-client. If that happens we silently ignore the new values.
15
- source. user . set ( Username :: new_coerce ( username) ) . ok ( ) ;
15
+ source. user . set ( username) . ok ( ) ;
16
16
source. realname . set ( realname. to_owned ( ) ) . ok ( ) ;
17
17
18
18
if source. can_register ( ) {
Original file line number Diff line number Diff line change @@ -52,6 +52,12 @@ impl<'a> PositionalArgument<'a> for Nickname {
52
52
}
53
53
}
54
54
55
+ impl < ' a > PositionalArgument < ' a > for Username {
56
+ fn parse_str ( _ctx : & ' a dyn Command , value : & ' a str ) -> Result < Self , CommandError > {
57
+ Ok ( Username :: new_coerce ( value) ?)
58
+ }
59
+ }
60
+
55
61
impl < ' a > PositionalArgument < ' a > for state:: ChannelRoleName {
56
62
fn parse_str ( _ctx : & ' a dyn Command , value : & ' a str ) -> Result < Self , CommandError > {
57
63
value
Original file line number Diff line number Diff line change @@ -64,6 +64,7 @@ define_messages! {
64
64
451 ( NotRegistered ) => { ( ) => ":You have not registered" } ,
65
65
461 ( NotEnoughParameters ) => { ( command: & str ) => "{command} :Not enough parameters" } ,
66
66
462 ( AlreadyRegistered ) => { ( ) => ":You are already connected and cannot handshake again" } ,
67
+ 468 ( InvalidUsername ) => { ( ) => ":Your username is not valid" } ,
67
68
472 ( UnknownMode ) => { ( c: char ) => "{c} :Unknown mode character" } ,
68
69
479 ( InvalidChannelName ) => { ( name: & str ) => "{name} :Illegal channel name" } ,
69
70
482 ( ChanOpPrivsNeeded ) => { ( chan: & ChannelName ) => "{chan} :You're not a channel operator" } ,
Original file line number Diff line number Diff line change @@ -59,7 +59,11 @@ define_validated! {
59
59
}
60
60
61
61
Username ( ArrayString <{ Username :: LENGTH } >) {
62
- Ok ( ( ) )
62
+ if value. len( ) == 0 {
63
+ Self :: error( value)
64
+ } else {
65
+ Ok ( ( ) )
66
+ }
63
67
}
64
68
65
69
Hostname ( ArrayString <{ Hostname :: LENGTH } >) {
@@ -129,13 +133,14 @@ impl Username {
129
133
pub const LENGTH : usize = 10 ;
130
134
131
135
/// Coerce the provided value into a valid `Username`, by truncating to the
132
- /// permitted length and removing any invalid characters.
133
- pub fn new_coerce ( s : & str ) -> Self {
136
+ /// permitted length, removing any invalid characters, and checking it is not empty .
137
+ pub fn new_coerce ( s : & str ) -> < Self as Validated > :: Result {
134
138
let mut s = s. to_string ( ) ;
135
139
s. retain ( |c| c != '[' ) ;
136
140
s. truncate ( s. floor_char_boundary ( Self :: LENGTH ) ) ;
137
141
// expect() is safe here; we've already truncated to the max length
138
- Self ( ArrayString :: try_from ( s. as_str ( ) ) . expect ( "Failed to convert string" ) )
142
+ let val = ArrayString :: try_from ( s. as_str ( ) ) . expect ( "Failed to convert string" ) ;
143
+ Self :: validate ( & val) . map ( |( ) | Self ( val) )
139
144
}
140
145
}
141
146
You can’t perform that action at this time.
0 commit comments