void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) { Packet packet; packet.Append(event->packet->data, event->packet->dataLength); packet.IgnoreBytes(sizeof(u8)); // Ignore the message type std::string nickname; packet >> nickname; MacAddress preferred_mac; packet >> preferred_mac; u32 client_version; packet >> client_version; std::string pass; packet >> pass; if (pass != password) { SendWrongPassword(event->peer); return; } if (!IsValidNickname(nickname)) { SendNameCollision(event->peer); return; } if (preferred_mac != NoPreferredMac) { // Verify if the preferred mac is available if (!IsValidMacAddress(preferred_mac)) { SendMacCollision(event->peer); return; } } else { // Assign a MAC address of this client automatically preferred_mac = GenerateMacAddress(); } if (client_version != network_version) { SendVersionMismatch(event->peer); return; } // At this point the client is ready to be added to the room. Member member{}; member.mac_address = preferred_mac; member.nickname = nickname; member.peer = event->peer; { std::lock_guard<std::mutex> lock(member_mutex); members.push_back(std::move(member)); } // Notify everyone that the room information has changed. BroadcastRoomInformation(); SendJoinSuccess(event->peer, preferred_mac); }
void ConnectWindow::OnOk(wxCommandEvent&) { wxString HostAddress = m_server_combo->GetValue(); // We assume that the server is given as : "host:port" so we split based on ":" wxArrayString serverString = wxStringTokenize(HostAddress, _T(":")); if (serverString.GetCount() > 2) { OnLoginDenied(_T("invalid host/port.")); return; } if (serverString.GetCount() == 2) { long port; if (!serverString[1].ToLong(&port)) { OnLoginDenied(_T("Invalid port.")); return; } if (port < 1 || port > 65535) { OnLoginDenied(_T("Port number out of range.\n\nIt must be an integer between 1 and 65535")); return; } sett().SetServer(HostAddress, serverString[0], port); } sett().SetDefaultServer(HostAddress); cfg().Write(_T( "/Server/Autoconnect" ), m_autoconnect_check->IsChecked()); //if autoconnect enabled force saving of pw, actual saving is done in Ui::DoConnect sett().SaveSettings(); ReloadServerList(); if (m_tabs->GetSelection() <= 0) { //normal login sett().SetServerAccountNick(HostAddress, m_nick_text->GetValue()); sett().SetServerAccountSavePass(HostAddress, m_rpass_check->GetValue()); if (m_rpass_check->IsChecked()) { sett().SetServerAccountPass(HostAddress, m_pass_text->GetValue()); } CleanHide(); ServerManager::Instance()->DoConnectToServer(STD_STRING(HostAddress), STD_STRING(m_nick_text->GetValue()), STD_STRING(m_pass_text->GetValue())); return; } sett().SetServerAccountNick(HostAddress, m_regnick_text->GetValue()); if (m_rpass_check->IsChecked()) { sett().SetServerAccountPass(HostAddress, m_regpass1_text->GetValue()); } // register new nick if (!IsValidNickname(STD_STRING(m_regnick_text->GetValue()))) { OnRegistrationDenied(_("The entered nickname contains invalid characters like )? &%.\n Please try again")); return; } if (m_regpass2_text->GetValue() != m_regpass1_text->GetValue() || m_regpass1_text->GetValue().IsEmpty()) { OnRegistrationDenied(_("Registration failed, the reason was:\nPassword / confirmation mismatch (or empty passwort)")); return; } CleanHide(); ServerManager::Instance()->RegisterNewUser(STD_STRING(HostAddress), STD_STRING(m_regnick_text->GetValue()), STD_STRING(m_regpass1_text->GetValue())); }
void ConnectWindow::OnOk(wxCommandEvent& ) { Hide(); wxString HostAddress = m_server_combo->GetValue(); if ( HostAddress.Find( _T(":") ) == wxNOT_FOUND ) { if ( !sett().ServerExists( HostAddress ) ) { HostAddress += wxFormat(_T(":%d") ) % DEFSETT_DEFAULT_SERVER_PORT; } } if ( m_tabs->GetSelection() <= 0 ) { sett().SetServerAccountNick( HostAddress,m_nick_text->GetValue() ); sett().SetServerAccountSavePass( HostAddress, m_rpass_check->GetValue() ); // We assume that the server is given as : "host:port" so we split based on ":" wxArrayString serverString = wxStringTokenize( HostAddress ,_T(":") ); if ( serverString.GetCount() == 2 ) { long port; if ( !serverString[1].ToLong( &port ) ) { wxLogWarning( _T("Invalid port.") ); customMessageBox(SL_MAIN_ICON, _("Invalid port."), _("Invalid port"), wxOK ); return; } if ( port < 1 || port > 65535) { wxLogWarning( _T("port number out of range") ); customMessageBox(SL_MAIN_ICON, _("Port number out of range.\n\nIt must be an integer between 1 and 65535"), _("Invalid port"), wxOK ); return; } sett().SetServer( HostAddress, serverString[0], port ); } if ( serverString.GetCount() > 2 ) { wxLogWarning( _T("invalid host/port.") ); customMessageBox(SL_MAIN_ICON, _("Invalid host/port."), _("Invalid host"), wxOK ); return; } sett().SetAutoConnect( m_autoconnect_check->IsChecked() ); //if autoconnect enabled force saving of pw, actual saving is done in Ui::DoConnect if ( m_autoconnect_check->IsChecked() ) sett().SetServerAccountSavePass( HostAddress, true ); sett().SaveSettings(); ReloadServerList(); m_ui.DoConnect( HostAddress, m_nick_text->GetValue(), m_pass_text->GetValue() ); } else { wxString reason; if ( !IsValidNickname( m_regnick_text->GetValue() ) ) { customMessageBox(SL_MAIN_ICON,_("The entered nickname contains invalid characters like )? &%.\n Please try again") , _("Invalid nickname"), wxOK ); Show(); } else if ( m_regpass2_text->GetValue()!= m_regpass1_text->GetValue() || m_regpass1_text->GetValue().IsEmpty() ) { Show(); wxLogWarning( _T("registration failed, reason: password/confirmation mismatch") ); customMessageBox(SL_MAIN_ICON,_("Registration failed, the reason was:\nPassword / confirmation mismatch (or empty passwort)") , _("Registration failed."), wxOK ); } else if ( m_ui.DoRegister( HostAddress, m_regnick_text->GetValue(), m_regpass1_text->GetValue(),reason ) ) { m_tabs->SetSelection( 0 ); m_nick_text->SetValue(m_regnick_text->GetValue()); m_pass_text->SetValue(m_regpass1_text->GetValue()); Show(); } else { Show(); } } }
void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) { { std::lock_guard lock(member_mutex); if (members.size() >= room_information.member_slots) { SendRoomIsFull(event->peer); return; } } Packet packet; packet.Append(event->packet->data, event->packet->dataLength); packet.IgnoreBytes(sizeof(u8)); // Ignore the message type std::string nickname; packet >> nickname; std::string console_id_hash; packet >> console_id_hash; MacAddress preferred_mac; packet >> preferred_mac; u32 client_version; packet >> client_version; std::string pass; packet >> pass; std::string token; packet >> token; if (pass != password) { SendWrongPassword(event->peer); return; } if (!IsValidNickname(nickname)) { SendNameCollision(event->peer); return; } if (preferred_mac != NoPreferredMac) { // Verify if the preferred mac is available if (!IsValidMacAddress(preferred_mac)) { SendMacCollision(event->peer); return; } } else { // Assign a MAC address of this client automatically preferred_mac = GenerateMacAddress(); } if (!IsValidConsoleId(console_id_hash)) { SendConsoleIdCollision(event->peer); return; } if (client_version != network_version) { SendVersionMismatch(event->peer); return; } // At this point the client is ready to be added to the room. Member member{}; member.mac_address = preferred_mac; member.console_id_hash = console_id_hash; member.nickname = nickname; member.peer = event->peer; std::string uid; { std::lock_guard lock(verify_UID_mutex); uid = verify_UID; } member.user_data = verify_backend->LoadUserData(uid, token); { std::lock_guard lock(ban_list_mutex); // Check username ban if (!member.user_data.username.empty() && std::find(username_ban_list.begin(), username_ban_list.end(), member.user_data.username) != username_ban_list.end()) { SendUserBanned(event->peer); return; } // Check IP ban char ip_raw[256]; enet_address_get_host_ip(&event->peer->address, ip_raw, sizeof(ip_raw) - 1); std::string ip = ip_raw; if (std::find(ip_ban_list.begin(), ip_ban_list.end(), ip) != ip_ban_list.end()) { SendUserBanned(event->peer); return; } } // Notify everyone that the user has joined. SendStatusMessage(IdMemberJoin, member.nickname, member.user_data.username); { std::lock_guard lock(member_mutex); members.push_back(std::move(member)); } // Notify everyone that the room information has changed. BroadcastRoomInformation(); if (HasModPermission(event->peer)) { SendJoinSuccessAsMod(event->peer, preferred_mac); } else { SendJoinSuccess(event->peer, preferred_mac); } }