Module: StillActive::VulnerabilityHelper

Extended by:
VulnerabilityHelper
Included in:
VulnerabilityHelper
Defined in:
lib/helpers/vulnerability_helper.rb

Constant Summary collapse

SEVERITY_ORDER =
["low", "medium", "high", "critical"].freeze

Instance Method Summary collapse

Instance Method Details

#highest_severity(vulnerabilities) ⇒ Object



9
10
11
12
13
14
15
16
# File 'lib/helpers/vulnerability_helper.rb', line 9

def highest_severity(vulnerabilities)
  return if vulnerabilities.nil? || vulnerabilities.empty?

  max_score = vulnerabilities.filter_map { |v| v[:cvss3_score] || v[:cvss2_score] }.max
  return if max_score.nil?

  severity_label(max_score)
end

#merge_advisories(deps_dev:, ruby_advisory_db:) ⇒ Object

Combines advisories from deps.dev and ruby-advisory-db (via bundler-audit), deduplicating on shared identifiers. deps.dev is preferred for CVSS/title/url (it carries the vector string); ruby-advisory-db fills gaps. Advisories present in both sources are tagged source: “merged”; otherwise the per-source tag is kept.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/helpers/vulnerability_helper.rb', line 29

def merge_advisories(deps_dev:, ruby_advisory_db:)
  merged = deps_dev.map(&:dup)

  ruby_advisory_db.each do |advisory|
    existing = merged.find { |m| identifiers(m).intersect?(identifiers(advisory)) }
    if existing
      combine!(existing, advisory)
    else
      merged << advisory
    end
  end

  merged
end

#severity_at_or_above?(vulnerabilities, threshold) ⇒ Boolean

Returns:

  • (Boolean)


18
19
20
21
22
23
# File 'lib/helpers/vulnerability_helper.rb', line 18

def severity_at_or_above?(vulnerabilities, threshold)
  highest = highest_severity(vulnerabilities)
  return false if highest.nil?

  SEVERITY_ORDER.index(highest) >= SEVERITY_ORDER.index(threshold)
end