rubygems-update 3.3.18 → 3.3.22
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 +65 -0
- data/Manifest.txt +11 -0
- data/bin/gem +2 -2
- data/bin/update_rubygems +4 -4
- data/bundler/CHANGELOG.md +100 -0
- data/bundler/UPGRADING.md +11 -4
- data/bundler/bundler.gemspec +6 -8
- data/bundler/lib/bundler/build_metadata.rb +2 -2
- data/bundler/lib/bundler/cli/common.rb +1 -0
- data/bundler/lib/bundler/cli/install.rb +5 -2
- data/bundler/lib/bundler/cli/outdated.rb +12 -3
- data/bundler/lib/bundler/cli/platform.rb +1 -1
- data/bundler/lib/bundler/cli.rb +7 -4
- data/bundler/lib/bundler/current_ruby.rb +14 -5
- data/bundler/lib/bundler/definition.rb +102 -31
- data/bundler/lib/bundler/dependency.rb +18 -85
- data/bundler/lib/bundler/dsl.rb +2 -2
- data/bundler/lib/bundler/endpoint_specification.rb +2 -13
- data/bundler/lib/bundler/feature_flag.rb +0 -1
- data/bundler/lib/bundler/fetcher.rb +6 -6
- data/bundler/lib/bundler/gem_helpers.rb +7 -1
- data/bundler/lib/bundler/gem_version_promoter.rb +8 -18
- data/bundler/lib/bundler/index.rb +10 -12
- data/bundler/lib/bundler/injector.rb +2 -1
- data/bundler/lib/bundler/inline.rb +1 -1
- data/bundler/lib/bundler/installer/standalone.rb +1 -1
- data/bundler/lib/bundler/installer.rb +14 -12
- data/bundler/lib/bundler/lazy_specification.rb +30 -23
- data/bundler/lib/bundler/lockfile_generator.rb +1 -1
- data/bundler/lib/bundler/man/bundle-add.1 +6 -2
- data/bundler/lib/bundler/man/bundle-add.1.ronn +4 -1
- data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/bundler/lib/bundler/man/bundle-cache.1 +7 -1
- data/bundler/lib/bundler/man/bundle-cache.1.ronn +7 -0
- data/bundler/lib/bundler/man/bundle-check.1 +1 -1
- data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
- data/bundler/lib/bundler/man/bundle-config.1 +25 -6
- data/bundler/lib/bundler/man/bundle-config.1.ronn +16 -6
- data/bundler/lib/bundler/man/bundle-console.1 +53 -0
- data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
- data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
- data/bundler/lib/bundler/man/bundle-exec.1 +2 -2
- data/bundler/lib/bundler/man/bundle-exec.1.ronn +1 -1
- data/bundler/lib/bundler/man/bundle-gem.1 +1 -1
- data/bundler/lib/bundler/man/bundle-help.1 +13 -0
- data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
- data/bundler/lib/bundler/man/bundle-info.1 +1 -1
- data/bundler/lib/bundler/man/bundle-init.1 +1 -1
- data/bundler/lib/bundler/man/bundle-inject.1 +5 -2
- data/bundler/lib/bundler/man/bundle-inject.1.ronn +3 -1
- data/bundler/lib/bundler/man/bundle-install.1 +5 -1
- data/bundler/lib/bundler/man/bundle-install.1.ronn +6 -0
- data/bundler/lib/bundler/man/bundle-list.1 +1 -1
- data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
- data/bundler/lib/bundler/man/bundle-open.1 +1 -1
- data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
- data/bundler/lib/bundler/man/bundle-platform.1 +16 -6
- data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
- data/bundler/lib/bundler/man/bundle-plugin.1 +81 -0
- data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
- data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
- data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
- data/bundler/lib/bundler/man/bundle-show.1 +1 -1
- data/bundler/lib/bundler/man/bundle-update.1 +1 -1
- data/bundler/lib/bundler/man/bundle-version.1 +35 -0
- data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
- data/bundler/lib/bundler/man/bundle-viz.1 +4 -1
- data/bundler/lib/bundler/man/bundle-viz.1.ronn +2 -0
- data/bundler/lib/bundler/man/bundle.1 +15 -10
- data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
- data/bundler/lib/bundler/man/gemfile.5 +23 -47
- data/bundler/lib/bundler/man/gemfile.5.ronn +32 -43
- data/bundler/lib/bundler/man/index.txt +4 -0
- data/bundler/lib/bundler/match_metadata.rb +13 -0
- data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
- data/bundler/lib/bundler/plugin.rb +2 -0
- data/bundler/lib/bundler/remote_specification.rb +6 -11
- data/bundler/lib/bundler/resolver/base.rb +50 -0
- data/bundler/lib/bundler/resolver/spec_group.rb +11 -8
- data/bundler/lib/bundler/resolver.rb +95 -90
- data/bundler/lib/bundler/ruby_dsl.rb +1 -1
- data/bundler/lib/bundler/ruby_version.rb +5 -5
- data/bundler/lib/bundler/rubygems_ext.rb +52 -1
- data/bundler/lib/bundler/rubygems_gem_installer.rb +19 -12
- data/bundler/lib/bundler/settings.rb +1 -1
- data/bundler/lib/bundler/source/metadata.rb +1 -1
- data/bundler/lib/bundler/source_list.rb +4 -0
- data/bundler/lib/bundler/spec_set.rb +48 -33
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler.rb +3 -3
- data/lib/rubygems/available_set.rb +3 -3
- data/lib/rubygems/basic_specification.rb +4 -4
- data/lib/rubygems/command.rb +25 -25
- data/lib/rubygems/command_manager.rb +9 -9
- data/lib/rubygems/commands/build_command.rb +8 -8
- data/lib/rubygems/commands/cert_command.rb +33 -33
- data/lib/rubygems/commands/check_command.rb +20 -20
- data/lib/rubygems/commands/cleanup_command.rb +17 -17
- data/lib/rubygems/commands/contents_command.rb +13 -13
- data/lib/rubygems/commands/dependency_command.rb +16 -16
- data/lib/rubygems/commands/environment_command.rb +5 -5
- data/lib/rubygems/commands/fetch_command.rb +8 -8
- data/lib/rubygems/commands/generate_index_command.rb +17 -17
- data/lib/rubygems/commands/help_command.rb +3 -3
- data/lib/rubygems/commands/info_command.rb +3 -3
- data/lib/rubygems/commands/install_command.rb +20 -20
- data/lib/rubygems/commands/list_command.rb +3 -3
- data/lib/rubygems/commands/lock_command.rb +4 -4
- data/lib/rubygems/commands/mirror_command.rb +3 -3
- data/lib/rubygems/commands/open_command.rb +9 -9
- data/lib/rubygems/commands/outdated_command.rb +5 -5
- data/lib/rubygems/commands/owner_command.rb +11 -11
- data/lib/rubygems/commands/pristine_command.rb +36 -36
- data/lib/rubygems/commands/push_command.rb +8 -8
- data/lib/rubygems/commands/query_command.rb +8 -8
- data/lib/rubygems/commands/rdoc_command.rb +17 -17
- data/lib/rubygems/commands/search_command.rb +3 -3
- data/lib/rubygems/commands/server_command.rb +3 -3
- data/lib/rubygems/commands/setup_command.rb +96 -106
- data/lib/rubygems/commands/signin_command.rb +9 -9
- data/lib/rubygems/commands/signout_command.rb +7 -7
- data/lib/rubygems/commands/sources_command.rb +21 -21
- data/lib/rubygems/commands/specification_command.rb +13 -13
- data/lib/rubygems/commands/stale_command.rb +2 -2
- data/lib/rubygems/commands/uninstall_command.rb +40 -40
- data/lib/rubygems/commands/unpack_command.rb +12 -12
- data/lib/rubygems/commands/update_command.rb +40 -56
- data/lib/rubygems/commands/which_command.rb +7 -7
- data/lib/rubygems/commands/yank_command.rb +11 -11
- data/lib/rubygems/config_file.rb +21 -21
- data/lib/rubygems/core_ext/kernel_gem.rb +1 -1
- data/lib/rubygems/core_ext/kernel_require.rb +1 -1
- data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
- data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
- data/lib/rubygems/defaults.rb +16 -16
- data/lib/rubygems/dependency.rb +9 -9
- data/lib/rubygems/dependency_installer.rb +13 -13
- data/lib/rubygems/dependency_list.rb +6 -6
- data/lib/rubygems/doctor.rb +18 -18
- data/lib/rubygems/errors.rb +2 -2
- data/lib/rubygems/exceptions.rb +5 -5
- data/lib/rubygems/ext/build_error.rb +1 -1
- data/lib/rubygems/ext/builder.rb +16 -16
- data/lib/rubygems/ext/cargo_builder.rb +7 -7
- data/lib/rubygems/ext/cmake_builder.rb +2 -2
- data/lib/rubygems/ext/configure_builder.rb +1 -1
- data/lib/rubygems/ext/ext_conf_builder.rb +8 -8
- data/lib/rubygems/ext/rake_builder.rb +3 -3
- data/lib/rubygems/ext.rb +7 -7
- data/lib/rubygems/gem_runner.rb +5 -5
- data/lib/rubygems/gemcutter_utilities.rb +31 -28
- data/lib/rubygems/indexer.rb +27 -27
- data/lib/rubygems/install_default_message.rb +2 -2
- data/lib/rubygems/install_message.rb +2 -2
- data/lib/rubygems/install_update_options.rb +55 -55
- data/lib/rubygems/installer.rb +32 -40
- data/lib/rubygems/installer_uninstaller_utils.rb +2 -2
- data/lib/rubygems/local_remote_options.rb +18 -20
- data/lib/rubygems/mock_gem_ui.rb +2 -2
- data/lib/rubygems/name_tuple.rb +4 -4
- data/lib/rubygems/optparse.rb +1 -1
- data/lib/rubygems/package/file_source.rb +2 -2
- data/lib/rubygems/package/old.rb +8 -8
- data/lib/rubygems/package/tar_header.rb +50 -50
- data/lib/rubygems/package/tar_reader/entry.rb +2 -2
- data/lib/rubygems/package/tar_reader.rb +1 -1
- data/lib/rubygems/package/tar_writer.rb +7 -7
- data/lib/rubygems/package.rb +54 -43
- data/lib/rubygems/package_task.rb +4 -4
- data/lib/rubygems/platform.rb +66 -55
- data/lib/rubygems/psych_tree.rb +1 -1
- data/lib/rubygems/query_utils.rb +35 -35
- data/lib/rubygems/rdoc.rb +2 -2
- data/lib/rubygems/remote_fetcher.rb +22 -22
- data/lib/rubygems/request/connection_pools.rb +4 -4
- data/lib/rubygems/request/http_pool.rb +1 -1
- data/lib/rubygems/request.rb +22 -22
- data/lib/rubygems/request_set/gem_dependency_api.rb +18 -18
- data/lib/rubygems/request_set/lockfile/parser.rb +26 -26
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +4 -4
- data/lib/rubygems/request_set/lockfile.rb +5 -5
- data/lib/rubygems/request_set.rb +17 -17
- data/lib/rubygems/requirement.rb +6 -6
- data/lib/rubygems/resolver/activation_request.rb +3 -3
- data/lib/rubygems/resolver/api_set.rb +4 -4
- data/lib/rubygems/resolver/api_specification.rb +6 -6
- data/lib/rubygems/resolver/best_set.rb +5 -5
- data/lib/rubygems/resolver/conflict.rb +10 -10
- data/lib/rubygems/resolver/dependency_request.rb +2 -2
- data/lib/rubygems/resolver/git_set.rb +2 -2
- data/lib/rubygems/resolver/git_specification.rb +6 -6
- data/lib/rubygems/resolver/index_set.rb +3 -3
- data/lib/rubygems/resolver/index_specification.rb +6 -5
- data/lib/rubygems/resolver/installed_specification.rb +4 -4
- data/lib/rubygems/resolver/installer_set.rb +11 -16
- data/lib/rubygems/resolver/local_specification.rb +2 -2
- data/lib/rubygems/resolver/lock_set.rb +4 -4
- data/lib/rubygems/resolver/lock_specification.rb +4 -4
- data/lib/rubygems/resolver/molinillo.rb +1 -1
- data/lib/rubygems/resolver/specification.rb +1 -1
- data/lib/rubygems/resolver/vendor_set.rb +1 -1
- data/lib/rubygems/resolver/vendor_specification.rb +3 -3
- data/lib/rubygems/resolver.rb +39 -39
- data/lib/rubygems/s3_uri_signer.rb +6 -6
- data/lib/rubygems/safe_yaml.rb +2 -2
- data/lib/rubygems/security/policies.rb +11 -11
- data/lib/rubygems/security/policy.rb +18 -18
- data/lib/rubygems/security/signer.rb +5 -5
- data/lib/rubygems/security/trust_dir.rb +3 -3
- data/lib/rubygems/security.rb +28 -28
- data/lib/rubygems/security_option.rb +5 -5
- data/lib/rubygems/source/git.rb +21 -21
- data/lib/rubygems/source/installed.rb +1 -1
- data/lib/rubygems/source/local.rb +2 -2
- data/lib/rubygems/source/specific_file.rb +1 -1
- data/lib/rubygems/source.rb +16 -16
- data/lib/rubygems/spec_fetcher.rb +9 -9
- data/lib/rubygems/specification.rb +63 -62
- data/lib/rubygems/specification_policy.rb +15 -15
- data/lib/rubygems/stub_specification.rb +5 -5
- data/lib/rubygems/tsort.rb +1 -1
- data/lib/rubygems/uninstaller.rb +18 -18
- data/lib/rubygems/uri.rb +4 -4
- data/lib/rubygems/uri_formatter.rb +1 -1
- data/lib/rubygems/user_interaction.rb +33 -19
- data/lib/rubygems/util/licenses.rb +3 -3
- data/lib/rubygems/util.rb +10 -10
- data/lib/rubygems/validator.rb +5 -5
- data/lib/rubygems/version.rb +15 -9
- data/lib/rubygems/version_option.rb +3 -3
- data/lib/rubygems.rb +62 -61
- data/rubygems-update.gemspec +2 -2
- data/setup.rb +9 -9
- data/test/rubygems/helper.rb +132 -134
- data/test/rubygems/installer_test_case.rb +13 -13
- data/test/rubygems/package/tar_test_case.rb +2 -2
- data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -1
- data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -1
- data/test/rubygems/rubygems_plugin.rb +2 -2
- data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +4 -4
- data/test/rubygems/test_bundled_ca.rb +10 -10
- data/test/rubygems/test_config.rb +3 -3
- data/test/rubygems/test_deprecate.rb +3 -3
- data/test/rubygems/test_exit.rb +2 -2
- data/test/rubygems/test_gem.rb +342 -342
- data/test/rubygems/test_gem_available_set.rb +21 -21
- data/test/rubygems/test_gem_bundler_version_finder.rb +1 -1
- data/test/rubygems/test_gem_command.rb +44 -44
- data/test/rubygems/test_gem_command_manager.rb +29 -29
- data/test/rubygems/test_gem_commands_build_command.rb +63 -63
- data/test/rubygems/test_gem_commands_cert_command.rb +97 -99
- data/test/rubygems/test_gem_commands_check_command.rb +4 -4
- data/test/rubygems/test_gem_commands_cleanup_command.rb +40 -40
- data/test/rubygems/test_gem_commands_contents_command.rb +27 -27
- data/test/rubygems/test_gem_commands_dependency_command.rb +36 -36
- data/test/rubygems/test_gem_commands_environment_command.rb +16 -16
- data/test/rubygems/test_gem_commands_fetch_command.rb +37 -37
- data/test/rubygems/test_gem_commands_generate_index_command.rb +7 -7
- data/test/rubygems/test_gem_commands_help_command.rb +13 -13
- data/test/rubygems/test_gem_commands_info_command.rb +28 -2
- data/test/rubygems/test_gem_commands_install_command.rb +131 -131
- data/test/rubygems/test_gem_commands_list_command.rb +4 -4
- data/test/rubygems/test_gem_commands_lock_command.rb +10 -10
- data/test/rubygems/test_gem_commands_mirror.rb +2 -2
- data/test/rubygems/test_gem_commands_open_command.rb +4 -4
- data/test/rubygems/test_gem_commands_outdated_command.rb +9 -9
- data/test/rubygems/test_gem_commands_owner_command.rb +41 -41
- data/test/rubygems/test_gem_commands_pristine_command.rb +92 -92
- data/test/rubygems/test_gem_commands_push_command.rb +54 -54
- data/test/rubygems/test_gem_commands_query_command.rb +73 -73
- data/test/rubygems/test_gem_commands_search_command.rb +2 -2
- data/test/rubygems/test_gem_commands_server_command.rb +2 -2
- data/test/rubygems/test_gem_commands_setup_command.rb +119 -85
- data/test/rubygems/test_gem_commands_signin_command.rb +45 -31
- data/test/rubygems/test_gem_commands_signout_command.rb +3 -3
- data/test/rubygems/test_gem_commands_sources_command.rb +28 -29
- data/test/rubygems/test_gem_commands_specification_command.rb +32 -32
- data/test/rubygems/test_gem_commands_stale_command.rb +4 -4
- data/test/rubygems/test_gem_commands_uninstall_command.rb +75 -75
- data/test/rubygems/test_gem_commands_unpack_command.rb +31 -31
- data/test/rubygems/test_gem_commands_update_command.rb +89 -89
- data/test/rubygems/test_gem_commands_which_command.rb +6 -6
- data/test/rubygems/test_gem_commands_yank_command.rb +40 -40
- data/test/rubygems/test_gem_config_file.rb +93 -81
- data/test/rubygems/test_gem_dependency.rb +73 -73
- data/test/rubygems/test_gem_dependency_installer.rb +165 -165
- data/test/rubygems/test_gem_dependency_list.rb +47 -47
- data/test/rubygems/test_gem_dependency_resolution_error.rb +4 -4
- data/test/rubygems/test_gem_doctor.rb +26 -26
- data/test/rubygems/test_gem_ext_builder.rb +59 -59
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +6 -6
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +8 -8
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +6 -6
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +8 -8
- data/test/rubygems/test_gem_ext_cargo_builder.rb +26 -26
- data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +3 -3
- data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +23 -23
- data/test/rubygems/test_gem_ext_cmake_builder.rb +15 -15
- data/test/rubygems/test_gem_ext_configure_builder.rb +13 -13
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +51 -52
- data/test/rubygems/test_gem_ext_rake_builder.rb +15 -15
- data/test/rubygems/test_gem_gem_runner.rb +7 -7
- data/test/rubygems/test_gem_gemcutter_utilities.rb +66 -66
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +4 -4
- data/test/rubygems/test_gem_indexer.rb +48 -48
- data/test/rubygems/test_gem_install_update_options.rb +16 -16
- data/test/rubygems/test_gem_installer.rb +303 -300
- data/test/rubygems/test_gem_local_remote_options.rb +10 -10
- data/test/rubygems/test_gem_name_tuple.rb +4 -4
- data/test/rubygems/test_gem_package.rb +228 -206
- data/test/rubygems/test_gem_package_old.rb +13 -13
- data/test/rubygems/test_gem_package_tar_header.rb +42 -42
- data/test/rubygems/test_gem_package_tar_reader.rb +8 -8
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +10 -10
- data/test/rubygems/test_gem_package_tar_writer.rb +76 -76
- data/test/rubygems/test_gem_package_task.rb +18 -18
- data/test/rubygems/test_gem_path_support.rb +14 -14
- data/test/rubygems/test_gem_platform.rb +298 -227
- data/test/rubygems/test_gem_rdoc.rb +14 -14
- data/test/rubygems/test_gem_remote_fetcher.rb +149 -149
- data/test/rubygems/test_gem_request.rb +55 -55
- data/test/rubygems/test_gem_request_connection_pools.rb +29 -29
- data/test/rubygems/test_gem_request_set.rb +99 -99
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +204 -206
- data/test/rubygems/test_gem_request_set_lockfile.rb +86 -86
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +56 -56
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +62 -62
- data/test/rubygems/test_gem_requirement.rb +47 -41
- data/test/rubygems/test_gem_resolver.rb +133 -99
- data/test/rubygems/test_gem_resolver_activation_request.rb +6 -6
- data/test/rubygems/test_gem_resolver_api_set.rb +33 -33
- data/test/rubygems/test_gem_resolver_api_specification.rb +47 -47
- data/test/rubygems/test_gem_resolver_best_set.rb +22 -22
- data/test/rubygems/test_gem_resolver_composed_set.rb +1 -1
- data/test/rubygems/test_gem_resolver_conflict.rb +12 -12
- data/test/rubygems/test_gem_resolver_dependency_request.rb +15 -15
- data/test/rubygems/test_gem_resolver_git_set.rb +21 -21
- data/test/rubygems/test_gem_resolver_git_specification.rb +21 -21
- data/test/rubygems/test_gem_resolver_index_set.rb +12 -12
- data/test/rubygems/test_gem_resolver_index_specification.rb +16 -16
- data/test/rubygems/test_gem_resolver_installed_specification.rb +5 -5
- data/test/rubygems/test_gem_resolver_installer_set.rb +78 -34
- data/test/rubygems/test_gem_resolver_local_specification.rb +7 -7
- data/test/rubygems/test_gem_resolver_lock_set.rb +12 -12
- data/test/rubygems/test_gem_resolver_lock_specification.rb +17 -17
- data/test/rubygems/test_gem_resolver_requirement_list.rb +1 -1
- data/test/rubygems/test_gem_resolver_specification.rb +8 -8
- data/test/rubygems/test_gem_resolver_vendor_set.rb +6 -6
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +10 -10
- data/test/rubygems/test_gem_security.rb +67 -67
- data/test/rubygems/test_gem_security_policy.rb +62 -62
- data/test/rubygems/test_gem_security_signer.rb +28 -28
- data/test/rubygems/test_gem_security_trust_dir.rb +4 -4
- data/test/rubygems/test_gem_silent_ui.rb +38 -32
- data/test/rubygems/test_gem_source.rb +44 -44
- data/test/rubygems/test_gem_source_fetch_problem.rb +9 -9
- data/test/rubygems/test_gem_source_git.rb +59 -59
- data/test/rubygems/test_gem_source_installed.rb +16 -16
- data/test/rubygems/test_gem_source_list.rb +5 -5
- data/test/rubygems/test_gem_source_local.rb +14 -14
- data/test/rubygems/test_gem_source_lock.rb +31 -31
- data/test/rubygems/test_gem_source_specific_file.rb +17 -17
- data/test/rubygems/test_gem_source_subpath_problem.rb +7 -7
- data/test/rubygems/test_gem_source_vendor.rb +13 -13
- data/test/rubygems/test_gem_spec_fetcher.rb +72 -72
- data/test/rubygems/test_gem_specification.rb +444 -436
- data/test/rubygems/test_gem_stream_ui.rb +19 -19
- data/test/rubygems/test_gem_stub_specification.rb +32 -32
- data/test/rubygems/test_gem_text.rb +1 -1
- data/test/rubygems/test_gem_uninstaller.rb +112 -112
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +3 -3
- data/test/rubygems/test_gem_uri.rb +4 -4
- data/test/rubygems/test_gem_uri_formatter.rb +14 -14
- data/test/rubygems/test_gem_util.rb +23 -23
- data/test/rubygems/test_gem_validator.rb +8 -8
- data/test/rubygems/test_gem_version.rb +22 -15
- data/test/rubygems/test_gem_version_option.rb +15 -15
- data/test/rubygems/test_kernel.rb +31 -31
- data/test/rubygems/test_project_sanity.rb +1 -1
- data/test/rubygems/test_remote_fetch_error.rb +6 -6
- data/test/rubygems/test_require.rb +43 -43
- data/test/rubygems/test_rubygems.rb +8 -8
- data/test/rubygems/utilities.rb +19 -19
- metadata +14 -3
@@ -1,22 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require_relative
|
3
|
-
require
|
2
|
+
require_relative "helper"
|
3
|
+
require "rubygems/security"
|
4
4
|
|
5
5
|
unless Gem::HAVE_OPENSSL
|
6
|
-
warn
|
6
|
+
warn "Skipping Gem::Security tests. openssl not found."
|
7
7
|
end
|
8
8
|
|
9
9
|
if Gem.java_platform?
|
10
|
-
warn
|
10
|
+
warn "Skipping Gem::Security tests on jruby."
|
11
11
|
end
|
12
12
|
|
13
13
|
class TestGemSecurity < Gem::TestCase
|
14
|
-
CHILD_KEY = load_key
|
15
|
-
EC_KEY = load_key
|
14
|
+
CHILD_KEY = load_key "child"
|
15
|
+
EC_KEY = load_key "private_ec", "Foo bar"
|
16
16
|
|
17
|
-
ALTERNATE_CERT = load_cert
|
18
|
-
CHILD_CERT = load_cert
|
19
|
-
EXPIRED_CERT = load_cert
|
17
|
+
ALTERNATE_CERT = load_cert "child"
|
18
|
+
CHILD_CERT = load_cert "child"
|
19
|
+
EXPIRED_CERT = load_cert "expired"
|
20
20
|
|
21
21
|
def setup
|
22
22
|
super
|
@@ -42,19 +42,19 @@ class TestGemSecurity < Gem::TestCase
|
|
42
42
|
assert_equal 3, cert.extensions.length,
|
43
43
|
cert.extensions.map {|e| e.to_a.first }
|
44
44
|
|
45
|
-
constraints = cert.extensions.find {|ext| ext.oid ==
|
46
|
-
assert_equal
|
45
|
+
constraints = cert.extensions.find {|ext| ext.oid == "basicConstraints" }
|
46
|
+
assert_equal "CA:FALSE", constraints.value
|
47
47
|
|
48
|
-
key_usage = cert.extensions.find {|ext| ext.oid ==
|
49
|
-
assert_equal
|
48
|
+
key_usage = cert.extensions.find {|ext| ext.oid == "keyUsage" }
|
49
|
+
assert_equal "Digital Signature, Key Encipherment, Data Encipherment",
|
50
50
|
key_usage.value
|
51
51
|
|
52
|
-
key_ident = cert.extensions.find {|ext| ext.oid ==
|
52
|
+
key_ident = cert.extensions.find {|ext| ext.oid == "subjectKeyIdentifier" }
|
53
53
|
assert_equal 59, key_ident.value.length
|
54
|
-
assert_equal
|
54
|
+
assert_equal "5F:43:6E:F6:9A:8E:45:25:E9:22:E3:7D:37:5E:A4:D5:36:02:85:1B",
|
55
55
|
key_ident.value
|
56
56
|
|
57
|
-
assert_equal
|
57
|
+
assert_equal "", cert.issuer.to_s
|
58
58
|
assert_equal name.to_s, cert.subject.to_s
|
59
59
|
end
|
60
60
|
|
@@ -63,12 +63,12 @@ class TestGemSecurity < Gem::TestCase
|
|
63
63
|
|
64
64
|
cert = @SEC.create_cert_self_signed subject, PRIVATE_KEY, 60
|
65
65
|
|
66
|
-
assert_equal
|
66
|
+
assert_equal "/CN=nobody/DC=example", cert.issuer.to_s
|
67
67
|
assert_equal "sha256WithRSAEncryption", cert.signature_algorithm
|
68
68
|
end
|
69
69
|
|
70
70
|
def test_class_create_cert_email
|
71
|
-
email =
|
71
|
+
email = "nobody@example"
|
72
72
|
name = PUBLIC_CERT.subject
|
73
73
|
key = PRIVATE_KEY
|
74
74
|
|
@@ -87,37 +87,37 @@ class TestGemSecurity < Gem::TestCase
|
|
87
87
|
assert_equal 5, cert.extensions.length,
|
88
88
|
cert.extensions.map {|e| e.to_a.first }
|
89
89
|
|
90
|
-
constraints = cert.extensions.find {|ext| ext.oid ==
|
91
|
-
assert_equal
|
90
|
+
constraints = cert.extensions.find {|ext| ext.oid == "subjectAltName" }
|
91
|
+
assert_equal "email:nobody@example", constraints.value
|
92
92
|
|
93
|
-
constraints = cert.extensions.find {|ext| ext.oid ==
|
94
|
-
assert_equal
|
93
|
+
constraints = cert.extensions.find {|ext| ext.oid == "basicConstraints" }
|
94
|
+
assert_equal "CA:FALSE", constraints.value
|
95
95
|
|
96
|
-
key_usage = cert.extensions.find {|ext| ext.oid ==
|
97
|
-
assert_equal
|
96
|
+
key_usage = cert.extensions.find {|ext| ext.oid == "keyUsage" }
|
97
|
+
assert_equal "Digital Signature, Key Encipherment, Data Encipherment",
|
98
98
|
key_usage.value
|
99
99
|
|
100
|
-
key_ident = cert.extensions.find {|ext| ext.oid ==
|
100
|
+
key_ident = cert.extensions.find {|ext| ext.oid == "subjectKeyIdentifier" }
|
101
101
|
assert_equal 59, key_ident.value.length
|
102
|
-
assert_equal
|
102
|
+
assert_equal "5F:43:6E:F6:9A:8E:45:25:E9:22:E3:7D:37:5E:A4:D5:36:02:85:1B",
|
103
103
|
key_ident.value
|
104
104
|
end
|
105
105
|
|
106
106
|
def test_class_create_key
|
107
|
-
key = @SEC.create_key
|
107
|
+
key = @SEC.create_key "rsa"
|
108
108
|
|
109
109
|
assert_kind_of OpenSSL::PKey::RSA, key
|
110
110
|
end
|
111
111
|
|
112
112
|
def test_class_create_key_downcases
|
113
|
-
key = @SEC.create_key
|
113
|
+
key = @SEC.create_key "DSA"
|
114
114
|
|
115
115
|
assert_kind_of OpenSSL::PKey::DSA, key
|
116
116
|
end
|
117
117
|
|
118
118
|
def test_class_create_key_raises_unknown_algorithm
|
119
119
|
e = assert_raise Gem::Security::Exception do
|
120
|
-
@SEC.create_key
|
120
|
+
@SEC.create_key "NOT_RSA"
|
121
121
|
end
|
122
122
|
|
123
123
|
assert_equal "NOT_RSA algorithm not found. RSA, DSA, and EC algorithms are supported.",
|
@@ -137,17 +137,17 @@ class TestGemSecurity < Gem::TestCase
|
|
137
137
|
end
|
138
138
|
|
139
139
|
def test_class_email_to_name
|
140
|
-
assert_equal
|
141
|
-
@SEC.email_to_name(
|
140
|
+
assert_equal "/CN=nobody/DC=example",
|
141
|
+
@SEC.email_to_name("nobody@example").to_s
|
142
142
|
|
143
|
-
assert_equal
|
144
|
-
@SEC.email_to_name(
|
143
|
+
assert_equal "/CN=nobody/DC=example/DC=com",
|
144
|
+
@SEC.email_to_name("nobody@example.com").to_s
|
145
145
|
|
146
|
-
assert_equal
|
147
|
-
@SEC.email_to_name(
|
146
|
+
assert_equal "/CN=no.body/DC=example",
|
147
|
+
@SEC.email_to_name("no.body@example").to_s
|
148
148
|
|
149
|
-
assert_equal
|
150
|
-
@SEC.email_to_name(
|
149
|
+
assert_equal "/CN=no_body/DC=example",
|
150
|
+
@SEC.email_to_name("no+body@example").to_s
|
151
151
|
end
|
152
152
|
|
153
153
|
def test_class_re_sign
|
@@ -168,7 +168,7 @@ class TestGemSecurity < Gem::TestCase
|
|
168
168
|
end
|
169
169
|
|
170
170
|
child_alt_name = CHILD_CERT.extensions.find do |extension|
|
171
|
-
extension.oid ==
|
171
|
+
extension.oid == "subjectAltName"
|
172
172
|
end
|
173
173
|
|
174
174
|
assert_equal "#{child_alt_name.value} is not self-signed, contact " +
|
@@ -217,20 +217,20 @@ class TestGemSecurity < Gem::TestCase
|
|
217
217
|
assert_equal 4, signed.extensions.length,
|
218
218
|
signed.extensions.map {|e| e.to_a.first }
|
219
219
|
|
220
|
-
constraints = signed.extensions.find {|ext| ext.oid ==
|
221
|
-
assert_equal
|
220
|
+
constraints = signed.extensions.find {|ext| ext.oid == "issuerAltName" }
|
221
|
+
assert_equal "email:nobody@example", constraints.value, "issuerAltName"
|
222
222
|
|
223
|
-
constraints = signed.extensions.find {|ext| ext.oid ==
|
224
|
-
assert_equal
|
223
|
+
constraints = signed.extensions.find {|ext| ext.oid == "basicConstraints" }
|
224
|
+
assert_equal "CA:FALSE", constraints.value
|
225
225
|
|
226
|
-
key_usage = signed.extensions.find {|ext| ext.oid ==
|
227
|
-
assert_equal
|
226
|
+
key_usage = signed.extensions.find {|ext| ext.oid == "keyUsage" }
|
227
|
+
assert_equal "Digital Signature, Key Encipherment, Data Encipherment",
|
228
228
|
key_usage.value
|
229
229
|
|
230
230
|
key_ident =
|
231
|
-
signed.extensions.find {|ext| ext.oid ==
|
231
|
+
signed.extensions.find {|ext| ext.oid == "subjectKeyIdentifier" }
|
232
232
|
assert_equal 59, key_ident.value.length
|
233
|
-
assert_equal
|
233
|
+
assert_equal "5F:43:6E:F6:9A:8E:45:25:E9:22:E3:7D:37:5E:A4:D5:36:02:85:1B",
|
234
234
|
key_ident.value
|
235
235
|
|
236
236
|
assert signed.verify key
|
@@ -240,7 +240,7 @@ class TestGemSecurity < Gem::TestCase
|
|
240
240
|
issuer = PUBLIC_CERT.subject
|
241
241
|
signee = OpenSSL::X509::Name.parse "/CN=signee/DC=example"
|
242
242
|
|
243
|
-
cert = @SEC.create_cert_email
|
243
|
+
cert = @SEC.create_cert_email "signee@example", PRIVATE_KEY
|
244
244
|
|
245
245
|
signed = @SEC.sign cert, PRIVATE_KEY, PUBLIC_CERT, 60
|
246
246
|
|
@@ -256,23 +256,23 @@ class TestGemSecurity < Gem::TestCase
|
|
256
256
|
assert_equal 5, signed.extensions.length,
|
257
257
|
signed.extensions.map {|e| e.to_a.first }
|
258
258
|
|
259
|
-
constraints = signed.extensions.find {|ext| ext.oid ==
|
260
|
-
assert_equal
|
259
|
+
constraints = signed.extensions.find {|ext| ext.oid == "issuerAltName" }
|
260
|
+
assert_equal "email:nobody@example", constraints.value, "issuerAltName"
|
261
261
|
|
262
|
-
constraints = signed.extensions.find {|ext| ext.oid ==
|
263
|
-
assert_equal
|
262
|
+
constraints = signed.extensions.find {|ext| ext.oid == "subjectAltName" }
|
263
|
+
assert_equal "email:signee@example", constraints.value, "subjectAltName"
|
264
264
|
|
265
|
-
constraints = signed.extensions.find {|ext| ext.oid ==
|
266
|
-
assert_equal
|
265
|
+
constraints = signed.extensions.find {|ext| ext.oid == "basicConstraints" }
|
266
|
+
assert_equal "CA:FALSE", constraints.value
|
267
267
|
|
268
|
-
key_usage = signed.extensions.find {|ext| ext.oid ==
|
269
|
-
assert_equal
|
268
|
+
key_usage = signed.extensions.find {|ext| ext.oid == "keyUsage" }
|
269
|
+
assert_equal "Digital Signature, Key Encipherment, Data Encipherment",
|
270
270
|
key_usage.value
|
271
271
|
|
272
272
|
key_ident =
|
273
|
-
signed.extensions.find {|ext| ext.oid ==
|
273
|
+
signed.extensions.find {|ext| ext.oid == "subjectKeyIdentifier" }
|
274
274
|
assert_equal 59, key_ident.value.length
|
275
|
-
assert_equal
|
275
|
+
assert_equal "5F:43:6E:F6:9A:8E:45:25:E9:22:E3:7D:37:5E:A4:D5:36:02:85:1B",
|
276
276
|
key_ident.value
|
277
277
|
|
278
278
|
assert signed.verify PUBLIC_KEY
|
@@ -281,15 +281,15 @@ class TestGemSecurity < Gem::TestCase
|
|
281
281
|
def test_class_trust_dir
|
282
282
|
trust_dir = @SEC.trust_dir
|
283
283
|
|
284
|
-
expected = File.join Gem.user_home,
|
284
|
+
expected = File.join Gem.user_home, ".gem/trust"
|
285
285
|
|
286
286
|
assert_equal expected, trust_dir.dir
|
287
287
|
end
|
288
288
|
|
289
289
|
def test_class_write
|
290
|
-
key = @SEC.create_key
|
290
|
+
key = @SEC.create_key "rsa"
|
291
291
|
|
292
|
-
path = File.join @tempdir,
|
292
|
+
path = File.join @tempdir, "test-private_key.pem"
|
293
293
|
|
294
294
|
@SEC.write key, path
|
295
295
|
|
@@ -301,11 +301,11 @@ class TestGemSecurity < Gem::TestCase
|
|
301
301
|
end
|
302
302
|
|
303
303
|
def test_class_write_encrypted
|
304
|
-
key = @SEC.create_key
|
304
|
+
key = @SEC.create_key "rsa"
|
305
305
|
|
306
|
-
path = File.join @tempdir,
|
306
|
+
path = File.join @tempdir, "test-private_encrypted_key.pem"
|
307
307
|
|
308
|
-
passphrase =
|
308
|
+
passphrase = "It should be long."
|
309
309
|
|
310
310
|
@SEC.write key, path, 0600, passphrase
|
311
311
|
|
@@ -317,13 +317,13 @@ class TestGemSecurity < Gem::TestCase
|
|
317
317
|
end
|
318
318
|
|
319
319
|
def test_class_write_encrypted_cipher
|
320
|
-
key = @SEC.create_key
|
320
|
+
key = @SEC.create_key "rsa"
|
321
321
|
|
322
|
-
path = File.join @tempdir,
|
322
|
+
path = File.join @tempdir, "test-private_encrypted__with_non_default_cipher_key.pem"
|
323
323
|
|
324
|
-
passphrase =
|
324
|
+
passphrase = "It should be long."
|
325
325
|
|
326
|
-
cipher = OpenSSL::Cipher.new
|
326
|
+
cipher = OpenSSL::Cipher.new "AES-192-CBC"
|
327
327
|
|
328
328
|
@SEC.write key, path, 0600, passphrase, cipher
|
329
329
|
|
@@ -1,34 +1,34 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "helper"
|
4
4
|
|
5
5
|
unless Gem::HAVE_OPENSSL
|
6
|
-
warn
|
6
|
+
warn "Skipping Gem::Security::Policy tests. openssl not found."
|
7
7
|
end
|
8
8
|
|
9
9
|
class TestGemSecurityPolicy < Gem::TestCase
|
10
|
-
ALTERNATE_KEY = load_key
|
11
|
-
INVALID_KEY = load_key
|
12
|
-
CHILD_KEY = load_key
|
13
|
-
GRANDCHILD_KEY = load_key
|
14
|
-
INVALIDCHILD_KEY = load_key
|
15
|
-
|
16
|
-
ALTERNATE_CERT = load_cert
|
17
|
-
CA_CERT = load_cert
|
18
|
-
CHILD_CERT = load_cert
|
19
|
-
EXPIRED_CERT = load_cert
|
20
|
-
FUTURE_CERT = load_cert
|
21
|
-
GRANDCHILD_CERT = load_cert
|
22
|
-
INVALIDCHILD_CERT = load_cert
|
23
|
-
INVALID_ISSUER_CERT = load_cert
|
24
|
-
INVALID_SIGNER_CERT = load_cert
|
25
|
-
WRONG_KEY_CERT = load_cert
|
10
|
+
ALTERNATE_KEY = load_key "alternate"
|
11
|
+
INVALID_KEY = load_key "invalid"
|
12
|
+
CHILD_KEY = load_key "child"
|
13
|
+
GRANDCHILD_KEY = load_key "grandchild"
|
14
|
+
INVALIDCHILD_KEY = load_key "invalidchild"
|
15
|
+
|
16
|
+
ALTERNATE_CERT = load_cert "alternate"
|
17
|
+
CA_CERT = load_cert "ca"
|
18
|
+
CHILD_CERT = load_cert "child"
|
19
|
+
EXPIRED_CERT = load_cert "expired"
|
20
|
+
FUTURE_CERT = load_cert "future"
|
21
|
+
GRANDCHILD_CERT = load_cert "grandchild"
|
22
|
+
INVALIDCHILD_CERT = load_cert "invalidchild"
|
23
|
+
INVALID_ISSUER_CERT = load_cert "invalid_issuer"
|
24
|
+
INVALID_SIGNER_CERT = load_cert "invalid_signer"
|
25
|
+
WRONG_KEY_CERT = load_cert "wrong_key"
|
26
26
|
|
27
27
|
def setup
|
28
28
|
super
|
29
29
|
|
30
|
-
@spec = quick_gem
|
31
|
-
s.description =
|
30
|
+
@spec = quick_gem "a" do |s|
|
31
|
+
s.description = "π"
|
32
32
|
s.files = %w[lib/code.rb]
|
33
33
|
end
|
34
34
|
|
@@ -42,7 +42,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
42
42
|
@high = Gem::Security::HighSecurity
|
43
43
|
|
44
44
|
@chain = Gem::Security::Policy.new(
|
45
|
-
|
45
|
+
"Chain",
|
46
46
|
:verify_data => true,
|
47
47
|
:verify_signer => true,
|
48
48
|
:verify_chain => true,
|
@@ -52,7 +52,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
52
52
|
)
|
53
53
|
|
54
54
|
@root = Gem::Security::Policy.new(
|
55
|
-
|
55
|
+
"Root",
|
56
56
|
:verify_data => true,
|
57
57
|
:verify_signer => true,
|
58
58
|
:verify_chain => true,
|
@@ -63,7 +63,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def test_check_data
|
66
|
-
data = digest
|
66
|
+
data = digest "hello"
|
67
67
|
|
68
68
|
signature = sign data
|
69
69
|
|
@@ -71,17 +71,17 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def test_check_data_invalid
|
74
|
-
data = digest
|
74
|
+
data = digest "hello"
|
75
75
|
|
76
76
|
signature = sign data
|
77
77
|
|
78
|
-
invalid = digest
|
78
|
+
invalid = digest "hello!"
|
79
79
|
|
80
80
|
e = assert_raise Gem::Security::Exception do
|
81
81
|
@almost_no.check_data PUBLIC_KEY, @digest, signature, invalid
|
82
82
|
end
|
83
83
|
|
84
|
-
assert_equal
|
84
|
+
assert_equal "invalid signature", e.message
|
85
85
|
end
|
86
86
|
|
87
87
|
def test_check_chain
|
@@ -95,7 +95,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
95
95
|
@chain.check_chain [], Time.now
|
96
96
|
end
|
97
97
|
|
98
|
-
assert_equal
|
98
|
+
assert_equal "empty signing chain", e.message
|
99
99
|
end
|
100
100
|
|
101
101
|
def test_check_chain_invalid
|
@@ -115,7 +115,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
115
115
|
@chain.check_chain nil, Time.now
|
116
116
|
end
|
117
117
|
|
118
|
-
assert_equal
|
118
|
+
assert_equal "missing signing chain", e.message
|
119
119
|
end
|
120
120
|
|
121
121
|
def test_check_cert
|
@@ -161,7 +161,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
161
161
|
@high.check_cert(nil, nil, Time.now)
|
162
162
|
end
|
163
163
|
|
164
|
-
assert_equal
|
164
|
+
assert_equal "missing signing certificate", e.message
|
165
165
|
end
|
166
166
|
|
167
167
|
def test_check_key
|
@@ -175,7 +175,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
175
175
|
@high.check_key(nil, nil)
|
176
176
|
end
|
177
177
|
|
178
|
-
assert_equal
|
178
|
+
assert_equal "missing key or signature", e.message
|
179
179
|
end
|
180
180
|
|
181
181
|
def test_check_key_wrong_key
|
@@ -198,7 +198,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
198
198
|
@chain.check_root [], Time.now
|
199
199
|
end
|
200
200
|
|
201
|
-
assert_equal
|
201
|
+
assert_equal "missing root certificate", e.message
|
202
202
|
end
|
203
203
|
|
204
204
|
def test_check_root_invalid_signer
|
@@ -230,7 +230,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
230
230
|
@chain.check_root nil, Time.now
|
231
231
|
end
|
232
232
|
|
233
|
-
assert_equal
|
233
|
+
assert_equal "missing signing chain", e.message
|
234
234
|
end
|
235
235
|
|
236
236
|
def test_check_trust
|
@@ -250,7 +250,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
250
250
|
@chain.check_trust [], @digest, @trust_dir
|
251
251
|
end
|
252
252
|
|
253
|
-
assert_equal
|
253
|
+
assert_equal "missing root certificate", e.message
|
254
254
|
end
|
255
255
|
|
256
256
|
def test_check_trust_mismatch
|
@@ -269,7 +269,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
269
269
|
@chain.check_trust nil, @digest, @trust_dir
|
270
270
|
end
|
271
271
|
|
272
|
-
assert_equal
|
272
|
+
assert_equal "missing signing chain", e.message
|
273
273
|
end
|
274
274
|
|
275
275
|
def test_check_trust_no_trust
|
@@ -290,8 +290,8 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
290
290
|
end
|
291
291
|
|
292
292
|
def test_subject
|
293
|
-
assert_equal
|
294
|
-
assert_equal
|
293
|
+
assert_equal "email:nobody@example", @no.subject(PUBLIC_CERT)
|
294
|
+
assert_equal "/C=JP/ST=Tokyo/O=RubyGemsTest/CN=CA", @no.subject(CA_CERT)
|
295
295
|
end
|
296
296
|
|
297
297
|
def test_verify
|
@@ -319,7 +319,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
319
319
|
@almost_no.verify [PUBLIC_CERT], nil, {}, signatures
|
320
320
|
end
|
321
321
|
|
322
|
-
assert_equal
|
322
|
+
assert_equal "no digests provided (probable bug)", e.message
|
323
323
|
end
|
324
324
|
|
325
325
|
def test_verify_no_digests_no_security
|
@@ -331,7 +331,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
331
331
|
@no.verify [PUBLIC_CERT], nil, {}, signatures
|
332
332
|
end
|
333
333
|
|
334
|
-
assert_equal
|
334
|
+
assert_equal "missing digest for 0", e.message
|
335
335
|
end
|
336
336
|
|
337
337
|
def test_verify_no_signatures
|
@@ -340,7 +340,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
340
340
|
digests, = dummy_signatures
|
341
341
|
|
342
342
|
use_ui @ui do
|
343
|
-
@no.verify [PUBLIC_CERT], nil, digests, {},
|
343
|
+
@no.verify [PUBLIC_CERT], nil, digests, {}, "some_gem"
|
344
344
|
end
|
345
345
|
|
346
346
|
assert_match "WARNING: some_gem is not signed\n", @ui.error
|
@@ -354,7 +354,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
354
354
|
Gem::Security.trust_dir.trust_cert PUBLIC_CERT
|
355
355
|
|
356
356
|
use_ui @ui do
|
357
|
-
@no.verify [PUBLIC_CERT], nil, {}, {},
|
357
|
+
@no.verify [PUBLIC_CERT], nil, {}, {}, "some_gem"
|
358
358
|
end
|
359
359
|
|
360
360
|
assert_empty @ui.output
|
@@ -366,7 +366,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
366
366
|
|
367
367
|
digests, signatures = dummy_signatures
|
368
368
|
|
369
|
-
data = digest
|
369
|
+
data = digest "goodbye"
|
370
370
|
|
371
371
|
signatures[1] = PRIVATE_KEY.sign @digest.new, data.digest
|
372
372
|
|
@@ -374,14 +374,14 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
374
374
|
@almost_no.verify [PUBLIC_CERT], nil, digests, signatures
|
375
375
|
end
|
376
376
|
|
377
|
-
assert_equal
|
377
|
+
assert_equal "missing digest for 1", e.message
|
378
378
|
end
|
379
379
|
|
380
380
|
def test_verify_no_trust
|
381
381
|
digests, signatures = dummy_signatures
|
382
382
|
|
383
383
|
use_ui @ui do
|
384
|
-
@low.verify [PUBLIC_CERT], nil, digests, signatures,
|
384
|
+
@low.verify [PUBLIC_CERT], nil, digests, signatures, "some_gem"
|
385
385
|
end
|
386
386
|
|
387
387
|
assert_equal "WARNING: email:nobody@example is not trusted for some_gem\n",
|
@@ -395,18 +395,18 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
395
395
|
def test_verify_wrong_digest_type
|
396
396
|
Gem::Security.trust_dir.trust_cert PUBLIC_CERT
|
397
397
|
|
398
|
-
data = OpenSSL::Digest.new(
|
399
|
-
data <<
|
398
|
+
data = OpenSSL::Digest.new("SHA512")
|
399
|
+
data << "hello"
|
400
400
|
|
401
|
-
digests = {
|
402
|
-
signature = PRIVATE_KEY.sign
|
401
|
+
digests = { "SHA512" => { 0 => data } }
|
402
|
+
signature = PRIVATE_KEY.sign "sha512", data.digest
|
403
403
|
signatures = { 0 => signature }
|
404
404
|
|
405
405
|
e = assert_raise Gem::Security::Exception do
|
406
406
|
@almost_no.verify [PUBLIC_CERT], nil, digests, signatures
|
407
407
|
end
|
408
408
|
|
409
|
-
assert_equal
|
409
|
+
assert_equal "no digests provided (probable bug)", e.message
|
410
410
|
end
|
411
411
|
|
412
412
|
def test_verify_signatures_chain
|
@@ -448,17 +448,17 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
448
448
|
|
449
449
|
metadata_gz = Gem::Util.gzip @spec.to_yaml
|
450
450
|
|
451
|
-
package = Gem::Package.new
|
451
|
+
package = Gem::Package.new "nonexistent.gem"
|
452
452
|
package.checksums[Gem::Security::DIGEST_NAME] = {}
|
453
453
|
|
454
454
|
s = StringIO.new metadata_gz
|
455
|
-
def s.full_name()
|
455
|
+
def s.full_name() "metadata.gz" end
|
456
456
|
|
457
457
|
digests = package.digest s
|
458
|
-
metadata_gz_digest = digests[Gem::Security::DIGEST_NAME][
|
458
|
+
metadata_gz_digest = digests[Gem::Security::DIGEST_NAME]["metadata.gz"]
|
459
459
|
|
460
460
|
signatures = {}
|
461
|
-
signatures[
|
461
|
+
signatures["metadata.gz"] =
|
462
462
|
PRIVATE_KEY.sign @digest.new, metadata_gz_digest.digest
|
463
463
|
|
464
464
|
assert @high.verify_signatures @spec, digests, signatures
|
@@ -471,26 +471,26 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
471
471
|
|
472
472
|
metadata_gz = Gem::Util.gzip @spec.to_yaml
|
473
473
|
|
474
|
-
package = Gem::Package.new
|
474
|
+
package = Gem::Package.new "nonexistent.gem"
|
475
475
|
package.checksums[Gem::Security::DIGEST_NAME] = {}
|
476
476
|
|
477
477
|
s = StringIO.new metadata_gz
|
478
|
-
def s.full_name()
|
478
|
+
def s.full_name() "metadata.gz" end
|
479
479
|
|
480
480
|
digests = package.digest s
|
481
|
-
digests[Gem::Security::DIGEST_NAME][
|
481
|
+
digests[Gem::Security::DIGEST_NAME]["data.tar.gz"] = @digest.hexdigest "hello"
|
482
482
|
|
483
|
-
metadata_gz_digest = digests[Gem::Security::DIGEST_NAME][
|
483
|
+
metadata_gz_digest = digests[Gem::Security::DIGEST_NAME]["metadata.gz"]
|
484
484
|
|
485
485
|
signatures = {}
|
486
|
-
signatures[
|
486
|
+
signatures["metadata.gz"] =
|
487
487
|
PRIVATE_KEY.sign @digest.new, metadata_gz_digest.digest
|
488
488
|
|
489
489
|
e = assert_raise Gem::Security::Exception do
|
490
490
|
@high.verify_signatures @spec, digests, signatures
|
491
491
|
end
|
492
492
|
|
493
|
-
assert_equal
|
493
|
+
assert_equal "missing signature for data.tar.gz", e.message
|
494
494
|
end
|
495
495
|
|
496
496
|
def test_verify_signatures_none
|
@@ -500,14 +500,14 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
500
500
|
|
501
501
|
metadata_gz = Gem::Util.gzip @spec.to_yaml
|
502
502
|
|
503
|
-
package = Gem::Package.new
|
503
|
+
package = Gem::Package.new "nonexistent.gem"
|
504
504
|
package.checksums[Gem::Security::DIGEST_NAME] = {}
|
505
505
|
|
506
506
|
s = StringIO.new metadata_gz
|
507
|
-
def s.full_name()
|
507
|
+
def s.full_name() "metadata.gz" end
|
508
508
|
|
509
509
|
digests = package.digest s
|
510
|
-
digests[Gem::Security::DIGEST_NAME][
|
510
|
+
digests[Gem::Security::DIGEST_NAME]["data.tar.gz"] = @digest.hexdigest "hello"
|
511
511
|
|
512
512
|
assert_raise Gem::Security::Exception do
|
513
513
|
@high.verify_signatures @spec, digests, {}
|
@@ -525,7 +525,7 @@ class TestGemSecurityPolicy < Gem::TestCase
|
|
525
525
|
end
|
526
526
|
|
527
527
|
def dummy_signatures(key = PRIVATE_KEY)
|
528
|
-
data = digest
|
528
|
+
data = digest "hello"
|
529
529
|
|
530
530
|
digests = { Gem::Security::DIGEST_NAME => { 0 => data } }
|
531
531
|
signatures = { 0 => sign(data, key) }
|