multiplayer: check nickname regex server side
This commit is contained in:
parent
e040bc9355
commit
3c589f473f
|
@ -12,8 +12,8 @@ const ConnectionError USERNAME_NOT_VALID(
|
||||||
QT_TR_NOOP("Username is not valid. Must be 4 to 20 alphanumeric characters."));
|
QT_TR_NOOP("Username is not valid. Must be 4 to 20 alphanumeric characters."));
|
||||||
const ConnectionError ROOMNAME_NOT_VALID(
|
const ConnectionError ROOMNAME_NOT_VALID(
|
||||||
QT_TR_NOOP("Room name is not valid. Must be 4 to 20 alphanumeric characters."));
|
QT_TR_NOOP("Room name is not valid. Must be 4 to 20 alphanumeric characters."));
|
||||||
const ConnectionError USERNAME_IN_USE(
|
const ConnectionError USERNAME_NOT_VALID_SERVER(
|
||||||
QT_TR_NOOP("Username is already in use. Please choose another."));
|
QT_TR_NOOP("Username is already in use or not valid. Please choose another."));
|
||||||
const ConnectionError IP_ADDRESS_NOT_VALID(QT_TR_NOOP("IP is not a valid IPv4 address."));
|
const ConnectionError IP_ADDRESS_NOT_VALID(QT_TR_NOOP("IP is not a valid IPv4 address."));
|
||||||
const ConnectionError PORT_NOT_VALID(QT_TR_NOOP("Port must be a number between 0 to 65535."));
|
const ConnectionError PORT_NOT_VALID(QT_TR_NOOP("Port must be a number between 0 to 65535."));
|
||||||
const ConnectionError NO_INTERNET(
|
const ConnectionError NO_INTERNET(
|
||||||
|
|
|
@ -20,9 +20,11 @@ private:
|
||||||
std::string err;
|
std::string err;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// When the nickname is considered invalid by the client
|
||||||
extern const ConnectionError USERNAME_NOT_VALID;
|
extern const ConnectionError USERNAME_NOT_VALID;
|
||||||
extern const ConnectionError ROOMNAME_NOT_VALID;
|
extern const ConnectionError ROOMNAME_NOT_VALID;
|
||||||
extern const ConnectionError USERNAME_IN_USE;
|
/// When the nickname is considered invalid by the room server
|
||||||
|
extern const ConnectionError USERNAME_NOT_VALID_SERVER;
|
||||||
extern const ConnectionError IP_ADDRESS_NOT_VALID;
|
extern const ConnectionError IP_ADDRESS_NOT_VALID;
|
||||||
extern const ConnectionError PORT_NOT_VALID;
|
extern const ConnectionError PORT_NOT_VALID;
|
||||||
extern const ConnectionError NO_INTERNET;
|
extern const ConnectionError NO_INTERNET;
|
||||||
|
|
|
@ -97,7 +97,7 @@ void MultiplayerState::OnNetworkStateChanged(const Network::RoomMember::State& s
|
||||||
NetworkMessage::ShowError(NetworkMessage::UNABLE_TO_CONNECT);
|
NetworkMessage::ShowError(NetworkMessage::UNABLE_TO_CONNECT);
|
||||||
break;
|
break;
|
||||||
case Network::RoomMember::State::NameCollision:
|
case Network::RoomMember::State::NameCollision:
|
||||||
NetworkMessage::ShowError(NetworkMessage::USERNAME_IN_USE);
|
NetworkMessage::ShowError(NetworkMessage::USERNAME_NOT_VALID_SERVER);
|
||||||
break;
|
break;
|
||||||
case Network::RoomMember::State::MacCollision:
|
case Network::RoomMember::State::MacCollision:
|
||||||
NetworkMessage::ShowError(NetworkMessage::MAC_COLLISION);
|
NetworkMessage::ShowError(NetworkMessage::MAC_COLLISION);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
#include <regex>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
@ -263,8 +264,12 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Room::RoomImpl::IsValidNickname(const std::string& nickname) const {
|
bool Room::RoomImpl::IsValidNickname(const std::string& nickname) const {
|
||||||
// A nickname is valid if it is not already taken by anybody else in the room.
|
// A nickname is valid if it matches the regex and is not already taken by anybody else in the
|
||||||
// TODO(B3N30): Check for empty names, spaces, etc.
|
// room.
|
||||||
|
const std::regex nickname_regex("^[ a-zA-Z0-9._-]{4,20}$");
|
||||||
|
if (!std::regex_match(nickname, nickname_regex))
|
||||||
|
return false;
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(member_mutex);
|
std::lock_guard<std::mutex> lock(member_mutex);
|
||||||
return std::all_of(members.begin(), members.end(),
|
return std::all_of(members.begin(), members.end(),
|
||||||
[&nickname](const auto& member) { return member.nickname != nickname; });
|
[&nickname](const auto& member) { return member.nickname != nickname; });
|
||||||
|
|
Reference in New Issue