class OpenRAReplay::Sanitize::PacketSanitizer

Attributes

chat[R]
ip[R]
message[R]
password[R]
ping[R]
player_map[R]
player_name[R]
server_name[R]
time[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 29
def initialize(options = {})
  @ping = options[:ping]
  @message = options[:message]
  @chat = options[:chat]
  @ip = options[:ip]
  @time = options[:time]
  @password = options[:password]
  @player_name = options[:player_name]
  @server_name = options[:server_name]
  @player_map = {}
end

Public Instance Methods

sanitize_packet(packet) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 41
def sanitize_packet(packet)
  return sanitize_packet_metadata(packet) if packet.metadata?
  return sanitize_packet_normal(packet) unless packet.unknown?
  packet
end

Private Instance Methods

sanitize_ip(object, key) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 112
def sanitize_ip(object, key)
  object[key]['IpAddress'] = nil if object[key]['IpAddress']
end
sanitize_name(object, key) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 116
def sanitize_name(object, key)
  return unless !object[key]['IsBot'] && object[key]['Name']
  unless player_map[object[key]['Name']]
    @player_map[object[key]['Name']] = "Player #{player_map.length + 1}"
  end
  object[key]['Name'] = player_map[object[key]['Name']]
end
sanitize_order(order) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 73
def sanitize_order(order)
  return order unless order.command.match('Sync') ||
                      order.command.match('Handshake')
  object = OpenRAReplay::MiniYaml.load order.data
  sanitize_password object if password
  sanitize_server_name object if server_name
  object.each_key do |key|
    next unless key == 'Client' || key =~ /^Client@\d+$/
    sanitize_name object, key if player_name
    sanitize_ip object, key if ip
  end
  order.class.new(
    command: order.command,
    data: OpenRAReplay::MiniYaml.dump(object)
  )
end
sanitize_packet_metadata(packet) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 49
def sanitize_packet_metadata(packet)
  object = OpenRAReplay::MiniYaml.load(packet.data)
  time_placeholder = sanitize_time_packet object if time
  object.each_key do |key|
    player = key.match(/^Player@(\d+)$/)
    next unless player
    sanitize_time_player object, key, time_placeholder if time
    sanitize_name object, key if player_name
  end
  packet.class.new(data: OpenRAReplay::MiniYaml.dump(object))
end
sanitize_packet_normal(packet) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 61
def sanitize_packet_normal(packet)
  packet.class.new(
    client_id: packet.client_id,
    frame: packet.frame,
    orders: packet.orders.reject do |o|
      (ping && (o.command.match('Ping') || o.command == 'Pong')) ||
      (message && o.command == 'Message') || (chat &&
      (o.command == 'Chat') || o.command == 'TeamChat')
    end.map { |o| sanitize_order o }
  )
end
sanitize_password(object) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 104
def sanitize_password(object)
  object['Handshake']['Password'] = nil if object['Handshake'] && object['Handshake']['Password']
end
sanitize_server_name(object) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 108
def sanitize_server_name(object)
  object['GlobalSettings']['ServerName'] = nil if object['GlobalSettings'] && object['GlobalSettings']['ServerName']
end
sanitize_time_packet(object) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 90
def sanitize_time_packet(object)
  start_time = OpenRAReplay::MiniYaml.load_time(object['Root']['StartTimeUtc'])
  epoch = Time.at(0).utc
  start_time = start_time.to_i
  stop_time = OpenRAReplay::MiniYaml.load_time(object['Root']['EndTimeUtc']) - start_time
  object['Root']['StartTimeUtc'] = OpenRAReplay::MiniYaml.dump_time(epoch)
  object['Root']['EndTimeUtc'] = OpenRAReplay::MiniYaml.dump_time(stop_time)
  start_time
end
sanitize_time_player(object, key, start_time) click to toggle source
# File lib/openrareplay/sanitize/packet_sanitizer.rb, line 100
def sanitize_time_player(object, key, start_time)
  object[key]['OutcomeTimestampUtc'] = OpenRAReplay::MiniYaml.dump_time(OpenRAReplay::MiniYaml.load_time(object[key]['OutcomeTimestampUtc']) - start_time)
end