예제 #1
0
파일: room.cpp 프로젝트: namkazt/citra
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);
}
예제 #2
0
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()));
}
예제 #3
0
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();
        }

    }
}
예제 #4
0
파일: room.cpp 프로젝트: citra-emu/citra
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);
    }
}