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.

Files changed (241) hide show
  1. checksums.yaml +6 -6
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +3 -0
  4. data/.autotest +6 -3
  5. data/History.txt +137 -63
  6. data/LICENSE.txt +1 -5
  7. data/Manifest.txt +69 -32
  8. data/README.rdoc +11 -9
  9. data/Rakefile +24 -38
  10. data/bin/gem +0 -9
  11. data/bin/update_rubygems +1 -0
  12. data/lib/rubygems.rb +193 -405
  13. data/lib/rubygems/available_set.rb +95 -0
  14. data/lib/rubygems/command.rb +88 -45
  15. data/lib/rubygems/command_manager.rb +67 -40
  16. data/lib/rubygems/commands/build_command.rb +5 -23
  17. data/lib/rubygems/commands/cert_command.rb +199 -57
  18. data/lib/rubygems/commands/check_command.rb +14 -39
  19. data/lib/rubygems/commands/cleanup_command.rb +9 -1
  20. data/lib/rubygems/commands/contents_command.rb +30 -12
  21. data/lib/rubygems/commands/dependency_command.rb +3 -8
  22. data/lib/rubygems/commands/environment_command.rb +13 -8
  23. data/lib/rubygems/commands/fetch_command.rb +3 -16
  24. data/lib/rubygems/commands/generate_index_command.rb +7 -47
  25. data/lib/rubygems/commands/help_command.rb +1 -1
  26. data/lib/rubygems/commands/install_command.rb +69 -36
  27. data/lib/rubygems/commands/list_command.rb +6 -4
  28. data/lib/rubygems/commands/lock_command.rb +1 -1
  29. data/lib/rubygems/commands/mirror_command.rb +17 -0
  30. data/lib/rubygems/commands/outdated_command.rb +6 -3
  31. data/lib/rubygems/commands/owner_command.rb +13 -5
  32. data/lib/rubygems/commands/pristine_command.rb +19 -4
  33. data/lib/rubygems/commands/push_command.rb +12 -1
  34. data/lib/rubygems/commands/query_command.rb +43 -27
  35. data/lib/rubygems/commands/rdoc_command.rb +23 -28
  36. data/lib/rubygems/commands/search_command.rb +4 -18
  37. data/lib/rubygems/commands/server_command.rb +1 -1
  38. data/lib/rubygems/commands/setup_command.rb +124 -38
  39. data/lib/rubygems/commands/sources_command.rb +16 -16
  40. data/lib/rubygems/commands/specification_command.rb +11 -13
  41. data/lib/rubygems/commands/uninstall_command.rb +24 -7
  42. data/lib/rubygems/commands/unpack_command.rb +7 -3
  43. data/lib/rubygems/commands/update_command.rb +22 -36
  44. data/lib/rubygems/commands/yank_command.rb +98 -0
  45. data/lib/rubygems/compatibility.rb +51 -0
  46. data/lib/rubygems/config_file.rb +82 -54
  47. data/lib/rubygems/core_ext/kernel_gem.rb +53 -0
  48. data/lib/rubygems/core_ext/kernel_require.rb +119 -0
  49. data/lib/rubygems/defaults.rb +10 -21
  50. data/lib/rubygems/dependency.rb +61 -10
  51. data/lib/rubygems/dependency_installer.rb +157 -69
  52. data/lib/rubygems/dependency_list.rb +11 -19
  53. data/lib/rubygems/dependency_resolver.rb +562 -0
  54. data/lib/rubygems/deprecate.rb +40 -40
  55. data/lib/rubygems/errors.rb +77 -24
  56. data/lib/rubygems/exceptions.rb +25 -7
  57. data/lib/rubygems/ext/builder.rb +20 -23
  58. data/lib/rubygems/ext/configure_builder.rb +2 -2
  59. data/lib/rubygems/ext/ext_conf_builder.rb +5 -45
  60. data/lib/rubygems/ext/rake_builder.rb +2 -2
  61. data/lib/rubygems/gem_runner.rb +3 -16
  62. data/lib/rubygems/gemcutter_utilities.rb +22 -7
  63. data/lib/rubygems/indexer.rb +6 -159
  64. data/lib/rubygems/install_message.rb +12 -0
  65. data/lib/rubygems/install_update_options.rb +56 -18
  66. data/lib/rubygems/installer.rb +244 -134
  67. data/lib/rubygems/installer_test_case.rb +71 -19
  68. data/lib/rubygems/mock_gem_ui.rb +17 -0
  69. data/lib/rubygems/name_tuple.rb +110 -0
  70. data/lib/rubygems/package.rb +514 -43
  71. data/lib/rubygems/package/digest_io.rb +64 -0
  72. data/lib/rubygems/package/old.rb +147 -0
  73. data/lib/rubygems/package/tar_header.rb +18 -55
  74. data/lib/rubygems/package/tar_reader.rb +20 -3
  75. data/lib/rubygems/package/tar_writer.rb +63 -7
  76. data/lib/rubygems/package_task.rb +3 -4
  77. data/lib/rubygems/path_support.rb +14 -7
  78. data/lib/rubygems/platform.rb +19 -26
  79. data/lib/rubygems/rdoc.rb +316 -0
  80. data/lib/rubygems/remote_fetcher.rb +117 -54
  81. data/lib/rubygems/request_set.rb +182 -0
  82. data/lib/rubygems/requirement.rb +63 -26
  83. data/lib/rubygems/security.rb +295 -555
  84. data/lib/rubygems/security/policies.rb +115 -0
  85. data/lib/rubygems/security/policy.rb +227 -0
  86. data/lib/rubygems/security/signer.rb +136 -0
  87. data/lib/rubygems/security/trust_dir.rb +104 -0
  88. data/lib/rubygems/server.rb +45 -55
  89. data/lib/rubygems/source.rb +144 -0
  90. data/lib/rubygems/source_list.rb +87 -0
  91. data/lib/rubygems/source_local.rb +92 -0
  92. data/lib/rubygems/source_specific_file.rb +28 -0
  93. data/lib/rubygems/spec_fetcher.rb +116 -184
  94. data/lib/rubygems/specification.rb +731 -335
  95. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +88 -30
  96. data/lib/rubygems/ssl_certs/Entrust_net-Secure-Server-Certification-Authority.pem +90 -0
  97. data/lib/rubygems/ssl_certs/VerisignClass3PublicPrimaryCertificationAuthority-G2.pem +57 -0
  98. data/lib/rubygems/syck_hack.rb +2 -0
  99. data/lib/rubygems/test_case.rb +199 -109
  100. data/lib/rubygems/test_utilities.rb +25 -5
  101. data/lib/rubygems/uninstaller.rb +62 -20
  102. data/lib/rubygems/user_interaction.rb +10 -0
  103. data/lib/rubygems/validator.rb +33 -40
  104. data/lib/rubygems/version.rb +19 -8
  105. data/setup.rb +8 -1
  106. data/test/rubygems/alternate_cert.pem +9 -0
  107. data/test/rubygems/alternate_cert_32.pem +9 -0
  108. data/test/rubygems/alternate_key.pem +9 -0
  109. data/test/rubygems/bad_rake.rb +1 -0
  110. data/test/rubygems/child_cert.pem +9 -0
  111. data/test/rubygems/child_cert_32.pem +9 -0
  112. data/test/rubygems/child_key.pem +9 -0
  113. data/test/rubygems/data/null-type.gemspec.rz +0 -0
  114. data/test/rubygems/expired_cert.pem +9 -0
  115. data/test/rubygems/future_cert.pem +9 -0
  116. data/test/rubygems/future_cert_32.pem +9 -0
  117. data/test/rubygems/good_rake.rb +1 -0
  118. data/test/rubygems/grandchild_cert.pem +9 -0
  119. data/test/rubygems/grandchild_cert_32.pem +9 -0
  120. data/test/rubygems/grandchild_key.pem +9 -0
  121. data/test/rubygems/invalid_issuer_cert.pem +9 -0
  122. data/test/rubygems/invalid_issuer_cert_32.pem +9 -0
  123. data/test/rubygems/invalid_key.pem +9 -0
  124. data/test/rubygems/invalid_signer_cert.pem +9 -0
  125. data/test/rubygems/invalid_signer_cert_32.pem +9 -0
  126. data/test/rubygems/invalidchild_cert.pem +9 -0
  127. data/test/rubygems/invalidchild_cert_32.pem +9 -0
  128. data/test/rubygems/invalidchild_key.pem +9 -0
  129. data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -1
  130. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -1
  131. data/test/rubygems/private_key.pem +7 -25
  132. data/test/rubygems/public_cert.pem +8 -18
  133. data/test/rubygems/public_cert_32.pem +10 -0
  134. data/test/rubygems/public_key.pem +4 -0
  135. data/test/rubygems/rubygems/commands/crash_command.rb +1 -1
  136. data/test/rubygems/test_config.rb +4 -6
  137. data/test/rubygems/test_deprecate.rb +76 -0
  138. data/test/rubygems/test_gem.rb +318 -83
  139. data/test/rubygems/test_gem_available_set.rb +106 -0
  140. data/test/rubygems/test_gem_command.rb +10 -0
  141. data/test/rubygems/test_gem_command_manager.rb +55 -9
  142. data/test/rubygems/test_gem_commands_build_command.rb +11 -19
  143. data/test/rubygems/test_gem_commands_cert_command.rb +441 -42
  144. data/test/rubygems/test_gem_commands_cleanup_command.rb +29 -1
  145. data/test/rubygems/test_gem_commands_contents_command.rb +23 -0
  146. data/test/rubygems/test_gem_commands_dependency_command.rb +5 -0
  147. data/test/rubygems/test_gem_commands_fetch_command.rb +19 -20
  148. data/test/rubygems/test_gem_commands_generate_index_command.rb +2 -83
  149. data/test/rubygems/test_gem_commands_help_command.rb +2 -1
  150. data/test/rubygems/test_gem_commands_install_command.rb +647 -48
  151. data/test/rubygems/test_gem_commands_mirror.rb +32 -0
  152. data/test/rubygems/test_gem_commands_owner_command.rb +4 -8
  153. data/test/rubygems/test_gem_commands_pristine_command.rb +99 -4
  154. data/test/rubygems/test_gem_commands_push_command.rb +62 -8
  155. data/test/rubygems/test_gem_commands_query_command.rb +51 -0
  156. data/test/rubygems/test_gem_commands_search_command.rb +25 -0
  157. data/test/rubygems/test_gem_commands_setup_command.rb +45 -0
  158. data/test/rubygems/test_gem_commands_sources_command.rb +21 -6
  159. data/test/rubygems/test_gem_commands_specification_command.rb +33 -1
  160. data/test/rubygems/test_gem_commands_uninstall_command.rb +91 -31
  161. data/test/rubygems/test_gem_commands_unpack_command.rb +3 -3
  162. data/test/rubygems/test_gem_commands_update_command.rb +56 -38
  163. data/test/rubygems/test_gem_commands_which_command.rb +4 -4
  164. data/test/rubygems/test_gem_commands_yank_command.rb +97 -0
  165. data/test/rubygems/test_gem_config_file.rb +66 -21
  166. data/test/rubygems/test_gem_dependency.rb +46 -0
  167. data/test/rubygems/test_gem_dependency_installer.rb +228 -18
  168. data/test/rubygems/test_gem_dependency_list.rb +0 -9
  169. data/test/rubygems/test_gem_dependency_resolver.rb +327 -0
  170. data/test/rubygems/test_gem_ext_configure_builder.rb +4 -4
  171. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +21 -49
  172. data/test/rubygems/test_gem_ext_rake_builder.rb +13 -13
  173. data/test/rubygems/test_gem_gem_runner.rb +27 -5
  174. data/test/rubygems/test_gem_gemcutter_utilities.rb +19 -0
  175. data/test/rubygems/test_gem_indexer.rb +14 -227
  176. data/test/rubygems/test_gem_install_update_options.rb +83 -3
  177. data/test/rubygems/test_gem_installer.rb +211 -236
  178. data/test/rubygems/test_gem_local_remote_options.rb +8 -2
  179. data/test/rubygems/test_gem_name_tuple.rb +15 -0
  180. data/test/rubygems/test_gem_package.rb +547 -0
  181. data/test/rubygems/test_gem_package_old.rb +37 -0
  182. data/test/rubygems/test_gem_package_tar_reader.rb +32 -0
  183. data/test/rubygems/test_gem_package_tar_writer.rb +84 -1
  184. data/test/rubygems/test_gem_path_support.rb +4 -30
  185. data/test/rubygems/test_gem_platform.rb +3 -6
  186. data/test/rubygems/test_gem_rdoc.rb +245 -0
  187. data/test/rubygems/test_gem_remote_fetcher.rb +51 -5
  188. data/test/rubygems/test_gem_request_set.rb +70 -0
  189. data/test/rubygems/test_gem_requirement.rb +53 -24
  190. data/test/rubygems/test_gem_security.rb +189 -43
  191. data/test/rubygems/test_gem_security_policy.rb +376 -0
  192. data/test/rubygems/test_gem_security_signer.rb +184 -0
  193. data/test/rubygems/test_gem_security_trust_dir.rb +94 -0
  194. data/test/rubygems/test_gem_server.rb +31 -36
  195. data/test/rubygems/test_gem_silent_ui.rb +2 -2
  196. data/test/rubygems/test_gem_source.rb +188 -0
  197. data/test/rubygems/test_gem_source_list.rb +87 -0
  198. data/test/rubygems/test_gem_source_local.rb +83 -0
  199. data/test/rubygems/test_gem_source_specific_file.rb +33 -0
  200. data/test/rubygems/test_gem_spec_fetcher.rb +91 -255
  201. data/test/rubygems/test_gem_specification.rb +293 -39
  202. data/test/rubygems/test_gem_uninstaller.rb +136 -13
  203. data/test/rubygems/test_gem_validator.rb +14 -41
  204. data/test/rubygems/test_gem_version.rb +15 -21
  205. data/test/rubygems/test_require.rb +193 -0
  206. data/test/rubygems/wrong_key_cert.pem +9 -0
  207. data/test/rubygems/wrong_key_cert_32.pem +9 -0
  208. metadata +171 -83
  209. metadata.gz.sig +1 -0
  210. data/CVE-2013-4287.txt +0 -36
  211. data/CVE-2013-4363.txt +0 -45
  212. data/ci_build.sh +0 -27
  213. data/cruise_config.rb +0 -32
  214. data/lib/rbconfig/datadir.rb +0 -13
  215. data/lib/rubygems/builder.rb +0 -99
  216. data/lib/rubygems/custom_require.rb +0 -69
  217. data/lib/rubygems/doc_manager.rb +0 -243
  218. data/lib/rubygems/format.rb +0 -82
  219. data/lib/rubygems/gem_openssl.rb +0 -90
  220. data/lib/rubygems/gem_path_searcher.rb +0 -172
  221. data/lib/rubygems/old_format.rb +0 -153
  222. data/lib/rubygems/package/f_sync_dir.rb +0 -23
  223. data/lib/rubygems/package/tar_input.rb +0 -234
  224. data/lib/rubygems/package/tar_output.rb +0 -146
  225. data/lib/rubygems/require_paths_builder.rb +0 -18
  226. data/lib/rubygems/source_index.rb +0 -406
  227. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
  228. data/lib/rubygems/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
  229. data/lib/rubygems/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +0 -23
  230. data/lib/rubygems/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  231. data/lib/rubygems/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  232. data/test/rubygems/test_bundled_ca.rb +0 -59
  233. data/test/rubygems/test_gem_builder.rb +0 -44
  234. data/test/rubygems/test_gem_doc_manager.rb +0 -32
  235. data/test/rubygems/test_gem_ext_builder.rb +0 -58
  236. data/test/rubygems/test_gem_format.rb +0 -88
  237. data/test/rubygems/test_gem_gem_path_searcher.rb +0 -94
  238. data/test/rubygems/test_gem_package_tar_input.rb +0 -129
  239. data/test/rubygems/test_gem_package_tar_output.rb +0 -101
  240. data/test/rubygems/test_gem_source_index.rb +0 -250
  241. data/util/update_bundled_ca_certificates.rb +0 -103
