rubygems-update 2.7.11 → 3.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +67 -0
  3. data/.travis.yml +24 -18
  4. data/CODE_OF_CONDUCT.md +10 -8
  5. data/CONTRIBUTING.md +148 -0
  6. data/History.txt +458 -8
  7. data/MAINTAINERS.txt +1 -0
  8. data/Manifest.txt +16 -9
  9. data/POLICIES.md +92 -0
  10. data/README.md +53 -26
  11. data/Rakefile +77 -211
  12. data/{UPGRADING.rdoc → UPGRADING.md} +31 -32
  13. data/appveyor.yml +20 -45
  14. data/bin/gem +1 -2
  15. data/bin/update_rubygems +2 -3
  16. data/bundler/CHANGELOG.md +65 -0
  17. data/bundler/bundler.gemspec +7 -1
  18. data/bundler/lib/bundler/build_metadata.rb +1 -1
  19. data/bundler/lib/bundler/cli/add.rb +15 -5
  20. data/bundler/lib/bundler/cli/binstubs.rb +8 -2
  21. data/bundler/lib/bundler/cli/doctor.rb +47 -1
  22. data/bundler/lib/bundler/cli/install.rb +8 -5
  23. data/bundler/lib/bundler/cli/list.rb +41 -5
  24. data/bundler/lib/bundler/cli/outdated.rb +7 -1
  25. data/bundler/lib/bundler/cli/pristine.rb +4 -0
  26. data/bundler/lib/bundler/cli/remove.rb +18 -0
  27. data/bundler/lib/bundler/cli.rb +63 -21
  28. data/bundler/lib/bundler/definition.rb +15 -16
  29. data/bundler/lib/bundler/dependency.rb +2 -2
  30. data/bundler/lib/bundler/dsl.rb +19 -3
  31. data/bundler/lib/bundler/feature_flag.rb +7 -0
  32. data/bundler/lib/bundler/gem_version_promoter.rb +4 -2
  33. data/bundler/lib/bundler/injector.rb +168 -9
  34. data/bundler/lib/bundler/installer/parallel_installer.rb +5 -0
  35. data/bundler/lib/bundler/installer.rb +29 -6
  36. data/bundler/lib/bundler/plugin/events.rb +61 -0
  37. data/bundler/lib/bundler/plugin.rb +10 -3
  38. data/bundler/lib/bundler/resolver.rb +2 -2
  39. data/bundler/lib/bundler/rubygems_gem_installer.rb +7 -0
  40. data/bundler/lib/bundler/runtime.rb +8 -2
  41. data/bundler/lib/bundler/settings/validator.rb +23 -0
  42. data/bundler/lib/bundler/settings.rb +24 -3
  43. data/bundler/lib/bundler/shared_helpers.rb +19 -3
  44. data/bundler/lib/bundler/source/metadata.rb +2 -3
  45. data/bundler/lib/bundler/source.rb +9 -9
  46. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
  47. data/bundler/lib/bundler/version.rb +1 -1
  48. data/bundler/lib/bundler.rb +26 -8
  49. data/bundler/man/bundle-add.ronn +13 -2
  50. data/bundler/man/bundle-config.ronn +21 -0
  51. data/bundler/man/bundle-install.ronn +1 -1
  52. data/bundler/man/bundle-list.ronn +19 -1
  53. data/bundler/man/bundle-outdated.ronn +4 -0
  54. data/bundler/man/bundle-remove.ronn +23 -0
  55. data/bundler/man/bundle-update.ronn +1 -1
  56. data/bundler/man/bundle.ronn +3 -0
  57. data/lib/rubygems/available_set.rb +1 -1
  58. data/lib/rubygems/basic_specification.rb +12 -12
  59. data/lib/rubygems/bundler_version_finder.rb +3 -3
  60. data/lib/rubygems/command.rb +22 -15
  61. data/lib/rubygems/command_manager.rb +22 -5
  62. data/lib/rubygems/commands/build_command.rb +41 -7
  63. data/lib/rubygems/commands/cert_command.rb +45 -24
  64. data/lib/rubygems/commands/check_command.rb +1 -1
  65. data/lib/rubygems/commands/cleanup_command.rb +14 -7
  66. data/lib/rubygems/commands/contents_command.rb +14 -15
  67. data/lib/rubygems/commands/dependency_command.rb +17 -17
  68. data/lib/rubygems/commands/environment_command.rb +20 -1
  69. data/lib/rubygems/commands/fetch_command.rb +2 -3
  70. data/lib/rubygems/commands/generate_index_command.rb +2 -3
  71. data/lib/rubygems/commands/help_command.rb +12 -13
  72. data/lib/rubygems/commands/info_command.rb +33 -0
  73. data/lib/rubygems/commands/install_command.rb +21 -17
  74. data/lib/rubygems/commands/list_command.rb +0 -1
  75. data/lib/rubygems/commands/lock_command.rb +3 -4
  76. data/lib/rubygems/commands/open_command.rb +16 -10
  77. data/lib/rubygems/commands/owner_command.rb +21 -7
  78. data/lib/rubygems/commands/pristine_command.rb +23 -16
  79. data/lib/rubygems/commands/push_command.rb +19 -8
  80. data/lib/rubygems/commands/query_command.rb +24 -24
  81. data/lib/rubygems/commands/rdoc_command.rb +3 -4
  82. data/lib/rubygems/commands/search_command.rb +0 -1
  83. data/lib/rubygems/commands/server_command.rb +1 -2
  84. data/lib/rubygems/commands/setup_command.rb +86 -48
  85. data/lib/rubygems/commands/signin_command.rb +2 -1
  86. data/lib/rubygems/commands/signout_command.rb +2 -2
  87. data/lib/rubygems/commands/sources_command.rb +11 -12
  88. data/lib/rubygems/commands/specification_command.rb +7 -7
  89. data/lib/rubygems/commands/uninstall_command.rb +50 -18
  90. data/lib/rubygems/commands/unpack_command.rb +16 -7
  91. data/lib/rubygems/commands/update_command.rb +28 -23
  92. data/lib/rubygems/commands/which_command.rb +5 -8
  93. data/lib/rubygems/commands/yank_command.rb +1 -2
  94. data/lib/rubygems/compatibility.rb +1 -21
  95. data/lib/rubygems/config_file.rb +36 -36
  96. data/lib/rubygems/core_ext/kernel_require.rb +6 -6
  97. data/lib/rubygems/core_ext/kernel_warn.rb +45 -0
  98. data/lib/rubygems/defaults.rb +31 -19
  99. data/lib/rubygems/dependency.rb +15 -15
  100. data/lib/rubygems/dependency_installer.rb +30 -33
  101. data/lib/rubygems/dependency_list.rb +9 -10
  102. data/lib/rubygems/deprecate.rb +2 -3
  103. data/lib/rubygems/doctor.rb +5 -6
  104. data/lib/rubygems/errors.rb +3 -3
  105. data/lib/rubygems/exceptions.rb +11 -8
  106. data/lib/rubygems/ext/build_error.rb +0 -1
  107. data/lib/rubygems/ext/builder.rb +50 -23
  108. data/lib/rubygems/ext/cmake_builder.rb +2 -2
  109. data/lib/rubygems/ext/configure_builder.rb +2 -3
  110. data/lib/rubygems/ext/ext_conf_builder.rb +8 -7
  111. data/lib/rubygems/ext/rake_builder.rb +16 -18
  112. data/lib/rubygems/ext.rb +0 -1
  113. data/lib/rubygems/gem_runner.rb +2 -2
  114. data/lib/rubygems/gemcutter_utilities.rb +46 -12
  115. data/lib/rubygems/indexer.rb +19 -12
  116. data/lib/rubygems/install_default_message.rb +0 -1
  117. data/lib/rubygems/install_message.rb +0 -1
  118. data/lib/rubygems/install_update_options.rb +3 -29
  119. data/lib/rubygems/installer.rb +97 -55
  120. data/lib/rubygems/installer_test_case.rb +2 -16
  121. data/lib/rubygems/local_remote_options.rb +5 -4
  122. data/lib/rubygems/mock_gem_ui.rb +3 -4
  123. data/lib/rubygems/name_tuple.rb +4 -4
  124. data/lib/rubygems/package/digest_io.rb +3 -4
  125. data/lib/rubygems/package/file_source.rb +3 -4
  126. data/lib/rubygems/package/io_source.rb +1 -2
  127. data/lib/rubygems/package/old.rb +8 -16
  128. data/lib/rubygems/package/source.rb +0 -1
  129. data/lib/rubygems/package/tar_header.rb +13 -4
  130. data/lib/rubygems/package/tar_reader/entry.rb +20 -4
  131. data/lib/rubygems/package/tar_reader.rb +2 -4
  132. data/lib/rubygems/package/tar_test_case.rb +2 -8
  133. data/lib/rubygems/package/tar_writer.rb +13 -15
  134. data/lib/rubygems/package.rb +90 -63
  135. data/lib/rubygems/package_task.rb +0 -1
  136. data/lib/rubygems/path_support.rb +16 -6
  137. data/lib/rubygems/platform.rb +4 -5
  138. data/lib/rubygems/psych_tree.rb +1 -1
  139. data/lib/rubygems/rdoc.rb +2 -313
  140. data/lib/rubygems/remote_fetcher.rb +29 -82
  141. data/lib/rubygems/request/connection_pools.rb +24 -13
  142. data/lib/rubygems/request/http_pool.rb +3 -4
  143. data/lib/rubygems/request/https_pool.rb +1 -3
  144. data/lib/rubygems/request.rb +17 -16
  145. data/lib/rubygems/request_set/gem_dependency_api.rb +46 -49
  146. data/lib/rubygems/request_set/lockfile/parser.rb +18 -29
  147. data/lib/rubygems/request_set/lockfile/tokenizer.rb +9 -9
  148. data/lib/rubygems/request_set/lockfile.rb +12 -12
  149. data/lib/rubygems/request_set.rb +52 -25
  150. data/lib/rubygems/requirement.rb +32 -21
  151. data/lib/rubygems/resolver/activation_request.rb +6 -6
  152. data/lib/rubygems/resolver/api_set.rb +5 -6
  153. data/lib/rubygems/resolver/api_specification.rb +2 -3
  154. data/lib/rubygems/resolver/best_set.rb +5 -6
  155. data/lib/rubygems/resolver/composed_set.rb +5 -6
  156. data/lib/rubygems/resolver/conflict.rb +5 -5
  157. data/lib/rubygems/resolver/current_set.rb +1 -2
  158. data/lib/rubygems/resolver/dependency_request.rb +4 -4
  159. data/lib/rubygems/resolver/git_set.rb +5 -6
  160. data/lib/rubygems/resolver/git_specification.rb +4 -5
  161. data/lib/rubygems/resolver/index_set.rb +5 -6
  162. data/lib/rubygems/resolver/index_specification.rb +3 -4
  163. data/lib/rubygems/resolver/installed_specification.rb +3 -4
  164. data/lib/rubygems/resolver/installer_set.rb +12 -12
  165. data/lib/rubygems/resolver/local_specification.rb +1 -2
  166. data/lib/rubygems/resolver/lock_set.rb +5 -6
  167. data/lib/rubygems/resolver/lock_specification.rb +7 -8
  168. data/lib/rubygems/resolver/requirement_list.rb +1 -1
  169. data/lib/rubygems/resolver/set.rb +2 -2
  170. data/lib/rubygems/resolver/source_set.rb +4 -5
  171. data/lib/rubygems/resolver/spec_specification.rb +1 -2
  172. data/lib/rubygems/resolver/specification.rb +10 -7
  173. data/lib/rubygems/resolver/stats.rb +1 -1
  174. data/lib/rubygems/resolver/vendor_set.rb +4 -5
  175. data/lib/rubygems/resolver/vendor_specification.rb +2 -3
  176. data/lib/rubygems/resolver.rb +14 -16
  177. data/lib/rubygems/s3_uri_signer.rb +183 -0
  178. data/lib/rubygems/safe_yaml.rb +18 -10
  179. data/lib/rubygems/security/policies.rb +1 -2
  180. data/lib/rubygems/security/policy.rb +25 -25
  181. data/lib/rubygems/security/signer.rb +72 -24
  182. data/lib/rubygems/security/trust_dir.rb +10 -10
  183. data/lib/rubygems/security.rb +21 -22
  184. data/lib/rubygems/security_option.rb +0 -1
  185. data/lib/rubygems/server.rb +21 -21
  186. data/lib/rubygems/source/git.rb +9 -10
  187. data/lib/rubygems/source/installed.rb +3 -4
  188. data/lib/rubygems/source/local.rb +7 -7
  189. data/lib/rubygems/source/lock.rb +4 -4
  190. data/lib/rubygems/source/specific_file.rb +5 -5
  191. data/lib/rubygems/source/vendor.rb +2 -3
  192. data/lib/rubygems/source.rb +16 -25
  193. data/lib/rubygems/source_list.rb +2 -2
  194. data/lib/rubygems/source_local.rb +0 -1
  195. data/lib/rubygems/spec_fetcher.rb +5 -6
  196. data/lib/rubygems/specification.rb +219 -558
  197. data/lib/rubygems/specification_policy.rb +407 -0
  198. data/lib/rubygems/stub_specification.rb +12 -17
  199. data/lib/rubygems/test_case.rb +161 -75
  200. data/lib/rubygems/test_utilities.rb +20 -35
  201. data/lib/rubygems/text.rb +6 -6
  202. data/lib/rubygems/uninstaller.rb +38 -27
  203. data/lib/rubygems/uri_formatter.rb +1 -2
  204. data/lib/rubygems/user_interaction.rb +37 -89
  205. data/lib/rubygems/util/licenses.rb +27 -1
  206. data/lib/rubygems/util/list.rb +1 -1
  207. data/lib/rubygems/util.rb +32 -14
  208. data/lib/rubygems/validator.rb +4 -5
  209. data/lib/rubygems/version.rb +15 -15
  210. data/lib/rubygems/version_option.rb +2 -3
  211. data/lib/rubygems.rb +71 -102
  212. data/rubygems-update.gemspec +43 -0
  213. data/setup.rb +2 -8
  214. data/test/rubygems/ca_cert.pem +74 -65
  215. data/test/rubygems/client.pem +103 -45
  216. data/test/rubygems/rubygems_plugin.rb +0 -1
  217. data/test/rubygems/simple_gem.rb +1 -1
  218. data/test/rubygems/ssl_cert.pem +78 -17
  219. data/test/rubygems/ssl_key.pem +25 -13
  220. data/test/rubygems/test_bundled_ca.rb +1 -1
  221. data/test/rubygems/test_config.rb +7 -2
  222. data/test/rubygems/test_gem.rb +205 -132
  223. data/test/rubygems/test_gem_bundler_version_finder.rb +4 -0
  224. data/test/rubygems/test_gem_command.rb +0 -1
  225. data/test/rubygems/test_gem_command_manager.rb +18 -3
  226. data/test/rubygems/test_gem_commands_build_command.rb +220 -15
  227. data/test/rubygems/test_gem_commands_cert_command.rb +69 -8
  228. data/test/rubygems/test_gem_commands_check_command.rb +1 -1
  229. data/test/rubygems/test_gem_commands_cleanup_command.rb +27 -1
  230. data/test/rubygems/test_gem_commands_contents_command.rb +1 -2
  231. data/test/rubygems/test_gem_commands_dependency_command.rb +33 -34
  232. data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
  233. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -1
  234. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -1
  235. data/test/rubygems/test_gem_commands_help_command.rb +7 -4
  236. data/test/rubygems/test_gem_commands_info_command.rb +44 -0
  237. data/test/rubygems/test_gem_commands_install_command.rb +79 -12
  238. data/test/rubygems/test_gem_commands_lock_command.rb +0 -1
  239. data/test/rubygems/test_gem_commands_open_command.rb +29 -0
  240. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -1
  241. data/test/rubygems/test_gem_commands_owner_command.rb +93 -57
  242. data/test/rubygems/test_gem_commands_pristine_command.rb +65 -30
  243. data/test/rubygems/test_gem_commands_push_command.rb +54 -0
  244. data/test/rubygems/test_gem_commands_query_command.rb +102 -100
  245. data/test/rubygems/test_gem_commands_search_command.rb +0 -1
  246. data/test/rubygems/test_gem_commands_server_command.rb +0 -1
  247. data/test/rubygems/test_gem_commands_setup_command.rb +50 -15
  248. data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
  249. data/test/rubygems/test_gem_commands_sources_command.rb +0 -1
  250. data/test/rubygems/test_gem_commands_specification_command.rb +2 -3
  251. data/test/rubygems/test_gem_commands_stale_command.rb +3 -2
  252. data/test/rubygems/test_gem_commands_uninstall_command.rb +161 -8
  253. data/test/rubygems/test_gem_commands_unpack_command.rb +17 -1
  254. data/test/rubygems/test_gem_commands_update_command.rb +19 -2
  255. data/test/rubygems/test_gem_commands_which_command.rb +0 -1
  256. data/test/rubygems/test_gem_commands_yank_command.rb +0 -1
  257. data/test/rubygems/test_gem_config_file.rb +4 -2
  258. data/test/rubygems/test_gem_dependency.rb +0 -1
  259. data/test/rubygems/test_gem_dependency_installer.rb +8 -5
  260. data/test/rubygems/test_gem_dependency_list.rb +6 -7
  261. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -1
  262. data/test/rubygems/test_gem_doctor.rb +1 -2
  263. data/test/rubygems/test_gem_ext_builder.rb +10 -23
  264. data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -4
  265. data/test/rubygems/test_gem_ext_configure_builder.rb +3 -3
  266. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +8 -9
  267. data/test/rubygems/test_gem_ext_rake_builder.rb +20 -5
  268. data/test/rubygems/test_gem_gem_runner.rb +0 -1
  269. data/test/rubygems/test_gem_gemcutter_utilities.rb +32 -6
  270. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -1
  271. data/test/rubygems/test_gem_indexer.rb +16 -10
  272. data/test/rubygems/test_gem_install_update_options.rb +1 -20
  273. data/test/rubygems/test_gem_installer.rb +154 -119
  274. data/test/rubygems/test_gem_local_remote_options.rb +3 -3
  275. data/test/rubygems/test_gem_name_tuple.rb +0 -1
  276. data/test/rubygems/test_gem_package.rb +77 -31
  277. data/test/rubygems/test_gem_package_old.rb +0 -1
  278. data/test/rubygems/test_gem_package_tar_header.rb +42 -2
  279. data/test/rubygems/test_gem_package_tar_reader.rb +0 -1
  280. data/test/rubygems/test_gem_package_tar_reader_entry.rb +11 -0
  281. data/test/rubygems/test_gem_package_tar_writer.rb +43 -7
  282. data/test/rubygems/test_gem_package_task.rb +2 -2
  283. data/test/rubygems/test_gem_path_support.rb +28 -11
  284. data/test/rubygems/test_gem_platform.rb +4 -5
  285. data/test/rubygems/test_gem_rdoc.rb +1 -136
  286. data/test/rubygems/test_gem_remote_fetcher.rb +241 -141
  287. data/test/rubygems/test_gem_request.rb +9 -9
  288. data/test/rubygems/test_gem_request_connection_pools.rb +24 -3
  289. data/test/rubygems/test_gem_request_set.rb +5 -5
  290. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +82 -64
  291. data/test/rubygems/test_gem_request_set_lockfile.rb +1 -2
  292. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +4 -9
  293. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
  294. data/test/rubygems/test_gem_requirement.rb +24 -4
  295. data/test/rubygems/test_gem_resolver.rb +13 -17
  296. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -1
  297. data/test/rubygems/test_gem_resolver_api_set.rb +0 -1
  298. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -1
  299. data/test/rubygems/test_gem_resolver_best_set.rb +0 -1
  300. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -1
  301. data/test/rubygems/test_gem_resolver_conflict.rb +0 -1
  302. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -1
  303. data/test/rubygems/test_gem_resolver_git_set.rb +0 -1
  304. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -1
  305. data/test/rubygems/test_gem_resolver_index_set.rb +0 -1
  306. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -1
  307. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -1
  308. data/test/rubygems/test_gem_resolver_installer_set.rb +2 -3
  309. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -1
  310. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -1
  311. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -1
  312. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -1
  313. data/test/rubygems/test_gem_resolver_specification.rb +1 -2
  314. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -1
  315. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -1
  316. data/test/rubygems/test_gem_security.rb +1 -3
  317. data/test/rubygems/test_gem_security_policy.rb +5 -6
  318. data/test/rubygems/test_gem_security_signer.rb +4 -3
  319. data/test/rubygems/test_gem_security_trust_dir.rb +1 -2
  320. data/test/rubygems/test_gem_server.rb +4 -4
  321. data/test/rubygems/test_gem_source.rb +0 -13
  322. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -1
  323. data/test/rubygems/test_gem_source_git.rb +0 -1
  324. data/test/rubygems/test_gem_source_installed.rb +0 -1
  325. data/test/rubygems/test_gem_source_lock.rb +0 -1
  326. data/test/rubygems/test_gem_source_vendor.rb +0 -1
  327. data/test/rubygems/test_gem_spec_fetcher.rb +0 -1
  328. data/test/rubygems/test_gem_specification.rb +366 -198
  329. data/test/rubygems/test_gem_stream_ui.rb +15 -32
  330. data/test/rubygems/test_gem_stub_specification.rb +0 -2
  331. data/test/rubygems/test_gem_text.rb +4 -0
  332. data/test/rubygems/test_gem_uninstaller.rb +42 -3
  333. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -1
  334. data/test/rubygems/test_gem_uri_formatter.rb +0 -1
  335. data/test/rubygems/test_gem_util.rb +31 -11
  336. data/test/rubygems/test_gem_validator.rb +0 -1
  337. data/test/rubygems/test_gem_version.rb +11 -11
  338. data/test/rubygems/test_gem_version_option.rb +0 -1
  339. data/test/rubygems/test_remote_fetch_error.rb +0 -1
  340. data/test/rubygems/test_require.rb +67 -52
  341. data/util/CL2notes +1 -2
  342. data/util/ci +20 -12
  343. data/util/cops/deprecations.rb +52 -0
  344. data/util/create_certs.rb +6 -7
  345. data/util/create_certs.sh +27 -0
  346. data/util/create_encrypted_key.rb +4 -5
  347. data/util/patch_with_prs.rb +1 -1
  348. data/util/rubocop +8 -0
  349. data/util/update_bundled_ca_certificates.rb +12 -13
  350. data/util/update_changelog.rb +1 -1
  351. metadata +61 -51
  352. data/.autotest +0 -71
  353. data/.document +0 -5
  354. data/CONTRIBUTING.rdoc +0 -130
  355. data/CVE-2013-4287.txt +0 -35
  356. data/CVE-2013-4363.txt +0 -45
  357. data/CVE-2015-3900.txt +0 -40
  358. data/POLICIES.rdoc +0 -74
  359. data/test/rubygems/fix_openssl_warnings.rb +0 -13
