module Rex::Proto::Quake
Quake
3 protocol, taken from ftp.idsoftware.com/idstuff/quake3/docs/server.txt
Constants
- HEADER
Public Instance Methods
decode_info(message)
click to toggle source
# File lib/rex/proto/quake/message.rb, line 67 def decode_info(message) decode_response(message, 'info') end
decode_infostring(infostring)
click to toggle source
# File lib/rex/proto/quake/message.rb, line 32 def decode_infostring(infostring) # decode an "infostring", which is just a (supposedly) quoted string of tokens separated # by backslashes, generally terminated with a newline token_re = /([^\\]+)\\([^\\]+)/ return nil unless infostring =~ token_re # remove possibly present leading/trailing double quote infostring.gsub!(/(?:^"|"$)/, '') # remove the trailing \n, if present infostring.gsub!(/\n$/, '') # split on backslashes and group into key value pairs infohash = {} infostring.scan(token_re).each do |kv| infohash[kv.first] = kv.last end infohash end
decode_message(message)
click to toggle source
# File lib/rex/proto/quake/message.rb, line 12 def decode_message(message) # minimum size is header (4) + <command> + <stuff> return if message.length < 7 header = message.unpack('N')[0] return if header != HEADER message[4, message.length] end
decode_response(message, type)
click to toggle source
# File lib/rex/proto/quake/message.rb, line 49 def decode_response(message, type) resp = decode_message(message) if /^print\n(?<error>.*)\n?/m =~ resp # XXX: is there a better exception to throw here? fail ::ArgumentError, "#{type} error: #{error}" # why doesn't this work? # elsif /^#{type}Response\n(?<infostring>.*)/m =~ resp elsif resp =~ /^#{type}Response\n(.*)/m decode_infostring(Regexp.last_match(1)) else nil end end
decode_status(message)
click to toggle source
# File lib/rex/proto/quake/message.rb, line 63 def decode_status(message) decode_response(message, 'status') end
encode_message(payload)
click to toggle source
# File lib/rex/proto/quake/message.rb, line 20 def encode_message(payload) [HEADER].pack('N') + payload end
getinfo()
click to toggle source
# File lib/rex/proto/quake/message.rb, line 28 def getinfo encode_message('getinfo') end
getstatus()
click to toggle source
# File lib/rex/proto/quake/message.rb, line 24 def getstatus encode_message('getstatus') end