110 lines
3.5 KiB
Ruby
110 lines
3.5 KiB
Ruby
#!/usr/bin/env ruby
|
|
|
|
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
|
|
require 'rex/test'
|
|
require 'rex/proto/drda/packet'
|
|
|
|
class Rex::Proto::DRDA::UnitTest < Test::Unit::TestCase
|
|
|
|
Klass = Rex::Proto::DRDA
|
|
Konst = Rex::Proto::DRDA::Constants
|
|
|
|
# Test a sample param
|
|
def test_mgrlvlls_param
|
|
p = Klass::MGRLVLLS_PARAM.new
|
|
assert_kind_of(Struct, p)
|
|
assert_equal(Konst::MGRLVLLS, p.codepoint)
|
|
end
|
|
|
|
# Test a sample ddm
|
|
def test_secchk_ddm
|
|
d = Klass::SECCHK_DDM.new
|
|
assert_kind_of Struct, d
|
|
assert_equal Konst::SECCHK, d.codepoint
|
|
end
|
|
|
|
# All parameter names should have a corresponding codepoint,
|
|
# except "DDM_PARAM" (a generic parameter).
|
|
def test_all_param_codepoints
|
|
params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
|
|
assert_operator params.size, :>=, 6 # Allow for more later.
|
|
params.each do |p|
|
|
cp = p.split(/_PARAM/).first
|
|
next if cp == "DDM"
|
|
assert Konst.const_defined? cp
|
|
assert_kind_of Numeric, Konst.const_get(cp)
|
|
end
|
|
end
|
|
|
|
# Similarly, so should DDM Structs.
|
|
def test_all_ddm_codepoints
|
|
ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
|
|
assert_operator ddms.size, :>=, 4 # Allow for more later.
|
|
ddms.each do |p|
|
|
cp = p.split(/_DDM/).first
|
|
next if cp == "BASIC"
|
|
assert_kind_of Numeric, Konst.const_get(cp)
|
|
end
|
|
end
|
|
|
|
# Ensure that all params have the same struct.
|
|
def test_param_struct
|
|
params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
|
|
params.each do |p|
|
|
obj = Klass.const_get(p).new
|
|
assert_equal 3, obj.size
|
|
assert_respond_to obj, :codepoint
|
|
assert_respond_to obj, :length
|
|
assert_respond_to obj, :payload
|
|
end
|
|
end
|
|
|
|
# Make some similiar assertions about DDMs, though specific DDMs
|
|
# will have particular elements after the codepoint, usually more
|
|
# than one.
|
|
def test_ddm_struct
|
|
ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
|
|
ddms.each do |d|
|
|
obj = Klass.const_get(d).new
|
|
assert_operator obj.size, :>=, 7
|
|
assert_respond_to obj, :length
|
|
assert_respond_to obj, :magic
|
|
assert_respond_to obj, :format
|
|
assert_respond_to obj, :correlid
|
|
assert_respond_to obj, :length2
|
|
assert_respond_to obj, :codepoint
|
|
end
|
|
end
|
|
|
|
# The server packet is special since it's an Array of BASIC_DDM's,
|
|
# and doesn't have a particular, fixed struct. (It would be nice
|
|
# to build those up on the fly, but we're not really interested in
|
|
# validating most server responses right now.
|
|
def test_server_packet_structure
|
|
s = Klass::SERVER_PACKET.new
|
|
assert_kind_of Array, s
|
|
assert_respond_to s, :to_s
|
|
assert_respond_to s, :sz
|
|
assert_respond_to s, :read
|
|
end
|
|
|
|
# Exercise the SERVER_PACKET#read function with a sample packet.
|
|
def test_server_packet_read
|
|
pkt = "0015d0420001000f1219000611490000000511a4000050d0520002004a2201000611490000000c112ee2d8d3f0f8f0f2f4000d002fd8e3c4e2d8d3e7f8f6000a00350006119c033300062103022e00172135c3f0c1f8f6c1f0f14bc5c6f1f2070402195612008cd0030002008624080000000000303030303053514c303830323400ffffffff0200000000000000030000000000000000000000202020202020202020202000124d59444232444220202020202020202020200000003331ff383139ff4d59555345522020ff4d594442324442ff514442322f4c494e5558ff353538ff353538ff30ff31323038ff30ffff".scan(/../).map {|x| x.to_i(16).chr}.join
|
|
s = Klass::SERVER_PACKET.new
|
|
assert_equal 0, s.size
|
|
s.read(pkt)
|
|
assert_equal 3, s.size
|
|
assert_equal Konst::SECCHKRM, s[0].codepoint
|
|
assert_equal Konst::ACCRDBRM, s[1].codepoint
|
|
assert_equal Konst::SQLCARD, s[2].codepoint
|
|
assert_equal 0xd0, s[0].magic
|
|
assert_equal 0x52, s[1].format
|
|
assert_equal 134, s[2].length2
|
|
assert_equal 21+80+140, s.sz
|
|
end
|
|
|
|
end
|
|
|