@@ -24,7 +24,7 @@ class Gem::Security::Policy
24
24
  # Create a new Gem::Security::Policy object with the given mode and
25
25
  # options.
26
26
 
27
- def initialize name, policy = {}, opt = {}
27
+ def initialize(name, policy = {}, opt = {})
28
28
  require 'openssl'
29
29
 
30
30
  @name = name
@@ -55,7 +55,7 @@ class Gem::Security::Policy
55
55
  # Verifies each certificate in +chain+ has signed the following certificate
56
56
  # and is valid for the given +time+.
57
57
 
58
- def check_chain chain, time
58
+ def check_chain(chain, time)
59
59
  raise Gem::Security::Exception, 'missing signing chain' unless chain
60
60
  raise Gem::Security::Exception, 'empty signing chain' if chain.empty?
61
61
 
@@ -74,7 +74,7 @@ class Gem::Security::Policy
74
74
  # Verifies that +data+ matches the +signature+ created by +public_key+ and
75
75
  # the +digest+ algorithm.
76
76
 
77
- def check_data public_key, digest, signature, data
77
+ def check_data(public_key, digest, signature, data)
78
78
  raise Gem::Security::Exception, "invalid signature" unless
79
79
  public_key.verify digest.new, signature, data.digest
80
80
 
@@ -85,22 +85,22 @@ class Gem::Security::Policy
85
85
  # Ensures that +signer+ is valid for +time+ and was signed by the +issuer+.
