1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
module Net
module NTLM
# base class of data structure
class FieldSet
class << FieldSet
# @macro string_security_buffer
# @method $1
# @method $1=
# @return [String]
def string(name, opts)
add_field(name, Net::NTLM::String, opts)
end
# @macro int16le_security_buffer
# @method $1
# @method $1=
# @return [Int16LE]
def int16LE(name, opts)
add_field(name, Net::NTLM::Int16LE, opts)
end
# @macro int32le_security_buffer
# @method $1
# @method $1=
# @return [Int32LE]
def int32LE(name, opts)
add_field(name, Net::NTLM::Int32LE, opts)
end
# @macro int64le_security_buffer
# @method $1
# @method $1=
# @return [Int64]
def int64LE(name, opts)
add_field(name, Net::NTLM::Int64LE, opts)
end
# @macro security_buffer
# @method $1
# @method $1=
# @return [SecurityBuffer]
def security_buffer(name, opts)
add_field(name, Net::NTLM::SecurityBuffer, opts)
end
def prototypes
@proto
end
def names
return [] if @proto.nil?
@proto.map{|n, t, o| n}
end
def types
return [] if @proto.nil?
@proto.map{|n, t, o| t}
end
def opts
return [] if @proto.nil?
@proto.map{|n, t, o| o}
end
private
def add_field(name, type, opts)
(@proto ||= []).push [name, type, opts]
define_accessor name
end
def define_accessor(name)
module_eval(<<-End, __FILE__, __LINE__ + 1)
def #{name}
self['#{name}'].value
end
def #{name}=(val)
self['#{name}'].value = val
end
End
end
end
def initialize
@alist = self.class.prototypes.map{ |n, t, o| [n, t.new(o)] }
end
def parse(str, offset=0)
@alist.inject(offset){|cur, a| cur += a[1].parse(str, cur)}
end
def serialize
@alist.map{|n, f| f.serialize }.join
end
def size
@alist.inject(0){|sum, a| sum += a[1].size}
end
def [](name)
a = @alist.assoc(name.to_s.intern)
raise ArgumentError, "no such field: #{name}" unless a
a[1]
end
def []=(name, val)
a = @alist.assoc(name.to_s.intern)
raise ArgumentError, "no such field: #{name}" unless a
a[1] = val
end
def enable(name)
self[name].active = true
end
def disable(name)
self[name].active = false
end
def has_disabled_fields?
@alist.any? { |name, field| !field.active }
end
end
end
end
|