This enables srp.
{
NetworkPacket pkt(TOSERVER_INIT, 1 + 2 + 2 + (1 + playerName.size()));
- // TODO (later) actually send supported compression modes
- pkt << (u8) SER_FMT_VER_HIGHEST_READ << (u8) 42;
+ // we don't support network compression yet
+ u16 supp_comp_modes = NETPROTO_COMPRESSION_NONE;
+ pkt << (u8) SER_FMT_VER_HIGHEST_READ << (u16) supp_comp_modes;
pkt << (u16) CLIENT_PROTOCOL_VERSION_MIN << (u16) CLIENT_PROTOCOL_VERSION_MAX;
pkt << playerName;
void setPendingSerializationVersion(u8 version)
{ m_pending_serialization_version = version; }
- void setSupportedCompressionModes(u8 byteFlag)
+ void setSupportedCompressionModes(u16 byteFlag)
{ m_supported_compressions = byteFlag; }
void confirmSerializationVersion()
std::string m_full_version;
- u8 m_supported_compressions;
+ u16 m_supported_compressions;
/*
time this client was created
if (pkt->getSize() < 1)
return;
- u8 deployed;
+ u8 serialization_ver;
+ u16 proto_ver;
+ u16 compression_mode;
u32 auth_mechs;
std::string username_legacy; // for case insensitivity
- *pkt >> deployed >> auth_mechs >> username_legacy;
+ *pkt >> serialization_ver >> compression_mode >> proto_ver
+ >> auth_mechs >> username_legacy;
// Chose an auth method we support
AuthMechanism chosen_auth_mechanism = choseAuthMech(auth_mechs);
infostream << "Client: TOCLIENT_HELLO received with "
- "deployed=" << ((int)deployed & 0xff) << ", auth_mechs="
- << auth_mechs << ", chosen=" << chosen_auth_mechanism << std::endl;
+ << "serialization_ver=" << serialization_ver
+ << ", auth_mechs=" << auth_mechs
+ << ", compression_mode=" << compression_mode
+ << ". Doing auth with mech " << chosen_auth_mechanism << std::endl;
- if (!ser_ver_supported(deployed)) {
+ if (!ser_ver_supported(serialization_ver)) {
infostream << "Client: TOCLIENT_HELLO: Server sent "
<< "unsupported ser_fmt_ver"<< std::endl;
return;
}
- m_server_ser_ver = deployed;
- m_proto_ver = deployed;
+ m_server_ser_ver = serialization_ver;
+ m_proto_ver = proto_ver;
//TODO verify that username_legacy matches sent username, only
// differs in casing (make both uppercase and compare)
Add TOCLIENT_AUTH_ACCEPT to accept connection from client
*/
-#define LATEST_PROTOCOL_VERSION 24
+#define LATEST_PROTOCOL_VERSION 25
// Server's supported network protocol range
#define SERVER_PROTOCOL_VERSION_MIN 13
/*
Sent after TOSERVER_INIT.
- u8 deployed version
+ u8 deployed serialisation version
+ u16 deployed network compression mode
+ u16 deployed protocol version
u32 supported auth methods
std::string username that should be used for legacy hash (for proper casing)
*/
/*
Sent first after connected.
- [2] u8 SER_FMT_VER_HIGHEST_READ
- [3] u8 compression_modes
- [4] u16 minimum supported network protocol version
- [6] u16 maximum supported network protocol version
- [8] std::string player name
+ u8 serialisation version (=SER_FMT_VER_HIGHEST_READ)
+ u16 supported network compression modes
+ u16 minimum supported network protocol version
+ u16 maximum supported network protocol version
+ std::string player name
*/
TOSERVER_INIT_LEGACY = 0x10,
};
enum NetProtoCompressionMode {
- NETPROTO_COMPRESSION_ZLIB = 0,
+ NETPROTO_COMPRESSION_NONE = 0,
};
const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
{
null_command_factory, // 0x00
null_command_factory, // 0x01
- null_command_factory, // 0x02
+ { "TOCLIENT_HELLO", 0, true }, // 0x02
{ "TOCLIENT_AUTH_ACCEPT", 0, true }, // 0x03
{ "TOCLIENT_ACCEPT_SUDO_MODE", 0, true }, // 0x04
{ "TOCLIENT_DENY_SUDO_MODE", 0, true }, // 0x05
// First byte after command is maximum supported
// serialization version
u8 client_max;
- u8 compression_modes;
+ u16 supp_compr_modes;
u16 min_net_proto_version = 0;
u16 max_net_proto_version;
std::string playerName;
- *pkt >> client_max >> compression_modes >> min_net_proto_version
+ *pkt >> client_max >> supp_compr_modes >> min_net_proto_version
>> max_net_proto_version >> playerName;
u8 our_max = SER_FMT_VER_HIGHEST_READ;
// Use the highest version supported by both
- u8 deployed = std::min(client_max, our_max);
+ u8 depl_serial_v = std::min(client_max, our_max);
// If it's lower than the lowest supported, give up.
- if (deployed < SER_FMT_VER_LOWEST)
- deployed = SER_FMT_VER_INVALID;
+ if (depl_serial_v < SER_FMT_VER_LOWEST)
+ depl_serial_v = SER_FMT_VER_INVALID;
- if (deployed == SER_FMT_VER_INVALID) {
+ if (depl_serial_v == SER_FMT_VER_INVALID) {
actionstream << "Server: A mismatched client tried to connect from "
<< addr_s << std::endl;
infostream<<"Server: Cannot negotiate serialization version with "
return;
}
- client->setPendingSerializationVersion(deployed);
+ client->setPendingSerializationVersion(depl_serial_v);
/*
Read and check network protocol version
NetworkPacket resp_pkt(TOCLIENT_HELLO, 1 + 4
+ legacyPlayerNameCasing.size(), pkt->getPeerId());
- resp_pkt << deployed << auth_mechs << legacyPlayerNameCasing;
+ u16 depl_compress_mode = NETPROTO_COMPRESSION_NONE;
+ resp_pkt << depl_serial_v << depl_compress_mode << net_proto_version
+ << auth_mechs << legacyPlayerNameCasing;
Send(&resp_pkt);