Libnetwork: add password protected rooms, guid, and error fixes (#3068)

* Network: Add password protected roomsand GUID

* Limit chat message size
This commit is contained in:
B3n30 2017-11-19 19:52:37 +01:00 committed by GitHub
parent 4071da5012
commit c0a7afaa5c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 139 additions and 33 deletions

View file

@ -74,10 +74,12 @@ public:
* nickname and preferred mac.
* @params nickname The desired nickname.
* @params preferred_mac The preferred MAC address to use in the room, the NoPreferredMac tells
* @params password The password for the room
* the server to assign one for us.
*/
void SendJoinRequest(const std::string& nickname,
const MacAddress& preferred_mac = NoPreferredMac);
const MacAddress& preferred_mac = NoPreferredMac,
const std::string& password = "");
/**
* Extracts a MAC Address from a received ENet packet.
@ -161,6 +163,9 @@ void RoomMember::RoomMemberImpl::MemberLoop() {
case IdVersionMismatch:
SetState(State::WrongVersion);
break;
case IdWrongPassword:
SetState(State::WrongPassword);
break;
case IdCloseRoom:
SetState(State::LostConnection);
break;
@ -196,12 +201,14 @@ void RoomMember::RoomMemberImpl::Send(Packet&& packet) {
}
void RoomMember::RoomMemberImpl::SendJoinRequest(const std::string& nickname,
const MacAddress& preferred_mac) {
const MacAddress& preferred_mac,
const std::string& password) {
Packet packet;
packet << static_cast<u8>(IdJoinRequest);
packet << nickname;
packet << preferred_mac;
packet << network_version;
packet << password;
Send(std::move(packet));
}
@ -215,8 +222,13 @@ void RoomMember::RoomMemberImpl::HandleRoomInformationPacket(const ENetEvent* ev
RoomInformation info{};
packet >> info.name;
packet >> info.member_slots;
packet >> info.uid;
packet >> info.port;
packet >> info.preferred_game;
room_information.name = info.name;
room_information.member_slots = info.member_slots;
room_information.port = info.port;
room_information.preferred_game = info.preferred_game;
u32 num_members;
packet >> num_members;
@ -260,10 +272,6 @@ void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) {
packet >> wifi_packet.channel;
packet >> wifi_packet.transmitter_address;
packet >> wifi_packet.destination_address;
u32 data_length;
packet >> data_length;
packet >> wifi_packet.data;
Invoke<WifiPacket>(wifi_packet);
@ -348,14 +356,13 @@ RoomMember::CallbackHandle<T> RoomMember::RoomMemberImpl::Bind(
}
// RoomMember
RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} {
room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0);
ASSERT_MSG(room_member_impl->client != nullptr, "Could not create client");
}
RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} {}
RoomMember::~RoomMember() {
ASSERT_MSG(!IsConnected(), "RoomMember is being destroyed while connected");
enet_host_destroy(room_member_impl->client);
if (room_member_impl->loop_thread) {
Leave();
}
}
RoomMember::State RoomMember::GetState() const {
@ -380,18 +387,22 @@ RoomInformation RoomMember::GetRoomInformation() const {
}
void RoomMember::Join(const std::string& nick, const char* server_addr, u16 server_port,
u16 client_port, const MacAddress& preferred_mac) {
u16 client_port, const MacAddress& preferred_mac,
const std::string& password) {
// If the member is connected, kill the connection first
if (room_member_impl->loop_thread && room_member_impl->loop_thread->joinable()) {
room_member_impl->SetState(State::Error);
room_member_impl->loop_thread->join();
room_member_impl->loop_thread.reset();
Leave();
}
// If the thread isn't running but the ptr still exists, reset it
else if (room_member_impl->loop_thread) {
room_member_impl->loop_thread.reset();
}
if (!room_member_impl->client) {
room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0);
ASSERT_MSG(room_member_impl->client != nullptr, "Could not create client");
}
ENetAddress address{};
enet_address_set_host(&address, server_addr);
address.port = server_port;
@ -409,9 +420,10 @@ void RoomMember::Join(const std::string& nick, const char* server_addr, u16 serv
room_member_impl->nickname = nick;
room_member_impl->SetState(State::Joining);
room_member_impl->StartLoop();
room_member_impl->SendJoinRequest(nick, preferred_mac);
room_member_impl->SendJoinRequest(nick, preferred_mac, password);
SendGameInfo(room_member_impl->current_game_info);
} else {
enet_peer_disconnect(room_member_impl->server, 0);
room_member_impl->SetState(State::CouldNotConnect);
}
}
@ -480,6 +492,9 @@ void RoomMember::Leave() {
room_member_impl->SetState(State::Idle);
room_member_impl->loop_thread->join();
room_member_impl->loop_thread.reset();
enet_host_destroy(room_member_impl->client);
room_member_impl->client = nullptr;
}
template void RoomMember::Unbind(CallbackHandle<WifiPacket>);