44 ) { |
44 ) { |
45 match message { |
45 match message { |
46 HWProtocolMessage::Nick(nick) => { |
46 HWProtocolMessage::Nick(nick) => { |
47 let client = &mut server.clients[client_id]; |
47 let client = &mut server.clients[client_id]; |
48 debug!("{} {}", nick, is_name_illegal(&nick)); |
48 debug!("{} {}", nick, is_name_illegal(&nick)); |
49 let actions = if client.room_id != None { |
49 if client.room_id != None { |
50 unreachable!() |
50 unreachable!() |
51 } else if !client.nick.is_empty() { |
51 } else if !client.nick.is_empty() { |
52 vec![ProtocolError("Nickname already provided.".to_string())] |
52 response.add(Error("Nickname already provided.".to_string()).send_self()); |
53 } else if is_name_illegal(&nick) { |
53 } else if is_name_illegal(&nick) { |
54 vec![ByeClient("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())] |
54 // ByeClient("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()) |
55 } else { |
55 } else { |
56 client.nick = nick.clone(); |
56 client.nick = nick.clone(); |
57 vec![Nick(nick).send_self().action(), CheckRegistered] |
57 response.add(Nick(nick).send_self()); |
58 }; |
58 //CheckRegistered |
59 |
59 } |
60 server.react(client_id, actions); |
|
61 } |
|
62 HWProtocolMessage::Proto(proto) => { |
|
63 let client = &mut server.clients[client_id]; |
|
64 let actions = if client.protocol_number != 0 { |
|
65 vec![ProtocolError("Protocol already known.".to_string())] |
|
66 } else if proto == 0 { |
|
67 vec![ProtocolError("Bad number.".to_string())] |
|
68 } else { |
|
69 client.protocol_number = proto; |
|
70 vec![Proto(proto).send_self().action(), CheckRegistered] |
|
71 }; |
|
72 server.react(client_id, actions); |
|
73 } |
60 } |
74 #[cfg(feature = "official-server")] |
61 #[cfg(feature = "official-server")] |
75 HWProtocolMessage::Password(hash, salt) => { |
62 HWProtocolMessage::Password(hash, salt) => { |
76 let c = &server.clients[client_id]; |
63 let c = &server.clients[client_id]; |
77 |
64 |
78 let client_hash = get_hash(c, &salt, &c.server_salt); |
65 let client_hash = get_hash(c, &salt, &c.server_salt); |
79 let server_hash = get_hash(c, &c.server_salt, &salt); |
66 let server_hash = get_hash(c, &c.server_salt, &salt); |
80 let actions = if client_hash == server_hash { |
67 if client_hash == server_hash { |
81 vec![ |
68 response.add(ServerAuth(format!("{:x}", server_hash)).send_self()); |
82 ServerAuth(format!("{:x}", server_hash)) |
69 //JoinLobby |
83 .send_self() |
|
84 .action(), |
|
85 JoinLobby, |
|
86 ] |
|
87 } else { |
70 } else { |
88 vec![ByeClient("Authentication failed".to_string())] |
71 //ByeClient("Authentication failed".to_string()) |
89 }; |
72 }; |
90 server.react(client_id, actions); |
73 } |
|
74 HWProtocolMessage::Proto(proto) => { |
|
75 let client = &mut server.clients[client_id]; |
|
76 if client.protocol_number != 0 { |
|
77 response.add(Error("Protocol already known.".to_string()).send_self()); |
|
78 } else if proto == 0 { |
|
79 response.add(Error("Bad number.".to_string()).send_self()); |
|
80 } else { |
|
81 client.protocol_number = proto; |
|
82 response.add(Proto(proto).send_self()); |
|
83 // CheckRegistered |
|
84 } |
91 } |
85 } |
92 #[cfg(feature = "official-server")] |
86 #[cfg(feature = "official-server")] |
93 HWProtocolMessage::Checker(protocol, nick, password) => { |
87 HWProtocolMessage::Checker(protocol, nick, password) => { |
94 let c = &mut server.clients[client_id]; |
88 let c = &mut server.clients[client_id]; |
95 c.nick = nick; |
89 c.nick = nick; |