#include "stdafx.h" #include "InputOutputStream.h" #include "PacketListener.h" #include "AuthResultPacket.h" AuthResultPacket::AuthResultPacket() { success = false; } AuthResultPacket::AuthResultPacket(bool success, const wstring& assignedUuid, const wstring& assignedUsername, const wstring& errorMessage, const wstring& skinKey, std::vector skinData) { this->success = success; this->assignedUuid = assignedUuid; this->assignedUsername = assignedUsername; this->errorMessage = errorMessage; this->skinKey = skinKey; this->skinData = std::move(skinData); } void AuthResultPacket::read(DataInputStream *dis) { success = dis->readBoolean(); assignedUuid = readUtf(dis, 64); assignedUsername = readUtf(dis, 64); errorMessage = readUtf(dis, 256); skinKey = readUtf(dis, 256); // Read inline skin data (int length + raw bytes) // Cap to 32KB — a valid 64x64 RGBA skin PNG is ~4KB compressed. int skinSize = dis->readInt(); if (skinSize > 0 && skinSize <= 32768) { skinData.resize(static_cast(skinSize)); for (int i = 0; i < skinSize; i++) skinData[i] = dis->readByte(); } else { skinData.clear(); // Consume declared bytes to keep stream synchronized (same fix as readUtf) if (skinSize > 0) { for (int i = 0; i < skinSize; i++) dis->readByte(); } } } void AuthResultPacket::write(DataOutputStream *dos) { dos->writeBoolean(success); writeUtf(assignedUuid, dos); writeUtf(assignedUsername, dos); writeUtf(errorMessage, dos); writeUtf(skinKey, dos); int skinSize = static_cast(skinData.size()); dos->writeInt(skinSize); for (int i = 0; i < skinSize; i++) dos->writeByte(skinData[i]); } void AuthResultPacket::handle(PacketListener *listener) { listener->handleAuthResult(shared_from_this()); } int AuthResultPacket::getEstimatedSize() { return static_cast(sizeof(bool) + 4 * sizeof(short) + (assignedUuid.length() + assignedUsername.length() + errorMessage.length() + skinKey.length()) * sizeof(wchar_t) + sizeof(int) + skinData.size()); }