86
86
  # If the +issuer+ is +nil+ no verification is performed.
87
87
 
88
- def check_cert signer, issuer, time
88
+ def check_cert(signer, issuer, time)
89
89
  raise Gem::Security::Exception, 'missing signing certificate' unless
90
90
  signer
91
91
 
92
92
  message = "certificate #{signer.subject}"
93
93
 
94
- if not_before = signer.not_before and not_before > time then
94
+ if not_before = signer.not_before and not_before > time
95
95
  raise Gem::Security::Exception,
96
96
  "#{message} not valid before #{not_before}"
97
97
  end
98
98
 
99
- if not_after = signer.not_after and not_after < time then
99
+ if not_after = signer.not_after and not_after < time
100
100
  raise Gem::Security::Exception, "#{message} not valid after #{not_after}"
101
101
  end
102
102
 
103
- if issuer and not signer.verify issuer.public_key then
103
+ if issuer and not signer.verify issuer.public_key
104
104
  raise Gem::Security::Exception,
105
105
  "#{message} was not issued by #{issuer.subject}"
106
106
  end
@@ -111,8 +111,8 @@ class Gem::Security::Policy
111
111
  ##
112
112
  # Ensures the public key of +key+ matches the public key in +signer+
113
113
 
114
- def check_key signer, key
115
- unless signer and key then
114
+ def check_key(signer, key)
115
+ unless signer and key
116
116
  return true unless @only_signed