@@ -3,7 +3,8 @@ require 'ostruct'
3
3
  require 'webrick'
4
4
  require 'webrick/https'
5
5
  require 'rubygems/remote_fetcher'
6
- require 'rubygems/format'
6
+ require 'rubygems/package'
7
+ require 'minitest/mock'
7
8
 
8
9
  # = Testing Proxy Settings
9
10
  #
@@ -87,6 +88,8 @@ gems:
87
88
  ENV.delete 'HTTP_PROXY_USER'
88
89
  ENV.delete 'http_proxy_pass'
89
90
  ENV.delete 'HTTP_PROXY_PASS'
91
+ ENV.delete 'no_proxy'
92
+ ENV.delete 'NO_PROXY'
90
93
 
91
94
  base_server_uri = "http://localhost:#{SERVER_PORT}"
92
95
  @proxy_uri = "http://localhost:#{PROXY_PORT}"
@@ -101,6 +104,7 @@ gems:
101
104
 
102
105
  # TODO: why does the remote fetcher need it written to disk?
103
106
  @a1, @a1_gem = util_gem 'a', '1' do |s| s.executables << 'a_bin' end
107
+ @a1.loaded_from = File.join(@gemhome, 'specifications', @a1.full_name)
104
108
 
105
109
  Gem::RemoteFetcher.fetcher = nil
