rubygems-update 2.7.11 → 3.0.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/.rubocop.yml +67 -0
- data/.travis.yml +24 -18
- data/CODE_OF_CONDUCT.md +10 -8
- data/CONTRIBUTING.md +148 -0
- data/History.txt +458 -8
- data/MAINTAINERS.txt +1 -0
- data/Manifest.txt +16 -9
- data/POLICIES.md +92 -0
- data/README.md +53 -26
- data/Rakefile +77 -211
- data/{UPGRADING.rdoc → UPGRADING.md} +31 -32
- data/appveyor.yml +20 -45
- data/bin/gem +1 -2
- data/bin/update_rubygems +2 -3
- data/bundler/CHANGELOG.md +65 -0
- data/bundler/bundler.gemspec +7 -1
- data/bundler/lib/bundler/build_metadata.rb +1 -1
- data/bundler/lib/bundler/cli/add.rb +15 -5
- data/bundler/lib/bundler/cli/binstubs.rb +8 -2
- data/bundler/lib/bundler/cli/doctor.rb +47 -1
- data/bundler/lib/bundler/cli/install.rb +8 -5
- data/bundler/lib/bundler/cli/list.rb +41 -5
- data/bundler/lib/bundler/cli/outdated.rb +7 -1
- data/bundler/lib/bundler/cli/pristine.rb +4 -0
- data/bundler/lib/bundler/cli/remove.rb +18 -0
- data/bundler/lib/bundler/cli.rb +63 -21
- data/bundler/lib/bundler/definition.rb +15 -16
- data/bundler/lib/bundler/dependency.rb +2 -2
- data/bundler/lib/bundler/dsl.rb +19 -3
- data/bundler/lib/bundler/feature_flag.rb +7 -0
- data/bundler/lib/bundler/gem_version_promoter.rb +4 -2
- data/bundler/lib/bundler/injector.rb +168 -9
- data/bundler/lib/bundler/installer/parallel_installer.rb +5 -0
- data/bundler/lib/bundler/installer.rb +29 -6
- data/bundler/lib/bundler/plugin/events.rb +61 -0
- data/bundler/lib/bundler/plugin.rb +10 -3
- data/bundler/lib/bundler/resolver.rb +2 -2
- data/bundler/lib/bundler/rubygems_gem_installer.rb +7 -0
- data/bundler/lib/bundler/runtime.rb +8 -2
- data/bundler/lib/bundler/settings/validator.rb +23 -0
- data/bundler/lib/bundler/settings.rb +24 -3
- data/bundler/lib/bundler/shared_helpers.rb +19 -3
- data/bundler/lib/bundler/source/metadata.rb +2 -3
- data/bundler/lib/bundler/source.rb +9 -9
- data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler.rb +26 -8
- data/bundler/man/bundle-add.ronn +13 -2
- data/bundler/man/bundle-config.ronn +21 -0
- data/bundler/man/bundle-install.ronn +1 -1
- data/bundler/man/bundle-list.ronn +19 -1
- data/bundler/man/bundle-outdated.ronn +4 -0
- data/bundler/man/bundle-remove.ronn +23 -0
- data/bundler/man/bundle-update.ronn +1 -1
- data/bundler/man/bundle.ronn +3 -0
- data/lib/rubygems/available_set.rb +1 -1
- data/lib/rubygems/basic_specification.rb +12 -12
- data/lib/rubygems/bundler_version_finder.rb +3 -3
- data/lib/rubygems/command.rb +22 -15
- data/lib/rubygems/command_manager.rb +22 -5
- data/lib/rubygems/commands/build_command.rb +41 -7
- data/lib/rubygems/commands/cert_command.rb +45 -24
- data/lib/rubygems/commands/check_command.rb +1 -1
- data/lib/rubygems/commands/cleanup_command.rb +14 -7
- data/lib/rubygems/commands/contents_command.rb +14 -15
- data/lib/rubygems/commands/dependency_command.rb +17 -17
- data/lib/rubygems/commands/environment_command.rb +20 -1
- data/lib/rubygems/commands/fetch_command.rb +2 -3
- data/lib/rubygems/commands/generate_index_command.rb +2 -3
- data/lib/rubygems/commands/help_command.rb +12 -13
- data/lib/rubygems/commands/info_command.rb +33 -0
- data/lib/rubygems/commands/install_command.rb +21 -17
- data/lib/rubygems/commands/list_command.rb +0 -1
- data/lib/rubygems/commands/lock_command.rb +3 -4
- data/lib/rubygems/commands/open_command.rb +16 -10
- data/lib/rubygems/commands/owner_command.rb +21 -7
- data/lib/rubygems/commands/pristine_command.rb +23 -16
- data/lib/rubygems/commands/push_command.rb +19 -8
- data/lib/rubygems/commands/query_command.rb +24 -24
- data/lib/rubygems/commands/rdoc_command.rb +3 -4
- data/lib/rubygems/commands/search_command.rb +0 -1
- data/lib/rubygems/commands/server_command.rb +1 -2
- data/lib/rubygems/commands/setup_command.rb +86 -48
- data/lib/rubygems/commands/signin_command.rb +2 -1
- data/lib/rubygems/commands/signout_command.rb +2 -2
- data/lib/rubygems/commands/sources_command.rb +11 -12
- data/lib/rubygems/commands/specification_command.rb +7 -7
- data/lib/rubygems/commands/uninstall_command.rb +50 -18
- data/lib/rubygems/commands/unpack_command.rb +16 -7
- data/lib/rubygems/commands/update_command.rb +28 -23
- data/lib/rubygems/commands/which_command.rb +5 -8
- data/lib/rubygems/commands/yank_command.rb +1 -2
- data/lib/rubygems/compatibility.rb +1 -21
- data/lib/rubygems/config_file.rb +36 -36
- data/lib/rubygems/core_ext/kernel_require.rb +6 -6
- data/lib/rubygems/core_ext/kernel_warn.rb +45 -0
- data/lib/rubygems/defaults.rb +31 -19
- data/lib/rubygems/dependency.rb +15 -15
- data/lib/rubygems/dependency_installer.rb +30 -33
- data/lib/rubygems/dependency_list.rb +9 -10
- data/lib/rubygems/deprecate.rb +2 -3
- data/lib/rubygems/doctor.rb +5 -6
- data/lib/rubygems/errors.rb +3 -3
- data/lib/rubygems/exceptions.rb +11 -8
- data/lib/rubygems/ext/build_error.rb +0 -1
- data/lib/rubygems/ext/builder.rb +50 -23
- data/lib/rubygems/ext/cmake_builder.rb +2 -2
- data/lib/rubygems/ext/configure_builder.rb +2 -3
- data/lib/rubygems/ext/ext_conf_builder.rb +8 -7
- data/lib/rubygems/ext/rake_builder.rb +16 -18
- data/lib/rubygems/ext.rb +0 -1
- data/lib/rubygems/gem_runner.rb +2 -2
- data/lib/rubygems/gemcutter_utilities.rb +46 -12
- data/lib/rubygems/indexer.rb +19 -12
- data/lib/rubygems/install_default_message.rb +0 -1
- data/lib/rubygems/install_message.rb +0 -1
- data/lib/rubygems/install_update_options.rb +3 -29
- data/lib/rubygems/installer.rb +97 -55
- data/lib/rubygems/installer_test_case.rb +2 -16
- data/lib/rubygems/local_remote_options.rb +5 -4
- data/lib/rubygems/mock_gem_ui.rb +3 -4
- data/lib/rubygems/name_tuple.rb +4 -4
- data/lib/rubygems/package/digest_io.rb +3 -4
- data/lib/rubygems/package/file_source.rb +3 -4
- data/lib/rubygems/package/io_source.rb +1 -2
- data/lib/rubygems/package/old.rb +8 -16
- data/lib/rubygems/package/source.rb +0 -1
- data/lib/rubygems/package/tar_header.rb +13 -4
- data/lib/rubygems/package/tar_reader/entry.rb +20 -4
- data/lib/rubygems/package/tar_reader.rb +2 -4
- data/lib/rubygems/package/tar_test_case.rb +2 -8
- data/lib/rubygems/package/tar_writer.rb +13 -15
- data/lib/rubygems/package.rb +90 -63
- data/lib/rubygems/package_task.rb +0 -1
- data/lib/rubygems/path_support.rb +16 -6
- data/lib/rubygems/platform.rb +4 -5
- data/lib/rubygems/psych_tree.rb +1 -1
- data/lib/rubygems/rdoc.rb +2 -313
- data/lib/rubygems/remote_fetcher.rb +29 -82
- data/lib/rubygems/request/connection_pools.rb +24 -13
- data/lib/rubygems/request/http_pool.rb +3 -4
- data/lib/rubygems/request/https_pool.rb +1 -3
- data/lib/rubygems/request.rb +17 -16
- data/lib/rubygems/request_set/gem_dependency_api.rb +46 -49
- data/lib/rubygems/request_set/lockfile/parser.rb +18 -29
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +9 -9
- data/lib/rubygems/request_set/lockfile.rb +12 -12
- data/lib/rubygems/request_set.rb +52 -25
- data/lib/rubygems/requirement.rb +32 -21
- data/lib/rubygems/resolver/activation_request.rb +6 -6
- data/lib/rubygems/resolver/api_set.rb +5 -6
- data/lib/rubygems/resolver/api_specification.rb +2 -3
- data/lib/rubygems/resolver/best_set.rb +5 -6
- data/lib/rubygems/resolver/composed_set.rb +5 -6
- data/lib/rubygems/resolver/conflict.rb +5 -5
- data/lib/rubygems/resolver/current_set.rb +1 -2
- data/lib/rubygems/resolver/dependency_request.rb +4 -4
- data/lib/rubygems/resolver/git_set.rb +5 -6
- data/lib/rubygems/resolver/git_specification.rb +4 -5
- data/lib/rubygems/resolver/index_set.rb +5 -6
- data/lib/rubygems/resolver/index_specification.rb +3 -4
- data/lib/rubygems/resolver/installed_specification.rb +3 -4
- data/lib/rubygems/resolver/installer_set.rb +12 -12
- data/lib/rubygems/resolver/local_specification.rb +1 -2
- data/lib/rubygems/resolver/lock_set.rb +5 -6
- data/lib/rubygems/resolver/lock_specification.rb +7 -8
- data/lib/rubygems/resolver/requirement_list.rb +1 -1
- data/lib/rubygems/resolver/set.rb +2 -2
- data/lib/rubygems/resolver/source_set.rb +4 -5
- data/lib/rubygems/resolver/spec_specification.rb +1 -2
- data/lib/rubygems/resolver/specification.rb +10 -7
- data/lib/rubygems/resolver/stats.rb +1 -1
- data/lib/rubygems/resolver/vendor_set.rb +4 -5
- data/lib/rubygems/resolver/vendor_specification.rb +2 -3
- data/lib/rubygems/resolver.rb +14 -16
- data/lib/rubygems/s3_uri_signer.rb +183 -0
- data/lib/rubygems/safe_yaml.rb +18 -10
- data/lib/rubygems/security/policies.rb +1 -2
- data/lib/rubygems/security/policy.rb +25 -25
- data/lib/rubygems/security/signer.rb +72 -24
- data/lib/rubygems/security/trust_dir.rb +10 -10
- data/lib/rubygems/security.rb +21 -22
- data/lib/rubygems/security_option.rb +0 -1
- data/lib/rubygems/server.rb +21 -21
- data/lib/rubygems/source/git.rb +9 -10
- data/lib/rubygems/source/installed.rb +3 -4
- data/lib/rubygems/source/local.rb +7 -7
- data/lib/rubygems/source/lock.rb +4 -4
- data/lib/rubygems/source/specific_file.rb +5 -5
- data/lib/rubygems/source/vendor.rb +2 -3
- data/lib/rubygems/source.rb +16 -25
- data/lib/rubygems/source_list.rb +2 -2
- data/lib/rubygems/source_local.rb +0 -1
- data/lib/rubygems/spec_fetcher.rb +5 -6
- data/lib/rubygems/specification.rb +219 -558
- data/lib/rubygems/specification_policy.rb +407 -0
- data/lib/rubygems/stub_specification.rb +12 -17
- data/lib/rubygems/test_case.rb +161 -75
- data/lib/rubygems/test_utilities.rb +20 -35
- data/lib/rubygems/text.rb +6 -6
- data/lib/rubygems/uninstaller.rb +38 -27
- data/lib/rubygems/uri_formatter.rb +1 -2
- data/lib/rubygems/user_interaction.rb +37 -89
- data/lib/rubygems/util/licenses.rb +27 -1
- data/lib/rubygems/util/list.rb +1 -1
- data/lib/rubygems/util.rb +32 -14
- data/lib/rubygems/validator.rb +4 -5
- data/lib/rubygems/version.rb +15 -15
- data/lib/rubygems/version_option.rb +2 -3
- data/lib/rubygems.rb +71 -102
- data/rubygems-update.gemspec +43 -0
- data/setup.rb +2 -8
- data/test/rubygems/ca_cert.pem +74 -65
- data/test/rubygems/client.pem +103 -45
- data/test/rubygems/rubygems_plugin.rb +0 -1
- data/test/rubygems/simple_gem.rb +1 -1
- data/test/rubygems/ssl_cert.pem +78 -17
- data/test/rubygems/ssl_key.pem +25 -13
- data/test/rubygems/test_bundled_ca.rb +1 -1
- data/test/rubygems/test_config.rb +7 -2
- data/test/rubygems/test_gem.rb +205 -132
- data/test/rubygems/test_gem_bundler_version_finder.rb +4 -0
- data/test/rubygems/test_gem_command.rb +0 -1
- data/test/rubygems/test_gem_command_manager.rb +18 -3
- data/test/rubygems/test_gem_commands_build_command.rb +220 -15
- data/test/rubygems/test_gem_commands_cert_command.rb +69 -8
- data/test/rubygems/test_gem_commands_check_command.rb +1 -1
- data/test/rubygems/test_gem_commands_cleanup_command.rb +27 -1
- data/test/rubygems/test_gem_commands_contents_command.rb +1 -2
- data/test/rubygems/test_gem_commands_dependency_command.rb +33 -34
- data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
- data/test/rubygems/test_gem_commands_fetch_command.rb +0 -1
- data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -1
- data/test/rubygems/test_gem_commands_help_command.rb +7 -4
- data/test/rubygems/test_gem_commands_info_command.rb +44 -0
- data/test/rubygems/test_gem_commands_install_command.rb +79 -12
- data/test/rubygems/test_gem_commands_lock_command.rb +0 -1
- data/test/rubygems/test_gem_commands_open_command.rb +29 -0
- data/test/rubygems/test_gem_commands_outdated_command.rb +0 -1
- data/test/rubygems/test_gem_commands_owner_command.rb +93 -57
- data/test/rubygems/test_gem_commands_pristine_command.rb +65 -30
- data/test/rubygems/test_gem_commands_push_command.rb +54 -0
- data/test/rubygems/test_gem_commands_query_command.rb +102 -100
- data/test/rubygems/test_gem_commands_search_command.rb +0 -1
- data/test/rubygems/test_gem_commands_server_command.rb +0 -1
- data/test/rubygems/test_gem_commands_setup_command.rb +50 -15
- data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
- data/test/rubygems/test_gem_commands_sources_command.rb +0 -1
- data/test/rubygems/test_gem_commands_specification_command.rb +2 -3
- data/test/rubygems/test_gem_commands_stale_command.rb +3 -2
- data/test/rubygems/test_gem_commands_uninstall_command.rb +161 -8
- data/test/rubygems/test_gem_commands_unpack_command.rb +17 -1
- data/test/rubygems/test_gem_commands_update_command.rb +19 -2
- data/test/rubygems/test_gem_commands_which_command.rb +0 -1
- data/test/rubygems/test_gem_commands_yank_command.rb +0 -1
- data/test/rubygems/test_gem_config_file.rb +4 -2
- data/test/rubygems/test_gem_dependency.rb +0 -1
- data/test/rubygems/test_gem_dependency_installer.rb +8 -5
- data/test/rubygems/test_gem_dependency_list.rb +6 -7
- data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -1
- data/test/rubygems/test_gem_doctor.rb +1 -2
- data/test/rubygems/test_gem_ext_builder.rb +10 -23
- data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -4
- data/test/rubygems/test_gem_ext_configure_builder.rb +3 -3
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +8 -9
- data/test/rubygems/test_gem_ext_rake_builder.rb +20 -5
- data/test/rubygems/test_gem_gem_runner.rb +0 -1
- data/test/rubygems/test_gem_gemcutter_utilities.rb +32 -6
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -1
- data/test/rubygems/test_gem_indexer.rb +16 -10
- data/test/rubygems/test_gem_install_update_options.rb +1 -20
- data/test/rubygems/test_gem_installer.rb +154 -119
- data/test/rubygems/test_gem_local_remote_options.rb +3 -3
- data/test/rubygems/test_gem_name_tuple.rb +0 -1
- data/test/rubygems/test_gem_package.rb +77 -31
- data/test/rubygems/test_gem_package_old.rb +0 -1
- data/test/rubygems/test_gem_package_tar_header.rb +42 -2
- data/test/rubygems/test_gem_package_tar_reader.rb +0 -1
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +11 -0
- data/test/rubygems/test_gem_package_tar_writer.rb +43 -7
- data/test/rubygems/test_gem_package_task.rb +2 -2
- data/test/rubygems/test_gem_path_support.rb +28 -11
- data/test/rubygems/test_gem_platform.rb +4 -5
- data/test/rubygems/test_gem_rdoc.rb +1 -136
- data/test/rubygems/test_gem_remote_fetcher.rb +241 -141
- data/test/rubygems/test_gem_request.rb +9 -9
- data/test/rubygems/test_gem_request_connection_pools.rb +24 -3
- data/test/rubygems/test_gem_request_set.rb +5 -5
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +82 -64
- data/test/rubygems/test_gem_request_set_lockfile.rb +1 -2
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +4 -9
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
- data/test/rubygems/test_gem_requirement.rb +24 -4
- data/test/rubygems/test_gem_resolver.rb +13 -17
- data/test/rubygems/test_gem_resolver_activation_request.rb +0 -1
- data/test/rubygems/test_gem_resolver_api_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_api_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_best_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_composed_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_conflict.rb +0 -1
- data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -1
- data/test/rubygems/test_gem_resolver_git_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_git_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_index_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_index_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_installer_set.rb +2 -3
- data/test/rubygems/test_gem_resolver_local_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_lock_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -1
- data/test/rubygems/test_gem_resolver_specification.rb +1 -2
- data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -1
- data/test/rubygems/test_gem_security.rb +1 -3
- data/test/rubygems/test_gem_security_policy.rb +5 -6
- data/test/rubygems/test_gem_security_signer.rb +4 -3
- data/test/rubygems/test_gem_security_trust_dir.rb +1 -2
- data/test/rubygems/test_gem_server.rb +4 -4
- data/test/rubygems/test_gem_source.rb +0 -13
- data/test/rubygems/test_gem_source_fetch_problem.rb +0 -1
- data/test/rubygems/test_gem_source_git.rb +0 -1
- data/test/rubygems/test_gem_source_installed.rb +0 -1
- data/test/rubygems/test_gem_source_lock.rb +0 -1
- data/test/rubygems/test_gem_source_vendor.rb +0 -1
- data/test/rubygems/test_gem_spec_fetcher.rb +0 -1
- data/test/rubygems/test_gem_specification.rb +366 -198
- data/test/rubygems/test_gem_stream_ui.rb +15 -32
- data/test/rubygems/test_gem_stub_specification.rb +0 -2
- data/test/rubygems/test_gem_text.rb +4 -0
- data/test/rubygems/test_gem_uninstaller.rb +42 -3
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -1
- data/test/rubygems/test_gem_uri_formatter.rb +0 -1
- data/test/rubygems/test_gem_util.rb +31 -11
- data/test/rubygems/test_gem_validator.rb +0 -1
- data/test/rubygems/test_gem_version.rb +11 -11
- data/test/rubygems/test_gem_version_option.rb +0 -1
- data/test/rubygems/test_remote_fetch_error.rb +0 -1
- data/test/rubygems/test_require.rb +67 -52
- data/util/CL2notes +1 -2
- data/util/ci +20 -12
- data/util/cops/deprecations.rb +52 -0
- data/util/create_certs.rb +6 -7
- data/util/create_certs.sh +27 -0
- data/util/create_encrypted_key.rb +4 -5
- data/util/patch_with_prs.rb +1 -1
- data/util/rubocop +8 -0
- data/util/update_bundled_ca_certificates.rb +12 -13
- data/util/update_changelog.rb +1 -1
- metadata +61 -51
- data/.autotest +0 -71
- data/.document +0 -5
- data/CONTRIBUTING.rdoc +0 -130
- data/CVE-2013-4287.txt +0 -35
- data/CVE-2013-4363.txt +0 -45
- data/CVE-2015-3900.txt +0 -40
- data/POLICIES.rdoc +0 -74
- data/test/rubygems/fix_openssl_warnings.rb +0 -13
@@ -50,7 +50,7 @@ class Gem::Package::TarHeader
|
|
50
50
|
:uid,
|
51
51
|
:uname,
|
52
52
|
:version,
|
53
|
-
]
|
53
|
+
].freeze
|
54
54
|
|
55
55
|
##
|
56
56
|
# Pack format for a tar header
|
@@ -107,8 +107,8 @@ class Gem::Package::TarHeader
|
|
107
107
|
|
108
108
|
new :name => fields.shift,
|
109
109
|
:mode => strict_oct(fields.shift),
|
110
|
-
:uid =>
|
111
|
-
:gid =>
|
110
|
+
:uid => oct_or_256based(fields.shift),
|
111
|
+
:gid => oct_or_256based(fields.shift),
|
112
112
|
:size => strict_oct(fields.shift),
|
113
113
|
:mtime => strict_oct(fields.shift),
|
114
114
|
:checksum => strict_oct(fields.shift),
|
@@ -130,11 +130,20 @@ class Gem::Package::TarHeader
|
|
130
130
|
raise ArgumentError, "#{str.inspect} is not an octal string"
|
131
131
|
end
|
132
132
|
|
133
|
+
def self.oct_or_256based(str)
|
134
|
+
# \x80 flags a positive 256-based number
|
135
|
+
# \ff flags a negative 256-based number
|
136
|
+
# In case we have a match, parse it as a signed binary value
|
137
|
+
# in big-endian order, except that the high-order bit is ignored.
|
138
|
+
return str.unpack('N2').last if str =~ /\A[\x80\xff]/n
|
139
|
+
strict_oct(str)
|
140
|
+
end
|
141
|
+
|
133
142
|
##
|
134
143
|
# Creates a new TarHeader using +vals+
|
135
144
|
|
136
145
|
def initialize(vals)
|
137
|
-
unless vals[:name] && vals[:size] && vals[:prefix] && vals[:mode]
|
146
|
+
unless vals[:name] && vals[:size] && vals[:prefix] && vals[:mode]
|
138
147
|
raise ArgumentError, ":name, :size, :prefix and :mode required"
|
139
148
|
end
|
140
149
|
|
@@ -64,7 +64,7 @@ class Gem::Package::TarReader::Entry
|
|
64
64
|
# Full name of the tar entry
|
65
65
|
|
66
66
|
def full_name
|
67
|
-
if @header.prefix != ""
|
67
|
+
if @header.prefix != ""
|
68
68
|
File.join @header.prefix, @header.name
|
69
69
|
else
|
70
70
|
@header.name
|
@@ -119,6 +119,12 @@ class Gem::Package::TarReader::Entry
|
|
119
119
|
bytes_read
|
120
120
|
end
|
121
121
|
|
122
|
+
def size
|
123
|
+
@header.size
|
124
|
+
end
|
125
|
+
|
126
|
+
alias length size
|
127
|
+
|
122
128
|
##
|
123
129
|
# Reads +len+ bytes from the tar file entry, or the rest of the entry if
|
124
130
|
# nil
|
@@ -137,7 +143,19 @@ class Gem::Package::TarReader::Entry
|
|
137
143
|
ret
|
138
144
|
end
|
139
145
|
|
140
|
-
|
146
|
+
def readpartial(maxlen = nil, outbuf = "".b)
|
147
|
+
check_closed
|
148
|
+
|
149
|
+
raise EOFError if @read >= @header.size
|
150
|
+
|
151
|
+
maxlen ||= @header.size - @read
|
152
|
+
max_read = [maxlen, @header.size - @read].min
|
153
|
+
|
154
|
+
@io.readpartial(max_read, outbuf)
|
155
|
+
@read += outbuf.size
|
156
|
+
|
157
|
+
outbuf
|
158
|
+
end
|
141
159
|
|
142
160
|
##
|
143
161
|
# Rewinds to the beginning of the tar file entry
|
@@ -145,8 +163,6 @@ class Gem::Package::TarReader::Entry
|
|
145
163
|
def rewind
|
146
164
|
check_closed
|
147
165
|
|
148
|
-
raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos=
|
149
|
-
|
150
166
|
@io.pos = @orig_pos
|
151
167
|
@read = 0
|
152
168
|
end
|
@@ -92,11 +92,9 @@ class Gem::Package::TarReader
|
|
92
92
|
# NOTE: Do not call #rewind during #each
|
93
93
|
|
94
94
|
def rewind
|
95
|
-
if @init_pos == 0
|
96
|
-
raise Gem::Package::NonSeekableIO unless @io.respond_to? :rewind
|
95
|
+
if @init_pos == 0
|
97
96
|
@io.rewind
|
98
97
|
else
|
99
|
-
raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos=
|
100
98
|
@io.pos = @init_pos
|
101
99
|
end
|
102
100
|
end
|
@@ -106,7 +104,7 @@ class Gem::Package::TarReader
|
|
106
104
|
# yields it. Rewinds the tar file to the beginning when the block
|
107
105
|
# terminates.
|
108
106
|
|
109
|
-
def seek
|
107
|
+
def seek(name) # :yields: entry
|
110
108
|
found = find do |entry|
|
111
109
|
entry.full_name == name
|
112
110
|
end
|
@@ -52,7 +52,7 @@ class Gem::Package::TarTestCase < Gem::TestCase
|
|
52
52
|
name = fields.shift
|
53
53
|
length = fields.shift.to_i
|
54
54
|
|
55
|
-
if name == "checksum"
|
55
|
+
if name == "checksum"
|
56
56
|
chksum_off = offset
|
57
57
|
offset += length
|
58
58
|
next
|
@@ -94,13 +94,7 @@ class Gem::Package::TarTestCase < Gem::TestCase
|
|
94
94
|
ASCIIZ(dname, 155) # char prefix[155]; ASCII + (Z unless filled)
|
95
95
|
]
|
96
96
|
|
97
|
-
|
98
|
-
h = if RUBY_VERSION >= "1.9" then
|
99
|
-
arr.join
|
100
|
-
else
|
101
|
-
arr = arr.join("").split(//).map{|x| x[0]}
|
102
|
-
arr.pack format
|
103
|
-
end
|
97
|
+
h = arr.join
|
104
98
|
ret = h + "\0" * (512 - h.size)
|
105
99
|
assert_equal(512, ret.size)
|
106
100
|
ret
|
@@ -106,8 +106,6 @@ class Gem::Package::TarWriter
|
|
106
106
|
def add_file(name, mode) # :yields: io
|
107
107
|
check_closed
|
108
108
|
|
109
|
-
raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos=
|
110
|
-
|
111
109
|
name, prefix = split_name name
|
112
110
|
|
113
111
|
init_pos = @io.pos
|
@@ -125,7 +123,7 @@ class Gem::Package::TarWriter
|
|
125
123
|
|
126
124
|
header = Gem::Package::TarHeader.new :name => name, :mode => mode,
|
127
125
|
:size => size, :prefix => prefix,
|
128
|
-
:mtime => Time.now
|
126
|
+
:mtime => ENV["SOURCE_DATE_EPOCH"] ? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc : Time.now
|
129
127
|
|
130
128
|
@io.write header
|
131
129
|
@io.pos = final_pos
|
@@ -141,11 +139,11 @@ class Gem::Package::TarWriter
|
|
141
139
|
#
|
142
140
|
# The created digest object is returned.
|
143
141
|
|
144
|
-
def add_file_digest
|
142
|
+
def add_file_digest(name, mode, digest_algorithms) # :yields: io
|
145
143
|
digests = digest_algorithms.map do |digest_algorithm|
|
146
144
|
digest = digest_algorithm.new
|
147
145
|
digest_name =
|
148
|
-
if digest.respond_to? :name
|
146
|
+
if digest.respond_to? :name
|
149
147
|
digest.name
|
150
148
|
else
|
151
149
|
/::([^:]+)$/ =~ digest_algorithm.name
|
@@ -174,7 +172,7 @@ class Gem::Package::TarWriter
|
|
174
172
|
#
|
175
173
|
# Returns the digest.
|
176
174
|
|
177
|
-
def add_file_signed
|
175
|
+
def add_file_signed(name, mode, signer)
|
178
176
|
digest_algorithms = [
|
179
177
|
signer.digest_algorithm,
|
180
178
|
Digest::SHA512,
|
@@ -186,7 +184,7 @@ class Gem::Package::TarWriter
|
|
186
184
|
|
187
185
|
signature_digest = digests.values.compact.find do |digest|
|
188
186
|
digest_name =
|
189
|
-
if digest.respond_to? :name
|
187
|
+
if digest.respond_to? :name
|
190
188
|
digest.name
|
191
189
|
else
|
192
190
|
digest.class.name[/::([^:]+)\z/, 1]
|
@@ -197,7 +195,7 @@ class Gem::Package::TarWriter
|
|
197
195
|
|
198
196
|
raise "no #{signer.digest_name} in #{digests.values.compact}" unless signature_digest
|
199
197
|
|
200
|
-
if signer.key
|
198
|
+
if signer.key
|
201
199
|
signature = signer.sign signature_digest.digest
|
202
200
|
|
203
201
|
add_file_simple "#{name}.sig", 0444, signature.length do |io|
|
@@ -219,7 +217,7 @@ class Gem::Package::TarWriter
|
|
219
217
|
|
220
218
|
header = Gem::Package::TarHeader.new(:name => name, :mode => mode,
|
221
219
|
:size => size, :prefix => prefix,
|
222
|
-
:mtime => Time.now).to_s
|
220
|
+
:mtime => ENV["SOURCE_DATE_EPOCH"] ? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc : Time.now).to_s
|
223
221
|
|
224
222
|
@io.write header
|
225
223
|
os = BoundedStream.new @io, size
|
@@ -247,7 +245,7 @@ class Gem::Package::TarWriter
|
|
247
245
|
:size => 0, :typeflag => "2",
|
248
246
|
:linkname => target,
|
249
247
|
:prefix => prefix,
|
250
|
-
:mtime => Time.now).to_s
|
248
|
+
:mtime => ENV["SOURCE_DATE_EPOCH"] ? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc : Time.now).to_s
|
251
249
|
|
252
250
|
@io.write header
|
253
251
|
|
@@ -300,7 +298,7 @@ class Gem::Package::TarWriter
|
|
300
298
|
header = Gem::Package::TarHeader.new :name => name, :mode => mode,
|
301
299
|
:typeflag => "5", :size => 0,
|
302
300
|
:prefix => prefix,
|
303
|
-
:mtime => Time.now
|
301
|
+
:mtime => ENV["SOURCE_DATE_EPOCH"] ? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc : Time.now
|
304
302
|
|
305
303
|
@io.write header
|
306
304
|
|
@@ -311,12 +309,12 @@ class Gem::Package::TarWriter
|
|
311
309
|
# Splits +name+ into a name and prefix that can fit in the TarHeader
|
312
310
|
|
313
311
|
def split_name(name) # :nodoc:
|
314
|
-
if name.bytesize > 256
|
312
|
+
if name.bytesize > 256
|
315
313
|
raise Gem::Package::TooLongFileName.new("File \"#{name}\" has a too long path (should be 256 or less)")
|
316
314
|
end
|
317
315
|
|
318
316
|
prefix = ''
|
319
|
-
if name.bytesize > 100
|
317
|
+
if name.bytesize > 100
|
320
318
|
parts = name.split('/', -1) # parts are never empty here
|
321
319
|
name = parts.pop # initially empty for names with a trailing slash ("foo/.../bar/")
|
322
320
|
prefix = parts.join('/') # if empty, then it's impossible to split (parts is empty too)
|
@@ -325,11 +323,11 @@ class Gem::Package::TarWriter
|
|
325
323
|
prefix = parts.join('/')
|
326
324
|
end
|
327
325
|
|
328
|
-
if name.bytesize > 100 or prefix.empty?
|
326
|
+
if name.bytesize > 100 or prefix.empty?
|
329
327
|
raise Gem::Package::TooLongFileName.new("File \"#{prefix}/#{name}\" has a too long name (should be 100 or less)")
|
330
328
|
end
|
331
329
|
|
332
|
-
if prefix.bytesize > 155
|
330
|
+
if prefix.bytesize > 155
|
333
331
|
raise Gem::Package::TooLongFileName.new("File \"#{prefix}/#{name}\" has a too long base path (should be 155 or less)")
|
334
332
|
end
|
335
333
|
end
|
data/lib/rubygems/package.rb
CHANGED
@@ -55,7 +55,7 @@ class Gem::Package
|
|
55
55
|
class FormatError < Error
|
56
56
|
attr_reader :path
|
57
57
|
|
58
|
-
def initialize
|
58
|
+
def initialize(message, source = nil)
|
59
59
|
if source
|
60
60
|
@path = source.path
|
61
61
|
|
@@ -68,7 +68,7 @@ class Gem::Package
|
|
68
68
|
end
|
69
69
|
|
70
70
|
class PathError < Error
|
71
|
-
def initialize
|
71
|
+
def initialize(destination, destination_dir)
|
72
72
|
super "installing into parent path %s of %s is not allowed" %
|
73
73
|
[destination, destination_dir]
|
74
74
|
end
|
@@ -107,12 +107,24 @@ class Gem::Package
|
|
107
107
|
|
108
108
|
attr_writer :spec
|
109
109
|
|
110
|
-
|
111
|
-
|
110
|
+
##
|
111
|
+
# Permission for directories
|
112
|
+
attr_accessor :dir_mode
|
113
|
+
|
114
|
+
##
|
115
|
+
# Permission for program files
|
116
|
+
attr_accessor :prog_mode
|
117
|
+
|
118
|
+
##
|
119
|
+
# Permission for other files
|
120
|
+
attr_accessor :data_mode
|
121
|
+
|
122
|
+
def self.build(spec, skip_validation = false, strict_validation = false, file_name = nil)
|
123
|
+
gem_file = file_name || spec.file_name
|
112
124
|
|
113
125
|
package = new gem_file
|
114
126
|
package.spec = spec
|
115
|
-
package.build skip_validation
|
127
|
+
package.build skip_validation, strict_validation
|
116
128
|
|
117
129
|
gem_file
|
118
130
|
end
|
@@ -124,7 +136,7 @@ class Gem::Package
|
|
124
136
|
# If +gem+ is an existing file in the old format a Gem::Package::Old will be
|
125
137
|
# returned.
|
126
138
|
|
127
|
-
def self.new
|
139
|
+
def self.new(gem, security_policy = nil)
|
128
140
|
gem = if gem.is_a?(Gem::Package::Source)
|
129
141
|
gem
|
130
142
|
elsif gem.respond_to? :read
|
@@ -145,10 +157,10 @@ class Gem::Package
|
|
145
157
|
##
|
146
158
|
# Creates a new package that will read or write to the file +gem+.
|
147
159
|
|
148
|
-
def initialize
|
160
|
+
def initialize(gem, security_policy) # :notnew:
|
149
161
|
@gem = gem
|
150
162
|
|
151
|
-
@build_time = Time.now
|
163
|
+
@build_time = ENV["SOURCE_DATE_EPOCH"] ? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc : Time.now
|
152
164
|
@checksums = {}
|
153
165
|
@contents = nil
|
154
166
|
@digests = Hash.new { |h, algorithm| h[algorithm] = {} }
|
@@ -162,14 +174,14 @@ class Gem::Package
|
|
162
174
|
##
|
163
175
|
# Copies this package to +path+ (if possible)
|
164
176
|
|
165
|
-
def copy_to
|
177
|
+
def copy_to(path)
|
166
178
|
FileUtils.cp @gem.path, path unless File.exist? path
|
167
179
|
end
|
168
180
|
|
169
181
|
##
|
170
182
|
# Adds a checksum for each entry in the gem to checksums.yaml.gz.
|
171
183
|
|
172
|
-
def add_checksums
|
184
|
+
def add_checksums(tar)
|
173
185
|
Gem.load_yaml
|
174
186
|
|
175
187
|
checksums_by_algorithm = Hash.new { |h, algorithm| h[algorithm] = {} }
|
@@ -191,7 +203,7 @@ class Gem::Package
|
|
191
203
|
# Adds the files listed in the packages's Gem::Specification to data.tar.gz
|
192
204
|
# and adds this file to the +tar+.
|
193
205
|
|
194
|
-
def add_contents
|
206
|
+
def add_contents(tar) # :nodoc:
|
195
207
|
digests = tar.add_file_signed 'data.tar.gz', 0444, @signer do |io|
|
196
208
|
gzip_to io do |gz_io|
|
197
209
|
Gem::Package::TarWriter.new gz_io do |data_tar|
|
@@ -206,13 +218,18 @@ class Gem::Package
|
|
206
218
|
##
|
207
219
|
# Adds files included the package's Gem::Specification to the +tar+ file
|
208
220
|
|
209
|
-
def add_files
|
221
|
+
def add_files(tar) # :nodoc:
|
210
222
|
@spec.files.each do |file|
|
211
223
|
stat = File.lstat file
|
212
224
|
|
213
225
|
if stat.symlink?
|
214
|
-
|
215
|
-
|
226
|
+
target_path = File.readlink(file)
|
227
|
+
|
228
|
+
unless target_path.start_with? '.'
|
229
|
+
relative_dir = File.dirname(file).sub("#{Dir.pwd}/", '')
|
230
|
+
target_path = File.join(relative_dir, target_path)
|
231
|
+
end
|
232
|
+
|
216
233
|
tar.add_symlink file, target_path, stat.mode
|
217
234
|
end
|
218
235
|
|
@@ -229,7 +246,7 @@ class Gem::Package
|
|
229
246
|
##
|
230
247
|
# Adds the package's Gem::Specification to the +tar+ file
|
231
248
|
|
232
|
-
def add_metadata
|
249
|
+
def add_metadata(tar) # :nodoc:
|
233
250
|
digests = tar.add_file_signed 'metadata.gz', 0444, @signer do |io|
|
234
251
|
gzip_to io do |gz_io|
|
235
252
|
gz_io.write @spec.to_yaml
|
@@ -242,14 +259,20 @@ class Gem::Package
|
|
242
259
|
##
|
243
260
|
# Builds this package based on the specification set by #spec=
|
244
261
|
|
245
|
-
def build
|
262
|
+
def build(skip_validation = false, strict_validation = false)
|
263
|
+
raise ArgumentError, "skip_validation = true and strict_validation = true are incompatible" if skip_validation && strict_validation
|
264
|
+
|
246
265
|
Gem.load_yaml
|
247
266
|
require 'rubygems/security'
|
248
267
|
|
249
268
|
@spec.mark_version
|
250
|
-
@spec.validate unless skip_validation
|
269
|
+
@spec.validate true, strict_validation unless skip_validation
|
251
270
|
|
252
|
-
setup_signer
|
271
|
+
setup_signer(
|
272
|
+
signer_options: {
|
273
|
+
expiration_length_days: Gem.configuration.cert_expiration_length_days
|
274
|
+
}
|
275
|
+
)
|
253
276
|
|
254
277
|
@gem.with_write_io do |gem_io|
|
255
278
|
Gem::Package::TarWriter.new gem_io do |gem|
|
@@ -263,7 +286,7 @@ class Gem::Package
|
|
263
286
|
Successfully built RubyGem
|
264
287
|
Name: #{@spec.name}
|
265
288
|
Version: #{@spec.version}
|
266
|
-
File: #{File.basename @
|
289
|
+
File: #{File.basename @gem.path}
|
267
290
|
EOM
|
268
291
|
ensure
|
269
292
|
@signer = nil
|
@@ -300,8 +323,8 @@ EOM
|
|
300
323
|
# Creates a digest of the TarEntry +entry+ from the digest algorithm set by
|
301
324
|
# the security policy.
|
302
325
|
|
303
|
-
def digest
|
304
|
-
algorithms = if @checksums
|
326
|
+
def digest(entry) # :nodoc:
|
327
|
+
algorithms = if @checksums
|
305
328
|
@checksums.keys
|
306
329
|
else
|
307
330
|
[Gem::Security::DIGEST_NAME].compact
|
@@ -309,7 +332,7 @@ EOM
|
|
309
332
|
|
310
333
|
algorithms.each do |algorithm|
|
311
334
|
digester =
|
312
|
-
if defined?(OpenSSL::Digest)
|
335
|
+
if defined?(OpenSSL::Digest)
|
313
336
|
OpenSSL::Digest.new algorithm
|
314
337
|
else
|
315
338
|
Digest.const_get(algorithm).new
|
@@ -331,10 +354,10 @@ EOM
|
|
331
354
|
# If +pattern+ is specified, only entries matching that glob will be
|
332
355
|
# extracted.
|
333
356
|
|
334
|
-
def extract_files
|
357
|
+
def extract_files(destination_dir, pattern = "*")
|
335
358
|
verify unless @spec
|
336
359
|
|
337
|
-
FileUtils.mkdir_p destination_dir
|
360
|
+
FileUtils.mkdir_p destination_dir, :mode => dir_mode && 0755
|
338
361
|
|
339
362
|
@gem.with_read_io do |io|
|
340
363
|
reader = Gem::Package::TarReader.new io
|
@@ -360,7 +383,8 @@ EOM
|
|
360
383
|
# If +pattern+ is specified, only entries matching that glob will be
|
361
384
|
# extracted.
|
362
385
|
|
363
|
-
def extract_tar_gz
|
386
|
+
def extract_tar_gz(io, destination_dir, pattern = "*") # :nodoc:
|
387
|
+
directories = [] if dir_mode
|
364
388
|
open_tar_gz io do |tar|
|
365
389
|
tar.each do |entry|
|
366
390
|
next unless File.fnmatch pattern, entry.full_name, File::FNM_DOTMATCH
|
@@ -370,19 +394,20 @@ EOM
|
|
370
394
|
FileUtils.rm_rf destination
|
371
395
|
|
372
396
|
mkdir_options = {}
|
373
|
-
mkdir_options[:mode] = entry.header.mode if entry.directory?
|
397
|
+
mkdir_options[:mode] = dir_mode ? 0755 : (entry.header.mode if entry.directory?)
|
374
398
|
mkdir =
|
375
|
-
if entry.directory?
|
399
|
+
if entry.directory?
|
376
400
|
destination
|
377
401
|
else
|
378
402
|
File.dirname destination
|
379
403
|
end
|
404
|
+
directories << mkdir if directories
|
380
405
|
|
381
406
|
mkdir_p_safe mkdir, mkdir_options, destination_dir, entry.full_name
|
382
407
|
|
383
408
|
File.open destination, 'wb' do |out|
|
384
409
|
out.write entry.read
|
385
|
-
FileUtils.chmod entry.header.mode, destination
|
410
|
+
FileUtils.chmod file_mode(entry.header.mode), destination
|
386
411
|
end if entry.file?
|
387
412
|
|
388
413
|
File.symlink(entry.header.linkname, destination) if entry.symlink?
|
@@ -390,6 +415,15 @@ EOM
|
|
390
415
|
verbose destination
|
391
416
|
end
|
392
417
|
end
|
418
|
+
|
419
|
+
if directories
|
420
|
+
directories.uniq!
|
421
|
+
File.chmod(dir_mode, *directories)
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
def file_mode(mode) # :nodoc:
|
426
|
+
((mode & 0111).zero? ? data_mode : prog_mode) || mode
|
393
427
|
end
|
394
428
|
|
395
429
|
##
|
@@ -398,7 +432,7 @@ EOM
|
|
398
432
|
# Also sets the gzip modification time to the package build time to ease
|
399
433
|
# testing.
|
400
434
|
|
401
|
-
def gzip_to
|
435
|
+
def gzip_to(io) # :yields: gz_io
|
402
436
|
gz_io = Zlib::GzipWriter.new io, Zlib::BEST_COMPRESSION
|
403
437
|
gz_io.mtime = @build_time
|
404
438
|
|
@@ -412,15 +446,12 @@ EOM
|
|
412
446
|
#
|
413
447
|
# If +filename+ is not inside +destination_dir+ an exception is raised.
|
414
448
|
|
415
|
-
def install_location
|
449
|
+
def install_location(filename, destination_dir) # :nodoc:
|
416
450
|
raise Gem::Package::PathError.new(filename, destination_dir) if
|
417
451
|
filename.start_with? '/'
|
418
452
|
|
419
|
-
destination_dir = realpath
|
420
|
-
|
421
|
-
|
422
|
-
destination = File.join destination_dir, filename
|
423
|
-
destination = File.expand_path destination
|
453
|
+
destination_dir = File.expand_path(File.realpath(destination_dir))
|
454
|
+
destination = File.expand_path(File.join(destination_dir, filename))
|
424
455
|
|
425
456
|
raise Gem::Package::PathError.new(destination, destination_dir) unless
|
426
457
|
destination.start_with? destination_dir + '/'
|
@@ -447,11 +478,11 @@ EOM
|
|
447
478
|
end
|
448
479
|
end
|
449
480
|
|
450
|
-
def mkdir_p_safe
|
451
|
-
destination_dir = realpath
|
481
|
+
def mkdir_p_safe(mkdir, mkdir_options, destination_dir, file_name)
|
482
|
+
destination_dir = File.realpath(File.expand_path(destination_dir))
|
452
483
|
parts = mkdir.split(File::SEPARATOR)
|
453
484
|
parts.reduce do |path, basename|
|
454
|
-
path = realpath
|
485
|
+
path = File.realpath(path) unless path == ""
|
455
486
|
path = File.expand_path(path + File::SEPARATOR + basename)
|
456
487
|
lstat = File.lstat path rescue nil
|
457
488
|
if !lstat || !lstat.directory?
|
@@ -466,15 +497,14 @@ EOM
|
|
466
497
|
##
|
467
498
|
# Loads a Gem::Specification from the TarEntry +entry+
|
468
499
|
|
469
|
-
def load_spec
|
500
|
+
def load_spec(entry) # :nodoc:
|
470
501
|
case entry.full_name
|
471
502
|
when 'metadata' then
|
472
503
|
@spec = Gem::Specification.from_yaml entry.read
|
473
504
|
when 'metadata.gz' then
|
474
505
|
args = [entry]
|
475
506
|
args << { :external_encoding => Encoding::UTF_8 } if
|
476
|
-
|
477
|
-
Zlib::GzipReader.method(:wrap).arity != 1
|
507
|
+
Zlib::GzipReader.method(:wrap).arity != 1
|
478
508
|
|
479
509
|
Zlib::GzipReader.wrap(*args) do |gzio|
|
480
510
|
@spec = Gem::Specification.from_yaml gzio.read
|
@@ -485,7 +515,7 @@ EOM
|
|
485
515
|
##
|
486
516
|
# Opens +io+ as a gzipped tar archive
|
487
517
|
|
488
|
-
def open_tar_gz
|
518
|
+
def open_tar_gz(io) # :nodoc:
|
489
519
|
Zlib::GzipReader.wrap io do |gzio|
|
490
520
|
tar = Gem::Package::TarReader.new gzio
|
491
521
|
|
@@ -496,7 +526,7 @@ EOM
|
|
496
526
|
##
|
497
527
|
# Reads and loads checksums.yaml.gz from the tar file +gem+
|
498
528
|
|
499
|
-
def read_checksums
|
529
|
+
def read_checksums(gem)
|
500
530
|
Gem.load_yaml
|
501
531
|
|
502
532
|
@checksums = gem.seek 'checksums.yaml.gz' do |entry|
|
@@ -510,10 +540,17 @@ EOM
|
|
510
540
|
# Prepares the gem for signing and checksum generation. If a signing
|
511
541
|
# certificate and key are not present only checksum generation is set up.
|
512
542
|
|
513
|
-
def setup_signer
|
543
|
+
def setup_signer(signer_options: {})
|
514
544
|
passphrase = ENV['GEM_PRIVATE_KEY_PASSPHRASE']
|
515
|
-
if @spec.signing_key
|
516
|
-
@signer =
|
545
|
+
if @spec.signing_key
|
546
|
+
@signer =
|
547
|
+
Gem::Security::Signer.new(
|
548
|
+
@spec.signing_key,
|
549
|
+
@spec.cert_chain,
|
550
|
+
passphrase,
|
551
|
+
signer_options
|
552
|
+
)
|
553
|
+
|
517
554
|
@spec.signing_key = nil
|
518
555
|
@spec.cert_chain = @signer.cert_chain.map { |cert| cert.to_s }
|
519
556
|
else
|
@@ -578,14 +615,14 @@ EOM
|
|
578
615
|
# Verifies the +checksums+ against the +digests+. This check is not
|
579
616
|
# cryptographically secure. Missing checksums are ignored.
|
580
617
|
|
581
|
-
def verify_checksums
|
618
|
+
def verify_checksums(digests, checksums) # :nodoc:
|
582
619
|
return unless checksums
|
583
620
|
|
584
621
|
checksums.sort.each do |algorithm, gem_digests|
|
585
622
|
gem_digests.sort.each do |file_name, gem_hexdigest|
|
586
623
|
computed_digest = digests[algorithm][file_name]
|
587
624
|
|
588
|
-
unless computed_digest.hexdigest == gem_hexdigest
|
625
|
+
unless computed_digest.hexdigest == gem_hexdigest
|
589
626
|
raise Gem::Package::FormatError.new \
|
590
627
|
"#{algorithm} checksum mismatch for #{file_name}", @gem
|
591
628
|
end
|
@@ -596,7 +633,7 @@ EOM
|
|
596
633
|
##
|
597
634
|
# Verifies +entry+ in a .gem file.
|
598
635
|
|
599
|
-
def verify_entry
|
636
|
+
def verify_entry(entry)
|
600
637
|
file_name = entry.full_name
|
601
638
|
@files << file_name
|
602
639
|
|
@@ -623,16 +660,16 @@ EOM
|
|
623
660
|
##
|
624
661
|
# Verifies the files of the +gem+
|
625
662
|
|
626
|
-
def verify_files
|
663
|
+
def verify_files(gem)
|
627
664
|
gem.each do |entry|
|
628
665
|
verify_entry entry
|
629
666
|
end
|
630
667
|
|
631
|
-
unless @spec
|
668
|
+
unless @spec
|
632
669
|
raise Gem::Package::FormatError.new 'package metadata is missing', @gem
|
633
670
|
end
|
634
671
|
|
635
|
-
unless @files.include? 'data.tar.gz'
|
672
|
+
unless @files.include? 'data.tar.gz'
|
636
673
|
raise Gem::Package::FormatError.new \
|
637
674
|
'package content (data.tar.gz) is missing', @gem
|
638
675
|
end
|
@@ -645,7 +682,7 @@ EOM
|
|
645
682
|
##
|
646
683
|
# Verifies that +entry+ is a valid gzipped file.
|
647
684
|
|
648
|
-
def verify_gz
|
685
|
+
def verify_gz(entry) # :nodoc:
|
649
686
|
Zlib::GzipReader.wrap entry do |gzio|
|
650
687
|
gzio.read 16384 until gzio.eof? # gzip checksum verification
|
651
688
|
end
|
@@ -653,16 +690,6 @@ EOM
|
|
653
690
|
raise Gem::Package::FormatError.new(e.message, entry.full_name)
|
654
691
|
end
|
655
692
|
|
656
|
-
if File.respond_to? :realpath
|
657
|
-
def realpath file
|
658
|
-
File.realpath file
|
659
|
-
end
|
660
|
-
else
|
661
|
-
def realpath file
|
662
|
-
file
|
663
|
-
end
|
664
|
-
end
|
665
|
-
|
666
693
|
end
|
667
694
|
|
668
695
|
require 'rubygems/package/digest_io'
|