117
117
 
118
118
  raise Gem::Security::Exception, 'missing key or signature'
@@ -129,7 +129,7 @@ class Gem::Security::Policy
129
129
  # Ensures the root certificate in +chain+ is self-signed and valid for
130
130
  # +time+.
131
131
 
132
- def check_root chain, time
132
+ def check_root(chain, time)
133
133
  raise Gem::Security::Exception, 'missing signing chain' unless chain
134
134
 
135
135
  root = chain.first
@@ -148,7 +148,7 @@ class Gem::Security::Policy
148
148
  # Ensures the root of +chain+ has a trusted certificate in +trust_dir+ and
149
149
  # the digests of the two certificates match according to +digester+
150
150
 
151
- def check_trust chain, digester, trust_dir
151
+ def check_trust(chain, digester, trust_dir)
152
152
  raise Gem::Security::Exception, 'missing signing chain' unless chain
153
153
 
154
154
  root = chain.first
@@ -157,7 +157,7 @@ class Gem::Security::Policy
157
157
 
158
158
  path = Gem::Security.trust_dir.cert_path root
159
159
 
160
- unless File.exist? path then
160
+ unless File.exist? path
161
161
  message = "root cert #{root.subject} is not trusted".dup
162
162
 
163
163
  message << " (root of signing cert #{chain.last.subject})" if
