# frozen_string_literal: true module CMSScanner # References related to the issue module References extend ActiveSupport::Concern # See ActiveSupport::Concern module ClassMethods # @return [ Array ] def references_keys @references_keys ||= %i[cve exploitdb url metasploit packetstorm securityfocus youtube] end end # @param [ Hash ] refs def references=(refs) @references = {} self.class.references_keys.each do |key| next unless refs.key?(key) @references[key] = if key == :youtube Array(refs[:youtube]).map { |id| youtube_url(id) } else Array(refs[key]).map(&:to_s) end end end # @return [ Hash ] def references @references ||= {} end # @return [ Array ] All the references URLs def references_urls cve_urls + exploitdb_urls + urls + msf_urls + packetstorm_urls + securityfocus_urls + youtube_urls end # @return [ Array ] The CVEs def cves references[:cve] || [] end # @return [ Array ] def cve_urls cves.reduce([]) { |acc, elem| acc << cve_url(elem) } end # @return [ String ] The URL to the CVE def cve_url(cve) "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-#{cve}" end # @return [ Array ] The ExploitDB ID def exploitdb_ids references[:exploitdb] || [] end # @return [ Array ] def exploitdb_urls exploitdb_ids.reduce([]) { |acc, elem| acc << exploitdb_url(elem) } end # @return [ String ] def exploitdb_url(id) "https://www.exploit-db.com/exploits/#{id}/" end # @return [ String ] def urls references[:url] || [] end # @return [ Array ] The metasploit modules def msf_modules references[:metasploit] || [] end # @return [ Array ] def msf_urls msf_modules.reduce([]) { |acc, elem| acc << msf_url(elem) } end # @return [ String ] The URL to the metasploit module page def msf_url(mod) "https://www.rapid7.com/db/modules/#{mod.sub(%r{^/}, '')}/" end # @return [ Array ] The Packetstormsecurity IDs def packetstorm_ids @packetstorm_ids ||= references[:packetstorm] || [] end # @return [ Array ] def packetstorm_urls packetstorm_ids.reduce([]) { |acc, elem| acc << packetstorm_url(elem) } end # @return [ String ] def packetstorm_url(id) "https://packetstormsecurity.com/files/#{id}/" end # @return [ Array ] The Security Focus IDs def securityfocus_ids references[:securityfocus] || [] end # @return [ Array ] def securityfocus_urls securityfocus_ids.reduce([]) { |acc, elem| acc << securityfocus_url(elem) } end # @return [ String ] def securityfocus_url(id) "https://www.securityfocus.com/bid/#{id}/" end # @return [ Array ] def youtube_urls references[:youtube] || [] end # @return [ String ] def youtube_url(id) "https://www.youtube.com/watch?v=#{id}" end end end