lib/net/ntlm/message.rb in rubyntlm-0.6.1 vs lib/net/ntlm/message.rb in rubyntlm-0.6.2

- old
+ new

@@ -1,129 +1,129 @@ -module Net -module NTLM - - SSP_SIGN = "NTLMSSP\0" - - FLAGS = { - :UNICODE => 0x00000001, - :OEM => 0x00000002, - :REQUEST_TARGET => 0x00000004, - :MBZ9 => 0x00000008, - :SIGN => 0x00000010, - :SEAL => 0x00000020, - :NEG_DATAGRAM => 0x00000040, - :NETWARE => 0x00000100, - :NTLM => 0x00000200, - :NEG_NT_ONLY => 0x00000400, - :MBZ7 => 0x00000800, - :DOMAIN_SUPPLIED => 0x00001000, - :WORKSTATION_SUPPLIED => 0x00002000, - :LOCAL_CALL => 0x00004000, - :ALWAYS_SIGN => 0x00008000, - :TARGET_TYPE_DOMAIN => 0x00010000, - :NTLM2_KEY => 0x00080000, - :TARGET_INFO => 0x00800000, - :KEY128 => 0x20000000, - :KEY_EXCHANGE => 0x40000000, - :KEY56 => 0x80000000 - }.freeze - - FLAG_KEYS = FLAGS.keys.sort{|a, b| FLAGS[a] <=> FLAGS[b] } - - DEFAULT_FLAGS = { - :TYPE1 => FLAGS[:UNICODE] | FLAGS[:OEM] | FLAGS[:REQUEST_TARGET] | FLAGS[:NTLM] | FLAGS[:ALWAYS_SIGN] | FLAGS[:NTLM2_KEY], - :TYPE2 => FLAGS[:UNICODE], - :TYPE3 => FLAGS[:UNICODE] | FLAGS[:REQUEST_TARGET] | FLAGS[:NTLM] | FLAGS[:ALWAYS_SIGN] | FLAGS[:NTLM2_KEY] - } - - - # @private false - class Message < FieldSet - class << Message - def parse(str) - m = Type0.new - m.parse(str) - case m.type - when 1 - t = Type1.new.parse(str) - when 2 - t = Type2.new.parse(str) - when 3 - t = Type3.new.parse(str) - else - raise ArgumentError, "unknown type: #{m.type}" - end - t - end - - def decode64(str) - parse(Base64.decode64(str)) - end - end - - # @return [self] - def parse(str) - super - - while has_disabled_fields? && serialize.size < str.size - # enable the next disabled field - self.class.names.find { |name| !self[name].active && enable(name) } - super - end - - self - end - - def has_flag?(flag) - (self[:flag].value & FLAGS[flag]) == FLAGS[flag] - end - - def set_flag(flag) - self[:flag].value |= FLAGS[flag] - end - - def dump_flags - FLAG_KEYS.each{ |k| print(k, "=", has_flag?(k), "\n") } - end - - def serialize - deflag - super + security_buffers.map{|n, f| f.value}.join - end - - def encode64 - Base64.encode64(serialize).gsub(/\n/, '') - end - - def decode64(str) - parse(Base64.decode64(str)) - end - - alias head_size size - - def data_size - security_buffers.inject(0){|sum, a| sum += a[1].data_size} - end - - def size - head_size + data_size - end - - - def security_buffers - @alist.find_all{|n, f| f.instance_of?(SecurityBuffer)} - end - - def deflag - security_buffers.inject(head_size){|cur, a| - a[1].offset = cur - cur += a[1].data_size - } - end - - def data_edge - security_buffers.map{ |n, f| f.active ? f.offset : size}.min - end - - end -end -end +module Net +module NTLM + + SSP_SIGN = "NTLMSSP\0" + + FLAGS = { + :UNICODE => 0x00000001, + :OEM => 0x00000002, + :REQUEST_TARGET => 0x00000004, + :MBZ9 => 0x00000008, + :SIGN => 0x00000010, + :SEAL => 0x00000020, + :NEG_DATAGRAM => 0x00000040, + :NETWARE => 0x00000100, + :NTLM => 0x00000200, + :NEG_NT_ONLY => 0x00000400, + :MBZ7 => 0x00000800, + :DOMAIN_SUPPLIED => 0x00001000, + :WORKSTATION_SUPPLIED => 0x00002000, + :LOCAL_CALL => 0x00004000, + :ALWAYS_SIGN => 0x00008000, + :TARGET_TYPE_DOMAIN => 0x00010000, + :NTLM2_KEY => 0x00080000, + :TARGET_INFO => 0x00800000, + :KEY128 => 0x20000000, + :KEY_EXCHANGE => 0x40000000, + :KEY56 => 0x80000000 + }.freeze + + FLAG_KEYS = FLAGS.keys.sort{|a, b| FLAGS[a] <=> FLAGS[b] } + + DEFAULT_FLAGS = { + :TYPE1 => FLAGS[:UNICODE] | FLAGS[:OEM] | FLAGS[:REQUEST_TARGET] | FLAGS[:NTLM] | FLAGS[:ALWAYS_SIGN] | FLAGS[:NTLM2_KEY], + :TYPE2 => FLAGS[:UNICODE], + :TYPE3 => FLAGS[:UNICODE] | FLAGS[:REQUEST_TARGET] | FLAGS[:NTLM] | FLAGS[:ALWAYS_SIGN] | FLAGS[:NTLM2_KEY] + } + + + # @private false + class Message < FieldSet + class << Message + def parse(str) + m = Type0.new + m.parse(str) + case m.type + when 1 + t = Type1.new.parse(str) + when 2 + t = Type2.new.parse(str) + when 3 + t = Type3.new.parse(str) + else + raise ArgumentError, "unknown type: #{m.type}" + end + t + end + + def decode64(str) + parse(Base64.decode64(str)) + end + end + + # @return [self] + def parse(str) + super + + while has_disabled_fields? && serialize.size < str.size + # enable the next disabled field + self.class.names.find { |name| !self[name].active && enable(name) } + super + end + + self + end + + def has_flag?(flag) + (self[:flag].value & FLAGS[flag]) == FLAGS[flag] + end + + def set_flag(flag) + self[:flag].value |= FLAGS[flag] + end + + def dump_flags + FLAG_KEYS.each{ |k| print(k, "=", has_flag?(k), "\n") } + end + + def serialize + deflag + super + security_buffers.map{|n, f| f.value}.join + end + + def encode64 + Base64.encode64(serialize).gsub(/\n/, '') + end + + def decode64(str) + parse(Base64.decode64(str)) + end + + alias head_size size + + def data_size + security_buffers.inject(0){|sum, a| sum += a[1].data_size} + end + + def size + head_size + data_size + end + + + def security_buffers + @alist.find_all{|n, f| f.instance_of?(SecurityBuffer)} + end + + def deflag + security_buffers.inject(head_size){|cur, a| + a[1].offset = cur + cur += a[1].data_size + } + end + + def data_edge + security_buffers.map{ |n, f| f.active ? f.offset : size}.min + end + + end +end +end