Specs and code changes for OptAddress

handles wierness around Optaddress.
Still need to address isues in optaddressRange

FIXRM #7537
bug/bundler_fix
David Maloney 2013-07-17 20:21:24 -05:00
parent 72df070b80
commit 27e2469d8e
3 changed files with 58 additions and 1 deletions

View File

@ -330,10 +330,17 @@ class OptAddress < OptBase
def valid?(value) def valid?(value)
return false if empty_required_value?(value) return false if empty_required_value?(value)
return false unless value.kind_of?(String)
if (value != nil and value.empty? == false) if (value != nil and value.empty? == false)
begin begin
::Rex::Socket.getaddress(value, true) getaddr_result = ::Rex::Socket.getaddress(value, true)
# Covers a wierdcase where an incomplete ipv4 address will have it's
# missing octets filled in with 0's. (e.g 192.168 become 192.0.0.168)
# which does not feel like a legit behaviour
if value =~ /^(\d{1,3}\.*){1,3}$/ and getaddr_result.gsub('.0','') == value
return false
end
rescue rescue
return false return false
end end

View File

@ -0,0 +1,50 @@
# -*- coding:binary -*-
require 'spec_helper'
require 'msf/core/option_container'
describe Msf::OptAddress do
subject{ Msf::OptAddress.new('RHOST', [true, 'The target address', '']) }
it 'should return a type of address' do
subject.type.should == 'address'
end
context 'the validator' do
it 'should return true for a valid ipv4 address' do
subject.valid?('192.168.1.1').should == true
end
it 'should return true for a valid ipv6 address' do
subject.valid?('2607:f0d0:1002:0051:0000:0000:0000:0004').should == true
end
it 'should return true for a valid compressed ipv6 address' do
subject.valid?('2607:f0d0:1002:51::4').should == true
end
it 'should return false for nil' do
subject.valid?(nil).should == false
end
it 'should return false for an empty string' do
subject.valid?('').should == false
end
it 'should return false for an incomplete ip4 address' do
subject.valid?('192.168.1').should == false
end
it 'should return false for a non-string value' do
subject.valid?(true).should == false
subject.valid?(50).should == false
subject.valid?([]).should == false
subject.valid?([1,2]).should == false
subject.valid?({}).should == false
subject.valid?({:foo => 'bar'}) == false
end
end
end