Files
metasploit-gs/lib/msf/core/modules/namespace.rb
T

77 lines
3.0 KiB
Ruby
Raw Normal View History

# -*- coding: binary -*-
2014-08-01 21:54:41 -05:00
require 'metasploit/framework/api/version'
2014-08-01 21:31:48 -05:00
require 'metasploit/framework/core/version'
2012-10-01 13:09:30 -05:00
# Concern for behavior that all namespace modules that wrap Msf::Modules must support like version checking and
# grabbing the version specific-Metasploit* class.
module Msf::Modules::Namespace
# Returns the Metasploit(3|2|1) class from the module_evalled content.
#
# @note The module content must be module_evalled into this namespace module before the return of
# {#metasploit_class} is valid.
2012-10-01 13:09:30 -05:00
#
# @return [Msf::Module] if a Metasploit(3|2|1) class exists in this module
# @return [nil] if such as class is not defined.
def metasploit_class
metasploit_class = nil
::Msf::Framework::Major.downto(1) do |major|
2012-10-08 17:29:36 -05:00
# Since we really only care about the deepest namespace, we don't
# need to look for parents' constants. However, the "inherit"
# parameter for const_defined? only exists after 1.9. If we ever
# drop 1.8 support, we can save a few cycles here by passing false
# here.
2012-10-08 12:11:59 -05:00
if const_defined?("Metasploit#{major}")
2012-10-01 13:09:30 -05:00
metasploit_class = const_get("Metasploit#{major}")
break
end
end
metasploit_class
end
def metasploit_class!(module_path, module_reference_name)
2013-08-30 16:28:33 -05:00
metasploit_class = self.metasploit_class
2013-08-30 16:28:33 -05:00
unless metasploit_class
raise Msf::Modules::MetasploitClassCompatibilityError.new(
:module_path => module_path,
:module_reference_name => module_reference_name
)
end
2013-08-30 16:28:33 -05:00
metasploit_class
end
2012-10-01 13:09:30 -05:00
# Raises an error unless {Msf::Framework::VersionCore} and {Msf::Framework::VersionAPI} meet the minimum required
# versions defined in RequiredVersions in the module content.
#
# @note The module content must be module_evalled into this namespace module using module_eval_with_lexical_scope
# before calling {#version_compatible!} is valid.
2012-10-01 13:09:30 -05:00
#
# @param [String] module_path Path from where the module was read.
# @param [String] module_reference_name The canonical name for the module.
2012-10-01 13:09:30 -05:00
# @raise [Msf::Modules::VersionCompatibilityError] if RequiredVersion[0] > Msf::Framework::VersionCore or
# RequiredVersion[1] > Msf::Framework::VersionApi
# @return [void]
def version_compatible!(module_path, module_reference_name)
2012-10-01 13:09:30 -05:00
if const_defined?(:RequiredVersions)
required_versions = const_get(:RequiredVersions)
2014-08-01 21:31:48 -05:00
minimum_core_version = Gem::Version.new(required_versions[0].to_s)
2014-08-01 21:43:14 -05:00
minimum_api_version = Gem::Version.new(required_versions[1].to_s)
2012-10-01 13:09:30 -05:00
2014-08-01 21:43:14 -05:00
if (minimum_core_version > Metasploit::Framework::Core::GEM_VERSION ||
minimum_api_version > Metasploit::Framework::API::GEM_VERSION)
2012-10-01 13:09:30 -05:00
raise Msf::Modules::VersionCompatibilityError.new(
:module_path => module_path,
:module_reference_name => module_reference_name,
2012-10-01 13:09:30 -05:00
:minimum_api_version => minimum_api_version,
:minimum_core_version => minimum_core_version
)
end
end
end
2012-10-08 12:11:59 -05:00
end
2012-10-08 12:42:34 -05:00