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_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