53 lines
1.2 KiB
Ruby
53 lines
1.2 KiB
Ruby
# -*- coding: binary -*-
|
|
|
|
module Msf
|
|
|
|
###
|
|
#
|
|
# File system path option.
|
|
#
|
|
###
|
|
class OptPath < OptBase
|
|
def type
|
|
return 'path'
|
|
end
|
|
|
|
def normalize(value)
|
|
value.nil? ? value : File.expand_path(value)
|
|
end
|
|
|
|
def validate_on_assignment?
|
|
false
|
|
end
|
|
|
|
# Generally, 'value' should be a file that exists.
|
|
def valid?(value, check_empty: true)
|
|
return false if check_empty && empty_required_value?(value)
|
|
if value and !value.empty?
|
|
if value =~ /^memory:\s*([0-9]+)/i
|
|
return false unless check_memory_location($1)
|
|
else
|
|
unless File.exist?(File.expand_path(value))
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
return super
|
|
end
|
|
|
|
# The AuthBrute mixin can take a memory address as well --
|
|
# currently, no other OptFile can make use of these objects.
|
|
# TODO: Implement memory:xxx to be more generally useful so
|
|
# the validator on OptFile isn't lying for non-AuthBrute.
|
|
def check_memory_location(id)
|
|
return false unless self.class.const_defined?(:ObjectSpace)
|
|
obj = ObjectSpace._id2ref(id.to_i) rescue nil
|
|
return false unless obj.respond_to? :acts_as_file?
|
|
return false unless obj.acts_as_file? # redundant?
|
|
return !!obj
|
|
end
|
|
|
|
end
|
|
|
|
end
|