Add doc for Rex::Proto::Steam

bug/bundler_fix
Jon Hart 2014-11-18 11:46:28 -08:00
parent 6330c428d7
commit d94ca2b89a
No known key found for this signature in database
GPG Key ID: 2FA9F0A3AFA8E9D3
2 changed files with 26 additions and 9 deletions

View File

@ -8,19 +8,30 @@ module Proto
#
##
module Steam
# The Steam header ussed when the message is fragmented.
FRAGMENTED_HEADER = 0xFFFFFFFE
# The Steam header ussed when the message is not fragmented.
UNFRAGMENTED_HEADER = 0xFFFFFFFF
# Decodes a Steam response message.
#
# @param message [String] the message to decode
# @return [Array] the message type and body
def decode_message(message)
# minimum size is header (4) + type (1)
return if message.length < 5
header, type = message.unpack('NC')
# TODO: handle fragmented responses
return if header != UNFRAGMENTED_HEADER
[header, type, message[5, message.length]]
[type, message[5, message.length]]
end
def encode_message(type, payload)
# Encodes a Steam message.
#
# @param type [String, Fixnum] the message type
# @param body [String] the message body
# @return [String] the encoded Steam message
def encode_message(type, body)
if type.is_a? Fixnum
type_num = type
elsif type.is_a? String
@ -29,23 +40,30 @@ module Steam
fail ArgumentError, 'type must be a String or Fixnum'
end
[UNFRAGMENTED_HEADER, type_num ].pack('NC') + payload
[UNFRAGMENTED_HEADER, type_num ].pack('NC') + body
end
# Builds an A2S_INFO message
#
# @return [String] the A2S_INFO message
def a2s_info
encode_message('T', "Source Engine Query\x00")
end
def a2s_info_decode(message)
# Decodes an A2S_INFO response message
#
# @parameter response [String] the A2S_INFO resposne to decode
# @return [Hash] the fields extracted from the response
def a2s_info_decode(response)
# abort if it is impossibly short
return nil if message.length < 19
_header, message_type, payload = decode_message(message)
return nil if response.length < 19
message_type, body = decode_message(response)
# abort if it isn't a valid Steam response
return nil if message_type != 0x49 # 'I'
info = {}
info[:version], info[:name], info[:map], info[:folder], info[:game_name],
info[:game_id], players, players_max, info[:bots],
type, env, vis, vac, info[:game_version], _edf = payload.unpack("CZ*Z*Z*Z*SCCCCCCCZ*C")
type, env, vis, vac, info[:game_version], _edf = body.unpack("CZ*Z*Z*Z*SCCCCCCCZ*C")
# translate type
case type

View File

@ -26,8 +26,7 @@ describe Rex::Proto::Steam do
end
it 'properly decodes valid messages' do
header, type, message = steam.decode_message("\xFF\xFF\xFF\xFF\x54Test")
expect(header).to eq(Rex::Proto::Steam::UNFRAGMENTED_HEADER)
type, message = steam.decode_message("\xFF\xFF\xFF\xFF\x54Test")
expect(type).to eq(0x54)
expect(message).to eq('Test')
end