106
110
 
@@ -173,6 +177,21 @@ gems:
173
177
  end
174
178
  end
175
179
 
180
+ def test_api_endpoint
181
+ uri = URI.parse "http://gems.example.com/foo"
182
+ target = MiniTest::Mock.new
183
+ target.expect :target, "http://blah.com"
184
+
185
+ dns = MiniTest::Mock.new
186
+ dns.expect :getresource, target, [String, Object]
187
+
188
+ fetch = Gem::RemoteFetcher.new nil, dns
189
+ assert_equal URI.parse("http://blah.com/foo"), fetch.api_endpoint(uri)
190
+
191
+ target.verify
192
+ dns.verify
193
+ end
194
+
176
195
  def util_fuck_with_fetcher data, blow = false
177
196
  fetcher = Gem::RemoteFetcher.fetcher
178
197
  fetcher.instance_variable_set :@test_data, data
@@ -278,8 +297,8 @@ gems:
278
297
  inst = Gem::RemoteFetcher.fetcher
279
298
  end
280
299
 
281
- assert_equal File.join(@tempdir, @a1.file_name),
282
- inst.download(@a1, local_path)
300
+ assert_equal(File.join(@tempdir, @a1.file_name),
301
+ inst.download(@a1, local_path))
283
302
  ensure
