From 186982b458fd1d11926b7116169df51b5547c0fc Mon Sep 17 00:00:00 2001 From: Matthew Toro Date: Sat, 28 Mar 2026 00:07:18 -0400 Subject: [PATCH] feat: add basic authentication packet handling. --- Minecraft.World/AuthPackets.cpp | 47 +++++++++++++++++++ Minecraft.World/AuthPackets.h | 36 ++++++++++++++ Minecraft.World/Packet.cpp | 1 + Minecraft.World/PacketListener.cpp | 5 ++ Minecraft.World/PacketListener.h | 4 ++ Minecraft.World/cmake/sources/Common.cmake | 2 + .../net.minecraft.network.packet.h | 1 + 7 files changed, 96 insertions(+) create mode 100644 Minecraft.World/AuthPackets.cpp create mode 100644 Minecraft.World/AuthPackets.h diff --git a/Minecraft.World/AuthPackets.cpp b/Minecraft.World/AuthPackets.cpp new file mode 100644 index 000000000..4bd2bb953 --- /dev/null +++ b/Minecraft.World/AuthPackets.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" +#include "InputOutputStream.h" +#include "PacketListener.h" +#include "AuthPackets.h" + +AuthPacket::AuthPacket(AuthStage stage, vector> fields) + : stage(stage), fields(std::move(fields)) +{ +} + +void AuthPacket::read(DataInputStream *dis) +{ + stage = static_cast(dis->readByte()); + short count = dis->readShort(); + fields.clear(); + fields.reserve(count); + for (short i = 0; i < count; i++) + { + wstring key = readUtf(dis, 256); + wstring value = readUtf(dis, 4096); + fields.emplace_back(std::move(key), std::move(value)); + } +} + +void AuthPacket::write(DataOutputStream *dos) +{ + dos->writeByte(static_cast(stage)); + dos->writeShort(static_cast(fields.size())); + for (const auto &field : fields) + { + writeUtf(field.first, dos); + writeUtf(field.second, dos); + } +} + +void AuthPacket::handle(PacketListener *listener) +{ + listener->handleAuth(shared_from_this()); +} + +int AuthPacket::getEstimatedSize() +{ + int size = 1 + 2; + for (const auto &field : fields) + size += 4 + static_cast((field.first.length() + field.second.length()) * sizeof(wchar_t)); + return size; +} diff --git a/Minecraft.World/AuthPackets.h b/Minecraft.World/AuthPackets.h new file mode 100644 index 000000000..6c73067f1 --- /dev/null +++ b/Minecraft.World/AuthPackets.h @@ -0,0 +1,36 @@ +#pragma once +using namespace std; + +#include "Packet.h" + +enum class AuthStage : uint8_t +{ + ANNOUNCE_VERSION, + DECLARE_SCHEME, + ACCEPT_SCHEME, + SCHEME_SETTINGS, + BEGIN_AUTH, + AUTH_DATA, + AUTH_DONE, + ASSIGN_IDENTITY, + CONFIRM_IDENTITY, + AUTH_SUCCESS, + AUTH_FAILURE +}; + +class AuthPacket : public Packet, public enable_shared_from_this +{ +public: + AuthStage stage; + vector> fields; + + AuthPacket(AuthStage stage = AuthStage::ANNOUNCE_VERSION, vector> fields = {}); + + virtual void read(DataInputStream *dis); + virtual void write(DataOutputStream *dos); + virtual void handle(PacketListener *listener); + virtual int getEstimatedSize(); + + static shared_ptr create() { return std::make_shared(); } + virtual int getId() { return 72; } +}; diff --git a/Minecraft.World/Packet.cpp b/Minecraft.World/Packet.cpp index 05bf932dc..325976c63 100644 --- a/Minecraft.World/Packet.cpp +++ b/Minecraft.World/Packet.cpp @@ -150,6 +150,7 @@ void Packet::staticCtor() //map(253, true, false, ServerAuthDataPacket.class); map(254, false, true, false, false, typeid(GetInfoPacket), GetInfoPacket::create); // TODO New for 1.8.2 - Needs sendToAny? map(255, true, true, true, false, typeid(DisconnectPacket), DisconnectPacket::create); + map(72, true, true, true, false, typeid(AuthPacket), AuthPacket::create); } IllegalArgumentException::IllegalArgumentException(const wstring& information) diff --git a/Minecraft.World/PacketListener.cpp b/Minecraft.World/PacketListener.cpp index 09fbb0525..490922c79 100644 --- a/Minecraft.World/PacketListener.cpp +++ b/Minecraft.World/PacketListener.cpp @@ -491,3 +491,8 @@ void PacketListener::handleGameCommand(shared_ptr packet) { onUnhandledPacket( (shared_ptr ) packet); } + +void PacketListener::handleAuth(shared_ptr packet) +{ + onUnhandledPacket( (shared_ptr ) packet); +} diff --git a/Minecraft.World/PacketListener.h b/Minecraft.World/PacketListener.h index f63b6bc7f..9f5b1b9de 100644 --- a/Minecraft.World/PacketListener.h +++ b/Minecraft.World/PacketListener.h @@ -111,6 +111,7 @@ class KickPlayerPacket; class AdditionalModelPartsPacket; class XZPacket; class GameCommandPacket; +class AuthPacket; class PacketListener { @@ -227,4 +228,7 @@ public: virtual void handleKickPlayer(shared_ptr packet); virtual void handleXZ(shared_ptr packet); virtual void handleGameCommand(shared_ptr packet); + + // MCConsoles Auth + virtual void handleAuth(shared_ptr packet); }; diff --git a/Minecraft.World/cmake/sources/Common.cmake b/Minecraft.World/cmake/sources/Common.cmake index 8a4d68330..544d1e571 100644 --- a/Minecraft.World/cmake/sources/Common.cmake +++ b/Minecraft.World/cmake/sources/Common.cmake @@ -259,6 +259,8 @@ set(_MINECRAFT_WORLD_COMMON_NET_MINECRAFT_NETWORK_PACKET "${CMAKE_CURRENT_SOURCE_DIR}/AddPlayerPacket.h" "${CMAKE_CURRENT_SOURCE_DIR}/AnimatePacket.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/AnimatePacket.h" + "${CMAKE_CURRENT_SOURCE_DIR}/AuthPackets.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/AuthPackets.h" "${CMAKE_CURRENT_SOURCE_DIR}/AwardStatPacket.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/AwardStatPacket.h" "${CMAKE_CURRENT_SOURCE_DIR}/BlockRegionUpdatePacket.cpp" diff --git a/Minecraft.World/net.minecraft.network.packet.h b/Minecraft.World/net.minecraft.network.packet.h index c1d52d147..2981508e3 100644 --- a/Minecraft.World/net.minecraft.network.packet.h +++ b/Minecraft.World/net.minecraft.network.packet.h @@ -108,4 +108,5 @@ #include "KickPlayerPacket.h" #include "XZPacket.h" #include "GameCommandPacket.h" +#include "AuthPackets.h"