21 Unchanged, |
23 Unchanged, |
22 Complete, |
24 Complete, |
23 Exit, |
25 Exit, |
24 } |
26 } |
25 |
27 |
26 fn completion_result(client: &HWAnteClient, response: &mut super::Response) -> LoginResult { |
28 fn completion_result<'a, I>( |
27 #[cfg(feature = "official-server")] |
29 mut other_clients: I, |
28 { |
30 client: &mut HWAnteClient, |
29 response.add(AskPassword(client.server_salt.clone()).send_self()); |
31 response: &mut super::Response, |
30 LoginResult::Unchanged |
32 ) -> LoginResult |
31 } |
33 where |
|
34 I: Iterator<Item = (ClientId, &'a HWClient)>, |
|
35 { |
|
36 let has_nick_clash = |
|
37 other_clients.any(|(_, c)| !c.is_checker() && c.nick == *client.nick.as_ref().unwrap()); |
32 |
38 |
33 #[cfg(not(feature = "official-server"))] |
39 if has_nick_clash { |
34 { |
40 if client.protocol_number.unwrap().get() < 38 { |
35 LoginResult::Complete |
41 response.add(Bye("User quit: Nickname is already in use".to_string()).send_self()); |
|
42 LoginResult::Exit |
|
43 } else { |
|
44 client.nick = None; |
|
45 response.add(Notice("NickAlreadyInUse".to_string()).send_self()); |
|
46 LoginResult::Unchanged |
|
47 } |
|
48 } else { |
|
49 #[cfg(feature = "official-server")] |
|
50 { |
|
51 response.add(AskPassword(client.server_salt.clone()).send_self()); |
|
52 LoginResult::Unchanged |
|
53 } |
|
54 |
|
55 #[cfg(not(feature = "official-server"))] |
|
56 { |
|
57 LoginResult::Complete |
|
58 } |
36 } |
59 } |
37 } |
60 } |
38 |
61 |
39 pub fn handle( |
62 pub fn handle( |
40 anteroom: &mut HWAnteroom, |
63 server: &mut HWServer, |
41 client_id: ClientId, |
64 client_id: ClientId, |
42 response: &mut super::Response, |
65 response: &mut super::Response, |
43 message: HWProtocolMessage, |
66 message: HWProtocolMessage, |
44 ) -> LoginResult { |
67 ) -> LoginResult { |
45 match message { |
68 match message { |
46 HWProtocolMessage::Quit(_) => { |
69 HWProtocolMessage::Quit(_) => { |
47 response.add(Bye("User quit".to_string()).send_self()); |
70 response.add(Bye("User quit".to_string()).send_self()); |
48 LoginResult::Exit |
71 LoginResult::Exit |
49 } |
72 } |
50 HWProtocolMessage::Nick(nick) => { |
73 HWProtocolMessage::Nick(nick) => { |
51 let client = &mut anteroom.clients[client_id]; |
74 let client = &mut server.anteroom.clients[client_id]; |
52 debug!("{} {}", nick, is_name_illegal(&nick)); |
75 debug!("{} {}", nick, is_name_illegal(&nick)); |
53 if !client.nick.is_some() { |
76 if client.nick.is_some() { |
54 response.add(Error("Nickname already provided.".to_string()).send_self()); |
77 response.add(Error("Nickname already provided.".to_string()).send_self()); |
55 LoginResult::Unchanged |
78 LoginResult::Unchanged |
56 } else if is_name_illegal(&nick) { |
79 } else if is_name_illegal(&nick) { |
57 response.add(Bye("Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string()).send_self()); |
80 response.add(Bye("Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string()).send_self()); |
58 LoginResult::Exit |
81 LoginResult::Exit |
59 } else { |
82 } else { |
60 client.nick = Some(nick.clone()); |
83 client.nick = Some(nick.clone()); |
61 response.add(Nick(nick).send_self()); |
84 response.add(Nick(nick).send_self()); |
62 |
85 |
63 if client.protocol_number.is_some() { |
86 if client.protocol_number.is_some() { |
64 completion_result(&client, response) |
87 completion_result(server.clients.iter(), client, response) |
65 } else { |
88 } else { |
66 LoginResult::Unchanged |
89 LoginResult::Unchanged |
67 } |
90 } |
68 } |
91 } |
69 } |
92 } |
70 HWProtocolMessage::Proto(proto) => { |
93 HWProtocolMessage::Proto(proto) => { |
71 let client = &mut anteroom.clients[client_id]; |
94 let client = &mut server.anteroom.clients[client_id]; |
72 if client.protocol_number.is_some() { |
95 if client.protocol_number.is_some() { |
73 response.add(Error("Protocol already known.".to_string()).send_self()); |
96 response.add(Error("Protocol already known.".to_string()).send_self()); |
74 LoginResult::Unchanged |
97 LoginResult::Unchanged |
75 } else if proto == 0 { |
98 } else if proto == 0 { |
76 response.add(Error("Bad number.".to_string()).send_self()); |
99 response.add(Error("Bad number.".to_string()).send_self()); |
78 } else { |
101 } else { |
79 client.protocol_number = NonZeroU16::new(proto); |
102 client.protocol_number = NonZeroU16::new(proto); |
80 response.add(Proto(proto).send_self()); |
103 response.add(Proto(proto).send_self()); |
81 |
104 |
82 if client.nick.is_some() { |
105 if client.nick.is_some() { |
83 completion_result(&client, response) |
106 completion_result(server.clients.iter(), client, response) |
84 } else { |
107 } else { |
85 LoginResult::Unchanged |
108 LoginResult::Unchanged |
86 } |
109 } |
87 } |
110 } |
88 } |
111 } |
89 #[cfg(feature = "official-server")] |
112 #[cfg(feature = "official-server")] |
90 HWProtocolMessage::Password(hash, salt) => { |
113 HWProtocolMessage::Password(hash, salt) => { |
91 let client = &anteroom.clients[client_id]; |
114 let client = &server.anteroom.clients[client_id]; |
92 |
115 |
93 if let (Some(nick), Some(protocol)) = (client.nick.as_ref(), client.protocol_number) { |
116 if let (Some(nick), Some(protocol)) = (client.nick.as_ref(), client.protocol_number) { |
94 response.request_io(super::IoTask::GetAccount { |
117 response.request_io(super::IoTask::GetAccount { |
95 nick: nick.clone(), |
118 nick: nick.clone(), |
96 protocol: protocol.get(), |
119 protocol: protocol.get(), |
102 |
125 |
103 LoginResult::Unchanged |
126 LoginResult::Unchanged |
104 } |
127 } |
105 #[cfg(feature = "official-server")] |
128 #[cfg(feature = "official-server")] |
106 HWProtocolMessage::Checker(protocol, nick, password) => { |
129 HWProtocolMessage::Checker(protocol, nick, password) => { |
107 let client = &mut anteroom.clients[client_id]; |
130 let client = &mut server.anteroom.clients[client_id]; |
108 client.protocol_number = NonZeroU16::new(protocol); |
131 if protocol == 0 { |
109 client.nick = Some(nick); |
132 response.add(Error("Bad number.".to_string()).send_self()); |
110 //client.set_is_checker(true); |
133 LoginResult::Unchanged |
111 LoginResult::Complete |
134 } else { |
|
135 client.protocol_number = NonZeroU16::new(protocol); |
|
136 client.nick = Some(nick); |
|
137 client.is_checker = true; |
|
138 LoginResult::Complete |
|
139 } |
112 } |
140 } |
113 _ => { |
141 _ => { |
114 warn!("Incorrect command in logging-in state"); |
142 warn!("Incorrect command in logging-in state"); |
115 LoginResult::Unchanged |
143 LoginResult::Unchanged |
116 } |
144 } |