284
303
  FileUtils.chmod 0755, @a1.cache_dir
285
304
  end
@@ -305,6 +324,7 @@ gems:
305
324
  s.platform = Gem::Platform::CURRENT
306
325
  s.instance_variable_set :@original_platform, original_platform
307
326
  end
327
+ e1.loaded_from = File.join(@gemhome, 'specifications', e1.full_name)
308
328
 
309
329
  e1_data = nil
310
330
  File.open e1_gem, 'rb' do |fp|
@@ -334,7 +354,7 @@ gems:
334
354
  cache_path = @a1.cache_file
335
355
  FileUtils.mv local_path, cache_path
336
356
 
337
- gem = Gem::Format.from_file_by_path cache_path
357
+ gem = Gem::Package.new cache_path
338
358
 
339
359
  assert_equal cache_path, inst.download(gem.spec, cache_path)
340
360
  end
@@ -342,7 +362,7 @@ gems:
342
362
  def test_download_unsupported
343
363
  inst = Gem::RemoteFetcher.fetcher
344
364
 
345
- e = assert_raises Gem::InstallError do
365
+ e = assert_raises ArgumentError do
346
366
  inst.download @a1, 'ftp://gems.rubyforge.org'
347
367
  end
348
368
 
@@ -624,6 +644,32 @@ gems:
624
644
  assert_equal "too many redirects (#{url})", e.message
625
645
  end
626
646
 
647
+ def test_normalize_uri
648
+ assert_equal 'FILE://example/', @fetcher.normalize_uri('FILE://example/')
649
+ assert_equal 'FTP://example/', @fetcher.normalize_uri('FTP://example/')
650
+ assert_equal 'HTTP://example/', @fetcher.normalize_uri('HTTP://example/')
651
+ assert_equal 'HTTPS://example/', @fetcher.normalize_uri('HTTPS://example/')
652
+ assert_equal 'http://example/', @fetcher.normalize_uri('example/')
653
+ end
654
+
655
+ def test_observe_no_proxy_env_single_host
656
+ use_ui @ui do
657
+ ENV["http_proxy"] = @proxy_uri
658
+ ENV["no_proxy"] = URI::parse(@server_uri).host
659
+ fetcher = Gem::RemoteFetcher.new nil
660
+ assert_data_from_server fetcher.fetch_path(@server_uri)
661
+ end
662
+ end
663
+
664
+ def test_observe_no_proxy_env_list
665
+ use_ui @ui do
666
+ ENV["http_proxy"] = @proxy_uri
667
+ ENV["no_proxy"] = "fakeurl.com, #{URI::parse(@server_uri).host}"
668
+ fetcher = Gem::RemoteFetcher.new nil
669
+ assert_data_from_server fetcher.fetch_path(@server_uri)
670
+ end
671
+ end
672
+
627
673
  def test_request
628
674
  uri = URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}"
629
675
  util_stub_connection_for :body => :junk, :code => 200
