class WinRM::PSRP::MessageDefragmenter

PowerShell Remoting Protocol message fragmenter.

Public Class Methods

new() click to toggle source
# File lib/winrm/psrp/message_defragmenter.rb, line 22
def initialize
  @messages = {}
end

Public Instance Methods

defragment(base64_bytes) click to toggle source
# File lib/winrm/psrp/message_defragmenter.rb, line 26
def defragment(base64_bytes)
  fragment = fragment_from(Base64.decode64(base64_bytes))

  @messages[fragment.object_id] ||= []
  @messages[fragment.object_id].push fragment

  # rubocop:disable Style/GuardClause
  if fragment.end_fragment
    blob = []
    @messages.delete(fragment.object_id).each { |frag| blob += frag.blob }
    return message_from(blob.pack('C*'))
  end
  # rubocop:enable Style/GuardClause
end
fragment_from(byte_string) click to toggle source
# File lib/winrm/psrp/message_defragmenter.rb, line 41
def fragment_from(byte_string)
  Fragment.new(
    byte_string[0..7].reverse.unpack('Q')[0],
    byte_string[21..-1].bytes,
    byte_string[8..15].reverse.unpack('Q')[0],
    byte_string[16].unpack('C')[0][0] == 1,
    byte_string[16].unpack('C')[0][1] == 1
  )
end
message_from(byte_string) click to toggle source
# File lib/winrm/psrp/message_defragmenter.rb, line 51
def message_from(byte_string)
  Message.new(
    '00000000-0000-0000-0000-000000000000',
    byte_string[4..7].unpack('V')[0],
    byte_string[40..-1],
    '00000000-0000-0000-0000-000000000000',
    byte_string[0..3].unpack('V')[0]
  )
end