45 lines
922 B
Ruby
45 lines
922 B
Ruby
# -*- coding: binary -*-
|
|
require 'network_interface'
|
|
|
|
module Msf
|
|
|
|
###
|
|
#
|
|
# Local network address option.
|
|
#
|
|
###
|
|
class OptAddressLocal < OptAddress
|
|
def interfaces
|
|
NetworkInterface.interfaces || []
|
|
end
|
|
|
|
def normalize(value)
|
|
return unless value.kind_of?(String)
|
|
return value unless interfaces.include?(value)
|
|
|
|
addrs = NetworkInterface.addresses(value).values.flatten
|
|
|
|
# Strip interface name from address (see getifaddrs(3))
|
|
addrs = addrs.map { |x| x['addr'].split('%').first }.select do |addr|
|
|
begin
|
|
IPAddr.new(addr)
|
|
rescue IPAddr::InvalidAddressError
|
|
false
|
|
end
|
|
end
|
|
|
|
addrs.any? ? addrs.first : ''
|
|
end
|
|
|
|
def valid?(value, check_empty: true)
|
|
return false if check_empty && empty_required_value?(value)
|
|
return false unless value.kind_of?(String) || value.kind_of?(NilClass)
|
|
|
|
return true if interfaces.include?(value)
|
|
|
|
super
|
|
end
|
|
end
|
|
|
|
end
|