rubygems-update 1.8.30 → 2.0.0.preview2
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.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- checksums.yaml +6 -6
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +3 -0
- data/.autotest +6 -3
- data/History.txt +137 -63
- data/LICENSE.txt +1 -5
- data/Manifest.txt +69 -32
- data/README.rdoc +11 -9
- data/Rakefile +24 -38
- data/bin/gem +0 -9
- data/bin/update_rubygems +1 -0
- data/lib/rubygems.rb +193 -405
- data/lib/rubygems/available_set.rb +95 -0
- data/lib/rubygems/command.rb +88 -45
- data/lib/rubygems/command_manager.rb +67 -40
- data/lib/rubygems/commands/build_command.rb +5 -23
- data/lib/rubygems/commands/cert_command.rb +199 -57
- data/lib/rubygems/commands/check_command.rb +14 -39
- data/lib/rubygems/commands/cleanup_command.rb +9 -1
- data/lib/rubygems/commands/contents_command.rb +30 -12
- data/lib/rubygems/commands/dependency_command.rb +3 -8
- data/lib/rubygems/commands/environment_command.rb +13 -8
- data/lib/rubygems/commands/fetch_command.rb +3 -16
- data/lib/rubygems/commands/generate_index_command.rb +7 -47
- data/lib/rubygems/commands/help_command.rb +1 -1
- data/lib/rubygems/commands/install_command.rb +69 -36
- data/lib/rubygems/commands/list_command.rb +6 -4
- data/lib/rubygems/commands/lock_command.rb +1 -1
- data/lib/rubygems/commands/mirror_command.rb +17 -0
- data/lib/rubygems/commands/outdated_command.rb +6 -3
- data/lib/rubygems/commands/owner_command.rb +13 -5
- data/lib/rubygems/commands/pristine_command.rb +19 -4
- data/lib/rubygems/commands/push_command.rb +12 -1
- data/lib/rubygems/commands/query_command.rb +43 -27
- data/lib/rubygems/commands/rdoc_command.rb +23 -28
- data/lib/rubygems/commands/search_command.rb +4 -18
- data/lib/rubygems/commands/server_command.rb +1 -1
- data/lib/rubygems/commands/setup_command.rb +124 -38
- data/lib/rubygems/commands/sources_command.rb +16 -16
- data/lib/rubygems/commands/specification_command.rb +11 -13
- data/lib/rubygems/commands/uninstall_command.rb +24 -7
- data/lib/rubygems/commands/unpack_command.rb +7 -3
- data/lib/rubygems/commands/update_command.rb +22 -36
- data/lib/rubygems/commands/yank_command.rb +98 -0
- data/lib/rubygems/compatibility.rb +51 -0
- data/lib/rubygems/config_file.rb +82 -54
- data/lib/rubygems/core_ext/kernel_gem.rb +53 -0
- data/lib/rubygems/core_ext/kernel_require.rb +119 -0
- data/lib/rubygems/defaults.rb +10 -21
- data/lib/rubygems/dependency.rb +61 -10
- data/lib/rubygems/dependency_installer.rb +157 -69
- data/lib/rubygems/dependency_list.rb +11 -19
- data/lib/rubygems/dependency_resolver.rb +562 -0
- data/lib/rubygems/deprecate.rb +40 -40
- data/lib/rubygems/errors.rb +77 -24
- data/lib/rubygems/exceptions.rb +25 -7
- data/lib/rubygems/ext/builder.rb +20 -23
- data/lib/rubygems/ext/configure_builder.rb +2 -2
- data/lib/rubygems/ext/ext_conf_builder.rb +5 -45
- data/lib/rubygems/ext/rake_builder.rb +2 -2
- data/lib/rubygems/gem_runner.rb +3 -16
- data/lib/rubygems/gemcutter_utilities.rb +22 -7
- data/lib/rubygems/indexer.rb +6 -159
- data/lib/rubygems/install_message.rb +12 -0
- data/lib/rubygems/install_update_options.rb +56 -18
- data/lib/rubygems/installer.rb +244 -134
- data/lib/rubygems/installer_test_case.rb +71 -19
- data/lib/rubygems/mock_gem_ui.rb +17 -0
- data/lib/rubygems/name_tuple.rb +110 -0
- data/lib/rubygems/package.rb +514 -43
- data/lib/rubygems/package/digest_io.rb +64 -0
- data/lib/rubygems/package/old.rb +147 -0
- data/lib/rubygems/package/tar_header.rb +18 -55
- data/lib/rubygems/package/tar_reader.rb +20 -3
- data/lib/rubygems/package/tar_writer.rb +63 -7
- data/lib/rubygems/package_task.rb +3 -4
- data/lib/rubygems/path_support.rb +14 -7
- data/lib/rubygems/platform.rb +19 -26
- data/lib/rubygems/rdoc.rb +316 -0
- data/lib/rubygems/remote_fetcher.rb +117 -54
- data/lib/rubygems/request_set.rb +182 -0
- data/lib/rubygems/requirement.rb +63 -26
- data/lib/rubygems/security.rb +295 -555
- data/lib/rubygems/security/policies.rb +115 -0
- data/lib/rubygems/security/policy.rb +227 -0
- data/lib/rubygems/security/signer.rb +136 -0
- data/lib/rubygems/security/trust_dir.rb +104 -0
- data/lib/rubygems/server.rb +45 -55
- data/lib/rubygems/source.rb +144 -0
- data/lib/rubygems/source_list.rb +87 -0
- data/lib/rubygems/source_local.rb +92 -0
- data/lib/rubygems/source_specific_file.rb +28 -0
- data/lib/rubygems/spec_fetcher.rb +116 -184
- data/lib/rubygems/specification.rb +731 -335
- data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +88 -30
- data/lib/rubygems/ssl_certs/Entrust_net-Secure-Server-Certification-Authority.pem +90 -0
- data/lib/rubygems/ssl_certs/VerisignClass3PublicPrimaryCertificationAuthority-G2.pem +57 -0
- data/lib/rubygems/syck_hack.rb +2 -0
- data/lib/rubygems/test_case.rb +199 -109
- data/lib/rubygems/test_utilities.rb +25 -5
- data/lib/rubygems/uninstaller.rb +62 -20
- data/lib/rubygems/user_interaction.rb +10 -0
- data/lib/rubygems/validator.rb +33 -40
- data/lib/rubygems/version.rb +19 -8
- data/setup.rb +8 -1
- data/test/rubygems/alternate_cert.pem +9 -0
- data/test/rubygems/alternate_cert_32.pem +9 -0
- data/test/rubygems/alternate_key.pem +9 -0
- data/test/rubygems/bad_rake.rb +1 -0
- data/test/rubygems/child_cert.pem +9 -0
- data/test/rubygems/child_cert_32.pem +9 -0
- data/test/rubygems/child_key.pem +9 -0
- data/test/rubygems/data/null-type.gemspec.rz +0 -0
- data/test/rubygems/expired_cert.pem +9 -0
- data/test/rubygems/future_cert.pem +9 -0
- data/test/rubygems/future_cert_32.pem +9 -0
- data/test/rubygems/good_rake.rb +1 -0
- data/test/rubygems/grandchild_cert.pem +9 -0
- data/test/rubygems/grandchild_cert_32.pem +9 -0
- data/test/rubygems/grandchild_key.pem +9 -0
- data/test/rubygems/invalid_issuer_cert.pem +9 -0
- data/test/rubygems/invalid_issuer_cert_32.pem +9 -0
- data/test/rubygems/invalid_key.pem +9 -0
- data/test/rubygems/invalid_signer_cert.pem +9 -0
- data/test/rubygems/invalid_signer_cert_32.pem +9 -0
- data/test/rubygems/invalidchild_cert.pem +9 -0
- data/test/rubygems/invalidchild_cert_32.pem +9 -0
- data/test/rubygems/invalidchild_key.pem +9 -0
- data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -1
- data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -1
- data/test/rubygems/private_key.pem +7 -25
- data/test/rubygems/public_cert.pem +8 -18
- data/test/rubygems/public_cert_32.pem +10 -0
- data/test/rubygems/public_key.pem +4 -0
- data/test/rubygems/rubygems/commands/crash_command.rb +1 -1
- data/test/rubygems/test_config.rb +4 -6
- data/test/rubygems/test_deprecate.rb +76 -0
- data/test/rubygems/test_gem.rb +318 -83
- data/test/rubygems/test_gem_available_set.rb +106 -0
- data/test/rubygems/test_gem_command.rb +10 -0
- data/test/rubygems/test_gem_command_manager.rb +55 -9
- data/test/rubygems/test_gem_commands_build_command.rb +11 -19
- data/test/rubygems/test_gem_commands_cert_command.rb +441 -42
- data/test/rubygems/test_gem_commands_cleanup_command.rb +29 -1
- data/test/rubygems/test_gem_commands_contents_command.rb +23 -0
- data/test/rubygems/test_gem_commands_dependency_command.rb +5 -0
- data/test/rubygems/test_gem_commands_fetch_command.rb +19 -20
- data/test/rubygems/test_gem_commands_generate_index_command.rb +2 -83
- data/test/rubygems/test_gem_commands_help_command.rb +2 -1
- data/test/rubygems/test_gem_commands_install_command.rb +647 -48
- data/test/rubygems/test_gem_commands_mirror.rb +32 -0
- data/test/rubygems/test_gem_commands_owner_command.rb +4 -8
- data/test/rubygems/test_gem_commands_pristine_command.rb +99 -4
- data/test/rubygems/test_gem_commands_push_command.rb +62 -8
- data/test/rubygems/test_gem_commands_query_command.rb +51 -0
- data/test/rubygems/test_gem_commands_search_command.rb +25 -0
- data/test/rubygems/test_gem_commands_setup_command.rb +45 -0
- data/test/rubygems/test_gem_commands_sources_command.rb +21 -6
- data/test/rubygems/test_gem_commands_specification_command.rb +33 -1
- data/test/rubygems/test_gem_commands_uninstall_command.rb +91 -31
- data/test/rubygems/test_gem_commands_unpack_command.rb +3 -3
- data/test/rubygems/test_gem_commands_update_command.rb +56 -38
- data/test/rubygems/test_gem_commands_which_command.rb +4 -4
- data/test/rubygems/test_gem_commands_yank_command.rb +97 -0
- data/test/rubygems/test_gem_config_file.rb +66 -21
- data/test/rubygems/test_gem_dependency.rb +46 -0
- data/test/rubygems/test_gem_dependency_installer.rb +228 -18
- data/test/rubygems/test_gem_dependency_list.rb +0 -9
- data/test/rubygems/test_gem_dependency_resolver.rb +327 -0
- data/test/rubygems/test_gem_ext_configure_builder.rb +4 -4
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +21 -49
- data/test/rubygems/test_gem_ext_rake_builder.rb +13 -13
- data/test/rubygems/test_gem_gem_runner.rb +27 -5
- data/test/rubygems/test_gem_gemcutter_utilities.rb +19 -0
- data/test/rubygems/test_gem_indexer.rb +14 -227
- data/test/rubygems/test_gem_install_update_options.rb +83 -3
- data/test/rubygems/test_gem_installer.rb +211 -236
- data/test/rubygems/test_gem_local_remote_options.rb +8 -2
- data/test/rubygems/test_gem_name_tuple.rb +15 -0
- data/test/rubygems/test_gem_package.rb +547 -0
- data/test/rubygems/test_gem_package_old.rb +37 -0
- data/test/rubygems/test_gem_package_tar_reader.rb +32 -0
- data/test/rubygems/test_gem_package_tar_writer.rb +84 -1
- data/test/rubygems/test_gem_path_support.rb +4 -30
- data/test/rubygems/test_gem_platform.rb +3 -6
- data/test/rubygems/test_gem_rdoc.rb +245 -0
- data/test/rubygems/test_gem_remote_fetcher.rb +51 -5
- data/test/rubygems/test_gem_request_set.rb +70 -0
- data/test/rubygems/test_gem_requirement.rb +53 -24
- data/test/rubygems/test_gem_security.rb +189 -43
- data/test/rubygems/test_gem_security_policy.rb +376 -0
- data/test/rubygems/test_gem_security_signer.rb +184 -0
- data/test/rubygems/test_gem_security_trust_dir.rb +94 -0
- data/test/rubygems/test_gem_server.rb +31 -36
- data/test/rubygems/test_gem_silent_ui.rb +2 -2
- data/test/rubygems/test_gem_source.rb +188 -0
- data/test/rubygems/test_gem_source_list.rb +87 -0
- data/test/rubygems/test_gem_source_local.rb +83 -0
- data/test/rubygems/test_gem_source_specific_file.rb +33 -0
- data/test/rubygems/test_gem_spec_fetcher.rb +91 -255
- data/test/rubygems/test_gem_specification.rb +293 -39
- data/test/rubygems/test_gem_uninstaller.rb +136 -13
- data/test/rubygems/test_gem_validator.rb +14 -41
- data/test/rubygems/test_gem_version.rb +15 -21
- data/test/rubygems/test_require.rb +193 -0
- data/test/rubygems/wrong_key_cert.pem +9 -0
- data/test/rubygems/wrong_key_cert_32.pem +9 -0
- metadata +171 -83
- metadata.gz.sig +1 -0
- data/CVE-2013-4287.txt +0 -36
- data/CVE-2013-4363.txt +0 -45
- data/ci_build.sh +0 -27
- data/cruise_config.rb +0 -32
- data/lib/rbconfig/datadir.rb +0 -13
- data/lib/rubygems/builder.rb +0 -99
- data/lib/rubygems/custom_require.rb +0 -69
- data/lib/rubygems/doc_manager.rb +0 -243
- data/lib/rubygems/format.rb +0 -82
- data/lib/rubygems/gem_openssl.rb +0 -90
- data/lib/rubygems/gem_path_searcher.rb +0 -172
- data/lib/rubygems/old_format.rb +0 -153
- data/lib/rubygems/package/f_sync_dir.rb +0 -23
- data/lib/rubygems/package/tar_input.rb +0 -234
- data/lib/rubygems/package/tar_output.rb +0 -146
- data/lib/rubygems/require_paths_builder.rb +0 -18
- data/lib/rubygems/source_index.rb +0 -406
- data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
- data/lib/rubygems/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
- data/lib/rubygems/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +0 -23
- data/lib/rubygems/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
- data/lib/rubygems/ssl_certs/GeoTrustGlobalCA.pem +0 -20
- data/test/rubygems/test_bundled_ca.rb +0 -59
- data/test/rubygems/test_gem_builder.rb +0 -44
- data/test/rubygems/test_gem_doc_manager.rb +0 -32
- data/test/rubygems/test_gem_ext_builder.rb +0 -58
- data/test/rubygems/test_gem_format.rb +0 -88
- data/test/rubygems/test_gem_gem_path_searcher.rb +0 -94
- data/test/rubygems/test_gem_package_tar_input.rb +0 -129
- data/test/rubygems/test_gem_package_tar_output.rb +0 -101
- data/test/rubygems/test_gem_source_index.rb +0 -250
- data/util/update_bundled_ca_certificates.rb +0 -103
@@ -40,6 +40,8 @@ class TestGemLocalRemoteOptions < Gem::TestCase
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_clear_sources_option_idiot_proof
|
43
|
+
util_setup_fake_fetcher
|
44
|
+
|
43
45
|
@cmd.add_local_remote_options
|
44
46
|
@cmd.handle_options %W[--clear-sources]
|
45
47
|
assert_equal Gem.default_sources, Gem.sources
|
@@ -78,10 +80,14 @@ class TestGemLocalRemoteOptions < Gem::TestCase
|
|
78
80
|
s4 = URI.parse 'http://more-gems.example.com/' # Intentional duplicate
|
79
81
|
|
80
82
|
original_sources = Gem.sources.dup
|
83
|
+
|
81
84
|
@cmd.handle_options %W[--source #{s1} --source #{s2} --source #{s3} --source #{s4}]
|
82
85
|
|
83
|
-
|
84
|
-
|
86
|
+
original_sources << s1.to_s
|
87
|
+
original_sources << s2.to_s
|
88
|
+
original_sources << "#{s3}/"
|
89
|
+
|
90
|
+
assert_equal original_sources, Gem.sources
|
85
91
|
end
|
86
92
|
|
87
93
|
def test_update_sources_option
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems/test_case'
|
2
|
+
require 'rubygems/name_tuple'
|
3
|
+
|
4
|
+
class TestGemNameTuple < Gem::TestCase
|
5
|
+
def test_platform_normalization
|
6
|
+
n = Gem::NameTuple.new "a", Gem::Version.new(0), "ruby"
|
7
|
+
assert_equal "ruby", n.platform
|
8
|
+
|
9
|
+
n = Gem::NameTuple.new "a", Gem::Version.new(0), nil
|
10
|
+
assert_equal "ruby", n.platform
|
11
|
+
|
12
|
+
n = Gem::NameTuple.new "a", Gem::Version.new(0), ""
|
13
|
+
assert_equal "ruby", n.platform
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,547 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
|
3
|
+
require 'rubygems/package/tar_test_case'
|
4
|
+
require 'rubygems/simple_gem'
|
5
|
+
|
6
|
+
class TestGemPackage < Gem::Package::TarTestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
|
11
|
+
@spec = quick_gem 'a' do |s|
|
12
|
+
s.description = 'π'
|
13
|
+
s.files = %w[lib/code.rb]
|
14
|
+
end
|
15
|
+
|
16
|
+
util_build_gem @spec
|
17
|
+
|
18
|
+
@gem = @spec.cache_file
|
19
|
+
|
20
|
+
@destination = File.join @tempdir, 'extract'
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_class_new_old_format
|
24
|
+
open 'old_format.gem', 'wb' do |io|
|
25
|
+
io.write SIMPLE_GEM
|
26
|
+
end
|
27
|
+
|
28
|
+
package = Gem::Package.new 'old_format.gem'
|
29
|
+
|
30
|
+
assert package.spec
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_add_checksums
|
34
|
+
gem_io = StringIO.new
|
35
|
+
|
36
|
+
spec = Gem::Specification.new 'build', '1'
|
37
|
+
spec.summary = 'build'
|
38
|
+
spec.authors = 'build'
|
39
|
+
spec.files = ['lib/code.rb']
|
40
|
+
spec.date = Time.at 0
|
41
|
+
spec.rubygems_version = Gem::Version.new '0'
|
42
|
+
|
43
|
+
FileUtils.mkdir 'lib'
|
44
|
+
|
45
|
+
open 'lib/code.rb', 'w' do |io|
|
46
|
+
io.write '# lib/code.rb'
|
47
|
+
end
|
48
|
+
|
49
|
+
package = Gem::Package.new spec.file_name
|
50
|
+
package.spec = spec
|
51
|
+
package.build_time = 1 # 0 uses current time
|
52
|
+
package.setup_signer
|
53
|
+
|
54
|
+
Gem::Package::TarWriter.new gem_io do |gem|
|
55
|
+
package.add_metadata gem
|
56
|
+
package.add_contents gem
|
57
|
+
package.add_checksums gem
|
58
|
+
end
|
59
|
+
|
60
|
+
gem_io.rewind
|
61
|
+
|
62
|
+
reader = Gem::Package::TarReader.new gem_io
|
63
|
+
|
64
|
+
checksums = nil
|
65
|
+
|
66
|
+
reader.each_entry do |entry|
|
67
|
+
case entry.full_name
|
68
|
+
when 'checksums.yaml.gz'
|
69
|
+
Zlib::GzipReader.wrap entry do |io|
|
70
|
+
checksums = io.read
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
s = StringIO.new
|
76
|
+
|
77
|
+
package.gzip_to s do |io|
|
78
|
+
io.write spec.to_yaml
|
79
|
+
end
|
80
|
+
|
81
|
+
metadata_sha1 = Digest::SHA1.hexdigest s.string
|
82
|
+
metadata_sha512 = Digest::SHA512.hexdigest s.string
|
83
|
+
|
84
|
+
data_digests = nil
|
85
|
+
util_tar do |tar|
|
86
|
+
data_digests = package.add_contents tar
|
87
|
+
end
|
88
|
+
|
89
|
+
expected = {
|
90
|
+
'SHA1' => {
|
91
|
+
'metadata.gz' => metadata_sha1,
|
92
|
+
'data.tar.gz' => data_digests['SHA1'].hexdigest,
|
93
|
+
},
|
94
|
+
'SHA512' => {
|
95
|
+
'metadata.gz' => metadata_sha512,
|
96
|
+
'data.tar.gz' => data_digests['SHA512'].hexdigest,
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
assert_equal expected, YAML.load(checksums)
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_add_files
|
104
|
+
spec = Gem::Specification.new
|
105
|
+
spec.files = 'lib/code.rb'
|
106
|
+
|
107
|
+
FileUtils.mkdir 'lib'
|
108
|
+
open 'lib/code.rb', 'w' do |io| io.write '# lib/code.rb' end
|
109
|
+
open 'lib/extra.rb', 'w' do |io| io.write '# lib/extra.rb' end
|
110
|
+
|
111
|
+
package = Gem::Package.new 'bogus.gem'
|
112
|
+
package.spec = spec
|
113
|
+
|
114
|
+
tar = util_tar do |tar_io|
|
115
|
+
package.add_files tar_io
|
116
|
+
end
|
117
|
+
|
118
|
+
tar.rewind
|
119
|
+
|
120
|
+
files = []
|
121
|
+
|
122
|
+
Gem::Package::TarReader.new tar do |tar_io|
|
123
|
+
tar_io.each_entry do |entry|
|
124
|
+
files << entry.full_name
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
assert_equal %w[lib/code.rb], files
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_build
|
132
|
+
spec = Gem::Specification.new 'build', '1'
|
133
|
+
spec.summary = 'build'
|
134
|
+
spec.authors = 'build'
|
135
|
+
spec.files = ['lib/code.rb']
|
136
|
+
|
137
|
+
FileUtils.mkdir 'lib'
|
138
|
+
|
139
|
+
open 'lib/code.rb', 'w' do |io|
|
140
|
+
io.write '# lib/code.rb'
|
141
|
+
end
|
142
|
+
|
143
|
+
package = Gem::Package.new spec.file_name
|
144
|
+
package.spec = spec
|
145
|
+
|
146
|
+
package.build
|
147
|
+
|
148
|
+
assert_equal Gem::VERSION, spec.rubygems_version
|
149
|
+
assert_path_exists spec.file_name
|
150
|
+
|
151
|
+
reader = Gem::Package.new spec.file_name
|
152
|
+
assert_equal spec, reader.spec
|
153
|
+
|
154
|
+
assert_equal %w[metadata.gz data.tar.gz checksums.yaml.gz],
|
155
|
+
reader.files
|
156
|
+
|
157
|
+
assert_equal %w[lib/code.rb], reader.contents
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_build_auto_signed
|
161
|
+
private_key_path = File.join Gem.user_home, 'gem-private_key.pem'
|
162
|
+
Gem::Security.write PRIVATE_KEY, private_key_path
|
163
|
+
|
164
|
+
public_cert_path = File.join Gem.user_home, 'gem-public_cert.pem'
|
165
|
+
Gem::Security.write PUBLIC_CERT, public_cert_path
|
166
|
+
|
167
|
+
spec = Gem::Specification.new 'build', '1'
|
168
|
+
spec.summary = 'build'
|
169
|
+
spec.authors = 'build'
|
170
|
+
spec.files = ['lib/code.rb']
|
171
|
+
|
172
|
+
FileUtils.mkdir 'lib'
|
173
|
+
|
174
|
+
open 'lib/code.rb', 'w' do |io|
|
175
|
+
io.write '# lib/code.rb'
|
176
|
+
end
|
177
|
+
|
178
|
+
package = Gem::Package.new spec.file_name
|
179
|
+
package.spec = spec
|
180
|
+
|
181
|
+
package.build
|
182
|
+
|
183
|
+
assert_equal Gem::VERSION, spec.rubygems_version
|
184
|
+
assert_path_exists spec.file_name
|
185
|
+
|
186
|
+
reader = Gem::Package.new spec.file_name
|
187
|
+
assert reader.verify
|
188
|
+
|
189
|
+
assert_equal [PUBLIC_CERT.to_pem], reader.spec.cert_chain
|
190
|
+
|
191
|
+
assert_equal %w[metadata.gz metadata.gz.sig
|
192
|
+
data.tar.gz data.tar.gz.sig
|
193
|
+
checksums.yaml.gz checksums.yaml.gz.sig],
|
194
|
+
reader.files
|
195
|
+
|
196
|
+
assert_equal %w[lib/code.rb], reader.contents
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_build_invalid
|
200
|
+
spec = Gem::Specification.new 'build', '1'
|
201
|
+
|
202
|
+
package = Gem::Package.new spec.file_name
|
203
|
+
package.spec = spec
|
204
|
+
|
205
|
+
e = assert_raises Gem::InvalidSpecificationException do
|
206
|
+
package.build
|
207
|
+
end
|
208
|
+
|
209
|
+
assert_equal 'missing value for attribute summary', e.message
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_build_signed
|
213
|
+
spec = Gem::Specification.new 'build', '1'
|
214
|
+
spec.summary = 'build'
|
215
|
+
spec.authors = 'build'
|
216
|
+
spec.files = ['lib/code.rb']
|
217
|
+
spec.cert_chain = [PUBLIC_CERT.to_pem]
|
218
|
+
spec.signing_key = PRIVATE_KEY
|
219
|
+
|
220
|
+
FileUtils.mkdir 'lib'
|
221
|
+
|
222
|
+
open 'lib/code.rb', 'w' do |io|
|
223
|
+
io.write '# lib/code.rb'
|
224
|
+
end
|
225
|
+
|
226
|
+
package = Gem::Package.new spec.file_name
|
227
|
+
package.spec = spec
|
228
|
+
|
229
|
+
package.build
|
230
|
+
|
231
|
+
assert_equal Gem::VERSION, spec.rubygems_version
|
232
|
+
assert_path_exists spec.file_name
|
233
|
+
|
234
|
+
reader = Gem::Package.new spec.file_name
|
235
|
+
assert reader.verify
|
236
|
+
|
237
|
+
assert_equal spec, reader.spec
|
238
|
+
|
239
|
+
assert_equal %w[metadata.gz metadata.gz.sig
|
240
|
+
data.tar.gz data.tar.gz.sig
|
241
|
+
checksums.yaml.gz checksums.yaml.gz.sig],
|
242
|
+
reader.files
|
243
|
+
|
244
|
+
assert_equal %w[lib/code.rb], reader.contents
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_contents
|
248
|
+
package = Gem::Package.new @gem
|
249
|
+
|
250
|
+
assert_equal %w[lib/code.rb], package.contents
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_extract_files
|
254
|
+
package = Gem::Package.new @gem
|
255
|
+
|
256
|
+
package.extract_files @destination
|
257
|
+
|
258
|
+
extracted = File.join @destination, 'lib/code.rb'
|
259
|
+
assert_path_exists extracted
|
260
|
+
|
261
|
+
mask = 0100666 & (~File.umask)
|
262
|
+
|
263
|
+
assert_equal mask.to_s(8), File.stat(extracted).mode.to_s(8) unless
|
264
|
+
win_platform?
|
265
|
+
end
|
266
|
+
|
267
|
+
def test_extract_files_empty
|
268
|
+
data_tgz = util_tar_gz do end
|
269
|
+
|
270
|
+
gem = util_tar do |tar|
|
271
|
+
tar.add_file 'data.tar.gz', 0644 do |io|
|
272
|
+
io.write data_tgz.string
|
273
|
+
end
|
274
|
+
|
275
|
+
tar.add_file 'metadata.gz', 0644 do |io|
|
276
|
+
Zlib::GzipWriter.wrap io do |gzio|
|
277
|
+
gzio.write @spec.to_yaml
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
open 'empty.gem', 'wb' do |io|
|
283
|
+
io.write gem.string
|
284
|
+
end
|
285
|
+
|
286
|
+
package = Gem::Package.new 'empty.gem'
|
287
|
+
|
288
|
+
package.extract_files @destination
|
289
|
+
|
290
|
+
assert_path_exists @destination
|
291
|
+
end
|
292
|
+
|
293
|
+
def test_extract_tar_gz_absolute
|
294
|
+
package = Gem::Package.new @gem
|
295
|
+
|
296
|
+
tgz_io = util_tar_gz do |tar|
|
297
|
+
tar.add_file '/absolute.rb', 0644 do |io| io.write 'hi' end
|
298
|
+
end
|
299
|
+
|
300
|
+
e = assert_raises Gem::Package::PathError do
|
301
|
+
package.extract_tar_gz tgz_io, @destination
|
302
|
+
end
|
303
|
+
|
304
|
+
assert_equal("installing into parent path /absolute.rb of " \
|
305
|
+
"#{@destination} is not allowed", e.message)
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_install_location
|
309
|
+
package = Gem::Package.new @gem
|
310
|
+
|
311
|
+
file = 'file.rb'
|
312
|
+
file.taint
|
313
|
+
|
314
|
+
destination = package.install_location file, @destination
|
315
|
+
|
316
|
+
assert_equal File.join(@destination, 'file.rb'), destination
|
317
|
+
refute destination.tainted?
|
318
|
+
end
|
319
|
+
|
320
|
+
def test_install_location_absolute
|
321
|
+
package = Gem::Package.new @gem
|
322
|
+
|
323
|
+
e = assert_raises Gem::Package::PathError do
|
324
|
+
package.install_location '/absolute.rb', @destination
|
325
|
+
end
|
326
|
+
|
327
|
+
assert_equal("installing into parent path /absolute.rb of " \
|
328
|
+
"#{@destination} is not allowed", e.message)
|
329
|
+
end
|
330
|
+
|
331
|
+
def test_install_location_relative
|
332
|
+
package = Gem::Package.new @gem
|
333
|
+
|
334
|
+
e = assert_raises Gem::Package::PathError do
|
335
|
+
package.install_location '../relative.rb', @destination
|
336
|
+
end
|
337
|
+
|
338
|
+
parent = File.expand_path File.join @destination, "../relative.rb"
|
339
|
+
|
340
|
+
assert_equal("installing into parent path #{parent} of " \
|
341
|
+
"#{@destination} is not allowed", e.message)
|
342
|
+
end
|
343
|
+
|
344
|
+
def test_load_spec
|
345
|
+
entry = StringIO.new Gem.gzip @spec.to_yaml
|
346
|
+
def entry.full_name() 'metadata.gz' end
|
347
|
+
|
348
|
+
package = Gem::Package.new 'nonexistent.gem'
|
349
|
+
|
350
|
+
spec = package.load_spec entry
|
351
|
+
|
352
|
+
assert_equal @spec, spec
|
353
|
+
end
|
354
|
+
|
355
|
+
def test_verify
|
356
|
+
package = Gem::Package.new @gem
|
357
|
+
|
358
|
+
package.verify
|
359
|
+
|
360
|
+
assert_equal @spec, package.spec
|
361
|
+
assert_equal %w[checksums.yaml.gz data.tar.gz metadata.gz],
|
362
|
+
package.files.sort
|
363
|
+
end
|
364
|
+
|
365
|
+
def test_verify_checksum_bad
|
366
|
+
data_tgz = util_tar_gz do |tar|
|
367
|
+
tar.add_file 'lib/code.rb', 0444 do |io|
|
368
|
+
io.write '# lib/code.rb'
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
data_tgz = data_tgz.string
|
373
|
+
|
374
|
+
gem = util_tar do |tar|
|
375
|
+
metadata_gz = Gem.gzip @spec.to_yaml
|
376
|
+
|
377
|
+
tar.add_file 'metadata.gz', 0444 do |io|
|
378
|
+
io.write metadata_gz
|
379
|
+
end
|
380
|
+
|
381
|
+
tar.add_file 'data.tar.gz', 0444 do |io|
|
382
|
+
io.write data_tgz
|
383
|
+
end
|
384
|
+
|
385
|
+
bogus_checksums = {
|
386
|
+
'SHA1' => {
|
387
|
+
'data.tar.gz' => 'bogus',
|
388
|
+
'metadata.gz' => 'bogus',
|
389
|
+
},
|
390
|
+
}
|
391
|
+
tar.add_file 'checksums.yaml.gz', 0444 do |io|
|
392
|
+
Zlib::GzipWriter.wrap io do |gz_io|
|
393
|
+
gz_io.write YAML.dump bogus_checksums
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
open 'mismatch.gem', 'wb' do |io|
|
399
|
+
io.write gem.string
|
400
|
+
end
|
401
|
+
|
402
|
+
package = Gem::Package.new 'mismatch.gem'
|
403
|
+
|
404
|
+
e = assert_raises Gem::Package::FormatError do
|
405
|
+
package.verify
|
406
|
+
end
|
407
|
+
|
408
|
+
assert_equal 'SHA1 checksum mismatch for data.tar.gz in mismatch.gem',
|
409
|
+
e.message
|
410
|
+
end
|
411
|
+
|
412
|
+
def test_verify_checksum_missing
|
413
|
+
data_tgz = util_tar_gz do |tar|
|
414
|
+
tar.add_file 'lib/code.rb', 0444 do |io|
|
415
|
+
io.write '# lib/code.rb'
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
data_tgz = data_tgz.string
|
420
|
+
|
421
|
+
gem = util_tar do |tar|
|
422
|
+
metadata_gz = Gem.gzip @spec.to_yaml
|
423
|
+
|
424
|
+
tar.add_file 'metadata.gz', 0444 do |io|
|
425
|
+
io.write metadata_gz
|
426
|
+
end
|
427
|
+
|
428
|
+
digest = OpenSSL::Digest::SHA1.new
|
429
|
+
digest << metadata_gz
|
430
|
+
checksum = "#{digest.name}\t#{digest.hexdigest}\n"
|
431
|
+
|
432
|
+
tar.add_file 'metadata.gz.sum', 0444 do |io|
|
433
|
+
io.write checksum
|
434
|
+
end
|
435
|
+
|
436
|
+
tar.add_file 'data.tar.gz', 0444 do |io|
|
437
|
+
io.write data_tgz
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
open 'data_checksum_missing.gem', 'wb' do |io|
|
442
|
+
io.write gem.string
|
443
|
+
end
|
444
|
+
|
445
|
+
package = Gem::Package.new 'data_checksum_missing.gem'
|
446
|
+
|
447
|
+
assert package.verify
|
448
|
+
end
|
449
|
+
|
450
|
+
def test_verify_corrupt
|
451
|
+
Tempfile.open 'corrupt' do |io|
|
452
|
+
data = Gem.gzip 'a' * 10
|
453
|
+
io.write tar_file_header('metadata.gz', "\000x", 0644, data.length)
|
454
|
+
io.write data
|
455
|
+
io.rewind
|
456
|
+
|
457
|
+
package = Gem::Package.new io.path
|
458
|
+
|
459
|
+
e = assert_raises Gem::Package::FormatError do
|
460
|
+
package.verify
|
461
|
+
end
|
462
|
+
|
463
|
+
assert_equal "tar is corrupt, name contains null byte in #{io.path}",
|
464
|
+
e.message
|
465
|
+
end
|
466
|
+
end
|
467
|
+
|
468
|
+
def test_verify_empty
|
469
|
+
FileUtils.touch 'empty.gem'
|
470
|
+
|
471
|
+
package = Gem::Package.new 'empty.gem'
|
472
|
+
|
473
|
+
e = assert_raises Gem::Package::FormatError do
|
474
|
+
package.verify
|
475
|
+
end
|
476
|
+
|
477
|
+
assert_equal 'package metadata is missing in empty.gem', e.message
|
478
|
+
end
|
479
|
+
|
480
|
+
def test_verify_nonexistent
|
481
|
+
package = Gem::Package.new 'nonexistent.gem'
|
482
|
+
|
483
|
+
e = assert_raises Gem::Package::FormatError do
|
484
|
+
package.verify
|
485
|
+
end
|
486
|
+
|
487
|
+
assert_equal 'No such file or directory - nonexistent.gem', e.message
|
488
|
+
end
|
489
|
+
|
490
|
+
def test_verify_security_policy
|
491
|
+
package = Gem::Package.new @gem
|
492
|
+
package.security_policy = Gem::Security::HighSecurity
|
493
|
+
|
494
|
+
e = assert_raises Gem::Security::Exception do
|
495
|
+
package.verify
|
496
|
+
end
|
497
|
+
|
498
|
+
assert_equal 'unsigned gems are not allowed by the High Security policy',
|
499
|
+
e.message
|
500
|
+
end
|
501
|
+
|
502
|
+
def test_verify_truncate
|
503
|
+
open 'bad.gem', 'wb' do |io|
|
504
|
+
io.write File.read(@gem, 1024) # don't care about newlines
|
505
|
+
end
|
506
|
+
|
507
|
+
package = Gem::Package.new 'bad.gem'
|
508
|
+
|
509
|
+
e = assert_raises Gem::Package::FormatError do
|
510
|
+
package.verify
|
511
|
+
end
|
512
|
+
|
513
|
+
assert_equal 'package content (data.tar.gz) is missing in bad.gem',
|
514
|
+
e.message
|
515
|
+
end
|
516
|
+
|
517
|
+
def test_spec
|
518
|
+
package = Gem::Package.new @gem
|
519
|
+
|
520
|
+
assert_equal @spec, package.spec
|
521
|
+
end
|
522
|
+
|
523
|
+
def util_tar
|
524
|
+
tar_io = StringIO.new
|
525
|
+
|
526
|
+
Gem::Package::TarWriter.new tar_io do |tar|
|
527
|
+
yield tar
|
528
|
+
end
|
529
|
+
|
530
|
+
tar_io.rewind
|
531
|
+
|
532
|
+
tar_io
|
533
|
+
end
|
534
|
+
|
535
|
+
def util_tar_gz(&block)
|
536
|
+
tar_io = util_tar(&block)
|
537
|
+
|
538
|
+
tgz_io = StringIO.new
|
539
|
+
|
540
|
+
# can't wrap TarWriter because it seeks
|
541
|
+
Zlib::GzipWriter.wrap tgz_io do |io| io.write tar_io.string end
|
542
|
+
|
543
|
+
StringIO.new tgz_io.string
|
544
|
+
end
|
545
|
+
|
546
|
+
end
|
547
|
+
|