brew-vulns 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 72efd9c1dafe1b2b35c1f0ade267d45827870a12ad5d3d39104edbf18737d458
4
- data.tar.gz: 893b6844b30213daa63a16e0aa89b2c9fab619615b4fc467c8172f8303b91533
3
+ metadata.gz: def22990a8238cc399cb69619db068f1f21d556629fe25a3981d0982d61b01ef
4
+ data.tar.gz: 3d312ead98bf8ead3107c96bb3ab5281a19c84149ceb36cc94b28ed7bb55959e
5
5
  SHA512:
6
- metadata.gz: 673a4f8eb760b9e12eccab25ae324f514a480580497e5629c57483351f3a8e5fb93a9fe6573ce55e19e03430e9daebdf836335e2485c6f7f059cb5579e817c53
7
- data.tar.gz: eda56de2b35ab3406f6d1c74de3e4df9ad075e227cd76d08e534e5fa2326373f3bc3e520044bf3f1b98103dde0b5ac5e65ba0d087b8f112c9ab798b7b4709548
6
+ metadata.gz: b08361df563690652cfdf979a25b745330dd3eb3b4f907f3a801f3aaca4ddf59650cf715796bd1fb9327e88a1d06b18743ce694c1008c373e7dad5ce7108f818
7
+ data.tar.gz: a44bb1deeeed685c2453a2a12eec32585c09d1351fedff501dd5b35e638e7416b71bdeea4a6b88ebb903309b4bc332ed403579032c2488e607b703cfe7eb6cb4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.2] - 2026-01-25
4
+
5
+ - Add retry logic to OSV API requests (up to 3 attempts on timeout or connection errors)
6
+
7
+ ## [0.2.1] - 2026-01-08
8
+
9
+ - Fix severity extraction for OSS-Fuzz vulnerabilities by reading `ecosystem_specific.severity` from OSV data
10
+
3
11
  ## [0.2.0] - 2026-01-08
4
12
 
5
13
  - Add CycloneDX SBOM output with vulnerabilities (`--cyclonedx`)
@@ -1,8 +1,8 @@
1
1
  class BrewVulns < Formula
2
2
  desc "Check Homebrew packages for known vulnerabilities via osv.dev"
3
3
  homepage "https://github.com/andrew/brew-vulns"
4
- url "https://github.com/andrew/brew-vulns/archive/refs/tags/v0.1.0.tar.gz"
5
- sha256 "UPDATE_WITH_SHA256_AFTER_RELEASE"
4
+ url "https://github.com/andrew/brew-vulns/archive/refs/tags/v0.2.2.tar.gz"
5
+ sha256 "64abf7791eb7d04312c1fda9dc49a73f3702f5716ce18506324ed9f401fe2514"
6
6
  license "MIT"
7
7
 
8
8
  depends_on "ruby"
data/Rakefile CHANGED
@@ -2,7 +2,35 @@
2
2
 
3
3
  require "bundler/gem_tasks"
4
4
  require "minitest/test_task"
5
+ require "digest"
6
+ require "open-uri"
5
7
 
6
8
  Minitest::TestTask.create
7
9
 
8
10
  task default: :test
11
+
12
+ desc "Update Formula sha256 hash for current version"
13
+ task :update_formula do
14
+ require_relative "lib/brew/vulns/version"
15
+
16
+ version = Brew::Vulns::VERSION
17
+ url = "https://github.com/andrew/brew-vulns/archive/refs/tags/v#{version}.tar.gz"
18
+ formula_path = File.expand_path("Formula/brew-vulns.rb", __dir__)
19
+
20
+ puts "Downloading #{url}..."
21
+ tarball = URI.open(url).read
22
+ sha256 = Digest::SHA256.hexdigest(tarball)
23
+ puts "SHA256: #{sha256}"
24
+
25
+ formula = File.read(formula_path)
26
+ formula.gsub!(%r{url "https://github.com/andrew/brew-vulns/archive/refs/tags/v[^"]+\.tar\.gz"},
27
+ "url \"#{url}\"")
28
+ formula.gsub!(/sha256 "[^"]+"/, "sha256 \"#{sha256}\"")
29
+ File.write(formula_path, formula)
30
+
31
+ puts "Updated Formula/brew-vulns.rb"
32
+ end
33
+
34
+ Rake::Task["release"].enhance do
35
+ Rake::Task["update_formula"].invoke
36
+ end
@@ -11,6 +11,8 @@ module Brew
11
11
  BATCH_SIZE = 1000
