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 +4 -4
- data/CHANGELOG.md +8 -0
- data/Formula/brew-vulns.rb +2 -2
- data/Rakefile +28 -0
- data/lib/brew/vulns/osv_client.rb +36 -21
- data/lib/brew/vulns/version.rb +1 -1
- data/lib/brew/vulns/vulnerability.rb +3 -0
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: def22990a8238cc399cb69619db068f1f21d556629fe25a3981d0982d61b01ef
|
|
4
|
+
data.tar.gz: 3d312ead98bf8ead3107c96bb3ab5281a19c84149ceb36cc94b28ed7bb55959e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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`)
|
data/Formula/brew-vulns.rb
CHANGED
|
@@ -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.
|
|
5
|
-
sha256 "
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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)
|
data/lib/brew/vulns/version.rb
CHANGED
|
@@ -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
|