@@ -0,0 +1,70 @@
1
+ require 'rubygems/test_case'
2
+ require 'rubygems/request_set'
3
+
4
+ class TestGemRequestSet < Gem::TestCase
5
+ def setup
6
+ super
7
+
8
+ Gem::RemoteFetcher.fetcher = @fetcher = Gem::FakeFetcher.new
9
+ end
10
+
11
+ def test_gem
12
+ util_spec "a", "2"
13
+
14
+ rs = Gem::RequestSet.new
15
+ rs.gem "a", "= 2"
16
+
17
+ assert_equal [Gem::Dependency.new("a", "=2")], rs.dependencies
18
+ end
19
+
20
+ def test_resolve
21
+ a = util_spec "a", "2", "b" => ">= 2"
22
+ b = util_spec "b", "2"
23
+
24
+ rs = Gem::RequestSet.new
25
+ rs.gem "a"
26
+
27
+ res = rs.resolve StaticSet.new([a, b])
28
+ assert_equal 2, res.size
29
+
30
+ names = res.map { |s| s.full_name }.sort
31
+
32
+ assert_equal ["a-2", "b-2"], names
33
+ end
34
+
35
+ def test_sorted_requests
36
+ a = util_spec "a", "2", "b" => ">= 2"
37
+ b = util_spec "b", "2", "c" => ">= 2"
38
+ c = util_spec "c", "2"
39
+
40
+ rs = Gem::RequestSet.new
41
+ rs.gem "a"
42
+
43
+ rs.resolve StaticSet.new([a, b, c])
44
+
45
+ names = rs.sorted_requests.map { |s| s.full_name }
46
+ assert_equal %w!c-2 b-2 a-2!, names
47
+ end
48
+
49
+ def test_install_into
50
+ a, ad = util_gem "a", "1", "b" => "= 1"
51
+ b, bd = util_gem "b", "1"
52
+
53
+ util_setup_spec_fetcher a, b
54
+
55
+ @fetcher.data["http://gems.example.com/gems/#{a.file_name}"] = Gem.read_binary(ad)
56
+ @fetcher.data["http://gems.example.com/gems/#{b.file_name}"] = Gem.read_binary(bd)
57
+
58
+ rs = Gem::RequestSet.new
59
+ rs.gem "a"
60
+
61
+ rs.resolve
62
+
63
+ installed = rs.install_into @tempdir
64
+
65
+ assert File.exists?(File.join(@tempdir, "specifications", "a-1.gemspec"))
66
+ assert File.exists?(File.join(@tempdir, "specifications", "b-1.gemspec"))
67
+
68
+ assert_equal %w!b-1 a-1!, installed.map { |s| s.full_name }
69
+ end
70
+ end
@@ -21,9 +21,19 @@ class TestGemRequirement < Gem::TestCase
21
21
  assert_requirement_equal "= 2", v(2)
22
22
  end
23
23
 
24
- def test_class_available_as_gem_version_requirement
25
- assert_same Gem::Requirement, Gem::Version::Requirement,
26
- "Gem::Version::Requirement is aliased for old YAML compatibility."
24
+ def test_empty_requirements_is_none
25
+ r = Gem::Requirement.new
26
+ assert_equal true, r.none?
27
+ end
28
+
29
+ def test_explicit_default_is_none
30
+ r = Gem::Requirement.new ">= 0"
31
+ assert_equal true, r.none?
32
+ end
33
+
34
+ def test_basic_non_none
35
+ r = Gem::Requirement.new "= 1"
36
+ assert_equal false, r.none?
27
37
  end
28
38
 
29
39
  def test_parse
@@ -37,19 +47,19 @@ class TestGemRequirement < Gem::TestCase
37
47
  end
38
48
 
39
49
  def test_parse_bad
40
- [
41
- nil,
42
- '',
43
- '! 1',
44
- '= junk',
45
- '1..2',
46
- ].each do |bad|
47
- e = assert_raises ArgumentError do
48
- Gem::Requirement.parse bad
49
- end
50
+ e = assert_raises Gem::Requirement::BadRequirementError do
51
+ Gem::Requirement.parse nil
52
+ end
53
+
54
+ assert_equal 'Illformed requirement [nil]', e.message
50
55
 
51
- assert_equal "Illformed requirement [#{bad.inspect}]", e.message
56
+ e = assert_raises Gem::Requirement::BadRequirementError do
57
+ Gem::Requirement.parse ""
52
58
  end
59
+
60
+ assert_equal 'Illformed requirement [""]', e.message
61
+
62
+ assert_equal Gem::Requirement::BadRequirementError.superclass, ArgumentError
53
63
  end
54
64
 
55
65
  def test_prerelease_eh
@@ -69,28 +79,37 @@ class TestGemRequirement < Gem::TestCase
69
79
  def test_satisfied_by_eh_bang_equal
70
80
  r = req '!= 1.2'
71
81
 
72
- assert_satisfied_by nil, r
73
82
  assert_satisfied_by "1.1", r
74
83
  refute_satisfied_by "1.2", r
75
84
  assert_satisfied_by "1.3", r
85
+
86
+ assert_raises ArgumentError do
87
+ assert_satisfied_by nil, r
88
+ end
76
89
  end
77
90
 
78
91
  def test_satisfied_by_eh_blank
79
92
  r = req "1.2"
80
93
 
81
- refute_satisfied_by nil, r
82
94
  refute_satisfied_by "1.1", r
83
95
  assert_satisfied_by "1.2", r
84
96
  refute_satisfied_by "1.3", r
97
+
98
+ assert_raises ArgumentError do
99
+ assert_satisfied_by nil, r
100
+ end
85
101
  end
86
102
 
87
103
  def test_satisfied_by_eh_equal
88
104
  r = req "= 1.2"
89
105
 
90
- refute_satisfied_by nil, r
91
106
  refute_satisfied_by "1.1", r
92
107
  assert_satisfied_by "1.2", r
93
108
  refute_satisfied_by "1.3", r
