05f0d09828
On August 15, shuckins-r7 merged the Metasploit 4.10.0 branch (staging/electro-release) into master. Rather than merging with history, he squashed all history into two commits (see149c3ecc63and82760bf5b3). We want to preserve history (for things like git blame, git log, etc.). So on August 22, we reverted the commits above (see19ba7772f3). This merge commit merges the staging/electro-release branch (62b81d6814) into master (48f0743d1b). It ensures that any changes committed to master since the original squashed merge are retained. As a side effect, you may see this merge commit in history/blame for the time period between August 15 and August 22.
77 lines
3.0 KiB
Ruby
77 lines
3.0 KiB
Ruby
# -*- coding: binary -*-
|
|
require 'metasploit/framework/api/version'
|
|
require 'metasploit/framework/core/version'
|
|
|
|
# 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.
|
|
#
|
|
# @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|
|
|
# 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.
|
|
if const_defined?("Metasploit#{major}")
|
|
metasploit_class = const_get("Metasploit#{major}")
|
|
|
|
break
|
|
end
|
|
end
|
|
|
|
metasploit_class
|
|
end
|
|
|
|
def metasploit_class!(module_path, module_reference_name)
|
|
metasploit_class = self.metasploit_class
|
|
|
|
unless metasploit_class
|
|
raise Msf::Modules::MetasploitClassCompatibilityError.new(
|
|
:module_path => module_path,
|
|
:module_reference_name => module_reference_name
|
|
)
|
|
end
|
|
|
|
metasploit_class
|
|
end
|
|
|
|
# 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.
|
|
#
|
|
# @param [String] module_path Path from where the module was read.
|
|
# @param [String] module_reference_name The canonical name for the module.
|
|
# @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)
|
|
if const_defined?(:RequiredVersions)
|
|
required_versions = const_get(:RequiredVersions)
|
|
minimum_core_version = Gem::Version.new(required_versions[0].to_s)
|
|
minimum_api_version = Gem::Version.new(required_versions[1].to_s)
|
|
|
|
if (minimum_core_version > Metasploit::Framework::Core::GEM_VERSION ||
|
|
minimum_api_version > Metasploit::Framework::API::GEM_VERSION)
|
|
raise Msf::Modules::VersionCompatibilityError.new(
|
|
:module_path => module_path,
|
|
:module_reference_name => module_reference_name,
|
|
:minimum_api_version => minimum_api_version,
|
|
:minimum_core_version => minimum_core_version
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|