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 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 109 def clear(symbol) @flag &= ~FLAGS[symbol] end
has_flag?(symbol)
click to toggle source
# File lib/ntlm/message.rb, line 101 def has_flag?(symbol) (@flag & FLAGS[symbol]) != 0 end
inspect()
click to toggle source
# File lib/ntlm/message.rb, line 125 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 117 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 95 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 105 def set(symbol) @flag |= FLAGS[symbol] end
to_s()
click to toggle source
# File lib/ntlm/message.rb, line 91 def to_s serialize end
unicode?()
click to toggle source
# File lib/ntlm/message.rb, line 113 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 139 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 163 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 159 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 184 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 155 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 149 def fetch_payload(fields) size, allocated_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 132 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