@@ -183,7 +183,7 @@ class Gem::Security::Policy
183
183
  ##
184
184
  # Extracts the email or subject from +certificate+
185
185
 
186
- def subject certificate # :nodoc:
186
+ def subject(certificate) # :nodoc:
187
187
  certificate.extensions.each do |extension|
188
188
  next unless extension.oid == 'subjectAltName'
189
189
 
@@ -196,9 +196,9 @@ class Gem::Security::Policy
196
196
  def inspect # :nodoc:
197
197
  ("[Policy: %s - data: %p signer: %p chain: %p root: %p " +
198
198
  "signed-only: %p trusted-only: %p]") % [
199
- @name, @verify_chain, @verify_data, @verify_root, @verify_signer,
200
- @only_signed, @only_trusted,
201
- ]
199
+ @name, @verify_chain, @verify_data, @verify_root, @verify_signer,
200
+ @only_signed, @only_trusted,
201
+ ]
202
202
  end
203
203
 
204
204
  ##
@@ -208,13 +208,13 @@ class Gem::Security::Policy
208
208
  #
209
209
  # If +key+ is given it is used to validate the signing certificate.
210
210
 
211
- def verify chain, key = nil, digests = {}, signatures = {},
212
- full_name = '(unknown)'
213
- if signatures.empty? then
214
- if @only_signed then
211
+ def verify(chain, key = nil, digests = {}, signatures = {},
212
+ full_name = '(unknown)')
213
+ if signatures.empty?
214
+ if @only_signed
215
215
  raise Gem::Security::Exception,
216
216
  "unsigned gems are not allowed by the #{name} policy"
217
- elsif digests.empty? then
217
+ elsif digests.empty?
218
218
  # lack of signatures is irrelevant if there is nothing to check
219
219
  # against
220
220
  else
@@ -232,7 +232,7 @@ class Gem::Security::Policy
232
232
  file_digests.values.first.name == Gem::Security::DIGEST_NAME
233
233
  end
234
234
 
235
- if @verify_data then
235
+ if @verify_data
236
236
  raise Gem::Security::Exception, 'no digests provided (probable bug)' if
237
237
  signer_digests.nil? or signer_digests.empty?
238
238
  else
@@ -249,9 +249,9 @@ class Gem::Security::Policy
249
249
 
250
250
  check_root chain, time if @verify_root
251
251
 
252
- if @only_trusted then
252
+ if @only_trusted
253
253
  check_trust chain, digester, trust_dir
254
- elsif signatures.empty? and digests.empty? then
254
+ elsif signatures.empty? and digests.empty?
255
255
  # trust is irrelevant if there's no signatures to verify
256
256
  else
257
257
  alert_warning "#{subject signer} is not trusted for #{full_name}"
@@ -280,7 +280,7 @@ class Gem::Security::Policy
280
280
  # Extracts the certificate chain from the +spec+ and calls #verify to ensure
281
281
  # the signatures and certificate chain is valid according to the policy..
282
282
 
283
- def verify_signatures spec, digests, signatures
283
+ def verify_signatures(spec, digests, signatures)
284
284
  chain = spec.cert_chain.map do |cert_pem|
285
285
  OpenSSL::X509::Certificate.new cert_pem
286
286
  end
@@ -2,8 +2,12 @@
2
2
  ##
3
3
  # Basic OpenSSL-based package signing class.
4
4
 
5
+ require "rubygems/user_interaction"
6
+
5
7
  class Gem::Security::Signer
6
8
 
9
+ include Gem::UserInteraction
10
+
7
11
  ##
8
12
  # The chain of certificates for signing including the signing certificate
9
13
 
@@ -25,21 +29,54 @@ class Gem::Security::Signer
25
29
 