109
+
110
+ assert_raises ArgumentError do
111
+ assert_satisfied_by nil, r
112
+ end
94
113
  end
95
114
 
96
115
  def test_satisfied_by_eh_gt
@@ -100,7 +119,7 @@ class TestGemRequirement < Gem::TestCase
100
119
  refute_satisfied_by "1.2", r
101
120
  assert_satisfied_by "1.3", r
102
121
 
103
- assert_raises NoMethodError do
122
+ assert_raises ArgumentError do
104
123
  r.satisfied_by? nil
105
124
  end
106
125
  end
@@ -112,7 +131,7 @@ class TestGemRequirement < Gem::TestCase
112
131
  assert_satisfied_by "1.2", r
113
132
  assert_satisfied_by "1.3", r
114
133
 
115
- assert_raises NoMethodError do
134
+ assert_raises ArgumentError do
116
135
  r.satisfied_by? nil
117
136
  end
118
137
  end
@@ -124,7 +143,7 @@ class TestGemRequirement < Gem::TestCase
124
143
  assert_satisfied_by "1.2", r
125
144
  refute_satisfied_by "1.3", r
126
145
 
127
- assert_raises NoMethodError do
146
+ assert_raises ArgumentError do
128
147
  r.satisfied_by? nil
129
148
  end
130
149
  end
@@ -136,7 +155,7 @@ class TestGemRequirement < Gem::TestCase
136
155
  refute_satisfied_by "1.2", r
137
156
  refute_satisfied_by "1.3", r
138
157
 
139
- assert_raises NoMethodError do
158
+ assert_raises ArgumentError do
140
159
  r.satisfied_by? nil
141
160
  end
142
161
  end
@@ -148,7 +167,7 @@ class TestGemRequirement < Gem::TestCase
148
167
  assert_satisfied_by "1.2", r
149
168
  refute_satisfied_by "1.3", r
150
169
 
151
- assert_raises NoMethodError do
170
+ assert_raises ArgumentError do
152
171
  r.satisfied_by? nil
153
172
  end
154
173
  end
@@ -160,7 +179,7 @@ class TestGemRequirement < Gem::TestCase
160
179
  assert_satisfied_by "1.2", r
161
180
  assert_satisfied_by "1.3", r
162
181
 
163
- assert_raises NoMethodError do
182
+ assert_raises ArgumentError do
164
183
  r.satisfied_by? nil
165
184
  end
166
185
  end
@@ -202,12 +221,22 @@ class TestGemRequirement < Gem::TestCase
202
221
 
203
222
  def test_illformed_requirements
204
223
  [ ">>> 1.3.5", "> blah" ].each do |rq|
205
- assert_raises ArgumentError, "req [#{rq}] should fail" do
224
+ assert_raises Gem::Requirement::BadRequirementError, "req [#{rq}] should fail" do
206
225
  Gem::Requirement.new rq
207
226
  end
208
227
  end
209
228
  end
210
229
 
230
+ def test_satisfied_by_eh_non_versions
231
+ assert_raises ArgumentError do
232
+ req(">= 0").satisfied_by? Object.new
233
+ end
234
+
235
+ assert_raises ArgumentError do
236
+ req(">= 0").satisfied_by? Gem::Requirement.default
237
+ end
238
+ end
239
+
211
240
  def test_satisfied_by_eh_boxed
212
241
  refute_satisfied_by "1.3", "~> 1.4"
213
242
  assert_satisfied_by "1.4", "~> 1.4"
@@ -4,33 +4,35 @@ require 'rubygems/fix_openssl_warnings' if RUBY_VERSION < "1.9"
4
4
 
5
5
  class TestGemSecurity < Gem::TestCase
6
6
 
7
+ CHILD_KEY = load_key 'child'
8
+
9
+ ALTERNATE_CERT = load_cert 'child'
10
+ CHILD_CERT = load_cert 'child'
11
+ EXPIRED_CERT = load_cert 'expired'
12
+
7
13
  def setup
8
14
  super
9
- Gem::Security::OPT[:trust_dir] = File.join(Gem.user_home, '.gem', 'trust')
10
- end
11
15
 
12
- def teardown
13
- super
14
- Gem::Security::OPT[:trust_dir] = File.join(Gem.user_home, '.gem', 'trust')
16
+ @SEC = Gem::Security
15
17
  end
16
18
 
17
- def test_class_build_cert
18
- name = OpenSSL::X509::Name.parse "CN=nobody/DC=example"
19
- key = OpenSSL::PKey::RSA.new 512
20
- opt = { :cert_age => 60 }
19
+ def test_class_create_cert
20
+ name = PUBLIC_CERT.subject
21
+ key = PRIVATE_KEY
21
22
 
22
- cert = Gem::Security.build_cert name, key, opt
23
+ cert = @SEC.create_cert name, key, 60, Gem::Security::EXTENSIONS, 5
23
24
 
24
25
  assert_kind_of OpenSSL::X509::Certificate, cert
25
26
 
26
27
  assert_equal 2, cert.version
27
- assert_equal 0, cert.serial
28
+ assert_equal 5, cert.serial
28
29
  assert_equal key.public_key.to_pem, cert.public_key.to_pem
29
30
  assert_in_delta Time.now, cert.not_before, 10
30
31
  assert_in_delta Time.now + 60, cert.not_after, 10
31
32
  assert_equal name.to_s, cert.subject.to_s
32
33
 
33
- assert_equal 3, cert.extensions.length
34
+ assert_equal 3, cert.extensions.length,
35
+ cert.extensions.map { |e| e.to_a.first }
34
36
 
35
37
  constraints = cert.extensions.find { |ext| ext.oid == 'basicConstraints' }
