rubygems-update 1.8.30 → 2.0.0.preview2

Sign up to get free protection for your applications and to get access to all the features.

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
+