[rubygems/rubygems] Diagnose when OpenSSL can't be loaded.
https://github.com/rubygems/rubygems/commit/e6aa8aabcd
This commit is contained in:
parent
cda29294a9
commit
ae308ae523
@ -9,6 +9,9 @@ module Bundler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def run
|
def run
|
||||||
|
return unless openssl_installed?
|
||||||
|
|
||||||
|
output_ssl_environment
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
@ -28,5 +31,29 @@ module Bundler
|
|||||||
|
|
||||||
@verify_mode ||= mode.then {|mod| OpenSSL::SSL.const_get("verify_#{mod}".upcase) }
|
@verify_mode ||= mode.then {|mod| OpenSSL::SSL.const_get("verify_#{mod}".upcase) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def openssl_installed?
|
||||||
|
require "openssl"
|
||||||
|
|
||||||
|
true
|
||||||
|
rescue LoadError
|
||||||
|
Bundler.ui.warn(<<~MSG)
|
||||||
|
Oh no! Your Ruby doesn't have OpenSSL, so it can't connect to #{host}.
|
||||||
|
You'll need to recompile or reinstall Ruby with OpenSSL support and try again.
|
||||||
|
MSG
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def output_ssl_environment
|
||||||
|
Bundler.ui.info(<<~MESSAGE)
|
||||||
|
Here's your OpenSSL environment:
|
||||||
|
|
||||||
|
OpenSSL: #{OpenSSL::VERSION}
|
||||||
|
Compiled with: #{OpenSSL::OPENSSL_VERSION}
|
||||||
|
Loaded with: #{OpenSSL::OPENSSL_LIBRARY_VERSION}
|
||||||
|
MESSAGE
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -4,14 +4,6 @@
|
|||||||
require 'uri'
|
require 'uri'
|
||||||
require 'net/http'
|
require 'net/http'
|
||||||
|
|
||||||
begin
|
|
||||||
require 'openssl'
|
|
||||||
rescue LoadError
|
|
||||||
puts "Oh no! Your Ruby doesn't have OpenSSL, so it can't connect to #{host}.",
|
|
||||||
"You'll need to recompile or reinstall Ruby with OpenSSL support and try again."
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
# Some versions of Ruby need this require to do HTTPS
|
# Some versions of Ruby need this require to do HTTPS
|
||||||
require 'net/https'
|
require 'net/https'
|
||||||
@ -39,10 +31,6 @@ puts
|
|||||||
puts "Ruby: %s" % ruby_version
|
puts "Ruby: %s" % ruby_version
|
||||||
puts "RubyGems: %s" % Gem::VERSION if defined?(Gem::VERSION)
|
puts "RubyGems: %s" % Gem::VERSION if defined?(Gem::VERSION)
|
||||||
puts "Bundler: %s" % Bundler::VERSION if defined?(Bundler::VERSION)
|
puts "Bundler: %s" % Bundler::VERSION if defined?(Bundler::VERSION)
|
||||||
puts "OpenSSL: %s" % OpenSSL::VERSION if defined?(OpenSSL::VERSION)
|
|
||||||
puts "Compiled with: %s" % OpenSSL::OPENSSL_VERSION
|
|
||||||
puts "Loaded with: %s" % OpenSSL::OPENSSL_LIBRARY_VERSION if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
|
|
||||||
puts
|
|
||||||
|
|
||||||
def show_ssl_certs
|
def show_ssl_certs
|
||||||
puts "", "Below affect only Ruby net/http connections:"
|
puts "", "Below affect only Ruby net/http connections:"
|
||||||
|
@ -5,4 +5,42 @@ require "bundler/cli/doctor"
|
|||||||
require "bundler/cli/doctor/ssl"
|
require "bundler/cli/doctor/ssl"
|
||||||
|
|
||||||
RSpec.describe "bundle doctor ssl" do
|
RSpec.describe "bundle doctor ssl" do
|
||||||
|
before(:each) do
|
||||||
|
@previous_level = Bundler.ui.level
|
||||||
|
Bundler.ui.instance_variable_get(:@warning_history).clear
|
||||||
|
Bundler.ui.level = "info"
|
||||||
|
end
|
||||||
|
|
||||||
|
after(:each) do
|
||||||
|
Bundler.ui.level = @previous_level
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when a diagnostic fails" do
|
||||||
|
it "prints the diagnostic when openssl can't be loaded" do
|
||||||
|
subject = Bundler::CLI::Doctor::SSL.new({})
|
||||||
|
allow(subject).to receive(:require).with("openssl").and_raise(LoadError)
|
||||||
|
|
||||||
|
expected_err = <<~MSG
|
||||||
|
Oh no! Your Ruby doesn't have OpenSSL, so it can't connect to rubygems.org.
|
||||||
|
You'll need to recompile or reinstall Ruby with OpenSSL support and try again.
|
||||||
|
MSG
|
||||||
|
|
||||||
|
expect { subject.run }.to output("").to_stdout.and output(expected_err).to_stderr
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when no diagnostic fails" do
|
||||||
|
it "prints the SSL environment" do
|
||||||
|
expected_out = <<~MSG
|
||||||
|
Here's your OpenSSL environment:
|
||||||
|
|
||||||
|
OpenSSL: #{OpenSSL::VERSION}
|
||||||
|
Compiled with: #{OpenSSL::OPENSSL_VERSION}
|
||||||
|
Loaded with: #{OpenSSL::OPENSSL_LIBRARY_VERSION}
|
||||||
|
MSG
|
||||||
|
|
||||||
|
subject = Bundler::CLI::Doctor::SSL.new({})
|
||||||
|
expect { subject.run }.to output(expected_out).to_stdout.and output("").to_stderr
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user