class NTLM::Message

Constants

AV_PAIRS
MS-NLMP

2.2.2.1

AV_PAIR_NAMES
FLAGS
MS-NLMP

2.2.2.5

SSP_SIGNATURE

Attributes

flag[RW]

Public Class Methods

new(args = {}) click to toggle source
# File lib/ntlm/message.rb, line 81
def initialize(args = {})
  @buffer      = ''
  @offset      = 0
  @flag        = args[:flag] || self.class::DEFAULT_FLAGS
  @domain      = nil
  @workstation = nil
  @version     = nil
  @target_info = nil
  @session_key = nil
  @mic         = nil

  self.class::ATTRIBUTES.each do |key|
    instance_variable_set("@#{key}", args[key]) if args[key]
  end
end
parse(*args) click to toggle source
# File lib/ntlm/message.rb, line 77
def self.parse(*args)
  new.parse(*args)
end

Public Instance Methods

clear(symbol) click to toggle source
# File lib/ntlm/message.rb, line 115
def clear(symbol)
  @flag &= ~FLAGS[symbol]
end
has_flag?(symbol) click to toggle source
# File lib/ntlm/message.rb, line 107
def has_flag?(symbol)
  (@flag & FLAGS[symbol]) != 0
end
inspect() click to toggle source
# File lib/ntlm/message.rb, line 131
def inspect
  variables = (instance_variables.map(&:to_sym) - [:@offset, :@buffer, :@flag]).sort.map {|name| "#{name}=#{instance_variable_get(name).inspect}, " }.join
  "\#<#{self.class.name} #{variables}@flag=#{inspect_flags}>"
end
inspect_flags() click to toggle source
# File lib/ntlm/message.rb, line 123
def inspect_flags
  flags = []
  FLAGS.sort_by(&:last).each do |name, val|
    flags << name if (@flag & val).nonzero?
  end
  "[#{flags.join(', ')}]"
end
serialize_to_base64() click to toggle source
# File lib/ntlm/message.rb, line 101
def serialize_to_base64
  [serialize].pack('m').delete("\r\n")
end
Also aliased as: to_base64
set(symbol) click to toggle source
# File lib/ntlm/message.rb, line 111
def set(symbol)
  @flag |= FLAGS[symbol]
end
to_base64()
Alias for: serialize_to_base64
to_s() click to toggle source
# File lib/ntlm/message.rb, line 97
def to_s
  serialize
end
unicode?() click to toggle source
# File lib/ntlm/message.rb, line 119
def unicode?
  has_flag?(:NEGOTIATE_UNICODE)
end

Private Instance Methods

append_payload(string, allocation_size = nil) click to toggle source
# File lib/ntlm/message.rb, line 145
def append_payload(string, allocation_size = nil)
  size = string.size
  allocation_size ||= (size + 1) & ~1
  string = string.ljust(allocation_size, "\0")
  @buffer << string[0, allocation_size]
  result = [size, allocation_size, @offset].pack('vvV')
  @offset += allocation_size
  result
end
decode_av_pair(string) click to toggle source
# File lib/ntlm/message.rb, line 169
def decode_av_pair(string)
  result = []
  string = string.dup
  while true
    id, length = string.slice!(0, 4).unpack('vv')
    value = string.slice!(0, length)

    case sym = AV_PAIR_NAMES[id]
    when :AV_EOL
      break
    when :AV_NB_COMPUTER_NAME, :AV_NB_DOMAIN_NAME, :AV_DNS_COMPUTER_NAME, :AV_DNS_DOMAIN_NAME, :AV_DNS_TREE_NAME, :AV_TARGET_NAME
      value = decode_utf16(value)
    when :AV_FLAGS
      value = data.unpack('V').first
    end

    result << [sym, value]
  end
  result
end
decode_version(string) click to toggle source
# File lib/ntlm/message.rb, line 165
def decode_version(string)
  string.unpack('CCvx3C')   # major, minor, build, ntlm revision
end
encode_av_pair(av_pair) click to toggle source
# File lib/ntlm/message.rb, line 190
def encode_av_pair(av_pair)
  result = ''
  av_pair.each do |(id, value)|
    case id
    when :AV_NB_COMPUTER_NAME, :AV_NB_DOMAIN_NAME, :AV_DNS_COMPUTER_NAME, :AV_DNS_DOMAIN_NAME, :AV_DNS_TREE_NAME, :AV_TARGET_NAME
      value = encode_utf16(value)
    when :AV_FLAGS
      value = [data].pack('V')
    end
    result << [AV_PAIRS[id], value.size, value].pack('vva*')
  end

  result << [AV_EOL, 0].pack('vv')
end
encode_version(array) click to toggle source
# File lib/ntlm/message.rb, line 161
def encode_version(array)
  array.pack('CCvx3C')   # major, minor, build, ntlm revision
end
fetch_payload(fields) click to toggle source
# File lib/ntlm/message.rb, line 155
def fetch_payload(fields)
  size, _, offset = fields.unpack('vvV')
  return nil if size.zero?
  @buffer[offset, size]
end
parse(string) click to toggle source
# File lib/ntlm/message.rb, line 138
def parse(string)
  @buffer = string
  signature, type = string.unpack('a8V')
  raise ParseError, 'Unknown signature' if signature != SSP_SIGNATURE
  raise ParseError, "Wrong type (expected #{self.class::TYPE}, but got #{type})" if type != self.class::TYPE
end