Module: NVD::Feed::CVE

Defined in:
lib/nvd/feed/cve.rb

Constant Summary collapse

LOCATIONS =
{}

Class Method Summary collapse

Class Method Details

.fetch(tag, etag = nil) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/nvd/feed/cve.rb', line 9

def self.fetch(tag,etag=nil)
  retval = {}
  location = LOCATIONS[tag]
  return nil unless location
  etag = (NVD::Feed.etags[tag] || "" ) unless etag
  data = HTTParty.get(location, {:headers => {"If-None-Match" => etag}})
  NVD::Feed.etags[tag] = data.response.header["etag"]
  return NVD::Feed.etags[tag] if data.nil?
  if location.match(/gz$/)
    data = NVD::Feed.gunzip(data)
    if location.match(/\.xml/)
      xml = HTTParty::Parser.new(data, :xml).parse
      data = []
      binding.pry #unless xml["nvd"] && xml["nvd"]["entry"]
      xml["nvd"]["entry"].each do |item|
        # item = OpenStruct.new(item)
        item.each_pair do |k,v|
          v = v.detect {|i| i["lang"] == "en-US"} if v.is_a?(Array)
          item[k] = v["__content__"] if v["__content__"]
        end
        data << item
      end
      retval[tag] = data
    end
  end

  if data.class == HTTParty::Response
    response = []
    data["nvd"]["entry"].each do |item|
      item["cvss"].each do |k,v|
        v.each do |j,l|
          item["cvss"][k][j] = Time.parse(l) if j.to_s.include?("datetime")
          item["cvss"][k][j] = l.to_f if j.to_s.include?("score")
        end if v.is_a?(Hash)
      end if item["cvss"]
      refs = []
      [item["references"]].flatten.each do |r|
        r.each do |k,v|
          v = v.detect {|i| i["lang"] == "en-US"} if v.is_a?(Array)
          r[k] = v["href"] if v["__content__"] && v["href"]
        end if r
        refs << r
      end
      item["references"] = refs
      products = []
      products = [item["vulnerable_software_list"]["product"]].flatten if item["vulnerable_software_list"]
      item["vulnerable_software_list"] = products
      item.each do |k,v|
        item[k] = Time.parse(v) if k.to_s.include?("datetime")
      end
      response << item
    end
    retval = response
  end
  return retval
end

.fetch_allObject



66
67
68
69
70
71
72
73
74
# File 'lib/nvd/feed/cve.rb', line 66

def self.fetch_all
  retval = {}
  LOCATIONS.each do |tag, location|
    puts tag
    retval[tag] = fetch(tag)
    return retval
  end
  retval
end

.save_off(name, data) ⇒ Object



76
77
78
# File 'lib/nvd/feed/cve.rb', line 76

def self.save_off(name,data)

end