26
30
  attr_reader :digest_name # :nodoc:
27
31
 
32
+ ##
33
+ # Gem::Security::Signer options
34
+
35
+ attr_reader :options
36
+
37
+ DEFAULT_OPTIONS = {
38
+ expiration_length_days: 365
39
+ }.freeze
40
+
41
+ ##
42
+ # Attemps to re-sign an expired cert with a given private key
43
+ def self.re_sign_cert(expired_cert, expired_cert_path, private_key)
44
+ return unless expired_cert.not_after < Time.now
45
+
46
+ expiry = expired_cert.not_after.strftime('%Y%m%d%H%M%S')
47
+ expired_cert_file = "#{File.basename(expired_cert_path)}.expired.#{expiry}"
48
+ new_expired_cert_path = File.join(Gem.user_home, ".gem", expired_cert_file)
49
+
50
+ Gem::Security.write(expired_cert, new_expired_cert_path)
51
+
52
+ re_signed_cert = Gem::Security.re_sign(
53
+ expired_cert,
54
+ private_key,
55
+ (Gem::Security::ONE_DAY * Gem.configuration.cert_expiration_length_days)
56
+ )
57
+
58
+ Gem::Security.write(re_signed_cert, expired_cert_path)
59
+
60
+ yield(expired_cert_path, new_expired_cert_path) if block_given?
61
+ end
62
+
28
63
  ##
29
64
  # Creates a new signer with an RSA +key+ or path to a key, and a certificate
30
65
  # +chain+ containing X509 certificates, encoding certificates or paths to
31
66
  # certificates.
32
67
 
33
- def initialize key, cert_chain, passphrase = nil
68
+ def initialize(key, cert_chain, passphrase = nil, options = {})
34
69
  @cert_chain = cert_chain
35
70
  @key = key
71
+ @passphrase = passphrase
72
+ @options = DEFAULT_OPTIONS.merge(options)
36
73
 
37
- unless @key then
74
+ unless @key
38
75
  default_key = File.join Gem.default_key_path
39
76
  @key = default_key if File.exist? default_key
40
77
  end
41
78
 
42
- unless @cert_chain then
79
+ unless @cert_chain
43
80
  default_cert = File.join Gem.default_cert_path
44
81
  @cert_chain = [default_cert] if File.exist? default_cert
45
82
  end
@@ -47,10 +84,12 @@ class Gem::Security::Signer
47
84
  @digest_algorithm = Gem::Security::DIGEST_ALGORITHM
48
85
  @digest_name = Gem::Security::DIGEST_NAME
49
86
 
50
- @key = OpenSSL::PKey::RSA.new File.read(@key), passphrase if
51
- @key and not OpenSSL::PKey::RSA === @key
87
+ if @key && !@key.is_a?(OpenSSL::PKey::RSA)
88
+ @passphrase ||= ask_for_password("Enter PEM pass phrase:")
89
+ @key = OpenSSL::PKey::RSA.new(File.read(@key), @passphrase)
90
+ end
52
91
 
53
- if @cert_chain then
92
+ if @cert_chain
54
93
  @cert_chain = @cert_chain.compact.map do |cert|
55
94
  next cert if OpenSSL::X509::Certificate === cert
56
95
 
@@ -67,10 +106,10 @@ class Gem::Security::Signer
67
106
  # Extracts the full name of +cert+. If the certificate has a subjectAltName
68
107
  # this value is preferred, otherwise the subject is used.
69
108
 
70
- def extract_name cert # :nodoc:
109
+ def extract_name(cert) # :nodoc:
71
110
  subject_alt_name = cert.extensions.find { |e| 'subjectAltName' == e.oid }
72
111
 
73
- if subject_alt_name then
112
+ if subject_alt_name
74
113
  /\Aemail:/ =~ subject_alt_name.value
75
114
 
76
115
  $' || subject_alt_name.value
@@ -99,13 +138,15 @@ class Gem::Security::Signer
99
138
  ##
100
139
  # Sign data with given digest algorithm
101
140
 
102
- def sign data
141
+ def sign(data)
103
142
  return unless @key
104
143
 
105
144
  raise Gem::Security::Exception, 'no certs provided' if @cert_chain.empty?
106
145
 
107
- if @cert_chain.length == 1 and @cert_chain.last.not_after < Time.now then
108
- re_sign_key
146
+ if @cert_chain.length == 1 and @cert_chain.last.not_after < Time.now
147
+ re_sign_key(
148
+ expiration_length: (Gem::Security::ONE_DAY * options[:expiration_length_days])
149
+ )
109
150
  end
110
151
 
111
152
  full_name = extract_name @cert_chain.last
@@ -121,6 +162,7 @@ class Gem::Security::Signer
121
162
  # The key will be re-signed if:
122
163
  # * The expired certificate is self-signed
123
164
  # * The expired certificate is saved at ~/.gem/gem-public_cert.pem
165
+ # and the private key is saved at ~/.gem/gem-private_key.pem
124
166
  # * There is no file matching the expiry date at
125
167
  # ~/.gem/gem-public_cert.pem.expired.%Y%m%d%H%M%S
126
168
  #
@@ -128,25 +170,32 @@ class Gem::Security::Signer
128
170
  # be saved as ~/.gem/gem-public_cert.pem.expired.%Y%m%d%H%M%S where the
129
171
  # expiry time (not after) is used for the timestamp.
130
172
 
131
- def re_sign_key # :nodoc:
173
+ def re_sign_key(expiration_length: Gem::Security::ONE_YEAR) # :nodoc:
132
174
  old_cert = @cert_chain.last
133
175
 
134
- disk_cert_path = File.join Gem.default_cert_path
135
- disk_cert = File.read disk_cert_path rescue nil
136
- disk_key =
137
- File.read File.join(Gem.default_key_path) rescue nil
176
+ disk_cert_path = File.join(Gem.default_cert_path)
177
+ disk_cert = File.read(disk_cert_path) rescue nil
138
178
 
