module WPScan
module Model
class WpVersion < CMSScanner::Model::Version
include Vulnerable
def initialize(number, opts = {})
raise Error::InvalidWordPressVersion unless WpVersion.valid?(number.to_s)
super(number, opts)
end
def self.valid?(number)
all.include?(number)
end
def self.all
return @all_numbers if @all_numbers
@all_numbers = []
DB::Version.metadata.each_key do |ver|
@all_numbers << ver
end
DB::Fingerprints.wp_fingerprints.each_value do |fp|
@all_numbers << fp.values
end
@all_numbers.flatten!
@all_numbers.uniq!
@all_numbers.sort! { |a, b| Gem::Version.new(b) <=> Gem::Version.new(a) }
end
def metadata
@metadata ||= db_data.empty? ? DB::Version.metadata_at(number) : db_data
end
def db_data
@db_data ||= DB::VulnApi.wordpress_data(number)
end
def vulnerabilities
return @vulnerabilities if @vulnerabilities
@vulnerabilities = []
Array(db_data['vulnerabilities']).each do |json_vuln|
@vulnerabilities << Vulnerability.load_from_json(json_vuln)
end
@vulnerabilities
end
def release_date
@release_date ||= metadata['release_date'] || 'Unknown'
end
def status
@status ||= metadata['status'] || 'Unknown'
end
end
end
end