36
38
  assert_equal 'CA:FALSE', constraints.value
@@ -41,60 +43,204 @@ class TestGemSecurity < Gem::TestCase
41
43
 
42
44
  key_ident = cert.extensions.find { |ext| ext.oid == 'subjectKeyIdentifier' }
43
45
  assert_equal 59, key_ident.value.length
46
+ assert_equal 'B0:EB:9C:A5:E5:8E:7D:94:BB:4B:3B:D6:80:CB:A5:AD:5D:12:88:90',
47
+ key_ident.value
44
48
 
45
- assert_equal name.to_s, cert.issuer.to_s
49
+ assert_equal '', cert.issuer.to_s
46
50
  assert_equal name.to_s, cert.subject.to_s
47
51
  end
48
52
 
49
- def test_class_build_self_signed_cert
53
+ def test_class_create_cert_self_signed
54
+ subject = PUBLIC_CERT.subject
55
+
56
+ cert = @SEC.create_cert_self_signed subject, PRIVATE_KEY, 60
57
+
58
+ assert_equal '/CN=nobody/DC=example', cert.issuer.to_s
59
+ end
60
+
61
+ def test_class_create_cert_email
50
62
  email = 'nobody@example'
51
- opt = {
52
- :cert_age => 60,
53
- :key_size => 512,
54
- :save_cert => false,
55
- :save_key => false,
56
- }
63
+ name = PUBLIC_CERT.subject
64
+ key = PRIVATE_KEY
57
65
 
58
- result = Gem::Security.build_self_signed_cert email, opt
66
+ cert = @SEC.create_cert_email email, key, 60
59
67
 
60
- key = result[:key]
68
+ assert_kind_of OpenSSL::X509::Certificate, cert
61
69
 
62
- assert_kind_of OpenSSL::PKey::RSA, key
63
- # assert_equal 512, key.something_here
70
+ assert_equal 2, cert.version
71
+ assert_equal 1, cert.serial
72
+ assert_equal key.public_key.to_pem, cert.public_key.to_pem
73
+ assert_in_delta Time.now, cert.not_before, 10
74
+ assert_in_delta Time.now + 60, cert.not_after, 10
75
+ assert_equal name.to_s, cert.subject.to_s
76
+ assert_equal name.to_s, cert.issuer.to_s
64
77
 
65
- cert = result[:cert]
78
+ assert_equal 5, cert.extensions.length,
79
+ cert.extensions.map { |e| e.to_a.first }
66
80
 
67
- assert_equal '/CN=nobody/DC=example', cert.issuer.to_s
68
- end
81
+ constraints = cert.extensions.find { |ext| ext.oid == 'subjectAltName' }
82
+ assert_equal 'email:nobody@example', constraints.value
69
83
 
70
- def test_class_sign_cert
71
- name = OpenSSL::X509::Name.parse "CN=nobody/DC=example"
72
- key = OpenSSL::PKey::RSA.new 512
73
- cert = OpenSSL::X509::Certificate.new
84
+ constraints = cert.extensions.find { |ext| ext.oid == 'basicConstraints' }
85
+ assert_equal 'CA:FALSE', constraints.value
74
86
 
75
- cert.subject = name
76
- cert.public_key = key.public_key
87
+ key_usage = cert.extensions.find { |ext| ext.oid == 'keyUsage' }
88
+ assert_equal 'Digital Signature, Key Encipherment, Data Encipherment',
89
+ key_usage.value
77
90
 
78
- signed = Gem::Security.sign_cert cert, key, cert
91
+ key_ident = cert.extensions.find { |ext| ext.oid == 'subjectKeyIdentifier' }
92
+ assert_equal 59, key_ident.value.length
93
+ assert_equal 'B0:EB:9C:A5:E5:8E:7D:94:BB:4B:3B:D6:80:CB:A5:AD:5D:12:88:90',
94
+ key_ident.value
95
+ end
79
96
 
80
- assert cert.verify key
81
- assert_equal name.to_s, signed.subject.to_s
97
+ def test_class_create_key
98
+ key = @SEC.create_key 256
99
+
100
+ assert_kind_of OpenSSL::PKey::RSA, key
82
101
  end
83
102
 
84
103
  def test_class_email_to_name
85
- munger = Gem::Security::OPT[:munge_re]
86
-
87
104
  assert_equal '/CN=nobody/DC=example',
88
- Gem::Security.email_to_name('nobody@example', munger).to_s
105
+ @SEC.email_to_name('nobody@example').to_s
89
106
 
90
107
  assert_equal '/CN=nobody/DC=example/DC=com',
91
- Gem::Security.email_to_name('nobody@example.com', munger).to_s
108
+ @SEC.email_to_name('nobody@example.com').to_s
92
109
 
93
110
  assert_equal '/CN=no.body/DC=example',
94
- Gem::Security.email_to_name('no.body@example', munger).to_s
111
+ @SEC.email_to_name('no.body@example').to_s
95
112
 
96
113
  assert_equal '/CN=no_body/DC=example',