139
- if disk_key == @key.to_pem and disk_cert == old_cert.to_pem then
140
- expiry = old_cert.not_after.strftime '%Y%m%d%H%M%S'
179
+ disk_key_path = File.join(Gem.default_key_path)
180
+ disk_key =
181
+ OpenSSL::PKey::RSA.new(File.read(disk_key_path), @passphrase) rescue nil
182
+
183
+ return unless disk_key
184
+
185
+ if disk_key.to_pem == @key.to_pem && disk_cert == old_cert.to_pem
186
+ expiry = old_cert.not_after.strftime('%Y%m%d%H%M%S')
141
187
  old_cert_file = "gem-public_cert.pem.expired.#{expiry}"
142
- old_cert_path = File.join Gem.user_home, ".gem", old_cert_file
188
+ old_cert_path = File.join(Gem.user_home, ".gem", old_cert_file)
143
189
 
144
- unless File.exist? old_cert_path then
145
- Gem::Security.write old_cert, old_cert_path
190
+ unless File.exist?(old_cert_path)
191
+ Gem::Security.write(old_cert, old_cert_path)
146
192
 
147
- cert = Gem::Security.re_sign old_cert, @key
193
+ cert = Gem::Security.re_sign(old_cert, @key, expiration_length)
148
194
 
149
- Gem::Security.write cert, disk_cert_path
195
+ Gem::Security.write(cert, disk_cert_path)
196
+
197
+ alert("Your cert: #{disk_cert_path} has been auto re-signed with the key: #{disk_key_path}")
198
+ alert("Your expired cert will be located at: #{old_cert_path}")
150
199
 
151
200
  @cert_chain = [cert]
152
201
  end
@@ -154,4 +203,3 @@ class Gem::Security::Signer
154
203
  end
155
204
 
156
205
  end
157
-
@@ -11,7 +11,7 @@ class Gem::Security::TrustDir
11
11
  DEFAULT_PERMISSIONS = {
12
12
  :trust_dir => 0700,
13
13
  :trusted_cert => 0600,
14
- }
14
+ }.freeze
15
15
 
16
16
  ##
17
17
  # The directory where trusted certificates will be stored.
@@ -22,7 +22,7 @@ class Gem::Security::TrustDir
22
22
  # Creates a new TrustDir using +dir+ where the directory and file
23
23
  # permissions will be checked according to +permissions+
24
24
 
25
- def initialize dir, permissions = DEFAULT_PERMISSIONS
25
+ def initialize(dir, permissions = DEFAULT_PERMISSIONS)
26
26
  @dir = dir
27
27
  @permissions = permissions
28
28
 
@@ -32,7 +32,7 @@ class Gem::Security::TrustDir
32
32
  ##
33
33
  # Returns the path to the trusted +certificate+
34
34
 
35
- def cert_path certificate
35
+ def cert_path(certificate)
36
36
  name_path certificate.subject
37
37
  end
38
38
 
@@ -59,7 +59,7 @@ class Gem::Security::TrustDir
59
59
  # Returns the issuer certificate of the given +certificate+ if it exists in
60
60
  # the trust directory.
61
61
 
62
- def issuer_of certificate
62
+ def issuer_of(certificate)
63
63
  path = name_path certificate.issuer
64
64
 
65
65
  return unless File.exist? path
@@ -70,7 +70,7 @@ class Gem::Security::TrustDir
70
70
  ##
71
71
  # Returns the path to the trusted certificate with the given ASN.1 +name+
72
72
 
73
- def name_path name
73
+ def name_path(name)
74
74
  digest = @digester.hexdigest name.to_s
75
75
 
76
76
  File.join @dir, "cert-#{digest}.pem"
@@ -79,7 +79,7 @@ class Gem::Security::TrustDir
79
79
  ##
80
80
  # Loads the given +certificate_file+
81
81
 
82
- def load_certificate certificate_file
82
+ def load_certificate(certificate_file)
83
83
  pem = File.read certificate_file
84
84
 
85
85
  OpenSSL::X509::Certificate.new pem
@@ -88,13 +88,14 @@ class Gem::Security::TrustDir
88
88
  ##
89
89
  # Add a certificate to trusted certificate list.
90
90
 
91
- def trust_cert certificate
91
+ def trust_cert(certificate)
92
92
  verify
93
93
 
94
94
  destination = cert_path certificate
95
95
 
96
- File.open destination, 'wb', @permissions[:trusted_cert] do |io|
96
+ File.open destination, 'wb', 0600 do |io|
97
97
  io.write certificate.to_pem
98
+ io.chmod(@permissions[:trusted_cert])
98
99
  end
99
100
  end
100
101
 
@@ -104,7 +105,7 @@ class Gem::Security::TrustDir
104
105
  # permissions.
105
106
 
106
107
  def verify
107
- if File.exist? @dir then
108
+ if File.exist? @dir
108
109
  raise Gem::Security::Exception,
109
110
  "trust directory #{@dir} is not a directory" unless
110
111
  File.directory? @dir
@@ -116,4 +117,3 @@ class Gem::Security::TrustDir
116
117
  end
117
118
 
118
119
  end
119
-
@@ -340,9 +340,9 @@ module Gem::Security
340
340
  # Digest algorithm used to sign gems
341
341
 
342
342
  DIGEST_ALGORITHM =
343
- if defined?(OpenSSL::Digest::SHA256) then
343
+ if defined?(OpenSSL::Digest::SHA256)
344
344
  OpenSSL::Digest::SHA256
345
- elsif defined?(OpenSSL::Digest::SHA1) then
345
+ elsif defined?(OpenSSL::Digest::SHA1)
346
346
  OpenSSL::Digest::SHA1
347
347
  else
348
348
  require 'digest'
@@ -353,7 +353,7 @@ module Gem::Security
353
353
  # Used internally to select the signing digest from all computed digests
354
354
 
355
355
  DIGEST_NAME = # :nodoc:
356
- if DIGEST_ALGORITHM.method_defined? :name then
356
+ if DIGEST_ALGORITHM.method_defined? :name
357
357
  DIGEST_ALGORITHM.new.name
358
358
  else
359
359
  DIGEST_ALGORITHM.name[/::([^:]+)\z/, 1]
@@ -363,7 +363,7 @@ module Gem::Security
363
363
  # Algorithm for creating the key pair used to sign gems
364
364
 
365
365
  KEY_ALGORITHM =
366
- if defined?(OpenSSL::PKey::RSA) then
366
+ if defined?(OpenSSL::PKey::RSA)
367
367
  OpenSSL::PKey::RSA