12
12
  OPEN_TIMEOUT = 10
13
13
  READ_TIMEOUT = 30
14
+ MAX_RETRIES = 3
15
+ RETRY_DELAY = 1
14
16
 
15
17
  class Error < StandardError; end
16
18
  class ApiError < Error; end
@@ -78,28 +80,41 @@ module Brew
78
80
  end
79
81
 
80
82
  def execute_request(uri, request)
81
- http = Net::HTTP.new(uri.host, uri.port)
82
- http.use_ssl = uri.scheme == "https"
83
- http.verify_mode = OpenSSL::SSL::VERIFY_PEER
84
- http.open_timeout = OPEN_TIMEOUT
85
- http.read_timeout = READ_TIMEOUT
86
-
87
- response = http.request(request)
88
-
89
- case response
90
- when Net::HTTPSuccess
91
- JSON.parse(response.body)
92
- else
93
- raise ApiError, "OSV API error: #{response.code} #{response.message}"
83
+ attempts = 0
84
+
85
+ begin
86
+ attempts += 1
87
+ http = Net::HTTP.new(uri.host, uri.port)
88
+ http.use_ssl = uri.scheme == "https"
89
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
90
+ http.open_timeout = OPEN_TIMEOUT
91
+ http.read_timeout = READ_TIMEOUT
92
+
93
+ response = http.request(request)
94
+
95
+ case response
96
+ when Net::HTTPSuccess
97
+ JSON.parse(response.body)
98
+ else
99
+ raise ApiError, "OSV API error: #{response.code} #{response.message}"
100
+ end
101
+ rescue JSON::ParserError => e
102
+ raise ApiError, "Invalid JSON response from OSV API: #{e.message}"
103
+ rescue Net::OpenTimeout, Net::ReadTimeout => e
104
+ if attempts < MAX_RETRIES
105
+ sleep RETRY_DELAY
106
+ retry
107
+ end
108
+ raise ApiError, "OSV API timeout after #{attempts} attempts: #{e.message}"
109
+ rescue SocketError, Errno::ECONNREFUSED => e
110
+ if attempts < MAX_RETRIES
111
+ sleep RETRY_DELAY
112
+ retry
113
+ end
114
+ raise ApiError, "OSV API connection error after #{attempts} attempts: #{e.message}"
115
+ rescue OpenSSL::SSL::SSLError => e
116
+ raise ApiError, "OSV API SSL error: #{e.message}"
94
117
  end
95
- rescue JSON::ParserError => e
96
- raise ApiError, "Invalid JSON response from OSV API: #{e.message}"
97
- rescue Net::OpenTimeout, Net::ReadTimeout => e
98
- raise ApiError, "OSV API timeout: #{e.message}"
99
- rescue SocketError, Errno::ECONNREFUSED => e
100
- raise ApiError, "OSV API connection error: #{e.message}"
101
- rescue OpenSSL::SSL::SSLError => e
102
- raise ApiError, "OSV API SSL error: #{e.message}"
103
118
  end
104
119
 
105
120
  def fetch_all_pages(response, original_payload)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Brew
4
4
  module Vulns
5
- VERSION = "0.2.0"
5
+ VERSION = "0.2.2"
6
6
  end
7
7
  end
@@ -87,6 +87,9 @@ module Brew
87
87
  end
88
88
 
89
89
  data["affected"]&.each do |aff|
90
+ eco_sev = aff.dig("ecosystem_specific", "severity")
91
+ return normalize_severity(eco_sev) if eco_sev
92
+
90
93
  db_sev = aff.dig("database_specific", "severity")
91
94
  return normalize_severity(db_sev) if db_sev
92
95
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brew-vulns
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Nesbitt