97
- Gem::Security.email_to_name('no+body@example', munger).to_s
114
+ @SEC.email_to_name('no+body@example').to_s
115
+ end
116
+
117
+ def test_class_re_sign
118
+ re_signed = Gem::Security.re_sign EXPIRED_CERT, PRIVATE_KEY, 60
119
+
120
+ assert_in_delta Time.now, re_signed.not_before, 10
121
+ assert_in_delta Time.now + 60, re_signed.not_after, 10
122
+ assert_equal 2, re_signed.serial
123
+
124
+ assert re_signed.verify PUBLIC_KEY
125
+ end
126
+
127
+ def test_class_re_sign_not_self_signed
128
+ e = assert_raises Gem::Security::Exception do
129
+ Gem::Security.re_sign CHILD_CERT, CHILD_KEY
130
+ end
131
+
132
+ assert_equal "#{ALTERNATE_CERT.subject} is not self-signed, contact " \
133
+ "#{ALTERNATE_CERT.issuer} to obtain a valid certificate",
134
+ e.message
135
+ end
136
+
137
+ def test_class_re_sign_wrong_key
138
+ e = assert_raises Gem::Security::Exception do
139
+ Gem::Security.re_sign ALTERNATE_CERT, PRIVATE_KEY
140
+ end
141
+
142
+ assert_equal "incorrect signing key for re-signing " \
143
+ "#{ALTERNATE_CERT.subject}",
144
+ e.message
145
+ end
146
+
147
+ def test_class_reset
148
+ trust_dir = @SEC.trust_dir
149
+
150
+ @SEC.reset
151
+
152
+ refute_equal trust_dir, @SEC.trust_dir
153
+ end
154
+
155
+ def test_class_sign
156
+ issuer = PUBLIC_CERT.subject
157
+ signee = OpenSSL::X509::Name.parse "/CN=signee/DC=example"
158
+
159
+ key = PRIVATE_KEY
160
+ cert = OpenSSL::X509::Certificate.new
161
+ cert.subject = signee
162
+
163
+ cert.subject = signee
164
+ cert.public_key = key.public_key
165
+
166
+ signed = @SEC.sign cert, key, PUBLIC_CERT, 60
167
+
168
+ assert_equal key.public_key.to_pem, signed.public_key.to_pem
169
+ assert_equal signee.to_s, signed.subject.to_s
170
+ assert_equal issuer.to_s, signed.issuer.to_s
171
+
172
+ assert_in_delta Time.now, signed.not_before, 10
173
+ assert_in_delta Time.now + 60, signed.not_after, 10
174
+
175
+ assert_equal 4, signed.extensions.length,
176
+ signed.extensions.map { |e| e.to_a.first }
177
+
178
+ constraints = signed.extensions.find { |ext| ext.oid == 'issuerAltName' }
179
+ assert_equal 'email:nobody@example', constraints.value, 'issuerAltName'
180
+
181
+ constraints = signed.extensions.find { |ext| ext.oid == 'basicConstraints' }
182
+ assert_equal 'CA:FALSE', constraints.value
183
+
184
+ key_usage = signed.extensions.find { |ext| ext.oid == 'keyUsage' }
185
+ assert_equal 'Digital Signature, Key Encipherment, Data Encipherment',
186
+ key_usage.value
187
+
188
+ key_ident =
189
+ signed.extensions.find { |ext| ext.oid == 'subjectKeyIdentifier' }
190
+ assert_equal 59, key_ident.value.length
191
+ assert_equal 'B0:EB:9C:A5:E5:8E:7D:94:BB:4B:3B:D6:80:CB:A5:AD:5D:12:88:90',
192
+ key_ident.value
193
+
194
+ assert signed.verify key
98
195
  end
99
196
 
100
- end if defined?(OpenSSL)
197
+ def test_class_sign_AltName
198
+ issuer = PUBLIC_CERT.subject
199
+ signee = OpenSSL::X509::Name.parse "/CN=signee/DC=example"
200
+
201
+ cert = @SEC.create_cert_email 'signee@example', PRIVATE_KEY
202
+
203
+ signed = @SEC.sign cert, PRIVATE_KEY, PUBLIC_CERT, 60
204
+
205
+ assert_equal PUBLIC_KEY.to_pem, signed.public_key.to_pem
206
+ assert_equal signee.to_s, signed.subject.to_s
207
+ assert_equal issuer.to_s, signed.issuer.to_s
208
+
209
+ assert_in_delta Time.now, signed.not_before, 10
210
+ assert_in_delta Time.now + 60, signed.not_after, 10
211
+
212
+ assert_equal 5, signed.extensions.length,
213
+ signed.extensions.map { |e| e.to_a.first }
214
+
215
+ constraints = signed.extensions.find { |ext| ext.oid == 'issuerAltName' }
216
+ assert_equal 'email:nobody@example', constraints.value, 'issuerAltName'
217
+
218
+ constraints = signed.extensions.find { |ext| ext.oid == 'subjectAltName' }
219
+ assert_equal 'email:signee@example', constraints.value, 'subjectAltName'
220
+
221
+ constraints = signed.extensions.find { |ext| ext.oid == 'basicConstraints' }
222
+ assert_equal 'CA:FALSE', constraints.value
223
+
224
+ key_usage = signed.extensions.find { |ext| ext.oid == 'keyUsage' }
225
+ assert_equal 'Digital Signature, Key Encipherment, Data Encipherment',
226
+ key_usage.value
227
+
228
+ key_ident =
229
+ signed.extensions.find { |ext| ext.oid == 'subjectKeyIdentifier' }
230
+ assert_equal 59, key_ident.value.length
231
+ assert_equal 'B0:EB:9C:A5:E5:8E:7D:94:BB:4B:3B:D6:80:CB:A5:AD:5D:12:88:90',
232
+ key_ident.value
233
+
234
+ assert signed.verify PUBLIC_KEY
235
+ end
236
+
237
+ def test_class_trust_dir
238
+ trust_dir = @SEC.trust_dir
239
+
240
+ expected = File.join Gem.user_home, '.gem/trust'
241
+
242
+ assert_equal expected, trust_dir.dir
243
+ end
244
+
245
+ end
246
+