368
368
  end
369
369
 
@@ -401,9 +401,9 @@ module Gem::Security
401
401
  'keyUsage' =>
402
402
  'keyEncipherment,dataEncipherment,digitalSignature',
403
403
  'subjectKeyIdentifier' => 'hash',
404
- }
404
+ }.freeze
405
405
 
406
- def self.alt_name_or_x509_entry certificate, x509_entry
406
+ def self.alt_name_or_x509_entry(certificate, x509_entry)
407
407
  alt_name = certificate.extensions.find do |extension|
408
408
  extension.oid == "#{x509_entry}AltName"
409
409
  end
@@ -419,8 +419,8 @@ module Gem::Security
419
419
  #
420
420
  # The +extensions+ restrict the key to the indicated uses.
421
421
 
422
- def self.create_cert subject, key, age = ONE_YEAR, extensions = EXTENSIONS,
423
- serial = 1
422
+ def self.create_cert(subject, key, age = ONE_YEAR, extensions = EXTENSIONS,
423
+ serial = 1)
424
424
  cert = OpenSSL::X509::Certificate.new
425
425
 
426
426
  cert.public_key = key.public_key
@@ -446,7 +446,7 @@ module Gem::Security
446
446
  # a subject alternative name of +email+ and the given +extensions+ for the
447
447
  # +key+.
448
448
 
449
- def self.create_cert_email email, key, age = ONE_YEAR, extensions = EXTENSIONS
449
+ def self.create_cert_email(email, key, age = ONE_YEAR, extensions = EXTENSIONS)
450
450
  subject = email_to_name email
451
451
 
452
452
  extensions = extensions.merge "subjectAltName" => "email:#{email}"
@@ -458,8 +458,8 @@ module Gem::Security
458
458
  # Creates a self-signed certificate with an issuer and subject of +subject+
459
459
  # and the given +extensions+ for the +key+.
460
460
 
461
- def self.create_cert_self_signed subject, key, age = ONE_YEAR,
462
- extensions = EXTENSIONS, serial = 1
461
+ def self.create_cert_self_signed(subject, key, age = ONE_YEAR,
462
+ extensions = EXTENSIONS, serial = 1)
463
463
  certificate = create_cert subject, key, age, extensions
464
464
 
465
465
  sign certificate, key, certificate, age, extensions, serial
@@ -469,14 +469,14 @@ module Gem::Security
469
469
  # Creates a new key pair of the specified +length+ and +algorithm+. The
470
470
  # default is a 3072 bit RSA key.
471
471
 
472
- def self.create_key length = KEY_LENGTH, algorithm = KEY_ALGORITHM
472
+ def self.create_key(length = KEY_LENGTH, algorithm = KEY_ALGORITHM)
473
473
  algorithm.new length
474
474
  end
475
475
 
476
476
  ##
477
477
  # Turns +email_address+ into an OpenSSL::X509::Name
478
478
 
479
- def self.email_to_name email_address
479
+ def self.email_to_name(email_address)
480
480
  email_address = email_address.gsub(/[^\w@.-]+/i, '_')
481
481
 
482
482
  cn, dcs = email_address.split '@'
@@ -494,15 +494,15 @@ module Gem::Security
494
494
  #--
495
495
  # TODO increment serial
496
496
 
497
- def self.re_sign expired_certificate, private_key, age = ONE_YEAR,
498
- extensions = EXTENSIONS
497
+ def self.re_sign(expired_certificate, private_key, age = ONE_YEAR,
498
+ extensions = EXTENSIONS)
499
499
  raise Gem::Security::Exception,
500
500
  "incorrect signing key for re-signing " +
501
501
  "#{expired_certificate.subject}" unless
502
502
  expired_certificate.public_key.to_pem == private_key.public_key.to_pem
503
503
 
504
504
  unless expired_certificate.subject.to_s ==
505
- expired_certificate.issuer.to_s then
505
+ expired_certificate.issuer.to_s
506
506
  subject = alt_name_or_x509_entry expired_certificate, :subject
507
507
  issuer = alt_name_or_x509_entry expired_certificate, :issuer
508
508
 
@@ -531,8 +531,8 @@ module Gem::Security
531
531
  #
532
532
  # Returns the newly signed certificate.
533
533
 
534
- def self.sign certificate, signing_key, signing_cert,
535
- age = ONE_YEAR, extensions = EXTENSIONS, serial = 1
534
+ def self.sign(certificate, signing_key, signing_cert,
535
+ age = ONE_YEAR, extensions = EXTENSIONS, serial = 1)
536
536
  signee_subject = certificate.subject
537
537
  signee_key = certificate.public_key
538
538
 
@@ -571,7 +571,7 @@ module Gem::Security
571
571
  ##
572
572
  # Enumerates the trusted certificates via Gem::Security::TrustDir.
573
573
 
574
- def self.trusted_certificates &block
574
+ def self.trusted_certificates(&block)
575
575
  trust_dir.each_certificate(&block)
576
576
  end
577
577
 
@@ -580,7 +580,7 @@ module Gem::Security
580
580
  # +permissions+. If passed +cipher+ and +passphrase+ those arguments will be
581
581
  # passed to +to_pem+.
582
582
 
583
- def self.write pemmable, path, permissions = 0600, passphrase = nil, cipher = KEY_CIPHER
583
+ def self.write(pemmable, path, permissions = 0600, passphrase = nil, cipher = KEY_CIPHER)
584
584
  path = File.expand_path path
585
585
 
586
586
  File.open path, 'wb', permissions do |io|
@@ -598,11 +598,10 @@ module Gem::Security
598
598
 
599
599
  end
600
600
 
601
- if defined?(OpenSSL::SSL) then
601
+ if defined?(OpenSSL::SSL)
602
602
  require 'rubygems/security/policy'
603
603
  require 'rubygems/security/policies'
604
604
  require 'rubygems/security/trust_dir'
605
605
  end
606
606
 
607
607
  require 'rubygems/security/signer'
608
-
@@ -19,7 +19,6 @@ end
19
19
 
20
20
  module Gem::SecurityOption
21
21
  def add_security_option
22
- # TODO: use @parser.accept
23
22
  OptionParser.accept Gem::Security::Policy do |value|
24
23
  require 'rubygems/security'
25
24