diff --git a/lib/steam-condenser/servers/packets/a2s_info_packet.rb b/lib/steam-condenser/servers/packets/a2s_info_packet.rb index 1812242..8e9e0e7 100644 --- a/lib/steam-condenser/servers/packets/a2s_info_packet.rb +++ b/lib/steam-condenser/servers/packets/a2s_info_packet.rb @@ -1,9 +1,9 @@ # This code is free software; you can redistribute it and/or modify it under # the terms of the new BSD License. # -# Copyright (c) 2008-2012, Sebastian Staudt +# Copyright (c) 2008-2020, Sebastian Staudt -require 'steam-condenser/servers/packets/base_packet' +require 'steam-condenser/servers/packets/query_packet' module SteamCondenser::Servers::Packets @@ -16,7 +16,7 @@ module SteamCondenser::Servers::Packets # @see GameServer#update_server_info class A2S_INFO_Packet - include BasePacket + include QueryPacket # Creates a new A2S_INFO request object def initialize diff --git a/lib/steam-condenser/servers/packets/a2s_player_packet.rb b/lib/steam-condenser/servers/packets/a2s_player_packet.rb index 6fd0dd8..9dec058 100644 --- a/lib/steam-condenser/servers/packets/a2s_player_packet.rb +++ b/lib/steam-condenser/servers/packets/a2s_player_packet.rb @@ -1,10 +1,9 @@ # This code is free software; you can redistribute it and/or modify it under # the terms of the new BSD License. # -# Copyright (c) 2008-2012, Sebastian Staudt +# Copyright (c) 2008-2020, Sebastian Staudt require 'steam-condenser/servers/packets/base_packet' -require 'steam-condenser/servers/packets/request_with_challenge' module SteamCondenser::Servers::Packets @@ -20,14 +19,13 @@ module SteamCondenser::Servers::Packets class A2S_PLAYER_Packet include BasePacket - include RequestWithChallenge # Creates a new A2S_PLAYER request object including the challenge number # # @param [Numeric] challenge_number The challenge number received from the # server def initialize(challenge_number = -1) - super A2S_PLAYER_HEADER, challenge_number + super A2S_PLAYER_HEADER, [challenge_number.to_i].pack('l') end end diff --git a/lib/steam-condenser/servers/packets/a2s_rules_packet.rb b/lib/steam-condenser/servers/packets/a2s_rules_packet.rb index 671506b..c191ebe 100644 --- a/lib/steam-condenser/servers/packets/a2s_rules_packet.rb +++ b/lib/steam-condenser/servers/packets/a2s_rules_packet.rb @@ -1,10 +1,9 @@ # This code is free software; you can redistribute it and/or modify it under # the terms of the new BSD License. # -# Copyright (c) 2008-2012, Sebastian Staudt +# Copyright (c) 2008-2020, Sebastian Staudt -require 'steam-condenser/servers/packets/base_packet' -require 'steam-condenser/servers/packets/request_with_challenge' +require 'steam-condenser/servers/packets/query_packet' module SteamCondenser::Servers::Packets @@ -20,15 +19,14 @@ module SteamCondenser::Servers::Packets # @see GameServer#update_rules_info class A2S_RULES_Packet - include BasePacket - include RequestWithChallenge + include QueryPacket # Creates a new A2S_RULES request object including the challenge number # # @param [Numeric] challenge_number The challenge number received from the # server def initialize(challenge_number = -1) - super A2S_RULES_HEADER, challenge_number + super A2S_RULES_HEADER, [challenge_number.to_i].pack('l') end end diff --git a/lib/steam-condenser/servers/packets/query_packet.rb b/lib/steam-condenser/servers/packets/query_packet.rb new file mode 100644 index 0000000..3070741 --- /dev/null +++ b/lib/steam-condenser/servers/packets/query_packet.rb @@ -0,0 +1,31 @@ +# This code is free software; you can redistribute it and/or modify it under +# the terms of the new BSD License. +# +# Copyright (c) 2020, Sebastian Staudt + +require 'steam-condenser/servers/packets/base_packet' + +module SteamCondenser::Servers::Packets + + # This is used as a wrapper to create padding of request packets to a minimum + # size of 1200 bytes. This was introduced in November 2020 as a counter-measure + # to DoS attacks on game servers. + # + # @author Sebastian Staudt + module QueryPacket + + include BasePacket + + # The minimum package size as defined by Valve + STEAM_GAMESERVER_MIN_CONNECTIONLESS_PACKET_SIZE = 1200 + + # Creates a new query packet including data padding + # + # @param [Fixnum] header The packet header + # @param [String] content The raw data of the packet + def initialize(header, content) + super header, content.to_s.ljust(STEAM_GAMESERVER_MIN_CONNECTIONLESS_PACKET_SIZE - 5, "\0") + end + + end +end \ No newline at end of file diff --git a/lib/steam-condenser/servers/packets/request_with_challenge.rb b/lib/steam-condenser/servers/packets/request_with_challenge.rb deleted file mode 100644 index 0848bac..0000000 --- a/lib/steam-condenser/servers/packets/request_with_challenge.rb +++ /dev/null @@ -1,22 +0,0 @@ -# This code is free software; you can redistribute it and/or modify it under -# the terms of the new BSD License. -# -# Copyright (c) 2008-2012, Sebastian Staudt - -module SteamCondenser::Servers::Packets - - # This module implements a method to generate raw packet data used by request - # packets which send a challenge number - # - # @author Sebastian Staudt - module RequestWithChallenge - - # Returns the raw data representing this packet - # - # @return [String] A string containing the raw data of this request packet - def to_s - [0xFF, 0xFF, 0xFF, 0xFF, @header_data, @content_data.string.to_i].pack('c5l') - end - - end -end diff --git a/test/steam-condenser/servers/packets/test_query_packet.rb b/test/steam-condenser/servers/packets/test_query_packet.rb new file mode 100644 index 0000000..d9a2e23 --- /dev/null +++ b/test/steam-condenser/servers/packets/test_query_packet.rb @@ -0,0 +1,26 @@ +# This code is free software; you can redistribute it and/or modify it under +# the terms of the new BSD License. +# +# Copyright (c) 2020, Sebastian Staudt + +require 'helper' + +class TestQueryPacket < Test::Unit::TestCase + + class GenericQueryPacket + include Servers::Packets::QueryPacket + end + + context 'A query packet' do + + setup do + @packet = GenericQueryPacket.new 0x61, 'test' + end + + should 'pad its content to at least 1200 bytes' do + assert_equal [255, 255, 255, 255, 'atest' + "\0" * 1191].pack('c4a*'), @packet.to_s + end + + end + +end \ No newline at end of file