aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-07-10 00:33:43 +0200
committerShauren <shauren.trinity@gmail.com>2016-07-10 00:37:33 +0200
commit0d9136f7648e623d6b15d67e2d4d83e91d3603da (patch)
treee2b8a2daf702b21a5e9670d9705e7d18fbd3b094 /src/server/game/Server
parentef344664e3ee1bef048cf197d416e83b95c74e30 (diff)
parenta78aa3cf4ef3f33903ec9f06d8fdc46e81c51cb3 (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.cpp26
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h57
-rw-r--r--src/server/game/Server/Packets/InstancePackets.cpp7
-rw-r--r--src/server/game/Server/Packets/InstancePackets.h9
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/WorldSocket.cpp45
-rw-r--r--src/server/game/Server/WorldSocket.h4
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;