Class: Hedra::Baseline

Inherits:
Object
  • Object
show all
Defined in:
lib/hedra/baseline.rb

Overview

Manage security baselines for comparison

Constant Summary collapse

BASELINE_DIR =
File.join(Config::CONFIG_DIR, 'baselines')

Instance Method Summary collapse

Constructor Details

#initializeBaseline

Returns a new instance of Baseline.



11
12
13
# File 'lib/hedra/baseline.rb', line 11

def initialize
  FileUtils.mkdir_p(BASELINE_DIR)
end

Instance Method Details

#compare(baseline_name, current_results) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/hedra/baseline.rb', line 52

def compare(baseline_name, current_results)
  baseline = load(baseline_name)
  baseline_results = baseline[:results]

  comparisons = []

  current_results.each do |current|
    baseline_result = baseline_results.find { |b| b[:url] == current[:url] }
    next unless baseline_result

    comparison = {
      url: current[:url],
      baseline_score: baseline_result[:score],
      current_score: current[:score],
      score_change: current[:score] - baseline_result[:score],
      new_findings: current[:findings] - baseline_result[:findings],
      resolved_findings: baseline_result[:findings] - current[:findings]
    }

    comparisons << comparison
  end

  comparisons
end

#delete(name) ⇒ Object

Raises:



45
46
47
48
49
50
# File 'lib/hedra/baseline.rb', line 45

def delete(name)
  baseline_file = File.join(BASELINE_DIR, "#{sanitize_name(name)}.json")
  raise Error, "Baseline not found: #{name}" unless File.exist?(baseline_file)

  File.delete(baseline_file)
end

#listObject



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/hedra/baseline.rb', line 32

def list
  Dir.glob(File.join(BASELINE_DIR, '*.json')).map do |file|
    data = JSON.parse(File.read(file), symbolize_names: true)
    {
      name: data[:name],
      created_at: data[:created_at],
      url_count: data[:results].length
    }
  end
rescue StandardError
  []
end

#load(name) ⇒ Object

Raises:



25
26
27
28
29
30
# File 'lib/hedra/baseline.rb', line 25

def load(name)
  baseline_file = File.join(BASELINE_DIR, "#{sanitize_name(name)}.json")
  raise Error, "Baseline not found: #{name}" unless File.exist?(baseline_file)

  JSON.parse(File.read(baseline_file), symbolize_names: true)
end

#save(name, results) ⇒ Object



15
16
17
18
19
20
21
22
23
# File 'lib/hedra/baseline.rb', line 15

def save(name, results)
  baseline_file = File.join(BASELINE_DIR, "#{sanitize_name(name)}.json")
  data = {
    name: name,
    created_at: Time.now.iso8601,
    results: results
  }
  File.write(baseline_file, JSON.pretty_generate(data))
end