diff options
| author | Shauren <shauren.trinity@gmail.com> | 2016-07-10 00:33:43 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2016-07-10 00:37:33 +0200 |
| commit | 0d9136f7648e623d6b15d67e2d4d83e91d3603da (patch) | |
| tree | e2b8a2daf702b21a5e9670d9705e7d18fbd3b094 /src/server/game/Server | |
| parent | ef344664e3ee1bef048cf197d416e83b95c74e30 (diff) | |
| parent | a78aa3cf4ef3f33903ec9f06d8fdc46e81c51cb3 (diff) | |
Merge branch '6.x' of https://github.com/TrinityCore/TrinityCore into legion
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/AuthenticationPackets.cpp | 26 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/AuthenticationPackets.h | 57 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/InstancePackets.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/InstancePackets.h | 9 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 45 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.h | 4 |
7 files changed, 119 insertions, 31 deletions
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 69cb22659cd..52fb54c725a 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -18,6 +18,32 @@ #include "AuthenticationPackets.h" #include "HmacHash.h" +bool WorldPackets::Auth::EarlyProcessClientPacket::ReadNoThrow() +{ + try + { + Read(); + return true; + } + catch (ByteBufferPositionException const& ex) + { + } + + return false; +} + +void WorldPackets::Auth::Ping::Read() +{ + _worldPacket >> Serial; + _worldPacket >> Latency; +} + +const WorldPacket* WorldPackets::Auth::Pong::Write() +{ + _worldPacket << uint32(Serial); + return &_worldPacket; +} + WorldPacket const* WorldPackets::Auth::AuthChallenge::Write() { _worldPacket.append(DosChallenge, 8); diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index f17e079f0fb..ef29cfae0d1 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -31,6 +31,36 @@ namespace WorldPackets { namespace Auth { + class EarlyProcessClientPacket : public ClientPacket + { + public: + EarlyProcessClientPacket(OpcodeClient opcode, WorldPacket&& packet) : ClientPacket(opcode, std::move(packet)) { } + + bool ReadNoThrow(); + }; + + class Ping final : public EarlyProcessClientPacket + { + public: + Ping(WorldPacket&& packet) : EarlyProcessClientPacket(CMSG_PING, std::move(packet)) { } + + uint32 Serial = 0; + uint32 Latency = 0; + + private: + void Read(); + }; + + class Pong final : public ServerPacket + { + public: + Pong(uint32 serial) : ServerPacket(SMSG_PONG, 4), Serial(serial) { } + + WorldPacket const* Write() override; + + uint32 Serial = 0; + }; + class AuthChallenge final : public ServerPacket { public: @@ -43,19 +73,17 @@ namespace WorldPackets uint8 DosZeroBits = 0; }; - class AuthSession final : public ClientPacket + class AuthSession final : public EarlyProcessClientPacket { public: static uint32 const DigestLength = 24; - AuthSession(WorldPacket&& packet) : ClientPacket(CMSG_AUTH_SESSION, std::move(packet)) + AuthSession(WorldPacket&& packet) : EarlyProcessClientPacket(CMSG_AUTH_SESSION, std::move(packet)) { LocalChallenge.fill(0); Digest.fill(0); } - void Read() override; - uint16 Build = 0; int8 BuildType = 0; uint32 RegionID = 0; @@ -66,6 +94,9 @@ namespace WorldPackets uint64 DosResponse = 0; std::string RealmJoinTicket; bool UseIPv6 = false; + + private: + void Read() override; }; class AuthResponse final : public ServerPacket @@ -172,23 +203,24 @@ namespace WorldPackets BigNumber iqmp; }; - class AuthContinuedSession final : public ClientPacket + class AuthContinuedSession final : public EarlyProcessClientPacket { public: static uint32 const DigestLength = 24; - AuthContinuedSession(WorldPacket&& packet) : ClientPacket(CMSG_AUTH_CONTINUED_SESSION, std::move(packet)) + AuthContinuedSession(WorldPacket&& packet) : EarlyProcessClientPacket(CMSG_AUTH_CONTINUED_SESSION, std::move(packet)) { LocalChallenge.fill(0); Digest.fill(0); } - void Read() override; - uint64 DosResponse = 0; uint64 Key = 0; std::array<uint8, 16> LocalChallenge; std::array<uint8, DigestLength> Digest; + + private: + void Read() override; }; class ResumeComms final : public ServerPacket @@ -199,15 +231,16 @@ namespace WorldPackets WorldPacket const* Write() override { return &_worldPacket; } }; - class ConnectToFailed final : public ClientPacket + class ConnectToFailed final : public EarlyProcessClientPacket { public: - ConnectToFailed(WorldPacket&& packet) : ClientPacket(CMSG_CONNECT_TO_FAILED, std::move(packet)) { } - - void Read() override; + ConnectToFailed(WorldPacket&& packet) : EarlyProcessClientPacket(CMSG_CONNECT_TO_FAILED, std::move(packet)) { } ConnectToSerial Serial = ConnectToSerial::None; uint8 Con = 0; + + private: + void Read() override; }; class EnableEncryption final : public ServerPacket diff --git a/src/server/game/Server/Packets/InstancePackets.cpp b/src/server/game/Server/Packets/InstancePackets.cpp index 959f39eccbe..dfa490135b0 100644 --- a/src/server/game/Server/Packets/InstancePackets.cpp +++ b/src/server/game/Server/Packets/InstancePackets.cpp @@ -157,3 +157,10 @@ WorldPacket const* WorldPackets::Instance::InstanceEncounterGainCombatResurrecti return &_worldPacket; } + +WorldPacket const* WorldPackets::Instance::BossKillCredit::Write() +{ + _worldPacket << uint32(DungeonEncounterID); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/InstancePackets.h b/src/server/game/Server/Packets/InstancePackets.h index 8895a8aaf82..d9e957aa470 100644 --- a/src/server/game/Server/Packets/InstancePackets.h +++ b/src/server/game/Server/Packets/InstancePackets.h @@ -235,6 +235,15 @@ namespace WorldPackets int32 InCombatResCount = 0; uint32 CombatResChargeRecovery = 0; }; + + class BossKillCredit final : public ServerPacket + { + public: + BossKillCredit() : ServerPacket(SMSG_BOSS_KILL_CREDIT, 4) { } + + WorldPacket const* Write() override; + uint32 DungeonEncounterID = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 3dbd9a60ad9..bae5da71a9e 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -939,7 +939,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_WON, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BONUS_ROLL_EMPTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BOSS_KILL_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BOSS_KILL_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_SUCCEEDED, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 12a62619798..36977542e36 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -368,8 +368,18 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() switch (opcode) { case CMSG_PING: + { LogOpcodeText(opcode, sessionGuard); - return HandlePing(packet) ? ReadDataHandlerResult::Ok : ReadDataHandlerResult::Error; + WorldPackets::Auth::Ping ping(std::move(packet)); + if (!ping.ReadNoThrow()) + { + TC_LOG_ERROR("network", "WorldSocket::ReadDataHandler(): client %s sent malformed CMSG_PING", GetRemoteIpAddress().to_string().c_str()); + return ReadDataHandlerResult::Error; + } + if (!HandlePing(ping)) + return ReadDataHandlerResult::Error; + break; + } case CMSG_AUTH_SESSION: { LogOpcodeText(opcode, sessionGuard); @@ -382,7 +392,11 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() } std::shared_ptr<WorldPackets::Auth::AuthSession> authSession = std::make_shared<WorldPackets::Auth::AuthSession>(std::move(packet)); - authSession->Read(); + if (!authSession->ReadNoThrow()) + { + TC_LOG_ERROR("network", "WorldSocket::ReadDataHandler(): client %s sent malformed CMSG_AUTH_SESSION", GetRemoteIpAddress().to_string().c_str()); + return ReadDataHandlerResult::Error; + } HandleAuthSession(authSession); return ReadDataHandlerResult::WaitingForQuery; } @@ -398,7 +412,11 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() } std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession = std::make_shared<WorldPackets::Auth::AuthContinuedSession>(std::move(packet)); - authSession->Read(); + if (!authSession->ReadNoThrow()) + { + TC_LOG_ERROR("network", "WorldSocket::ReadDataHandler(): client %s sent malformed CMSG_AUTH_CONTINUED_SESSION", GetRemoteIpAddress().to_string().c_str()); + return ReadDataHandlerResult::Error; + } HandleAuthContinuedSession(authSession); return ReadDataHandlerResult::WaitingForQuery; } @@ -419,7 +437,11 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() LogOpcodeText(opcode, sessionGuard); WorldPackets::Auth::ConnectToFailed connectToFailed(std::move(packet)); - connectToFailed.Read(); + if (!connectToFailed.ReadNoThrow()) + { + TC_LOG_ERROR("network", "WorldSocket::ReadDataHandler(): client %s sent malformed CMSG_CONNECT_TO_FAILED", GetRemoteIpAddress().to_string().c_str()); + return ReadDataHandlerResult::Error; + } HandleConnectToFailed(connectToFailed); break; } @@ -924,17 +946,10 @@ void WorldSocket::SendAuthResponseError(uint32 code) SendPacketAndLogOpcode(*response.Write()); } -bool WorldSocket::HandlePing(WorldPacket& recvPacket) +bool WorldSocket::HandlePing(WorldPackets::Auth::Ping& ping) { using namespace std::chrono; - uint32 ping; - uint32 latency; - - // Get the ping packet content - recvPacket >> ping; - recvPacket >> latency; - if (_LastPingTime == steady_clock::time_point()) { _LastPingTime = steady_clock::now(); @@ -975,7 +990,7 @@ bool WorldSocket::HandlePing(WorldPacket& recvPacket) if (_worldSession) { - _worldSession->SetLatency(latency); + _worldSession->SetLatency(ping.Latency); _worldSession->ResetClientTimeDelay(); } else @@ -985,8 +1000,6 @@ bool WorldSocket::HandlePing(WorldPacket& recvPacket) } } - WorldPacket packet(SMSG_PONG, 4); - packet << ping; - SendPacketAndLogOpcode(packet); + SendPacketAndLogOpcode(*WorldPackets::Auth::Pong(ping.Serial).Write()); return true; } diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 44f253d0864..0b78e36a3f5 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -41,6 +41,7 @@ namespace WorldPackets class AuthSession; class AuthContinuedSession; class ConnectToFailed; + class Ping; } } @@ -118,10 +119,9 @@ private: void HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession, PreparedQueryResult result); void LoadSessionPermissionsCallback(PreparedQueryResult result); void HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& connectToFailed); + bool HandlePing(WorldPackets::Auth::Ping& ping); void HandleEnableEncryptionAck(); - bool HandlePing(WorldPacket& recvPacket); - ConnectionType _type; uint64 _key; |
