aboutsummaryrefslogtreecommitdiff
path: root/src/server/authserver/Server/BattlenetPackets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/authserver/Server/BattlenetPackets.cpp')
-rw-r--r--src/server/authserver/Server/BattlenetPackets.cpp170
1 files changed, 170 insertions, 0 deletions
diff --git a/src/server/authserver/Server/BattlenetPackets.cpp b/src/server/authserver/Server/BattlenetPackets.cpp
new file mode 100644
index 00000000000..37040fa6d6e
--- /dev/null
+++ b/src/server/authserver/Server/BattlenetPackets.cpp
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Common.h"
+#include "BattlenetBitStream.h"
+#include "BattlenetPackets.h"
+#include "Util.h"
+#include <limits>
+#include <sstream>
+
+std::string Battlenet::PacketHeader::ToString() const
+{
+ std::ostringstream stream;
+ stream << "Battlenet::PacketHeader opcode: " << Opcode << ", channel: " << Channel;
+ return stream.str();
+}
+
+Battlenet::ServerPacket::ServerPacket(PacketHeader const& header) : Packet(header, *new BitStream())
+{
+ _stream.Write(header.Opcode, 6);
+ _stream.Write(1, 1);
+ _stream.Write(header.Channel, 4);
+}
+
+Battlenet::ServerPacket::~ServerPacket()
+{
+ delete &_stream;
+}
+
+void Battlenet::AuthChallenge::Read()
+{
+ Program = _stream.ReadFourCC();
+ Platform = _stream.ReadFourCC();
+ Locale = _stream.ReadFourCC();
+
+ Components.resize(_stream.Read<uint32>(6));
+ for (size_t i = 0; i < Components.size(); ++i)
+ {
+ Component& component = Components[i];
+ component.Program = _stream.ReadFourCC();
+ component.Platform = _stream.ReadFourCC();
+ component.Build = _stream.Read<uint32>(32);
+ }
+
+ if (_stream.Read<uint32>(1))
+ Login = _stream.ReadString(9, 3);
+}
+
+std::string Battlenet::AuthChallenge::ToString() const
+{
+ std::ostringstream stream;
+ stream << "Battlenet::AuthChallenge Program: " << Program << ", Platform: " << Platform << ", Locale: " << Locale;
+ for (uint32 i = 0; i < Components.size(); ++i)
+ stream << std::endl << "Battlenet::AuthChallenge::Component Program: " << Components[i].Program << ", Platform: " << Components[i].Platform << ", Build: " << Components[i].Build;
+
+ if (!Login.empty())
+ stream << std::endl << "Battlenet::AuthChallenge Login: " << Login;
+
+ return stream.str();
+}
+
+void Battlenet::ProofRequest::Write()
+{
+ _stream.Write(Modules.size(), 3);
+ for (size_t i = 0; i < Modules.size(); ++i)
+ {
+ ModuleInfo& info = Modules[i];
+ _stream.WriteBytes(info.AuthString.c_str(), 4);
+ _stream.WriteFourCC(info.Locale.c_str());
+ _stream.WriteBytes(info.ModuleId, 32);
+ _stream.Write(info.BlobSize, 10);
+ _stream.WriteBytes(info.Blob, info.BlobSize);
+ }
+}
+
+Battlenet::ProofResponse::~ProofResponse()
+{
+ for (size_t i = 0; i < Modules.size(); ++i)
+ delete[] Modules[i].Data;
+}
+
+void Battlenet::ProofResponse::Read()
+{
+ Modules.resize(_stream.Read<uint32>(3));
+ for (size_t i = 0; i < Modules.size(); ++i)
+ {
+ ModuleData& data = Modules[i];
+ data.Size = _stream.Read<uint32>(10);
+ data.Data = _stream.ReadBytes(data.Size);
+ }
+}
+
+std::string Battlenet::ProofResponse::ToString() const
+{
+ std::ostringstream stream;
+ stream << "Battlenet::ProofResponse Modules " << Modules.size();
+ for (size_t i = 0; i < Modules.size(); ++i)
+ {
+ std::string hexStr = ByteArrayToHexStr(Modules[i].Data, Modules[i].Size);
+ stream << std::endl << "Battlenet::ProofResponse::ModuleData Size: " << Modules[i].Size << ", Data: " << hexStr;
+ }
+
+ return stream.str();
+}
+
+void Battlenet::AuthComplete::Write()
+{
+ _stream.Write(AuthResult != 0, 1);
+ if (AuthResult == 0)
+ {
+ _stream.Write(Modules.size(), 3);
+ for (size_t i = 0; i < Modules.size(); ++i)
+ {
+ ModuleInfo& info = Modules[i];
+ _stream.WriteBytes(info.AuthString.c_str(), 4);
+ _stream.WriteFourCC(info.Locale.c_str());
+ _stream.WriteBytes(info.ModuleId, 32);
+ _stream.Write(info.BlobSize, 10);
+ _stream.WriteBytes(info.Blob, info.BlobSize);
+ }
+
+ _stream.Write(PingTimeout + std::numeric_limits<int32>::min(), 32);
+ _stream.Write(1, 1);
+ // if written == 1
+ {
+ _stream.Write(1, 1);
+ // if written == 1
+ {
+ _stream.Write(Threshold, 32);
+ _stream.Write(Rate, 32);
+ }
+ }
+
+ // todo more
+ }
+ else
+ {
+ _stream.Write(!Modules.empty(), 1);
+ if (!Modules.empty())
+ {
+ ModuleInfo& info = Modules[0];
+ _stream.WriteBytes(info.AuthString.c_str(), 4);
+ _stream.WriteFourCC(info.Locale.c_str());
+ _stream.WriteBytes(info.ModuleId, 32);
+ _stream.Write(info.BlobSize, 10);
+ _stream.WriteBytes(info.Blob, info.BlobSize);
+ }
+
+ _stream.Write(ErrorType, 2);
+ if (ErrorType == 1)
+ {
+ _stream.Write(AuthResult, 16);
+ _stream.Write(0, 32);
+ }
+ }
+}