From 2dbbeffdcf21a3ffda510037a053c3cbc436f310 Mon Sep 17 00:00:00 2001 From: "Stanko K.R." Date: Mon, 2 Feb 2026 13:16:59 +0100 Subject: [PATCH] Fix SSL issues when reading remote ZIP files This is caused by our self-signed PureStorage certs. Once that's taken care of this commit can be reverted. --- app/models/zip_file.rb | 2 +- app/models/zip_file/remote_io.rb | 44 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 app/models/zip_file/remote_io.rb diff --git a/app/models/zip_file.rb b/app/models/zip_file.rb index b2760c1c4..2f135fd8d 100644 --- a/app/models/zip_file.rb +++ b/app/models/zip_file.rb @@ -65,7 +65,7 @@ class ZipFile def read_from_s3(blob) url = blob.url(expires_in: 6.hour) - remote_io = ZipKit::RemoteIO.new(url) + remote_io = RemoteIO.new(url) reader = Reader.new(remote_io) yield reader end diff --git a/app/models/zip_file/remote_io.rb b/app/models/zip_file/remote_io.rb new file mode 100644 index 000000000..1cb00831a --- /dev/null +++ b/app/models/zip_file/remote_io.rb @@ -0,0 +1,44 @@ +class ZipFile::RemoteIO < ZipKit::RemoteIO + protected + def request_range(range) + with_http do |http| + request = Net::HTTP::Get.new(@uri) + request.range = range + response = http.request(request) + + case response.code + when "206", "200" + response.body + else + raise "Remote at #{@uri} replied with code #{response.code}" + end + end + end + + def request_object_size + with_http do |http| + request = Net::HTTP::Get.new(@uri) + request.range = 0..0 + response = http.request(request) + + case response.code + when "206" + content_range_header_value = response["Content-Range"] + content_range_header_value.split("/").last.to_i + when "200" + response["Content-Length"].to_i + else + raise "Remote at #{@uri} replied with code #{response.code}" + end + end + end + + private + def with_http + http = Net::HTTP.new(@uri.hostname, @uri.port) + http.use_ssl = @uri.scheme == "https" + # FIXME: Disable SSL verification for now to avoid issues with our self-signed certificates for PureStorage + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + http.start { yield http } + end +end