@@ -758,4 +758,120 @@ void PacketSerializer::parseVersionHelloPayload(const std::vector<uint8_t> &payl
758758 }
759759}
760760
761+ std::vector<uint8_t > PacketSerializer::makeVersionAckPayload (uint8_t agreedVersion, const std::string &serverVersion, const std::string &platform, bool rejected, const std::string &reason)
762+ {
763+ std::vector<uint8_t > data;
764+
765+ // Flags byte: bit 0 = rejected, bit 1 = hasReason
766+ uint8_t flags = 0 ;
767+ if (rejected)
768+ {
769+ flags |= 0x01 ;
770+ }
771+ if (!reason.empty ())
772+ {
773+ flags |= 0x02 ;
774+ }
775+ writeUint8 (data, flags);
776+
777+ // Agreed version
778+ writeUint8 (data, agreedVersion);
779+
780+ // Server version (string with length prefix)
781+ writeUint8 (data, static_cast <uint8_t >(std::min (static_cast <size_t >(255 ), serverVersion.length ())));
782+ data.insert (data.end (), serverVersion.begin (), serverVersion.begin () + std::min (static_cast <size_t >(255 ), serverVersion.length ()));
783+
784+ // Platform (string with length prefix)
785+ writeUint8 (data, static_cast <uint8_t >(std::min (static_cast <size_t >(255 ), platform.length ())));
786+ data.insert (data.end (), platform.begin (), platform.begin () + std::min (static_cast <size_t >(255 ), platform.length ()));
787+
788+ // Reason (if present)
789+ if (!reason.empty ())
790+ {
791+ writeUint8 (data, static_cast <uint8_t >(std::min (static_cast <size_t >(255 ), reason.length ())));
792+ data.insert (data.end (), reason.begin (), reason.begin () + std::min (static_cast <size_t >(255 ), reason.length ()));
793+ }
794+
795+ return data;
796+ }
797+
798+ void PacketSerializer::parseVersionAckPayload (const std::vector<uint8_t > &payload, uint8_t &agreedVersion, std::string &serverVersion, std::string &platform, bool &rejected, std::string &reason)
799+ {
800+ // Minimum size check: flags(1) + agreedVersion(1) + min strings
801+ if (payload.size () < 3 )
802+ {
803+ spdlog::error (" Version ack payload too short" );
804+ return ;
805+ }
806+
807+ size_t offset = 0 ;
808+
809+ // Flags byte
810+ uint8_t flags = readUint8 (payload, offset);
811+ rejected = (flags & 0x01 ) != 0 ;
812+ bool hasReason = (flags & 0x02 ) != 0 ;
813+
814+ // Agreed version
815+ if (offset >= payload.size ())
816+ {
817+ spdlog::error (" Version ack payload buffer overflow reading agreed version" );
818+ return ;
819+ }
820+ agreedVersion = readUint8 (payload, offset);
821+
822+ // Server version (string with length prefix)
823+ if (offset >= payload.size ())
824+ {
825+ spdlog::error (" Version ack payload buffer overflow reading server version length" );
826+ return ;
827+ }
828+ uint8_t serverVersionLen = readUint8 (payload, offset);
829+
830+ if (offset + serverVersionLen > payload.size ())
831+ {
832+ spdlog::error (" Version ack payload buffer overflow reading server version" );
833+ return ;
834+ }
835+
836+ serverVersion = std::string (payload.begin () + offset, payload.begin () + offset + serverVersionLen);
837+ offset += serverVersionLen;
838+
839+ // Platform (string with length prefix)
840+ if (offset >= payload.size ())
841+ {
842+ spdlog::error (" Version ack payload buffer overflow reading platform length" );
843+ return ;
844+ }
845+ uint8_t platformLen = readUint8 (payload, offset);
846+
847+ if (offset + platformLen > payload.size ())
848+ {
849+ spdlog::error (" Version ack payload buffer overflow reading platform" );
850+ return ;
851+ }
852+
853+ platform = std::string (payload.begin () + offset, payload.begin () + offset + platformLen);
854+ offset += platformLen;
855+
856+ // Reason (if present)
857+ reason.clear ();
858+ if (hasReason)
859+ {
860+ if (offset >= payload.size ())
861+ {
862+ spdlog::error (" Version ack payload buffer overflow reading reason length" );
863+ return ;
864+ }
865+ uint8_t reasonLen = readUint8 (payload, offset);
866+
867+ if (offset + reasonLen > payload.size ())
868+ {
869+ spdlog::error (" Version ack payload buffer overflow reading reason" );
870+ return ;
871+ }
872+
873+ reason = std::string (payload.begin () + offset, payload.begin () + offset + reasonLen);
874+ }
875+ }
876+
761877} // namespace bitchat
0 commit comments