rubygems-update 3.5.5 → 3.6.9
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 +606 -1
- data/CODE_OF_CONDUCT.md +79 -28
- data/Manifest.txt +114 -73
- data/README.md +16 -11
- data/bundler/CHANGELOG.md +506 -6
- data/bundler/README.md +2 -2
- data/bundler/bundler.gemspec +2 -2
- data/bundler/lib/bundler/build_metadata.rb +2 -2
- data/bundler/lib/bundler/checksum.rb +22 -12
- data/bundler/lib/bundler/cli/add.rb +3 -1
- data/bundler/lib/bundler/cli/binstubs.rb +1 -1
- data/bundler/lib/bundler/cli/check.rb +3 -3
- data/bundler/lib/bundler/cli/console.rb +8 -10
- data/bundler/lib/bundler/cli/doctor/diagnose.rb +167 -0
- data/bundler/lib/bundler/cli/doctor/ssl.rb +249 -0
- data/bundler/lib/bundler/cli/doctor.rb +27 -151
- data/bundler/lib/bundler/cli/exec.rb +1 -0
- data/bundler/lib/bundler/cli/fund.rb +1 -1
- data/bundler/lib/bundler/cli/gem.rb +13 -17
- data/bundler/lib/bundler/cli/info.rb +6 -6
- data/bundler/lib/bundler/cli/inject.rb +3 -3
- data/bundler/lib/bundler/cli/install.rb +14 -5
- data/bundler/lib/bundler/cli/issue.rb +3 -3
- data/bundler/lib/bundler/cli/lock.rb +32 -11
- data/bundler/lib/bundler/cli/outdated.rb +22 -22
- data/bundler/lib/bundler/cli/plugin.rb +3 -2
- data/bundler/lib/bundler/cli/pristine.rb +1 -1
- data/bundler/lib/bundler/cli/show.rb +3 -3
- data/bundler/lib/bundler/cli.rb +51 -107
- data/bundler/lib/bundler/compact_index_client/cache.rb +48 -73
- data/bundler/lib/bundler/compact_index_client/cache_file.rb +0 -5
- data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
- data/bundler/lib/bundler/compact_index_client/updater.rb +2 -12
- data/bundler/lib/bundler/compact_index_client.rb +51 -80
- data/bundler/lib/bundler/constants.rb +8 -1
- data/bundler/lib/bundler/current_ruby.rb +23 -33
- data/bundler/lib/bundler/definition.rb +485 -313
- data/bundler/lib/bundler/dependency.rb +92 -46
- data/bundler/lib/bundler/dsl.rb +135 -101
- data/bundler/lib/bundler/endpoint_specification.rb +30 -3
- data/bundler/lib/bundler/env.rb +1 -1
- data/bundler/lib/bundler/environment_preserver.rb +5 -23
- data/bundler/lib/bundler/errors.rb +53 -5
- data/bundler/lib/bundler/feature_flag.rb +3 -6
- data/bundler/lib/bundler/fetcher/compact_index.rb +16 -25
- data/bundler/lib/bundler/fetcher/downloader.rb +1 -1
- data/bundler/lib/bundler/fetcher.rb +14 -7
- data/bundler/lib/bundler/force_platform.rb +0 -2
- data/bundler/lib/bundler/friendly_errors.rb +1 -1
- data/bundler/lib/bundler/gem_helper.rb +1 -1
- data/bundler/lib/bundler/gem_helpers.rb +36 -19
- data/bundler/lib/bundler/gem_version_promoter.rb +42 -40
- data/bundler/lib/bundler/injector.rb +14 -16
- data/bundler/lib/bundler/inline.rb +42 -17
- data/bundler/lib/bundler/installer/gem_installer.rb +4 -3
- data/bundler/lib/bundler/installer/parallel_installer.rb +3 -2
- data/bundler/lib/bundler/installer/standalone.rb +2 -5
- data/bundler/lib/bundler/installer.rb +17 -41
- data/bundler/lib/bundler/lazy_specification.rb +117 -46
- data/bundler/lib/bundler/lockfile_generator.rb +1 -1
- data/bundler/lib/bundler/lockfile_parser.rb +18 -7
- data/bundler/lib/bundler/man/bundle-add.1 +44 -27
- data/bundler/lib/bundler/man/bundle-add.1.ronn +52 -23
- data/bundler/lib/bundler/man/bundle-binstubs.1 +9 -6
- data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
- data/bundler/lib/bundler/man/bundle-cache.1 +32 -4
- data/bundler/lib/bundler/man/bundle-cache.1.ronn +31 -2
- data/bundler/lib/bundler/man/bundle-check.1 +7 -5
- data/bundler/lib/bundler/man/bundle-check.1.ronn +7 -2
- data/bundler/lib/bundler/man/bundle-clean.1 +3 -3
- data/bundler/lib/bundler/man/bundle-config.1 +11 -15
- data/bundler/lib/bundler/man/bundle-config.1.ronn +12 -15
- data/bundler/lib/bundler/man/bundle-console.1 +4 -6
- data/bundler/lib/bundler/man/bundle-console.1.ronn +2 -7
- data/bundler/lib/bundler/man/bundle-doctor.1 +4 -4
- data/bundler/lib/bundler/man/bundle-doctor.1.ronn +1 -1
- data/bundler/lib/bundler/man/bundle-env.1 +9 -0
- data/bundler/lib/bundler/man/bundle-env.1.ronn +10 -0
- data/bundler/lib/bundler/man/bundle-exec.1 +9 -6
- data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -3
- data/bundler/lib/bundler/man/bundle-fund.1 +22 -0
- data/bundler/lib/bundler/man/bundle-fund.1.ronn +25 -0
- data/bundler/lib/bundler/man/bundle-gem.1 +25 -7
- data/bundler/lib/bundler/man/bundle-gem.1.ronn +38 -6
- data/bundler/lib/bundler/man/bundle-help.1 +3 -3
- data/bundler/lib/bundler/man/bundle-info.1 +7 -4
- data/bundler/lib/bundler/man/bundle-info.1.ronn +6 -2
- data/bundler/lib/bundler/man/bundle-init.1 +5 -5
- data/bundler/lib/bundler/man/bundle-init.1.ronn +3 -2
- data/bundler/lib/bundler/man/bundle-inject.1 +12 -4
- data/bundler/lib/bundler/man/bundle-inject.1.ronn +9 -1
- data/bundler/lib/bundler/man/bundle-install.1 +19 -16
- data/bundler/lib/bundler/man/bundle-install.1.ronn +24 -20
- data/bundler/lib/bundler/man/bundle-issue.1 +45 -0
- data/bundler/lib/bundler/man/bundle-issue.1.ronn +37 -0
- data/bundler/lib/bundler/man/bundle-licenses.1 +9 -0
- data/bundler/lib/bundler/man/bundle-licenses.1.ronn +10 -0
- data/bundler/lib/bundler/man/bundle-list.1 +3 -3
- data/bundler/lib/bundler/man/bundle-list.1.ronn +4 -1
- data/bundler/lib/bundler/man/bundle-lock.1 +23 -8
- data/bundler/lib/bundler/man/bundle-lock.1.ronn +25 -4
- data/bundler/lib/bundler/man/bundle-open.1 +4 -4
- data/bundler/lib/bundler/man/bundle-open.1.ronn +2 -1
- data/bundler/lib/bundler/man/bundle-outdated.1 +10 -7
- data/bundler/lib/bundler/man/bundle-outdated.1.ronn +8 -4
- data/bundler/lib/bundler/man/bundle-platform.1 +3 -3
- data/bundler/lib/bundler/man/bundle-plugin.1 +9 -6
- data/bundler/lib/bundler/man/bundle-plugin.1.ronn +7 -3
- data/bundler/lib/bundler/man/bundle-pristine.1 +3 -3
- data/bundler/lib/bundler/man/bundle-pristine.1.ronn +1 -1
- data/bundler/lib/bundler/man/bundle-remove.1 +3 -3
- data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -1
- data/bundler/lib/bundler/man/bundle-show.1 +7 -4
- data/bundler/lib/bundler/man/bundle-show.1.ronn +4 -0
- data/bundler/lib/bundler/man/bundle-update.1 +15 -9
- data/bundler/lib/bundler/man/bundle-update.1.ronn +14 -6
- data/bundler/lib/bundler/man/bundle-version.1 +3 -3
- data/bundler/lib/bundler/man/bundle-viz.1 +6 -6
- data/bundler/lib/bundler/man/bundle-viz.1.ronn +7 -3
- data/bundler/lib/bundler/man/bundle.1 +3 -3
- data/bundler/lib/bundler/man/gemfile.5 +7 -5
- data/bundler/lib/bundler/man/gemfile.5.ronn +8 -2
- data/bundler/lib/bundler/man/index.txt +4 -0
- data/bundler/lib/bundler/match_metadata.rb +13 -0
- data/bundler/lib/bundler/materialization.rb +59 -0
- data/bundler/lib/bundler/mirror.rb +3 -3
- data/bundler/lib/bundler/plugin/api/source.rb +5 -4
- data/bundler/lib/bundler/plugin/events.rb +24 -0
- data/bundler/lib/bundler/plugin/index.rb +5 -1
- data/bundler/lib/bundler/plugin/installer/path.rb +26 -0
- data/bundler/lib/bundler/plugin/installer.rb +37 -17
- data/bundler/lib/bundler/plugin/source_list.rb +4 -4
- data/bundler/lib/bundler/plugin.rb +21 -2
- data/bundler/lib/bundler/process_lock.rb +10 -14
- data/bundler/lib/bundler/remote_specification.rb +6 -1
- data/bundler/lib/bundler/resolver/base.rb +14 -3
- data/bundler/lib/bundler/resolver/candidate.rb +18 -27
- data/bundler/lib/bundler/resolver/package.rb +20 -3
- data/bundler/lib/bundler/resolver/spec_group.rb +22 -27
- data/bundler/lib/bundler/resolver/strategy.rb +40 -0
- data/bundler/lib/bundler/resolver.rb +114 -50
- data/bundler/lib/bundler/retry.rb +1 -1
- data/bundler/lib/bundler/ruby_dsl.rb +12 -3
- data/bundler/lib/bundler/ruby_version.rb +7 -1
- data/bundler/lib/bundler/rubygems_ext.rb +282 -125
- data/bundler/lib/bundler/rubygems_gem_installer.rb +40 -5
- data/bundler/lib/bundler/rubygems_integration.rb +29 -67
- data/bundler/lib/bundler/runtime.rb +48 -35
- data/bundler/lib/bundler/self_manager.rb +27 -7
- data/bundler/lib/bundler/settings.rb +32 -21
- data/bundler/lib/bundler/setup.rb +6 -0
- data/bundler/lib/bundler/shared_helpers.rb +39 -21
- data/bundler/lib/bundler/source/gemspec.rb +1 -4
- data/bundler/lib/bundler/source/git/git_proxy.rb +23 -6
- data/bundler/lib/bundler/source/git.rb +113 -41
- data/bundler/lib/bundler/source/metadata.rb +4 -3
- data/bundler/lib/bundler/source/path.rb +7 -18
- data/bundler/lib/bundler/source/rubygems/remote.rb +12 -4
- data/bundler/lib/bundler/source/rubygems.rb +54 -48
- data/bundler/lib/bundler/source.rb +2 -0
- data/bundler/lib/bundler/source_list.rb +53 -7
- data/bundler/lib/bundler/spec_set.rb +187 -88
- data/bundler/lib/bundler/stub_specification.rb +29 -2
- data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
- data/bundler/lib/bundler/templates/newgem/Gemfile.tt +1 -3
- data/bundler/lib/bundler/templates/newgem/README.md.tt +7 -3
- data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +15 -15
- data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -7
- data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
- data/bundler/lib/bundler/ui/shell.rb +24 -2
- data/bundler/lib/bundler/ui/silent.rb +12 -1
- data/bundler/lib/bundler/uri_credentials_filter.rb +3 -3
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +53 -3
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +11 -0
- data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +15 -13
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +68 -30
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +4 -24
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +1 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +20 -8
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +17 -29
- data/bundler/lib/bundler/vendor/securerandom/COPYING +56 -0
- data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +3 -5
- data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +11 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +1 -4
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +2 -2
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +2 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +9 -9
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +5 -21
- data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor.rb +11 -0
- data/bundler/lib/bundler/vendor/uri/COPYING +56 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +43 -16
- data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +3 -3
- data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +28 -37
- data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +2 -2
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +16 -9
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +26 -3
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri.rb +9 -9
- data/bundler/lib/bundler/vendored_net_http.rb +20 -5
- data/bundler/lib/bundler/vendored_securerandom.rb +12 -0
- data/bundler/lib/bundler/vendored_timeout.rb +7 -3
- data/bundler/lib/bundler/vendored_uri.rb +18 -1
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler/yaml_serializer.rb +12 -7
- data/bundler/lib/bundler.rb +89 -51
- data/{CONTRIBUTING.md → doc/rubygems/CONTRIBUTING.md} +10 -14
- data/{POLICIES.md → doc/rubygems/POLICIES.md} +81 -12
- data/exe/update_rubygems +1 -1
- data/lib/rubygems/basic_specification.rb +43 -10
- data/lib/rubygems/bundler_version_finder.rb +1 -1
- data/lib/rubygems/command.rb +1 -4
- data/lib/rubygems/command_manager.rb +5 -6
- data/lib/rubygems/commands/build_command.rb +2 -11
- data/lib/rubygems/commands/cleanup_command.rb +3 -13
- data/lib/rubygems/commands/contents_command.rb +17 -10
- data/lib/rubygems/commands/environment_command.rb +5 -0
- data/lib/rubygems/commands/exec_command.rb +18 -11
- data/lib/rubygems/commands/fetch_command.rb +14 -0
- data/lib/rubygems/commands/help_command.rb +2 -2
- data/lib/rubygems/commands/install_command.rb +0 -4
- data/lib/rubygems/commands/pristine_command.rb +30 -17
- data/lib/rubygems/commands/push_command.rb +31 -6
- data/lib/rubygems/commands/rdoc_command.rb +3 -10
- data/lib/rubygems/commands/rebuild_command.rb +262 -0
- data/lib/rubygems/commands/setup_command.rb +11 -16
- data/lib/rubygems/commands/sources_command.rb +2 -2
- data/lib/rubygems/commands/uninstall_command.rb +9 -4
- data/lib/rubygems/commands/unpack_command.rb +0 -6
- data/lib/rubygems/commands/update_command.rb +10 -17
- data/lib/rubygems/config_file.rb +45 -16
- data/lib/rubygems/core_ext/kernel_warn.rb +2 -6
- data/lib/rubygems/defaults.rb +6 -6
- data/lib/rubygems/dependency.rb +12 -16
- data/lib/rubygems/dependency_list.rb +1 -1
- data/lib/rubygems/deprecate.rb +79 -77
- data/lib/rubygems/errors.rb +2 -1
- data/lib/rubygems/exceptions.rb +2 -9
- data/lib/rubygems/ext/builder.rb +21 -8
- data/lib/rubygems/ext/cargo_builder.rb +12 -26
- data/lib/rubygems/ext/cmake_builder.rb +7 -2
- data/lib/rubygems/ext/configure_builder.rb +7 -2
- data/lib/rubygems/ext/ext_conf_builder.rb +9 -5
- data/lib/rubygems/ext/rake_builder.rb +7 -4
- data/lib/rubygems/gem_runner.rb +9 -0
- data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +1 -1
- data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -1
- data/lib/rubygems/gemcutter_utilities.rb +52 -26
- data/lib/rubygems/gemspec_helpers.rb +19 -0
- data/lib/rubygems/install_update_options.rb +5 -0
- data/lib/rubygems/installer.rb +31 -40
- data/lib/rubygems/local_remote_options.rb +8 -8
- data/lib/rubygems/package/tar_header.rb +31 -4
- data/lib/rubygems/package/tar_reader/entry.rb +1 -5
- data/lib/rubygems/package/tar_writer.rb +5 -4
- data/lib/rubygems/package.rb +13 -8
- data/lib/rubygems/platform.rb +7 -5
- data/lib/rubygems/psych_tree.rb +4 -0
- data/lib/rubygems/query_utils.rb +2 -2
- data/lib/rubygems/rdoc.rb +16 -3
- data/lib/rubygems/remote_fetcher.rb +3 -4
- data/lib/rubygems/request.rb +5 -5
- data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
- data/lib/rubygems/request_set.rb +1 -1
- data/lib/rubygems/requirement.rb +16 -12
- data/lib/rubygems/resolver/activation_request.rb +1 -1
- data/lib/rubygems/resolver/api_set/gem_parser.rb +2 -5
- data/lib/rubygems/resolver/api_set.rb +13 -8
- data/lib/rubygems/resolver/best_set.rb +0 -28
- data/lib/rubygems/resolver/composed_set.rb +3 -3
- data/lib/rubygems/resolver/git_set.rb +0 -1
- data/lib/rubygems/resolver/index_set.rb +2 -2
- data/lib/rubygems/resolver/spec_specification.rb +7 -0
- data/lib/rubygems/resolver.rb +7 -7
- data/lib/rubygems/s3_uri_signer.rb +3 -3
- data/lib/rubygems/safe_marshal/reader.rb +31 -14
- data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +29 -16
- data/lib/rubygems/safe_yaml.rb +10 -1
- data/lib/rubygems/security.rb +1 -1
- data/lib/rubygems/source/git.rb +22 -17
- data/lib/rubygems/source/installed.rb +3 -1
- data/lib/rubygems/source/local.rb +8 -4
- data/lib/rubygems/source/specific_file.rb +5 -3
- data/lib/rubygems/source.rb +10 -8
- data/lib/rubygems/source_list.rb +1 -1
- data/lib/rubygems/spec_fetcher.rb +47 -15
- data/lib/rubygems/specification.rb +107 -180
- data/lib/rubygems/specification_policy.rb +33 -13
- data/lib/rubygems/specification_record.rb +212 -0
- data/lib/rubygems/stub_specification.rb +32 -10
- data/lib/rubygems/target_rbconfig.rb +50 -0
- data/lib/rubygems/uninstaller.rb +42 -22
- data/lib/rubygems/uri.rb +6 -6
- data/lib/rubygems/util/licenses.rb +97 -1
- data/lib/rubygems/util.rb +1 -1
- data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph.rb +2 -2
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/errors.rb +1 -1
- data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/ui.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolution.rb +4 -4
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolver.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/state.rb +1 -1
- data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo.rb +2 -2
- data/lib/rubygems/vendor/net-http/COPYING +56 -0
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/generic_request.rb +9 -9
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/header.rb +3 -3
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/request.rb +3 -3
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/requests.rb +35 -30
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/response.rb +2 -2
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/responses.rb +6 -6
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/status.rb +1 -1
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http.rb +135 -51
- data/lib/rubygems/{net-http → vendor/net-http}/lib/net/https.rb +1 -1
- data/lib/rubygems/vendor/optparse/COPYING +56 -0
- data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +16 -0
- data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +8 -3
- data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
- data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +9 -0
- data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +158 -62
- data/lib/rubygems/vendor/resolv/COPYING +56 -0
- data/lib/rubygems/{resolv → vendor/resolv}/lib/resolv.rb +117 -49
- data/lib/rubygems/vendor/securerandom/COPYING +56 -0
- data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +102 -0
- data/lib/rubygems/vendor/timeout/.document +1 -0
- data/lib/rubygems/vendor/timeout/COPYING +56 -0
- data/lib/rubygems/{timeout → vendor/timeout}/lib/timeout.rb +10 -11
- data/lib/rubygems/vendor/tsort/.document +1 -0
- data/lib/rubygems/{tsort → vendor/tsort}/lib/tsort.rb +2 -2
- data/lib/rubygems/vendor/uri/.document +1 -0
- data/lib/rubygems/vendor/uri/COPYING +56 -0
- data/lib/rubygems/vendor/uri/lib/uri/common.rb +880 -0
- data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
- data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
- data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1579 -0
- data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
- data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
- data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
- data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
- data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
- data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
- data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
- data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
- data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
- data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
- data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
- data/lib/rubygems/vendored_molinillo.rb +3 -0
- data/lib/rubygems/vendored_net_http.rb +5 -0
- data/lib/rubygems/vendored_optparse.rb +3 -0
- data/lib/rubygems/vendored_securerandom.rb +3 -0
- data/lib/rubygems/vendored_timeout.rb +5 -0
- data/lib/rubygems/vendored_tsort.rb +3 -0
- data/lib/rubygems/version.rb +26 -9
- data/lib/rubygems/yaml_serializer.rb +12 -7
- data/lib/rubygems.rb +82 -47
- data/rubygems-update.gemspec +11 -6
- data/setup.rb +1 -1
- metadata +131 -86
- data/bundler/lib/bundler/compact_index_client/gem_parser.rb +0 -32
- data/lib/rubygems/net/http.rb +0 -3
- data/lib/rubygems/net-http/LICENSE.txt +0 -22
- data/lib/rubygems/net-http/lib/net/http/backward.rb +0 -40
- data/lib/rubygems/net-protocol/LICENSE.txt +0 -22
- data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
- data/lib/rubygems/optparse.rb +0 -3
- data/lib/rubygems/resolv/LICENSE.txt +0 -22
- data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/lib/rubygems/resolver/molinillo.rb +0 -3
- data/lib/rubygems/shellwords.rb +0 -3
- data/lib/rubygems/timeout/LICENSE.txt +0 -22
- data/lib/rubygems/timeout.rb +0 -3
- data/lib/rubygems/tsort/LICENSE.txt +0 -22
- data/lib/rubygems/tsort.rb +0 -3
- /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/fileutils}/COPYING +0 -0
- /data/{lib/rubygems/net-http → bundler/lib/bundler/vendor/securerandom}/.document +0 -0
- /data/{MAINTAINERS.txt → doc/MAINTAINERS.txt} +0 -0
- /data/{bundler → doc/bundler}/UPGRADING.md +0 -0
- /data/{UPGRADING.md → doc/rubygems/UPGRADING.md} +0 -0
- /data/lib/rubygems/{net-protocol → vendor/molinillo}/.document +0 -0
- /data/lib/rubygems/{resolver → vendor}/molinillo/LICENSE +0 -0
- /data/lib/rubygems/{optparse → vendor/net-http}/.document +0 -0
- /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/exceptions.rb +0 -0
- /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/proxy_delta.rb +0 -0
- /data/lib/rubygems/{resolv → vendor/net-protocol}/.document +0 -0
- /data/{bundler/lib/bundler/vendor/fileutils → lib/rubygems/vendor/net-protocol}/LICENSE.txt +0 -0
- /data/lib/rubygems/{net-protocol → vendor/net-protocol}/lib/net/protocol.rb +0 -0
- /data/lib/rubygems/{resolver/molinillo → vendor/optparse}/.document +0 -0
- /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
- /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
- /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
- /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
- /data/lib/rubygems/{timeout → vendor/resolv}/.document +0 -0
- /data/lib/rubygems/{tsort → vendor/securerandom}/.document +0 -0
- /data/{bundler/lib/bundler/vendor/uri → lib/rubygems/vendor/tsort}/LICENSE.txt +0 -0
|
@@ -126,7 +126,7 @@ module Bundler
|
|
|
126
126
|
end
|
|
127
127
|
|
|
128
128
|
def removable?
|
|
129
|
-
|
|
129
|
+
[:lock, :gem].include?(type)
|
|
130
130
|
end
|
|
131
131
|
|
|
132
132
|
def ==(other)
|
|
@@ -190,7 +190,7 @@ module Bundler
|
|
|
190
190
|
def replace(spec, checksum)
|
|
191
191
|
return unless checksum
|
|
192
192
|
|
|
193
|
-
lock_name = spec.
|
|
193
|
+
lock_name = spec.lock_name
|
|
194
194
|
@store_mutex.synchronize do
|
|
195
195
|
existing = fetch_checksum(lock_name, checksum.algo)
|
|
196
196
|
if !existing || existing.same_source?(checksum)
|
|
@@ -201,10 +201,12 @@ module Bundler
|
|
|
201
201
|
end
|
|
202
202
|
end
|
|
203
203
|
|
|
204
|
-
def
|
|
205
|
-
|
|
204
|
+
def missing?(spec)
|
|
205
|
+
@store[spec.lock_name].nil?
|
|
206
|
+
end
|
|
206
207
|
|
|
207
|
-
|
|
208
|
+
def register(spec, checksum)
|
|
209
|
+
register_checksum(spec.lock_name, checksum)
|
|
208
210
|
end
|
|
209
211
|
|
|
210
212
|
def merge!(other)
|
|
@@ -216,9 +218,9 @@ module Bundler
|
|
|
216
218
|
end
|
|
217
219
|
|
|
218
220
|
def to_lock(spec)
|
|
219
|
-
lock_name = spec.
|
|
221
|
+
lock_name = spec.lock_name
|
|
220
222
|
checksums = @store[lock_name]
|
|
221
|
-
if checksums
|
|
223
|
+
if checksums&.any?
|
|
222
224
|
"#{lock_name} #{checksums.values.map(&:to_lock).sort.join(",")}"
|
|
223
225
|
else
|
|
224
226
|
lock_name
|
|
@@ -229,11 +231,15 @@ module Bundler
|
|
|
229
231
|
|
|
230
232
|
def register_checksum(lock_name, checksum)
|
|
231
233
|
@store_mutex.synchronize do
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
234
|
+
if checksum
|
|
235
|
+
existing = fetch_checksum(lock_name, checksum.algo)
|
|
236
|
+
if existing
|
|
237
|
+
merge_checksum(lock_name, checksum, existing)
|
|
238
|
+
else
|
|
239
|
+
store_checksum(lock_name, checksum)
|
|
240
|
+
end
|
|
235
241
|
else
|
|
236
|
-
|
|
242
|
+
init_checksum(lock_name)
|
|
237
243
|
end
|
|
238
244
|
end
|
|
239
245
|
end
|
|
@@ -243,7 +249,11 @@ module Bundler
|
|
|
243
249
|
end
|
|
244
250
|
|
|
245
251
|
def store_checksum(lock_name, checksum)
|
|
246
|
-
(
|
|
252
|
+
init_checksum(lock_name)[checksum.algo] = checksum
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def init_checksum(lock_name)
|
|
256
|
+
@store[lock_name] ||= {}
|
|
247
257
|
end
|
|
248
258
|
|
|
249
259
|
def fetch_checksum(lock_name, algo)
|
|
@@ -12,6 +12,8 @@ module Bundler
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def run
|
|
15
|
+
Bundler.ui.level = "warn" if options[:quiet]
|
|
16
|
+
|
|
15
17
|
validate_options!
|
|
16
18
|
inject_dependencies
|
|
17
19
|
perform_bundle_install unless options["skip-install"]
|
|
@@ -34,7 +36,7 @@ module Bundler
|
|
|
34
36
|
end
|
|
35
37
|
|
|
36
38
|
def validate_options!
|
|
37
|
-
raise InvalidOption, "You
|
|
39
|
+
raise InvalidOption, "You cannot specify `--strict` and `--optimistic` at the same time." if options[:strict] && options[:optimistic]
|
|
38
40
|
|
|
39
41
|
# raise error when no gems are specified
|
|
40
42
|
raise InvalidOption, "Please specify gems to add." if gems.empty?
|
|
@@ -45,7 +45,7 @@ module Bundler
|
|
|
45
45
|
next
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
Bundler.settings.temporary(path:
|
|
48
|
+
Bundler.settings.temporary(path: Bundler.settings[:path] || Bundler.root) do
|
|
49
49
|
installer.generate_standalone_bundler_executable_stubs(spec, installer_opts)
|
|
50
50
|
end
|
|
51
51
|
else
|
|
@@ -15,9 +15,9 @@ module Bundler
|
|
|
15
15
|
definition.validate_runtime!
|
|
16
16
|
|
|
17
17
|
begin
|
|
18
|
-
definition.
|
|
18
|
+
definition.check!
|
|
19
19
|
not_installed = definition.missing_specs
|
|
20
|
-
rescue GemNotFound, SolveFailure
|
|
20
|
+
rescue GemNotFound, GitError, SolveFailure
|
|
21
21
|
Bundler.ui.error "Bundler can't satisfy your Gemfile's dependencies."
|
|
22
22
|
Bundler.ui.warn "Install missing gems with `bundle install`."
|
|
23
23
|
exit 1
|
|
@@ -32,7 +32,7 @@ module Bundler
|
|
|
32
32
|
Bundler.ui.error "This bundle has been frozen, but there is no #{SharedHelpers.relative_lockfile_path} present"
|
|
33
33
|
exit 1
|
|
34
34
|
else
|
|
35
|
-
|
|
35
|
+
definition.lock(true) unless options[:"dry-run"]
|
|
36
36
|
Bundler.ui.info "The Gemfile's dependencies are satisfied"
|
|
37
37
|
end
|
|
38
38
|
end
|
|
@@ -9,10 +9,6 @@ module Bundler
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def run
|
|
12
|
-
message = "bundle console will be replaced by `bin/console` generated by `bundle gem <name>`"
|
|
13
|
-
removed_message = "bundle console has been replaced by `bin/console` generated by `bundle gem <name>`"
|
|
14
|
-
Bundler::SharedHelpers.major_deprecation 2, message, removed_message: removed_message
|
|
15
|
-
|
|
16
12
|
group ? Bundler.require(:default, *group.split(" ").map!(&:to_sym)) : Bundler.require
|
|
17
13
|
ARGV.clear
|
|
18
14
|
|
|
@@ -24,9 +20,14 @@ module Bundler
|
|
|
24
20
|
require name
|
|
25
21
|
get_constant(name)
|
|
26
22
|
rescue LoadError
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
if name == "irb"
|
|
24
|
+
Bundler.ui.error "#{name} is not available"
|
|
25
|
+
exit 1
|
|
26
|
+
else
|
|
27
|
+
Bundler.ui.error "Couldn't load console #{name}, falling back to irb"
|
|
28
|
+
name = "irb"
|
|
29
|
+
retry
|
|
30
|
+
end
|
|
30
31
|
end
|
|
31
32
|
|
|
32
33
|
def get_constant(name)
|
|
@@ -36,9 +37,6 @@ module Bundler
|
|
|
36
37
|
"irb" => :IRB,
|
|
37
38
|
}[name]
|
|
38
39
|
Object.const_get(const_name)
|
|
39
|
-
rescue NameError
|
|
40
|
-
Bundler.ui.error "Could not find constant #{const_name}"
|
|
41
|
-
exit 1
|
|
42
40
|
end
|
|
43
41
|
end
|
|
44
42
|
end
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rbconfig"
|
|
4
|
+
require "shellwords"
|
|
5
|
+
|
|
6
|
+
module Bundler
|
|
7
|
+
class CLI::Doctor::Diagnose
|
|
8
|
+
DARWIN_REGEX = /\s+(.+) \(compatibility /
|
|
9
|
+
LDD_REGEX = /\t\S+ => (\S+) \(\S+\)/
|
|
10
|
+
|
|
11
|
+
attr_reader :options
|
|
12
|
+
|
|
13
|
+
def initialize(options)
|
|
14
|
+
@options = options
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def otool_available?
|
|
18
|
+
Bundler.which("otool")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def ldd_available?
|
|
22
|
+
Bundler.which("ldd")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def dylibs_darwin(path)
|
|
26
|
+
output = `/usr/bin/otool -L #{path.shellescape}`.chomp
|
|
27
|
+
dylibs = output.split("\n")[1..-1].filter_map {|l| l.match(DARWIN_REGEX)&.match(1) }.uniq
|
|
28
|
+
# ignore @rpath and friends
|
|
29
|
+
dylibs.reject {|dylib| dylib.start_with? "@" }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def dylibs_ldd(path)
|
|
33
|
+
output = `/usr/bin/ldd #{path.shellescape}`.chomp
|
|
34
|
+
output.split("\n").filter_map do |l|
|
|
35
|
+
match = l.match(LDD_REGEX)
|
|
36
|
+
next if match.nil?
|
|
37
|
+
match.captures[0]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def dylibs(path)
|
|
42
|
+
case RbConfig::CONFIG["host_os"]
|
|
43
|
+
when /darwin/
|
|
44
|
+
return [] unless otool_available?
|
|
45
|
+
dylibs_darwin(path)
|
|
46
|
+
when /(linux|solaris|bsd)/
|
|
47
|
+
return [] unless ldd_available?
|
|
48
|
+
dylibs_ldd(path)
|
|
49
|
+
else # Windows, etc.
|
|
50
|
+
Bundler.ui.warn("Dynamic library check not supported on this platform.")
|
|
51
|
+
[]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def bundles_for_gem(spec)
|
|
56
|
+
Dir.glob("#{spec.full_gem_path}/**/*.bundle")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def lookup_with_fiddle(path)
|
|
60
|
+
require "fiddle"
|
|
61
|
+
Fiddle.dlopen(path)
|
|
62
|
+
false
|
|
63
|
+
rescue Fiddle::DLError
|
|
64
|
+
true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def check!
|
|
68
|
+
require_relative "../check"
|
|
69
|
+
Bundler::CLI::Check.new({}).run
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def diagnose_ssl
|
|
73
|
+
require_relative "ssl"
|
|
74
|
+
Bundler::CLI::Doctor::SSL.new({}).run
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def run
|
|
78
|
+
Bundler.ui.level = "warn" if options[:quiet]
|
|
79
|
+
Bundler.settings.validate!
|
|
80
|
+
check!
|
|
81
|
+
diagnose_ssl if options[:ssl]
|
|
82
|
+
|
|
83
|
+
definition = Bundler.definition
|
|
84
|
+
broken_links = {}
|
|
85
|
+
|
|
86
|
+
definition.specs.each do |spec|
|
|
87
|
+
bundles_for_gem(spec).each do |bundle|
|
|
88
|
+
bad_paths = dylibs(bundle).select do |f|
|
|
89
|
+
lookup_with_fiddle(f)
|
|
90
|
+
end
|
|
91
|
+
if bad_paths.any?
|
|
92
|
+
broken_links[spec] ||= []
|
|
93
|
+
broken_links[spec].concat(bad_paths)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
permissions_valid = check_home_permissions
|
|
99
|
+
|
|
100
|
+
if broken_links.any?
|
|
101
|
+
message = "The following gems are missing OS dependencies:"
|
|
102
|
+
broken_links.flat_map do |spec, paths|
|
|
103
|
+
paths.uniq.map do |path|
|
|
104
|
+
"\n * #{spec.name}: #{path}"
|
|
105
|
+
end
|
|
106
|
+
end.sort.each {|m| message += m }
|
|
107
|
+
raise ProductionError, message
|
|
108
|
+
elsif permissions_valid
|
|
109
|
+
Bundler.ui.info "No issues found with the installed bundle"
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
private
|
|
114
|
+
|
|
115
|
+
def check_home_permissions
|
|
116
|
+
require "find"
|
|
117
|
+
files_not_readable = []
|
|
118
|
+
files_not_readable_and_owned_by_different_user = []
|
|
119
|
+
files_not_owned_by_current_user_but_still_readable = []
|
|
120
|
+
broken_symlinks = []
|
|
121
|
+
Find.find(Bundler.bundle_path.to_s).each do |f|
|
|
122
|
+
if !File.exist?(f)
|
|
123
|
+
broken_symlinks << f
|
|
124
|
+
elsif !File.readable?(f)
|
|
125
|
+
if File.stat(f).uid != Process.uid
|
|
126
|
+
files_not_readable_and_owned_by_different_user << f
|
|
127
|
+
else
|
|
128
|
+
files_not_readable << f
|
|
129
|
+
end
|
|
130
|
+
elsif File.stat(f).uid != Process.uid
|
|
131
|
+
files_not_owned_by_current_user_but_still_readable << f
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
ok = true
|
|
136
|
+
|
|
137
|
+
if broken_symlinks.any?
|
|
138
|
+
Bundler.ui.warn "Broken links exist in the Bundler home. Please report them to the offending gem's upstream repo. These files are:\n - #{broken_symlinks.join("\n - ")}"
|
|
139
|
+
|
|
140
|
+
ok = false
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
if files_not_owned_by_current_user_but_still_readable.any?
|
|
144
|
+
Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
|
|
145
|
+
"user, but are still readable. These files are:\n - #{files_not_owned_by_current_user_but_still_readable.join("\n - ")}"
|
|
146
|
+
|
|
147
|
+
ok = false
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
if files_not_readable_and_owned_by_different_user.any?
|
|
151
|
+
Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
|
|
152
|
+
"user, and are not readable. These files are:\n - #{files_not_readable_and_owned_by_different_user.join("\n - ")}"
|
|
153
|
+
|
|
154
|
+
ok = false
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
if files_not_readable.any?
|
|
158
|
+
Bundler.ui.warn "Files exist in the Bundler home that are not " \
|
|
159
|
+
"readable by the current user. These files are:\n - #{files_not_readable.join("\n - ")}"
|
|
160
|
+
|
|
161
|
+
ok = false
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
ok
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rubygems/remote_fetcher"
|
|
4
|
+
require "uri"
|
|
5
|
+
|
|
6
|
+
module Bundler
|
|
7
|
+
class CLI::Doctor::SSL
|
|
8
|
+
attr_reader :options
|
|
9
|
+
|
|
10
|
+
def initialize(options)
|
|
11
|
+
@options = options
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def run
|
|
15
|
+
return unless openssl_installed?
|
|
16
|
+
|
|
17
|
+
output_ssl_environment
|
|
18
|
+
bundler_success = bundler_connection_successful?
|
|
19
|
+
rubygem_success = rubygem_connection_successful?
|
|
20
|
+
|
|
21
|
+
return unless net_http_connection_successful?
|
|
22
|
+
|
|
23
|
+
Explanation.summarize(bundler_success, rubygem_success, host)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def host
|
|
29
|
+
@options[:host] || "rubygems.org"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def tls_version
|
|
33
|
+
@options[:"tls-version"].then do |version|
|
|
34
|
+
"TLS#{version.sub(".", "_")}".to_sym if version
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def verify_mode
|
|
39
|
+
mode = @options[:"verify-mode"] || :peer
|
|
40
|
+
|
|
41
|
+
@verify_mode ||= mode.then {|mod| OpenSSL::SSL.const_get("verify_#{mod}".upcase) }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def uri
|
|
45
|
+
@uri ||= URI("https://#{host}")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def openssl_installed?
|
|
49
|
+
require "openssl"
|
|
50
|
+
|
|
51
|
+
true
|
|
52
|
+
rescue LoadError
|
|
53
|
+
Bundler.ui.warn(<<~MSG)
|
|
54
|
+
Oh no! Your Ruby doesn't have OpenSSL, so it can't connect to #{host}.
|
|
55
|
+
You'll need to recompile or reinstall Ruby with OpenSSL support and try again.
|
|
56
|
+
MSG
|
|
57
|
+
|
|
58
|
+
false
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def output_ssl_environment
|
|
62
|
+
Bundler.ui.info(<<~MESSAGE)
|
|
63
|
+
Here's your OpenSSL environment:
|
|
64
|
+
|
|
65
|
+
OpenSSL: #{OpenSSL::VERSION}
|
|
66
|
+
Compiled with: #{OpenSSL::OPENSSL_VERSION}
|
|
67
|
+
Loaded with: #{OpenSSL::OPENSSL_LIBRARY_VERSION}
|
|
68
|
+
MESSAGE
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def bundler_connection_successful?
|
|
72
|
+
Bundler.ui.info("\nTrying connections to #{uri}:\n")
|
|
73
|
+
|
|
74
|
+
bundler_uri = Gem::URI(uri.to_s)
|
|
75
|
+
Bundler::Fetcher.new(
|
|
76
|
+
Bundler::Source::Rubygems::Remote.new(bundler_uri)
|
|
77
|
+
).send(:connection).request(bundler_uri)
|
|
78
|
+
|
|
79
|
+
Bundler.ui.info("Bundler: success")
|
|
80
|
+
|
|
81
|
+
true
|
|
82
|
+
rescue StandardError => error
|
|
83
|
+
Bundler.ui.warn("Bundler: failed (#{Explanation.explain_bundler_or_rubygems_error(error)})")
|
|
84
|
+
|
|
85
|
+
false
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def rubygem_connection_successful?
|
|
89
|
+
Gem::RemoteFetcher.fetcher.fetch_path(uri)
|
|
90
|
+
Bundler.ui.info("RubyGems: success")
|
|
91
|
+
|
|
92
|
+
true
|
|
93
|
+
rescue StandardError => error
|
|
94
|
+
Bundler.ui.warn("RubyGems: failed (#{Explanation.explain_bundler_or_rubygems_error(error)})")
|
|
95
|
+
|
|
96
|
+
false
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def net_http_connection_successful?
|
|
100
|
+
::Gem::Net::HTTP.new(uri.host, uri.port).tap do |http|
|
|
101
|
+
http.use_ssl = true
|
|
102
|
+
http.min_version = tls_version
|
|
103
|
+
http.max_version = tls_version
|
|
104
|
+
http.verify_mode = verify_mode
|
|
105
|
+
end.start
|
|
106
|
+
|
|
107
|
+
Bundler.ui.info("Ruby net/http: success")
|
|
108
|
+
warn_on_unsupported_tls12
|
|
109
|
+
|
|
110
|
+
true
|
|
111
|
+
rescue StandardError => error
|
|
112
|
+
Bundler.ui.warn(<<~MSG)
|
|
113
|
+
Ruby net/http: failed
|
|
114
|
+
|
|
115
|
+
Unfortunately, this Ruby can't connect to #{host}.
|
|
116
|
+
|
|
117
|
+
#{Explanation.explain_net_http_error(error, host, tls_version)}
|
|
118
|
+
MSG
|
|
119
|
+
|
|
120
|
+
false
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def warn_on_unsupported_tls12
|
|
124
|
+
ctx = OpenSSL::SSL::SSLContext.new
|
|
125
|
+
supported = true
|
|
126
|
+
|
|
127
|
+
if ctx.respond_to?(:min_version=)
|
|
128
|
+
begin
|
|
129
|
+
ctx.min_version = ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION
|
|
130
|
+
rescue OpenSSL::SSL::SSLError, NameError
|
|
131
|
+
supported = false
|
|
132
|
+
end
|
|
133
|
+
else
|
|
134
|
+
supported = OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1_2) # rubocop:disable Naming/VariableNumber
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
Bundler.ui.warn(<<~EOM) unless supported
|
|
138
|
+
|
|
139
|
+
WARNING: Although your Ruby can connect to #{host} today, your OpenSSL is very old!
|
|
140
|
+
WARNING: You will need to upgrade OpenSSL to use #{host}.
|
|
141
|
+
|
|
142
|
+
EOM
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
module Explanation
|
|
146
|
+
extend self
|
|
147
|
+
|
|
148
|
+
def explain_bundler_or_rubygems_error(error)
|
|
149
|
+
case error.message
|
|
150
|
+
when /certificate verify failed/
|
|
151
|
+
"certificate verification"
|
|
152
|
+
when /read server hello A/
|
|
153
|
+
"SSL/TLS protocol version mismatch"
|
|
154
|
+
when /tlsv1 alert protocol version/
|
|
155
|
+
"requested TLS version is too old"
|
|
156
|
+
else
|
|
157
|
+
error.message
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def explain_net_http_error(error, host, tls_version)
|
|
162
|
+
case error.message
|
|
163
|
+
# Check for certificate errors
|
|
164
|
+
when /certificate verify failed/
|
|
165
|
+
<<~MSG
|
|
166
|
+
#{show_ssl_certs}
|
|
167
|
+
Your Ruby can't connect to #{host} because you are missing the certificate files OpenSSL needs to verify you are connecting to the genuine #{host} servers.
|
|
168
|
+
MSG
|
|
169
|
+
# Check for TLS version errors
|
|
170
|
+
when /read server hello A/, /tlsv1 alert protocol version/
|
|
171
|
+
if tls_version.to_s == "TLS1_3"
|
|
172
|
+
"Your Ruby can't connect to #{host} because #{tls_version} isn't supported yet.\n"
|
|
173
|
+
else
|
|
174
|
+
<<~MSG
|
|
175
|
+
Your Ruby can't connect to #{host} because your version of OpenSSL is too old.
|
|
176
|
+
You'll need to upgrade your OpenSSL install and/or recompile Ruby to use a newer OpenSSL.
|
|
177
|
+
MSG
|
|
178
|
+
end
|
|
179
|
+
# OpenSSL doesn't support TLS version specified by argument
|
|
180
|
+
when /unknown SSL method/
|
|
181
|
+
"Your Ruby can't connect because #{tls_version} isn't supported by your version of OpenSSL."
|
|
182
|
+
else
|
|
183
|
+
<<~MSG
|
|
184
|
+
Even worse, we're not sure why.
|
|
185
|
+
|
|
186
|
+
Here's the full error information:
|
|
187
|
+
#{error.class}: #{error.message}
|
|
188
|
+
#{error.backtrace.join("\n ")}
|
|
189
|
+
|
|
190
|
+
You might have more luck using Mislav's SSL doctor.rb script. You can get it here:
|
|
191
|
+
https://github.com/mislav/ssl-tools/blob/8b3dec4/doctor.rb
|
|
192
|
+
|
|
193
|
+
Read more about the script and how to use it in this blog post:
|
|
194
|
+
https://mislav.net/2013/07/ruby-openssl/
|
|
195
|
+
MSG
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def summarize(bundler_success, rubygems_success, host)
|
|
200
|
+
guide_url = "http://ruby.to/ssl-check-failed"
|
|
201
|
+
|
|
202
|
+
message = if bundler_success && rubygems_success
|
|
203
|
+
<<~MSG
|
|
204
|
+
Hooray! This Ruby can connect to #{host}.
|
|
205
|
+
You are all set to use Bundler and RubyGems.
|
|
206
|
+
|
|
207
|
+
MSG
|
|
208
|
+
elsif !bundler_success && !rubygems_success
|
|
209
|
+
<<~MSG
|
|
210
|
+
For some reason, your Ruby installation can connect to #{host}, but neither RubyGems nor Bundler can.
|
|
211
|
+
The most likely fix is to manually upgrade RubyGems by following the instructions at #{guide_url}.
|
|
212
|
+
After you've done that, run `gem install bundler` to upgrade Bundler, and then run this script again to make sure everything worked. ❣
|
|
213
|
+
|
|
214
|
+
MSG
|
|
215
|
+
elsif !bundler_success
|
|
216
|
+
<<~MSG
|
|
217
|
+
Although your Ruby installation and RubyGems can both connect to #{host}, Bundler is having trouble.
|
|
218
|
+
The most likely way to fix this is to upgrade Bundler by running `gem install bundler`.
|
|
219
|
+
Run this script again after doing that to make sure everything is all set.
|
|
220
|
+
If you're still having trouble, check out the troubleshooting guide at #{guide_url}.
|
|
221
|
+
|
|
222
|
+
MSG
|
|
223
|
+
else
|
|
224
|
+
<<~MSG
|
|
225
|
+
It looks like Ruby and Bundler can connect to #{host}, but RubyGems itself cannot.
|
|
226
|
+
You can likely solve this by manually downloading and installing a RubyGems update.
|
|
227
|
+
Visit #{guide_url} for instructions on how to manually upgrade RubyGems.
|
|
228
|
+
|
|
229
|
+
MSG
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
Bundler.ui.info("\n#{message}")
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
private
|
|
236
|
+
|
|
237
|
+
def show_ssl_certs
|
|
238
|
+
ssl_cert_file = ENV["SSL_CERT_FILE"] || OpenSSL::X509::DEFAULT_CERT_FILE
|
|
239
|
+
ssl_cert_dir = ENV["SSL_CERT_DIR"] || OpenSSL::X509::DEFAULT_CERT_DIR
|
|
240
|
+
|
|
241
|
+
<<~MSG
|
|
242
|
+
Below affect only Ruby net/http connections:
|
|
243
|
+
SSL_CERT_FILE: #{File.exist?(ssl_cert_file) ? "exists #{ssl_cert_file}" : "is missing #{ssl_cert_file}"}
|
|
244
|
+
SSL_CERT_DIR: #{Dir.exist?(ssl_cert_dir) ? "exists #{ssl_cert_dir}" : "is missing #{ssl_cert_dir}"}
|
|
245
|
+
MSG
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|