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.["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 xml["nvd"]["entry"].each do |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
|