redcar 0.3.2dev → 0.3.3

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 (485) hide show
  1. data/CHANGES +49 -2
  2. data/README.md +2 -7
  3. data/ROADMAP.md +8 -9
  4. data/Rakefile +29 -44
  5. data/bin/redcar +11 -2
  6. data/lib/openssl/History.txt +75 -0
  7. data/lib/openssl/License.txt +30 -0
  8. data/lib/openssl/Manifest.txt +99 -0
  9. data/lib/openssl/README.txt +24 -0
  10. data/lib/openssl/Rakefile +71 -0
  11. data/lib/openssl/build.properties.SAMPLE +7 -0
  12. data/lib/openssl/build.xml +57 -0
  13. data/lib/openssl/lib/jopenssl/version.rb +5 -0
  14. data/lib/openssl/lib/openssl.rb +24 -0
  15. data/lib/openssl/lib/openssl/bn.rb +33 -0
  16. data/lib/openssl/lib/openssl/buffering.rb +239 -0
  17. data/lib/openssl/lib/openssl/cipher.rb +56 -0
  18. data/lib/openssl/lib/openssl/digest.rb +46 -0
  19. data/lib/openssl/lib/openssl/dummy.rb +34 -0
  20. data/lib/openssl/lib/openssl/dummyssl.rb +13 -0
  21. data/lib/openssl/lib/openssl/ssl.rb +135 -0
  22. data/lib/openssl/lib/openssl/x509.rb +154 -0
  23. data/lib/openssl/mocha/COPYING +3 -0
  24. data/lib/openssl/mocha/MIT-LICENSE +7 -0
  25. data/lib/openssl/mocha/README +35 -0
  26. data/lib/openssl/mocha/RELEASE +171 -0
  27. data/lib/openssl/mocha/Rakefile +147 -0
  28. data/lib/openssl/mocha/TODO +48 -0
  29. data/lib/openssl/mocha/examples/misc.rb +36 -0
  30. data/lib/openssl/mocha/examples/mocha.rb +26 -0
  31. data/lib/openssl/mocha/examples/stubba.rb +65 -0
  32. data/lib/openssl/mocha/init.rb +3 -0
  33. data/lib/openssl/mocha/lib/mocha.rb +19 -0
  34. data/lib/openssl/mocha/lib/mocha/any_instance_method.rb +35 -0
  35. data/lib/openssl/mocha/lib/mocha/auto_verify.rb +111 -0
  36. data/lib/openssl/mocha/lib/mocha/central.rb +35 -0
  37. data/lib/openssl/mocha/lib/mocha/class_method.rb +62 -0
  38. data/lib/openssl/mocha/lib/mocha/deprecation.rb +22 -0
  39. data/lib/openssl/mocha/lib/mocha/exception_raiser.rb +17 -0
  40. data/lib/openssl/mocha/lib/mocha/expectation.rb +382 -0
  41. data/lib/openssl/mocha/lib/mocha/expectation_error.rb +6 -0
  42. data/lib/openssl/mocha/lib/mocha/expectation_list.rb +45 -0
  43. data/lib/openssl/mocha/lib/mocha/infinite_range.rb +25 -0
  44. data/lib/openssl/mocha/lib/mocha/inspect.rb +39 -0
  45. data/lib/openssl/mocha/lib/mocha/instance_method.rb +8 -0
  46. data/lib/openssl/mocha/lib/mocha/is_a.rb +9 -0
  47. data/lib/openssl/mocha/lib/mocha/metaclass.rb +7 -0
  48. data/lib/openssl/mocha/lib/mocha/missing_expectation.rb +27 -0
  49. data/lib/openssl/mocha/lib/mocha/mock.rb +200 -0
  50. data/lib/openssl/mocha/lib/mocha/multiple_yields.rb +20 -0
  51. data/lib/openssl/mocha/lib/mocha/no_yields.rb +11 -0
  52. data/lib/openssl/mocha/lib/mocha/object.rb +110 -0
  53. data/lib/openssl/mocha/lib/mocha/parameter_matchers.rb +9 -0
  54. data/lib/openssl/mocha/lib/mocha/parameter_matchers/all_of.rb +39 -0
  55. data/lib/openssl/mocha/lib/mocha/parameter_matchers/any_of.rb +44 -0
  56. data/lib/openssl/mocha/lib/mocha/parameter_matchers/anything.rb +30 -0
  57. data/lib/openssl/mocha/lib/mocha/parameter_matchers/has_entry.rb +39 -0
  58. data/lib/openssl/mocha/lib/mocha/parameter_matchers/has_key.rb +39 -0
  59. data/lib/openssl/mocha/lib/mocha/parameter_matchers/has_value.rb +39 -0
  60. data/lib/openssl/mocha/lib/mocha/parameter_matchers/includes.rb +37 -0
  61. data/lib/openssl/mocha/lib/mocha/parameter_matchers/instance_of.rb +39 -0
  62. data/lib/openssl/mocha/lib/mocha/parameter_matchers/kind_of.rb +39 -0
  63. data/lib/openssl/mocha/lib/mocha/pretty_parameters.rb +28 -0
  64. data/lib/openssl/mocha/lib/mocha/return_values.rb +31 -0
  65. data/lib/openssl/mocha/lib/mocha/setup_and_teardown.rb +23 -0
  66. data/lib/openssl/mocha/lib/mocha/single_return_value.rb +24 -0
  67. data/lib/openssl/mocha/lib/mocha/single_yield.rb +18 -0
  68. data/lib/openssl/mocha/lib/mocha/standalone.rb +32 -0
  69. data/lib/openssl/mocha/lib/mocha/stub.rb +18 -0
  70. data/lib/openssl/mocha/lib/mocha/test_case_adapter.rb +49 -0
  71. data/lib/openssl/mocha/lib/mocha/yield_parameters.rb +31 -0
  72. data/lib/openssl/mocha/lib/mocha_standalone.rb +2 -0
  73. data/lib/openssl/mocha/lib/stubba.rb +2 -0
  74. data/lib/openssl/mocha/templates/html_with_google_analytics.rb +742 -0
  75. data/lib/openssl/mocha/test/acceptance/expected_invocation_count_acceptance_test.rb +187 -0
  76. data/lib/openssl/mocha/test/acceptance/mocha_acceptance_test.rb +98 -0
  77. data/lib/openssl/mocha/test/acceptance/mocked_methods_dispatch_acceptance_test.rb +71 -0
  78. data/lib/openssl/mocha/test/acceptance/parameter_matcher_acceptance_test.rb +63 -0
  79. data/lib/openssl/mocha/test/acceptance/standalone_acceptance_test.rb +131 -0
  80. data/lib/openssl/mocha/test/acceptance/stubba_acceptance_test.rb +102 -0
  81. data/lib/openssl/mocha/test/active_record_test_case.rb +36 -0
  82. data/lib/openssl/mocha/test/deprecation_disabler.rb +15 -0
  83. data/lib/openssl/mocha/test/execution_point.rb +34 -0
  84. data/lib/openssl/mocha/test/integration/mocha_test_result_integration_test.rb +105 -0
  85. data/lib/openssl/mocha/test/integration/stubba_integration_test.rb +89 -0
  86. data/lib/openssl/mocha/test/integration/stubba_test_result_integration_test.rb +85 -0
  87. data/lib/openssl/mocha/test/method_definer.rb +18 -0
  88. data/lib/openssl/mocha/test/test_helper.rb +12 -0
  89. data/lib/openssl/mocha/test/test_runner.rb +31 -0
  90. data/lib/openssl/mocha/test/unit/any_instance_method_test.rb +124 -0
  91. data/lib/openssl/mocha/test/unit/array_inspect_test.rb +16 -0
  92. data/lib/openssl/mocha/test/unit/auto_verify_test.rb +122 -0
  93. data/lib/openssl/mocha/test/unit/central_test.rb +124 -0
  94. data/lib/openssl/mocha/test/unit/class_method_test.rb +196 -0
  95. data/lib/openssl/mocha/test/unit/date_time_inspect_test.rb +21 -0
  96. data/lib/openssl/mocha/test/unit/expectation_list_test.rb +69 -0
  97. data/lib/openssl/mocha/test/unit/expectation_raiser_test.rb +28 -0
  98. data/lib/openssl/mocha/test/unit/expectation_test.rb +399 -0
  99. data/lib/openssl/mocha/test/unit/hash_inspect_test.rb +16 -0
  100. data/lib/openssl/mocha/test/unit/infinite_range_test.rb +53 -0
  101. data/lib/openssl/mocha/test/unit/metaclass_test.rb +22 -0
  102. data/lib/openssl/mocha/test/unit/missing_expectation_test.rb +45 -0
  103. data/lib/openssl/mocha/test/unit/mock_test.rb +316 -0
  104. data/lib/openssl/mocha/test/unit/multiple_yields_test.rb +18 -0
  105. data/lib/openssl/mocha/test/unit/no_yield_test.rb +18 -0
  106. data/lib/openssl/mocha/test/unit/object_inspect_test.rb +35 -0
  107. data/lib/openssl/mocha/test/unit/object_test.rb +165 -0
  108. data/lib/openssl/mocha/test/unit/parameter_matchers/all_of_test.rb +26 -0
  109. data/lib/openssl/mocha/test/unit/parameter_matchers/any_of_test.rb +26 -0
  110. data/lib/openssl/mocha/test/unit/parameter_matchers/anything_test.rb +21 -0
  111. data/lib/openssl/mocha/test/unit/parameter_matchers/has_entry_test.rb +25 -0
  112. data/lib/openssl/mocha/test/unit/parameter_matchers/has_key_test.rb +25 -0
  113. data/lib/openssl/mocha/test/unit/parameter_matchers/has_value_test.rb +25 -0
  114. data/lib/openssl/mocha/test/unit/parameter_matchers/includes_test.rb +25 -0
  115. data/lib/openssl/mocha/test/unit/parameter_matchers/instance_of_test.rb +25 -0
  116. data/lib/openssl/mocha/test/unit/parameter_matchers/kind_of_test.rb +25 -0
  117. data/lib/openssl/mocha/test/unit/parameter_matchers/stub_matcher.rb +22 -0
  118. data/lib/openssl/mocha/test/unit/pretty_parameters_test.rb +32 -0
  119. data/lib/openssl/mocha/test/unit/return_values_test.rb +63 -0
  120. data/lib/openssl/mocha/test/unit/setup_and_teardown_test.rb +76 -0
  121. data/lib/openssl/mocha/test/unit/single_return_value_test.rb +33 -0
  122. data/lib/openssl/mocha/test/unit/single_yield_test.rb +18 -0
  123. data/lib/openssl/mocha/test/unit/string_inspect_test.rb +11 -0
  124. data/lib/openssl/mocha/test/unit/stub_test.rb +24 -0
  125. data/lib/openssl/mocha/test/unit/yield_parameters_test.rb +93 -0
  126. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/FOLDERS +53 -0
  127. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/LICENSE +340 -0
  128. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/README +117 -0
  129. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/bin/coderay +77 -0
  130. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/bin/coderay_stylesheet +4 -0
  131. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay.rb +319 -0
  132. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/duo.rb +29 -0
  133. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoder.rb +173 -0
  134. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/_map.rb +8 -0
  135. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/count.rb +21 -0
  136. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/debug.rb +46 -0
  137. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/div.rb +20 -0
  138. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html.rb +260 -0
  139. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html/classes.rb +77 -0
  140. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html/css.rb +65 -0
  141. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html/numerization.rb +122 -0
  142. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html/output.rb +195 -0
  143. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/null.rb +26 -0
  144. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/page.rb +21 -0
  145. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/span.rb +20 -0
  146. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/statistic.rb +81 -0
  147. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/text.rb +33 -0
  148. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/tokens.rb +44 -0
  149. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/xml.rb +71 -0
  150. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/yaml.rb +22 -0
  151. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/helpers/file_type.rb +182 -0
  152. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/helpers/gzip_simple.rb +122 -0
  153. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/helpers/plugin.rb +326 -0
  154. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/helpers/word_list.rb +119 -0
  155. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanner.rb +238 -0
  156. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/_map.rb +15 -0
  157. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/c.rb +163 -0
  158. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/debug.rb +60 -0
  159. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/delphi.rb +149 -0
  160. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/html.rb +177 -0
  161. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/nitro_xhtml.rb +133 -0
  162. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/plaintext.rb +16 -0
  163. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/rhtml.rb +73 -0
  164. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/ruby.rb +367 -0
  165. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/ruby/patterns.rb +230 -0
  166. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/xml.rb +18 -0
  167. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/style.rb +20 -0
  168. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/styles/_map.rb +7 -0
  169. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/styles/cycnus.rb +125 -0
  170. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/styles/murphy.rb +119 -0
  171. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/tokens.rb +368 -0
  172. data/lib/openssl/mocha/vendor/meta_project-0.4.15/CHANGES +295 -0
  173. data/lib/openssl/mocha/vendor/meta_project-0.4.15/MIT-LICENSE +21 -0
  174. data/lib/openssl/mocha/vendor/meta_project-0.4.15/README +129 -0
  175. data/lib/openssl/mocha/vendor/meta_project-0.4.15/Rakefile +152 -0
  176. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project.rb +19 -0
  177. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/core_ext/open_uri.rb +22 -0
  178. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/core_ext/pathname.rb +36 -0
  179. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/core_ext/string.rb +5 -0
  180. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/http/multipart.rb +32 -0
  181. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/patois.rb +1 -0
  182. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/patois/parser.rb +99 -0
  183. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project.rb +4 -0
  184. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/base.rb +9 -0
  185. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/codehaus.rb +1 -0
  186. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/codehaus/codehaus_project_svn.rb +31 -0
  187. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/trac.rb +1 -0
  188. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/trac/trac_project.rb +54 -0
  189. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge.rb +5 -0
  190. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/ruby_forge.rb +47 -0
  191. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/session.rb +177 -0
  192. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/source_forge.rb +50 -0
  193. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/xfile.rb +45 -0
  194. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/xforge_base.rb +85 -0
  195. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project_analyzer.rb +36 -0
  196. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/release/freshmeat.rb +267 -0
  197. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/release/raa.rb +572 -0
  198. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/scm_web.rb +2 -0
  199. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/scm_web/browser.rb +112 -0
  200. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/scm_web/pathname.rb +89 -0
  201. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker.rb +6 -0
  202. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/base.rb +24 -0
  203. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/digit_issues.rb +34 -0
  204. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/issue.rb +57 -0
  205. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/jira.rb +2 -0
  206. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/jira/jira_issues.rb +35 -0
  207. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/jira/jira_tracker.rb +149 -0
  208. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/trac.rb +1 -0
  209. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/trac/trac_tracker.rb +33 -0
  210. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/xforge.rb +3 -0
  211. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/xforge/ruby_forge_tracker.rb +17 -0
  212. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/xforge/source_forge_tracker.rb +17 -0
  213. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/xforge/xforge_tracker.rb +191 -0
  214. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/version_parser.rb +52 -0
  215. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/rake/contrib/xforge.rb +3 -0
  216. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/rake/contrib/xforge/base.rb +64 -0
  217. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/rake/contrib/xforge/news_publisher.rb +97 -0
  218. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/rake/contrib/xforge/release.rb +134 -0
  219. data/lib/openssl/nbproject/genfiles.properties +5 -0
  220. data/lib/openssl/nbproject/jdk.xml +157 -0
  221. data/lib/openssl/nbproject/nbjdk.properties +1 -0
  222. data/lib/openssl/nbproject/nbjdk.xml +16 -0
  223. data/lib/openssl/nbproject/project.xml +117 -0
  224. data/lib/openssl/src/java/JopensslService.java +41 -0
  225. data/lib/openssl/src/java/org/jruby/ext/openssl/ASN1.java +930 -0
  226. data/lib/openssl/src/java/org/jruby/ext/openssl/Attribute.java +132 -0
  227. data/lib/openssl/src/java/org/jruby/ext/openssl/BN.java +769 -0
  228. data/lib/openssl/src/java/org/jruby/ext/openssl/BouncyCastlePEMHandler.java +69 -0
  229. data/lib/openssl/src/java/org/jruby/ext/openssl/Callable.java +10 -0
  230. data/lib/openssl/src/java/org/jruby/ext/openssl/Cipher.java +661 -0
  231. data/lib/openssl/src/java/org/jruby/ext/openssl/CipherStrings.java +1827 -0
  232. data/lib/openssl/src/java/org/jruby/ext/openssl/Config.java +49 -0
  233. data/lib/openssl/src/java/org/jruby/ext/openssl/DefaultPEMHandler.java +44 -0
  234. data/lib/openssl/src/java/org/jruby/ext/openssl/Digest.java +207 -0
  235. data/lib/openssl/src/java/org/jruby/ext/openssl/HMAC.java +183 -0
  236. data/lib/openssl/src/java/org/jruby/ext/openssl/NetscapeSPKI.java +212 -0
  237. data/lib/openssl/src/java/org/jruby/ext/openssl/OpenSSLImpl.java +341 -0
  238. data/lib/openssl/src/java/org/jruby/ext/openssl/OpenSSLReal.java +113 -0
  239. data/lib/openssl/src/java/org/jruby/ext/openssl/PEMHandler.java +40 -0
  240. data/lib/openssl/src/java/org/jruby/ext/openssl/PKCS10CertificationRequestExt.java +159 -0
  241. data/lib/openssl/src/java/org/jruby/ext/openssl/PKCS7.java +642 -0
  242. data/lib/openssl/src/java/org/jruby/ext/openssl/PKey.java +154 -0
  243. data/lib/openssl/src/java/org/jruby/ext/openssl/PKeyDH.java +401 -0
  244. data/lib/openssl/src/java/org/jruby/ext/openssl/PKeyDSA.java +419 -0
  245. data/lib/openssl/src/java/org/jruby/ext/openssl/PKeyRSA.java +762 -0
  246. data/lib/openssl/src/java/org/jruby/ext/openssl/Random.java +103 -0
  247. data/lib/openssl/src/java/org/jruby/ext/openssl/Request.java +336 -0
  248. data/lib/openssl/src/java/org/jruby/ext/openssl/SSL.java +71 -0
  249. data/lib/openssl/src/java/org/jruby/ext/openssl/SSLContext.java +358 -0
  250. data/lib/openssl/src/java/org/jruby/ext/openssl/SSLSocket.java +561 -0
  251. data/lib/openssl/src/java/org/jruby/ext/openssl/SimpleSecretKey.java +53 -0
  252. data/lib/openssl/src/java/org/jruby/ext/openssl/Utils.java +60 -0
  253. data/lib/openssl/src/java/org/jruby/ext/openssl/X509.java +108 -0
  254. data/lib/openssl/src/java/org/jruby/ext/openssl/X509CRL.java +446 -0
  255. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Cert.java +520 -0
  256. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Extensions.java +751 -0
  257. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Name.java +405 -0
  258. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Revoked.java +111 -0
  259. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Store.java +282 -0
  260. data/lib/openssl/src/java/org/jruby/ext/openssl/X509StoreCtx.java +206 -0
  261. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/ASN1Registry.java +5135 -0
  262. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Attribute.java +79 -0
  263. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/BIO.java +345 -0
  264. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/BIOFilter.java +38 -0
  265. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Base64BIOFilter.java +84 -0
  266. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/CipherBIOFilter.java +157 -0
  267. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Digest.java +126 -0
  268. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/EVP.java +136 -0
  269. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/EncContent.java +178 -0
  270. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Encrypt.java +77 -0
  271. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Envelope.java +169 -0
  272. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/IssuerAndSerial.java +35 -0
  273. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/MemBIO.java +117 -0
  274. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/MessageDigestBIOFilter.java +76 -0
  275. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Mime.java +245 -0
  276. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/MimeHeader.java +103 -0
  277. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/MimeParam.java +69 -0
  278. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/NotVerifiedPKCS7Exception.java +38 -0
  279. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/NullSinkBIO.java +52 -0
  280. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7.java +1276 -0
  281. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7Data.java +168 -0
  282. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataData.java +88 -0
  283. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataDigest.java +64 -0
  284. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataEncrypted.java +61 -0
  285. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataEnveloped.java +85 -0
  286. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataSigned.java +127 -0
  287. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataSignedAndEnveloped.java +91 -0
  288. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7Exception.java +68 -0
  289. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/RecipInfo.java +244 -0
  290. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/SMIME.java +281 -0
  291. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/SignEnvelope.java +202 -0
  292. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Signed.java +345 -0
  293. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/SignerInfoWithPkey.java +365 -0
  294. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/TypeDiscriminating.java +34 -0
  295. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/utils/Base64.java +1809 -0
  296. data/lib/openssl/src/java/org/jruby/ext/openssl/util/Base64Coder.java +103 -0
  297. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/CRL.java +59 -0
  298. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Certificate.java +57 -0
  299. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/CertificateFile.java +46 -0
  300. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/CertificateHashDir.java +46 -0
  301. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function0.java +43 -0
  302. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function1.java +43 -0
  303. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function2.java +43 -0
  304. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function3.java +43 -0
  305. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function4.java +43 -0
  306. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function5.java +43 -0
  307. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Lookup.java +560 -0
  308. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/LookupMethod.java +84 -0
  309. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Name.java +85 -0
  310. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/PEMInputOutput.java +1210 -0
  311. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/PKey.java +41 -0
  312. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/PolicyTree.java +36 -0
  313. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Purpose.java +475 -0
  314. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Store.java +377 -0
  315. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/StoreContext.java +1356 -0
  316. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Trust.java +279 -0
  317. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/VerifyParameter.java +324 -0
  318. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509Aux.java +43 -0
  319. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509AuxCertificate.java +170 -0
  320. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509Error.java +70 -0
  321. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509Object.java +88 -0
  322. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509Utils.java +541 -0
  323. data/lib/openssl/test/cert_with_ec_pk.cer +27 -0
  324. data/lib/openssl/test/fixture/ca_path/72fa7371.0 +19 -0
  325. data/lib/openssl/test/fixture/ca_path/verisign.pem +19 -0
  326. data/lib/openssl/test/fixture/cacert.pem +23 -0
  327. data/lib/openssl/test/fixture/cert_localhost.pem +19 -0
  328. data/lib/openssl/test/fixture/common.pem +48 -0
  329. data/lib/openssl/test/fixture/localhost_keypair.pem +18 -0
  330. data/lib/openssl/test/fixture/max.pem +29 -0
  331. data/lib/openssl/test/fixture/purpose/b70a5bc1.0 +24 -0
  332. data/lib/openssl/test/fixture/purpose/ca/PASSWD_OF_CA_KEY_IS_1234 +0 -0
  333. data/lib/openssl/test/fixture/purpose/ca/ca_config.rb +37 -0
  334. data/lib/openssl/test/fixture/purpose/ca/cacert.pem +24 -0
  335. data/lib/openssl/test/fixture/purpose/ca/newcerts/2_cert.pem +19 -0
  336. data/lib/openssl/test/fixture/purpose/ca/newcerts/3_cert.pem +19 -0
  337. data/lib/openssl/test/fixture/purpose/ca/private/cakeypair.pem +30 -0
  338. data/lib/openssl/test/fixture/purpose/ca/serial +1 -0
  339. data/lib/openssl/test/fixture/purpose/cacert.pem +24 -0
  340. data/lib/openssl/test/fixture/purpose/scripts/gen_cert.rb +127 -0
  341. data/lib/openssl/test/fixture/purpose/scripts/gen_csr.rb +50 -0
  342. data/lib/openssl/test/fixture/purpose/scripts/init_ca.rb +66 -0
  343. data/lib/openssl/test/fixture/purpose/sslclient.pem +19 -0
  344. data/lib/openssl/test/fixture/purpose/sslclient/csr.pem +10 -0
  345. data/lib/openssl/test/fixture/purpose/sslclient/keypair.pem +15 -0
  346. data/lib/openssl/test/fixture/purpose/sslclient/sslclient.pem +19 -0
  347. data/lib/openssl/test/fixture/purpose/sslserver.pem +19 -0
  348. data/lib/openssl/test/fixture/purpose/sslserver/csr.pem +10 -0
  349. data/lib/openssl/test/fixture/purpose/sslserver/keypair.pem +15 -0
  350. data/lib/openssl/test/fixture/purpose/sslserver/sslserver.pem +19 -0
  351. data/lib/openssl/test/fixture/verisign.pem +19 -0
  352. data/lib/openssl/test/fixture/verisign_c3.pem +14 -0
  353. data/lib/openssl/test/openssl/ssl_server.rb +99 -0
  354. data/lib/openssl/test/openssl/test_asn1.rb +199 -0
  355. data/lib/openssl/test/openssl/test_cipher.rb +196 -0
  356. data/lib/openssl/test/openssl/test_digest.rb +88 -0
  357. data/lib/openssl/test/openssl/test_hmac.rb +44 -0
  358. data/lib/openssl/test/openssl/test_ns_spki.rb +69 -0
  359. data/lib/openssl/test/openssl/test_pair.rb +149 -0
  360. data/lib/openssl/test/openssl/test_pkcs7.rb +160 -0
  361. data/lib/openssl/test/openssl/test_pkey_rsa.rb +49 -0
  362. data/lib/openssl/test/openssl/test_ssl.rb +413 -0
  363. data/lib/openssl/test/openssl/test_x509cert.rb +236 -0
  364. data/lib/openssl/test/openssl/test_x509crl.rb +234 -0
  365. data/lib/openssl/test/openssl/test_x509ext.rb +95 -0
  366. data/lib/openssl/test/openssl/test_x509name.rb +281 -0
  367. data/lib/openssl/test/openssl/test_x509req.rb +178 -0
  368. data/lib/openssl/test/openssl/test_x509store.rb +245 -0
  369. data/lib/openssl/test/openssl/utils.rb +135 -0
  370. data/lib/openssl/test/pkcs7_mime_enveloped.message +19 -0
  371. data/lib/openssl/test/pkcs7_mime_signed.message +30 -0
  372. data/lib/openssl/test/pkcs7_multipart_signed.message +45 -0
  373. data/lib/openssl/test/ref/compile.rb +8 -0
  374. data/lib/openssl/test/ref/pkcs1 +0 -0
  375. data/lib/openssl/test/ref/pkcs1.c +21 -0
  376. data/lib/openssl/test/test_cipher.rb +95 -0
  377. data/lib/openssl/test/test_integration.rb +139 -0
  378. data/lib/openssl/test/test_java.rb +98 -0
  379. data/lib/openssl/test/test_java_attribute.rb +25 -0
  380. data/lib/openssl/test/test_java_bio.rb +42 -0
  381. data/lib/openssl/test/test_java_mime.rb +173 -0
  382. data/lib/openssl/test/test_java_pkcs7.rb +769 -0
  383. data/lib/openssl/test/test_java_smime.rb +177 -0
  384. data/lib/openssl/test/test_openssl.rb +34 -0
  385. data/lib/openssl/test/test_openssl_x509.rb +34 -0
  386. data/lib/openssl/test/test_parse_certificate.rb +20 -0
  387. data/lib/openssl/test/test_pkey.rb +46 -0
  388. data/lib/openssl/test/test_x509store.rb +155 -0
  389. data/lib/openssl/test/ut_eof.rb +128 -0
  390. data/lib/redcar.rb +134 -8
  391. data/lib/redcar/installer.rb +46 -11
  392. data/lib/redcar/runner.rb +2 -1
  393. data/lib/redcar/usage.rb +12 -5
  394. data/lib/redcar_quick_start.rb +37 -0
  395. data/plugins/application/features/support/env.rb +9 -1
  396. data/plugins/application/icons/redcar_icon_beta.png +0 -0
  397. data/plugins/application/lib/application.rb +113 -43
  398. data/plugins/application/lib/application/clipboard.rb +28 -4
  399. data/plugins/application/lib/application/command.rb +4 -12
  400. data/plugins/application/lib/application/command/executor.rb +2 -2
  401. data/plugins/application/lib/application/keymap.rb +39 -0
  402. data/plugins/application/lib/application/keymap/builder.rb +19 -0
  403. data/plugins/application/lib/application/speedbar.rb +33 -24
  404. data/plugins/application/lib/application/tab.rb +15 -0
  405. data/plugins/application/lib/application/window.rb +28 -5
  406. data/plugins/application/spec/application/clipboard_spec.rb +20 -1
  407. data/plugins/application/spec/application/command/executor_spec.rb +7 -2
  408. data/plugins/application/spec/application/command_spec.rb +0 -5
  409. data/plugins/application/spec/application/keymap/builder_spec.rb +17 -0
  410. data/plugins/application/spec/application/menu_spec.rb +30 -0
  411. data/plugins/application/spec/application/speedbar_spec.rb +30 -6
  412. data/plugins/application/spec/application/window_spec.rb +2 -2
  413. data/plugins/application/spec/spec_helper.rb +1 -1
  414. data/plugins/application_swt/lib/application_swt.rb +3 -0
  415. data/plugins/application_swt/lib/application_swt/dialogs/filter_list_dialog_controller.rb +10 -1
  416. data/plugins/application_swt/lib/application_swt/html_tab.rb +1 -0
  417. data/plugins/application_swt/lib/application_swt/menu.rb +4 -3
  418. data/plugins/application_swt/lib/application_swt/menu/binding_translator.rb +12 -4
  419. data/plugins/application_swt/lib/application_swt/speedbar.rb +105 -19
  420. data/plugins/application_swt/lib/application_swt/swt_wrapper.rb +2 -0
  421. data/plugins/application_swt/lib/application_swt/window.rb +55 -23
  422. data/plugins/application_swt/spec/spec_helper.rb +0 -1
  423. data/plugins/auto_completer/lib/auto_completer.rb +57 -3
  424. data/plugins/auto_indenter/lib/auto_indenter.rb +1 -1
  425. data/plugins/core/lib/core.rb +5 -3
  426. data/plugins/core/lib/core/interface.rb +73 -0
  427. data/plugins/core/lib/core/model.rb +2 -0
  428. data/plugins/core/lib/core/observable.rb +12 -1
  429. data/plugins/core/lib/core/observable_struct.rb +34 -0
  430. data/plugins/core/lib/core/plugin/storage.rb +16 -3
  431. data/plugins/core/lib/core/reentry_helpers.rb +13 -0
  432. data/plugins/core/spec/core/observable_spec.rb +13 -0
  433. data/plugins/core/spec/core/storage_spec.rb +18 -0
  434. data/plugins/core/spec/spec_helper.rb +1 -0
  435. data/plugins/edit_view/features/cut_and_paste.feature +4 -2
  436. data/plugins/edit_view/features/soft_tabs.feature +243 -0
  437. data/plugins/edit_view/features/step_definitions/editing_steps.rb +91 -2
  438. data/plugins/edit_view/features/step_definitions/tab_steps.rb +1 -1
  439. data/plugins/edit_view/features/tabs.feature +146 -0
  440. data/plugins/edit_view/lib/edit_view.rb +197 -8
  441. data/plugins/edit_view/lib/edit_view/actions/arrow_keys.rb +121 -0
  442. data/plugins/edit_view/lib/edit_view/actions/deletion.rb +30 -0
  443. data/plugins/edit_view/lib/edit_view/actions/tab.rb +66 -0
  444. data/plugins/edit_view/lib/edit_view/command.rb +0 -2
  445. data/plugins/edit_view/lib/edit_view/document.rb +62 -27
  446. data/plugins/edit_view/lib/edit_view/document/command.rb +11 -0
  447. data/plugins/edit_view/lib/edit_view/edit_tab.rb +2 -1
  448. data/plugins/edit_view/lib/edit_view/info_speedbar.rb +69 -0
  449. data/plugins/edit_view/lib/edit_view/tab_settings.rb +40 -0
  450. data/plugins/edit_view/spec/edit_view/document_spec.rb +26 -0
  451. data/plugins/edit_view/spec/spec_helper.rb +0 -1
  452. data/plugins/edit_view_swt/lib/edit_view_swt.rb +57 -69
  453. data/plugins/edit_view_swt/lib/edit_view_swt/document.rb +24 -3
  454. data/plugins/edit_view_swt/lib/edit_view_swt/edit_tab.rb +23 -6
  455. data/plugins/edit_view_swt/spec/spec_helper.rb +0 -1
  456. data/plugins/edit_view_swt/vendor/java-mateview.rb +19 -2
  457. data/plugins/encryption/encryption.rb +38 -0
  458. data/plugins/encryption/ezcrypto.rb +652 -0
  459. data/plugins/encryption/jarmor-1.1.jar +0 -0
  460. data/plugins/encryption/plugin.rb +9 -0
  461. data/plugins/execute_current_tab/lib/execute_current_tab.rb +56 -0
  462. data/plugins/execute_current_tab/plugin.rb +8 -0
  463. data/plugins/html_view/lib/html_view.rb +16 -11
  464. data/plugins/plugin_manager_ui/lib/plugin_manager_ui.rb +2 -1
  465. data/plugins/plugin_manager_ui/views/index.html.erb +22 -4
  466. data/plugins/project/lib/project.rb +140 -26
  467. data/plugins/project/lib/project/drb_service.rb +75 -0
  468. data/plugins/project/lib/project/file_mirror.rb +5 -5
  469. data/plugins/project/lib/project/find_file_dialog.rb +123 -32
  470. data/plugins/project/spec/project/file_mirror_spec.rb +10 -1
  471. data/plugins/project/spec/spec_helper.rb +0 -1
  472. data/plugins/redcar/plugin.rb +1 -1
  473. data/plugins/redcar/redcar.rb +204 -109
  474. data/plugins/redcar/spec/redcar/redcar_spec.rb +70 -0
  475. data/plugins/redcar/spec/spec_helper.rb +4 -0
  476. data/plugins/repl/lib/repl.rb +14 -7
  477. data/plugins/repl/lib/repl/internal_mirror.rb +43 -22
  478. data/plugins/repl/spec/repl/internal_mirror_spec.rb +34 -7
  479. data/plugins/repl/spec/spec_helper.rb +0 -1
  480. data/plugins/tree/spec/spec_helper.rb +0 -1
  481. data/plugins/tree_view_swt/lib/tree_view_swt.rb +1 -1
  482. data/textmate/Bundles/RedcarRepl.tmbundle/Syntaxes/InternalRuby.plist +2 -18
  483. data/textmate/Bundles/asciidoc.tmbundle/Syntaxes/AsciiDoc.tmLanguage +428 -0
  484. metadata +790 -371
  485. data/lib/redcar/boot.rb +0 -108
@@ -0,0 +1,358 @@
1
+ /***** BEGIN LICENSE BLOCK *****
2
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
3
+ *
4
+ * The contents of this file are subject to the Common Public
5
+ * License Version 1.0 (the "License"); you may not use this file
6
+ * except in compliance with the License. You may obtain a copy of
7
+ * the License at http://www.eclipse.org/legal/cpl-v10.html
8
+ *
9
+ * Software distributed under the License is distributed on an "AS
10
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11
+ * implied. See the License for the specific language governing
12
+ * rights and limitations under the License.
13
+ *
14
+ * Copyright (C) 2006 Ola Bini <ola@ologix.com>
15
+ *
16
+ * Alternatively, the contents of this file may be used under the terms of
17
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
18
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
19
+ * in which case the provisions of the GPL or the LGPL are applicable instead
20
+ * of those above. If you wish to allow use of your version of this file only
21
+ * under the terms of either the GPL or the LGPL, and not to allow others to
22
+ * use your version of this file under the terms of the CPL, indicate your
23
+ * decision by deleting the provisions above and replace them with the notice
24
+ * and other provisions required by the GPL or the LGPL. If you do not delete
25
+ * the provisions above, a recipient may use your version of this file under
26
+ * the terms of any one of the CPL, the GPL or the LGPL.
27
+ ***** END LICENSE BLOCK *****/
28
+ package org.jruby.ext.openssl;
29
+
30
+
31
+
32
+ import java.security.cert.CertificateException;
33
+ import java.util.ArrayList;
34
+ import java.util.Arrays;
35
+ import java.util.HashMap;
36
+ import java.util.Iterator;
37
+ import java.util.List;
38
+ import java.util.Map;
39
+ import javax.net.ssl.SSLEngine;
40
+ import org.jruby.Ruby;
41
+ import org.jruby.RubyArray;
42
+ import org.jruby.RubyClass;
43
+ import org.jruby.RubyModule;
44
+ import org.jruby.RubyNumeric;
45
+ import org.jruby.RubyObject;
46
+ import org.jruby.anno.JRubyMethod;
47
+ import org.jruby.common.IRubyWarnings.ID;
48
+ import org.jruby.ext.openssl.x509store.Store;
49
+ import org.jruby.ext.openssl.x509store.StoreContext;
50
+ import org.jruby.ext.openssl.x509store.X509AuxCertificate;
51
+ import org.jruby.runtime.Block;
52
+ import org.jruby.runtime.ObjectAllocator;
53
+ import org.jruby.runtime.builtin.IRubyObject;
54
+
55
+ /**
56
+ * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a>
57
+ */
58
+ public class SSLContext extends RubyObject {
59
+ private final static String[] ctx_attrs = {
60
+ "cert", "key", "client_ca", "ca_file", "ca_path",
61
+ "timeout", "verify_mode", "verify_depth",
62
+ "verify_callback", "options", "cert_store", "extra_chain_cert",
63
+ "client_cert_cb", "tmp_dh_callback", "session_id_context"};
64
+
65
+ private static ObjectAllocator SSLCONTEXT_ALLOCATOR = new ObjectAllocator() {
66
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
67
+ return new SSLContext(runtime, klass);
68
+ }
69
+ };
70
+
71
+ public static void createSSLContext(Ruby runtime, RubyModule mSSL) {
72
+ RubyClass cSSLContext = mSSL.defineClassUnder("SSLContext",runtime.getObject(),SSLCONTEXT_ALLOCATOR);
73
+ for(int i=0;i<ctx_attrs.length;i++) {
74
+ cSSLContext.attr_accessor(runtime.getCurrentContext(),new IRubyObject[]{runtime.newSymbol(ctx_attrs[i])});
75
+ }
76
+
77
+ cSSLContext.defineAnnotatedMethods(SSLContext.class);
78
+ }
79
+
80
+ public SSLContext(Ruby runtime, RubyClass type) {
81
+ super(runtime,type);
82
+ }
83
+
84
+ private IRubyObject ciphers;
85
+ private PKey t_key = null;
86
+ private X509Cert t_cert = null;
87
+
88
+ private java.security.cert.X509Certificate peer_cert;
89
+
90
+ public void setPeer(java.security.cert.X509Certificate p) {
91
+ this.peer_cert = p;
92
+ }
93
+
94
+ public java.security.cert.X509Certificate getPeer() {
95
+ return this.peer_cert;
96
+ }
97
+
98
+ private void initFromCallback(IRubyObject cb) {
99
+ IRubyObject out = cb.callMethod(getRuntime().getCurrentContext(),"call",this);
100
+ t_cert = (X509Cert)(((RubyArray)out).getList().get(0));
101
+ t_key = (PKey)(((RubyArray)out).getList().get(1));
102
+ }
103
+
104
+ public PKey getCallbackKey() {
105
+ IRubyObject cb = callMethod(getRuntime().getCurrentContext(),"client_cert_cb");
106
+ if(t_key == null && !cb.isNil()) {
107
+ initFromCallback(cb);
108
+ }
109
+ return t_key;
110
+ }
111
+
112
+ public X509Cert getCallbackCert() {
113
+ IRubyObject cb = callMethod(getRuntime().getCurrentContext(),"client_cert_cb");
114
+ if(t_cert == null && !cb.isNil()) {
115
+ initFromCallback(cb);
116
+ }
117
+ return t_cert;
118
+ }
119
+
120
+ @JRubyMethod(rest=true)
121
+ public IRubyObject initialize(IRubyObject[] args) {
122
+ ciphers = getRuntime().getNil();
123
+ return this;
124
+ }
125
+
126
+ @JRubyMethod
127
+ public IRubyObject ciphers() {
128
+ System.err.println("fetching ciphers");
129
+ return this.ciphers;
130
+ }
131
+
132
+ @JRubyMethod(name="ciphers=")
133
+ public IRubyObject set_ciphers(IRubyObject val) {
134
+ this.ciphers = val;
135
+ return val;
136
+ }
137
+
138
+ String[] getCipherSuites(SSLEngine engine) {
139
+ List<CipherStrings.Def> ciphs = null;
140
+ if(this.ciphers.isNil()) {
141
+ ciphs = CipherStrings.getMatchingCiphers(CipherStrings.SSL_DEFAULT_CIPHER_LIST, engine.getSupportedCipherSuites());
142
+ } else if(this.ciphers instanceof RubyArray) {
143
+ StringBuilder builder = new StringBuilder();
144
+ String sep = "";
145
+ for(Iterator iter = ((RubyArray)this.ciphers).getList().iterator();iter.hasNext();) {
146
+ builder.append(sep).append(iter.next().toString());
147
+ sep = ":";
148
+ }
149
+ ciphs = CipherStrings.getMatchingCiphers(builder.toString(), engine.getSupportedCipherSuites());
150
+ } else {
151
+ ciphs = CipherStrings.getMatchingCiphers(this.ciphers.toString(), engine.getSupportedCipherSuites());
152
+ }
153
+ String[] result = new String[ciphs.size()];
154
+ for(int i=0;i<result.length;i++) {
155
+ result[i] = ciphs.get(i).cipherSuite;
156
+ }
157
+ return result;
158
+ }
159
+
160
+ KM getKM() {
161
+ return new KM(this);
162
+ }
163
+
164
+ TM getTM() {
165
+ return new TM(this);
166
+ }
167
+
168
+ private static class KM extends javax.net.ssl.X509ExtendedKeyManager {
169
+ private SSLContext ctt;
170
+ public KM(SSLContext ctt) {
171
+ super();
172
+ this.ctt = ctt;
173
+ }
174
+
175
+ public String chooseEngineClientAlias(String[] keyType, java.security.Principal[] issuers, javax.net.ssl.SSLEngine engine) {
176
+ PKey k = null;
177
+ if(!ctt.callMethod(ctt.getRuntime().getCurrentContext(),"key").isNil()) {
178
+ k = (PKey)ctt.callMethod(ctt.getRuntime().getCurrentContext(),"key");
179
+ } else {
180
+ k = ctt.getCallbackKey();
181
+ }
182
+ if(k == null) {
183
+ return null;
184
+ }
185
+ for(int i=0;i<keyType.length;i++) {
186
+ if(keyType[i].equalsIgnoreCase(k.getAlgorithm())) {
187
+ return keyType[i];
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+
193
+ public String chooseEngineServerAlias(String keyType, java.security.Principal[] issuers, javax.net.ssl.SSLEngine engine) {
194
+ PKey k = null;
195
+ if(!ctt.callMethod(ctt.getRuntime().getCurrentContext(),"key").isNil()) {
196
+ k = (PKey)ctt.callMethod(ctt.getRuntime().getCurrentContext(),"key");
197
+ } else {
198
+ k = ctt.getCallbackKey();
199
+ }
200
+ if(k == null) {
201
+ return null;
202
+ }
203
+ if(keyType.equalsIgnoreCase(k.getAlgorithm())) {
204
+ return keyType;
205
+ }
206
+ return null;
207
+ }
208
+ public String chooseClientAlias(String[] keyType, java.security.Principal[] issuers, java.net.Socket socket) {
209
+ return null;
210
+ }
211
+ public String chooseServerAlias(String keyType, java.security.Principal[] issuers, java.net.Socket socket) {
212
+ return null;
213
+ }
214
+ public java.security.cert.X509Certificate[] getCertificateChain(String alias) {
215
+ X509Cert c = null;
216
+ if(!ctt.callMethod(ctt.getRuntime().getCurrentContext(),"cert").isNil()) {
217
+ c = (X509Cert)ctt.callMethod(ctt.getRuntime().getCurrentContext(),"cert");
218
+ } else {
219
+ c = ctt.getCallbackCert();
220
+ }
221
+ if(c == null) {
222
+ return null;
223
+ }
224
+ return new java.security.cert.X509Certificate[]{c.getAuxCert()};
225
+ }
226
+ public String[] getClientAliases(String keyType, java.security.Principal[] issuers) {
227
+ return null;
228
+ }
229
+ public java.security.PrivateKey getPrivateKey(String alias) {
230
+ PKey k = null;
231
+ if(!ctt.callMethod(ctt.getRuntime().getCurrentContext(),"key").isNil()) {
232
+ k = (PKey)ctt.callMethod(ctt.getRuntime().getCurrentContext(),"key");
233
+ } else {
234
+ k = ctt.getCallbackKey();
235
+ }
236
+ if(k == null) {
237
+ return null;
238
+ }
239
+ return k.getPrivateKey();
240
+ }
241
+ public String[] getServerAliases(String keyType, java.security.Principal[] issuers) {
242
+ return null;
243
+ }
244
+ }
245
+
246
+ private static class TM implements javax.net.ssl.X509TrustManager {
247
+ private SSLContext ctt;
248
+ public TM(SSLContext ctt) {
249
+ this.ctt = ctt;
250
+ }
251
+
252
+ public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
253
+ if(ctt.callMethod(ctt.getRuntime().getCurrentContext(),"verify_mode").isNil()) {
254
+ if(chain != null && chain.length > 0) {
255
+ ctt.setPeer(chain[0]);
256
+ }
257
+ return;
258
+ }
259
+
260
+ int verify_mode = RubyNumeric.fix2int(ctt.callMethod(ctt.getRuntime().getCurrentContext(),"verify_mode"));
261
+ if(chain != null && chain.length > 0) {
262
+ ctt.setPeer(chain[0]);
263
+ if((verify_mode & 0x1) != 0) { // verify_peer
264
+ X509AuxCertificate x = StoreContext.ensureAux(chain[0]);
265
+ StoreContext ctx = new StoreContext();
266
+ IRubyObject str = ctt.callMethod(ctt.getRuntime().getCurrentContext(),"cert_store");
267
+ Store store = null;
268
+ if(!str.isNil()) {
269
+ store = ((X509Store)str).getStore();
270
+ }
271
+ if(ctx.init(store,x,StoreContext.ensureAux(chain)) == 0) {
272
+ throw new CertificateException("couldn't initialize store");
273
+ }
274
+
275
+ ctx.setDefault("ssl_client");
276
+
277
+ IRubyObject val = ctt.callMethod(ctt.getRuntime().getCurrentContext(),"ca_file");
278
+ String ca_file = val.isNil() ? null : val.convertToString().toString();
279
+ val = ctt.callMethod(ctt.getRuntime().getCurrentContext(),"ca_path");
280
+ String ca_path = val.isNil() ? null : val.convertToString().toString();
281
+
282
+ if(ca_file != null || ca_path != null) {
283
+ if(ctx.loadVerifyLocations(ca_file, ca_path) == 0) {
284
+ ctt.getRuntime().getWarnings().warn(ID.MISCELLANEOUS, "can't set verify locations");
285
+ }
286
+ }
287
+
288
+ try {
289
+ if(ctx.verifyCertificate() == 0) {
290
+ throw new CertificateException("certificate verify failed");
291
+ }
292
+ } catch(Exception e) {
293
+ throw new CertificateException("certificate verify failed");
294
+ }
295
+ }
296
+ } else {
297
+ if((verify_mode & 0x2) != 0) { // fail if no peer cer
298
+ throw new CertificateException("no peer certificate");
299
+ }
300
+ }
301
+ }
302
+
303
+ public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
304
+ if(ctt.callMethod(ctt.getRuntime().getCurrentContext(),"verify_mode").isNil()) {
305
+ if(chain != null && chain.length > 0) {
306
+ ctt.setPeer(chain[0]);
307
+ }
308
+ return;
309
+ }
310
+
311
+ int verify_mode = RubyNumeric.fix2int(ctt.callMethod(ctt.getRuntime().getCurrentContext(),"verify_mode"));
312
+ if(chain != null && chain.length > 0) {
313
+ ctt.setPeer(chain[0]);
314
+ if((verify_mode & 0x1) != 0) { // verify_peer
315
+ X509AuxCertificate x = StoreContext.ensureAux(chain[0]);
316
+ StoreContext ctx = new StoreContext();
317
+ IRubyObject str = ctt.callMethod(ctt.getRuntime().getCurrentContext(),"cert_store");
318
+ Store store = null;
319
+ if(!str.isNil()) {
320
+ store = ((X509Store)str).getStore();
321
+ }
322
+ if(ctx.init(store,x,StoreContext.ensureAux(chain)) == 0) {
323
+ throw new CertificateException("couldn't initialize store");
324
+ }
325
+
326
+ ctx.setDefault("ssl_server");
327
+
328
+ IRubyObject val = ctt.callMethod(ctt.getRuntime().getCurrentContext(),"ca_file");
329
+ String ca_file = val.isNil() ? null : val.convertToString().toString();
330
+ val = ctt.callMethod(ctt.getRuntime().getCurrentContext(),"ca_path");
331
+ String ca_path = val.isNil() ? null : val.convertToString().toString();
332
+
333
+ if(ca_file != null || ca_path != null) {
334
+ if(ctx.loadVerifyLocations(ca_file, ca_path) == 0) {
335
+ ctt.getRuntime().getWarnings().warn(ID.MISCELLANEOUS, "can't set verify locations");
336
+ }
337
+ }
338
+
339
+ try {
340
+ if(ctx.verifyCertificate() == 0) {
341
+ throw new CertificateException("certificate verify failed");
342
+ }
343
+ } catch(Exception e) {
344
+ throw new CertificateException("certificate verify failed");
345
+ }
346
+ }
347
+ } else {
348
+ if((verify_mode & 0x2) != 0) { // fail if no peer cer
349
+ throw new CertificateException("no peer certificate");
350
+ }
351
+ }
352
+ }
353
+
354
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
355
+ return new java.security.cert.X509Certificate[0];
356
+ }
357
+ }
358
+ }// SSLContext
@@ -0,0 +1,561 @@
1
+ /***** BEGIN LICENSE BLOCK *****
2
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
3
+ *
4
+ * The contents of this file are subject to the Common Public
5
+ * License Version 1.0 (the "License"); you may not use this file
6
+ * except in compliance with the License. You may obtain a copy of
7
+ * the License at http://www.eclipse.org/legal/cpl-v10.html
8
+ *
9
+ * Software distributed under the License is distributed on an "AS
10
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11
+ * implied. See the License for the specific language governing
12
+ * rights and limitations under the License.
13
+ *
14
+ * Copyright (C) 2006, 2007 Ola Bini <ola@ologix.com>
15
+ *
16
+ * Alternatively, the contents of this file may be used under the terms of
17
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
18
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
19
+ * in which case the provisions of the GPL or the LGPL are applicable instead
20
+ * of those above. If you wish to allow use of your version of this file only
21
+ * under the terms of either the GPL or the LGPL, and not to allow others to
22
+ * use your version of this file under the terms of the CPL, indicate your
23
+ * decision by deleting the provisions above and replace them with the notice
24
+ * and other provisions required by the GPL or the LGPL. If you do not delete
25
+ * the provisions above, a recipient may use your version of this file under
26
+ * the terms of any one of the CPL, the GPL or the LGPL.
27
+ ***** END LICENSE BLOCK *****/
28
+ package org.jruby.ext.openssl;
29
+
30
+ import java.io.IOException;
31
+ import java.nio.ByteBuffer;
32
+ import java.nio.channels.SelectionKey;
33
+ import java.nio.channels.Selector;
34
+ import java.nio.channels.SocketChannel;
35
+ import java.security.KeyManagementException;
36
+ import java.security.NoSuchAlgorithmException;
37
+ import java.security.cert.Certificate;
38
+ import java.security.cert.CertificateEncodingException;
39
+ import java.util.Iterator;
40
+
41
+ import java.util.logging.Level;
42
+ import java.util.logging.Logger;
43
+ import javax.net.ssl.SSLContext;
44
+ import javax.net.ssl.SSLEngine;
45
+ import javax.net.ssl.SSLEngineResult;
46
+ import javax.net.ssl.SSLException;
47
+ import javax.net.ssl.SSLHandshakeException;
48
+ import javax.net.ssl.SSLPeerUnverifiedException;
49
+ import javax.net.ssl.SSLSession;
50
+
51
+ import org.jruby.Ruby;
52
+ import org.jruby.RubyArray;
53
+ import org.jruby.RubyClass;
54
+ import org.jruby.RubyIO;
55
+ import org.jruby.RubyModule;
56
+ import org.jruby.RubyNumeric;
57
+ import org.jruby.RubyObject;
58
+ import org.jruby.RubyObjectAdapter;
59
+ import org.jruby.RubyString;
60
+ import org.jruby.anno.JRubyMethod;
61
+ import org.jruby.javasupport.JavaEmbedUtils;
62
+ import org.jruby.runtime.Arity;
63
+ import org.jruby.runtime.Block;
64
+ import org.jruby.runtime.ObjectAllocator;
65
+ import org.jruby.runtime.ThreadContext;
66
+ import org.jruby.runtime.builtin.IRubyObject;
67
+
68
+ /**
69
+ * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a>
70
+ */
71
+ public class SSLSocket extends RubyObject {
72
+ private static ObjectAllocator SSLSOCKET_ALLOCATOR = new ObjectAllocator() {
73
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
74
+ return new SSLSocket(runtime, klass);
75
+ }
76
+ };
77
+
78
+ private static RubyObjectAdapter api = JavaEmbedUtils.newObjectAdapter();
79
+
80
+ public static void createSSLSocket(Ruby runtime, RubyModule mSSL) {
81
+ RubyClass cSSLSocket = mSSL.defineClassUnder("SSLSocket",runtime.getObject(),SSLSOCKET_ALLOCATOR);
82
+
83
+ cSSLSocket.attr_accessor(runtime.getCurrentContext(), new IRubyObject[]{runtime.newSymbol("io")});
84
+ cSSLSocket.attr_accessor(runtime.getCurrentContext(), new IRubyObject[]{runtime.newSymbol("context")});
85
+ cSSLSocket.attr_accessor(runtime.getCurrentContext(), new IRubyObject[]{runtime.newSymbol("sync_close")});
86
+ cSSLSocket.defineAlias("to_io","io");
87
+
88
+ cSSLSocket.defineAnnotatedMethods(SSLSocket.class);
89
+ }
90
+
91
+ public SSLSocket(Ruby runtime, RubyClass type) {
92
+ super(runtime,type);
93
+ }
94
+
95
+ private SSLEngine engine;
96
+ private SocketChannel c = null;
97
+
98
+ private ByteBuffer peerAppData;
99
+ private ByteBuffer peerNetData;
100
+ private ByteBuffer netData;
101
+ private ByteBuffer dummy;
102
+
103
+ private boolean initialHandshake = false;
104
+
105
+ private SSLEngineResult.HandshakeStatus hsStatus;
106
+ private SSLEngineResult.Status status = null;
107
+
108
+ private Selector rsel;
109
+ private Selector wsel;
110
+ private Selector asel;
111
+
112
+ @JRubyMethod(name="initialize", rest=true, frame=true)
113
+ public IRubyObject _initialize(IRubyObject[] args, Block unused) {
114
+ IRubyObject io, ctx;
115
+ if (Arity.checkArgumentCount(getRuntime(),args,1,2) == 1) {
116
+ RubyClass sslContext = ((RubyModule) (getRuntime().getModule("OpenSSL").getConstant("SSL"))).getClass("SSLContext");
117
+ ctx = api.callMethod(sslContext,"new");
118
+ } else {
119
+ ctx = args[1];
120
+ }
121
+ io = args[0];
122
+ api.callMethod(this,"io=",io);
123
+ // This is a bit of a hack: SSLSocket should share code with RubyBasicSocket, which always sets sync to true.
124
+ // Instead we set it here for now.
125
+ api.callMethod(io,"sync=",getRuntime().getTrue());
126
+ c = (SocketChannel)(((RubyIO)io).getChannel());
127
+ api.callMethod(this,"context=",ctx);
128
+ api.callMethod(this,"sync_close=",getRuntime().getFalse());
129
+ return api.callSuper(this, args);
130
+ }
131
+
132
+ private void ossl_ssl_setup() throws NoSuchAlgorithmException, KeyManagementException, IOException {
133
+ if(null == engine) {
134
+ ThreadContext tc = getRuntime().getCurrentContext();
135
+ SSLContext ctx = SSLContext.getInstance("SSL");
136
+ IRubyObject store = callMethod(tc,"context").callMethod(tc,"cert_store");
137
+ callMethod(tc,"context").callMethod(tc,"verify_mode");
138
+
139
+ ctx.init(new javax.net.ssl.KeyManager[]{((org.jruby.ext.openssl.SSLContext)callMethod(tc,"context")).getKM()},new javax.net.ssl.TrustManager[]{((org.jruby.ext.openssl.SSLContext)callMethod(tc,"context")).getTM()},null);
140
+
141
+ String peerHost = ((SocketChannel)c).socket().getInetAddress().getHostName();
142
+ int peerPort = ((SocketChannel)c).socket().getPort();
143
+ engine = ctx.createSSLEngine(peerHost,peerPort);
144
+ engine.setEnabledCipherSuites(((org.jruby.ext.openssl.SSLContext)callMethod(tc,"context")).getCipherSuites(engine));
145
+ SSLSession session = engine.getSession();
146
+ peerNetData = ByteBuffer.allocate(session.getPacketBufferSize());
147
+ peerAppData = ByteBuffer.allocate(session.getApplicationBufferSize());
148
+ netData = ByteBuffer.allocate(session.getPacketBufferSize());
149
+ peerNetData.limit(0);
150
+ peerAppData.limit(0);
151
+ netData.limit(0);
152
+ dummy = ByteBuffer.allocate(0);
153
+ rsel = Selector.open();
154
+ wsel = Selector.open();
155
+ asel = Selector.open();
156
+ c.register(rsel,SelectionKey.OP_READ);
157
+ c.register(wsel,SelectionKey.OP_WRITE);
158
+ c.register(asel,SelectionKey.OP_READ | SelectionKey.OP_WRITE);
159
+ }
160
+ }
161
+
162
+ @JRubyMethod
163
+ public IRubyObject connect(ThreadContext context) {
164
+ Ruby runtime = context.getRuntime();
165
+
166
+ try {
167
+ ossl_ssl_setup();
168
+ engine.setUseClientMode(true);
169
+ engine.beginHandshake();
170
+ hsStatus = engine.getHandshakeStatus();
171
+ initialHandshake = true;
172
+ doHandshake();
173
+ } catch(SSLHandshakeException e) {
174
+ Throwable v = e;
175
+ while(v.getCause() != null && (v instanceof SSLHandshakeException)) {
176
+ v = v.getCause();
177
+ }
178
+ throw SSL.newSSLError(runtime, v);
179
+ } catch (NoSuchAlgorithmException ex) {
180
+ throw SSL.newSSLError(runtime, ex);
181
+ } catch (KeyManagementException ex) {
182
+ throw SSL.newSSLError(runtime, ex);
183
+ } catch (IOException ex) {
184
+ throw SSL.newSSLError(runtime, ex);
185
+
186
+ }
187
+ return this;
188
+ }
189
+
190
+ @JRubyMethod
191
+ public IRubyObject accept(ThreadContext context) {
192
+ Ruby runtime = context.getRuntime();
193
+
194
+ try {
195
+ int vfy = 0;
196
+ ossl_ssl_setup();
197
+ engine.setUseClientMode(false);
198
+ IRubyObject ccc = callMethod(context,"context");
199
+ if(!ccc.isNil() && !ccc.callMethod(context,"verify_mode").isNil()) {
200
+ vfy = RubyNumeric.fix2int(ccc.callMethod(context,"verify_mode"));
201
+ if(vfy == 0) { //VERIFY_NONE
202
+ engine.setNeedClientAuth(false);
203
+ engine.setWantClientAuth(false);
204
+ }
205
+ if((vfy & 1) != 0) { //VERIFY_PEER
206
+ engine.setWantClientAuth(true);
207
+ }
208
+ if((vfy & 2) != 0) { //VERIFY_FAIL_IF_NO_PEER_CERT
209
+ engine.setNeedClientAuth(true);
210
+ }
211
+ }
212
+ engine.beginHandshake();
213
+ hsStatus = engine.getHandshakeStatus();
214
+ initialHandshake = true;
215
+ doHandshake();
216
+ } catch(SSLHandshakeException e) {
217
+ throw SSL.newSSLError(runtime, e);
218
+ } catch (NoSuchAlgorithmException ex) {
219
+ throw SSL.newSSLError(runtime, ex);
220
+ } catch (KeyManagementException ex) {
221
+ throw SSL.newSSLError(runtime, ex);
222
+ } catch (IOException ex) {
223
+ throw SSL.newSSLError(runtime, ex);
224
+ }
225
+
226
+ return this;
227
+ }
228
+
229
+ private void waitSelect(Selector sel) {
230
+ try {
231
+ sel.select();
232
+ } catch(Exception e) {
233
+ return;
234
+ }
235
+ Iterator it = sel.selectedKeys().iterator();
236
+ while(it.hasNext()) {
237
+ it.next();
238
+ it.remove();
239
+ }
240
+ }
241
+
242
+ private void doHandshake() throws IOException {
243
+ while (true) {
244
+ SSLEngineResult res;
245
+ waitSelect(asel);
246
+ if(hsStatus == SSLEngineResult.HandshakeStatus.FINISHED) {
247
+ if (initialHandshake) {
248
+ finishInitialHandshake();
249
+ }
250
+ return;
251
+ } else if(hsStatus == SSLEngineResult.HandshakeStatus.NEED_TASK) {
252
+ doTasks();
253
+ } else if(hsStatus == SSLEngineResult.HandshakeStatus.NEED_UNWRAP) {
254
+ if(readAndUnwrap() == -1 && hsStatus != SSLEngineResult.HandshakeStatus.FINISHED) {
255
+ throw new SSLHandshakeException("Socket closed");
256
+ }
257
+ } else if(hsStatus == SSLEngineResult.HandshakeStatus.NEED_WRAP) {
258
+ if (netData.hasRemaining()) {
259
+ while(flushData());
260
+ }
261
+ netData.clear();
262
+ res = engine.wrap(dummy, netData);
263
+ hsStatus = res.getHandshakeStatus();
264
+ netData.flip();
265
+ flushData();
266
+ } else {
267
+ assert false : "doHandshake() should never reach the NOT_HANDSHAKING state";
268
+ return;
269
+ }
270
+ }
271
+ }
272
+
273
+ private void doTasks() {
274
+ Runnable task;
275
+ while ((task = engine.getDelegatedTask()) != null) {
276
+ task.run();
277
+ }
278
+ hsStatus = engine.getHandshakeStatus();
279
+ }
280
+
281
+ private boolean flushData() throws IOException {
282
+ try {
283
+ writeToChannel(c, netData);
284
+ } catch (IOException ioe) {
285
+ netData.position(netData.limit());
286
+ throw ioe;
287
+ }
288
+ if (netData.hasRemaining()) {
289
+ return false;
290
+ } else {
291
+ return true;
292
+ }
293
+ }
294
+
295
+ private int writeToChannel(SocketChannel channel, ByteBuffer buffer) throws IOException {
296
+ int totalWritten = 0;
297
+ while (buffer.hasRemaining()) {
298
+ totalWritten += channel.write(buffer);
299
+ }
300
+ return totalWritten;
301
+ }
302
+
303
+ private void finishInitialHandshake() {
304
+ initialHandshake = false;
305
+ }
306
+
307
+ public int write(ByteBuffer src) throws SSLException, IOException {
308
+ if(initialHandshake) {
309
+ return 0;
310
+ }
311
+ if(netData.hasRemaining()) {
312
+ return 0;
313
+ }
314
+ netData.clear();
315
+ SSLEngineResult res = engine.wrap(src, netData);
316
+ netData.flip();
317
+ flushData();
318
+ return res.bytesConsumed();
319
+ }
320
+
321
+ public int read(ByteBuffer dst) throws IOException {
322
+ if(initialHandshake) {
323
+ return 0;
324
+ }
325
+ if (engine.isInboundDone()) {
326
+ return -1;
327
+ }
328
+ if (!peerAppData.hasRemaining()) {
329
+ int appBytesProduced = readAndUnwrap();
330
+ if (appBytesProduced == -1 || appBytesProduced == 0) {
331
+ return appBytesProduced;
332
+ }
333
+ }
334
+ int limit = Math.min(peerAppData.remaining(), dst.remaining());
335
+ for (int i = 0; i < limit; i++) {
336
+ dst.put(peerAppData.get());
337
+ }
338
+ return limit;
339
+ }
340
+
341
+ private int readAndUnwrap() throws IOException {
342
+ int bytesRead = c.read(peerNetData);
343
+
344
+ if(bytesRead == -1) {
345
+ // engine.closeInbound();
346
+ if ((peerNetData.position() == 0) || (status == SSLEngineResult.Status.BUFFER_UNDERFLOW)) {
347
+ return -1;
348
+ }
349
+ }
350
+ peerAppData.clear();
351
+ peerNetData.flip();
352
+ SSLEngineResult res;
353
+ do {
354
+ res = engine.unwrap(peerNetData, peerAppData);
355
+ } while (res.getStatus() == SSLEngineResult.Status.OK &&
356
+ res.getHandshakeStatus() == SSLEngineResult.HandshakeStatus.NEED_UNWRAP &&
357
+ res.bytesProduced() == 0);
358
+ if(res.getHandshakeStatus() == SSLEngineResult.HandshakeStatus.FINISHED) {
359
+ finishInitialHandshake();
360
+ }
361
+ if(peerAppData.position() == 0 &&
362
+ res.getStatus() == SSLEngineResult.Status.OK &&
363
+ peerNetData.hasRemaining()) {
364
+ res = engine.unwrap(peerNetData, peerAppData);
365
+ }
366
+ status = res.getStatus();
367
+ hsStatus = res.getHandshakeStatus();
368
+
369
+ if(status == SSLEngineResult.Status.CLOSED) {
370
+ doShutdown();
371
+ return -1;
372
+ }
373
+ peerNetData.compact();
374
+ peerAppData.flip();
375
+ if(!initialHandshake && (hsStatus == SSLEngineResult.HandshakeStatus.NEED_TASK ||
376
+ hsStatus == SSLEngineResult.HandshakeStatus.NEED_WRAP ||
377
+ hsStatus == SSLEngineResult.HandshakeStatus.FINISHED)) {
378
+ doHandshake();
379
+ }
380
+ return peerAppData.remaining();
381
+ }
382
+
383
+ private void doShutdown() throws IOException {
384
+ if (engine.isOutboundDone()) {
385
+ return;
386
+ }
387
+ netData.clear();
388
+ try {
389
+ engine.wrap(dummy, netData);
390
+ } catch(Exception e1) {
391
+ return;
392
+ }
393
+ netData.flip();
394
+ flushData();
395
+
396
+ rsel.close();
397
+ wsel.close();
398
+ asel.close();
399
+ }
400
+
401
+ @JRubyMethod(rest = true, required = 1, optional = 1)
402
+ public IRubyObject sysread(ThreadContext context, IRubyObject[] args) {
403
+ Ruby runtime = context.getRuntime();
404
+ int len = RubyNumeric.fix2int(args[0]);
405
+ IRubyObject str = getRuntime().getNil();
406
+
407
+ if (args.length == 2) {
408
+ str = args[1];
409
+ }
410
+ if (str.isNil()) {
411
+ str = getRuntime().newString("");
412
+ }
413
+ if(len == 0) {
414
+ return str;
415
+ }
416
+ if (len < 0) {
417
+ throw runtime.newArgumentError("negative string size (or size too big)");
418
+ }
419
+
420
+ // So we need to make sure to only block when there is no data left to process
421
+ if(engine == null || !(peerAppData.hasRemaining() || peerNetData.position() > 0)) {
422
+ waitSelect(rsel);
423
+ }
424
+
425
+ ByteBuffer dst = ByteBuffer.allocate(len);
426
+ try {
427
+ int rr = -1;
428
+ if(engine == null) {
429
+ rr = c.read(dst);
430
+ } else {
431
+ rr = read(dst);
432
+ }
433
+ byte[] out = null;
434
+ boolean eof = false;
435
+ if(rr == -1) {
436
+ eof = true;
437
+ } else {
438
+ byte[] bss = new byte[rr];
439
+ dst.position(dst.position()-rr);
440
+ dst.get(bss);
441
+ out = bss;
442
+ }
443
+ if(eof){
444
+ throw getRuntime().newEOFError();
445
+ }
446
+
447
+ str.callMethod(getRuntime().getCurrentContext(),"<<",RubyString.newString(getRuntime(), out));
448
+ return str;
449
+ } catch (IOException ioe) {
450
+ throw runtime.newIOErrorFromException(ioe);
451
+ }
452
+ }
453
+
454
+ @JRubyMethod
455
+ public IRubyObject syswrite(ThreadContext context, IRubyObject arg) {
456
+ Ruby runtime = context.getRuntime();
457
+ waitSelect(wsel);
458
+ byte[] bls = arg.convertToString().getBytes();
459
+ ByteBuffer b1 = ByteBuffer.wrap(bls);
460
+ try {
461
+ int written;
462
+ if(engine == null) {
463
+ written = writeToChannel(c, b1);
464
+ } else {
465
+ written = write(b1);
466
+ }
467
+ ((RubyIO)api.callMethod(this,"io")).flush();
468
+
469
+ return getRuntime().newFixnum(written);
470
+ } catch (IOException ioe) {
471
+ throw runtime.newIOErrorFromException(ioe);
472
+ }
473
+ }
474
+
475
+ private void close() {
476
+ if (engine == null) throw getRuntime().newEOFError();
477
+ engine.closeOutbound();
478
+ if (netData.hasRemaining()) {
479
+ return;
480
+ } else {
481
+ try {
482
+ doShutdown();
483
+ } catch (IOException ex) {
484
+ // ignore?
485
+ }
486
+ }
487
+ }
488
+
489
+ @JRubyMethod
490
+ public IRubyObject sysclose() {
491
+ close();
492
+ ThreadContext tc = getRuntime().getCurrentContext();
493
+ if(callMethod(tc,"sync_close").isTrue()) {
494
+ callMethod(tc,"io").callMethod(tc,"close");
495
+ }
496
+ return getRuntime().getNil();
497
+ }
498
+
499
+ @JRubyMethod
500
+ public IRubyObject cert() {
501
+ try {
502
+ Certificate[] cert = engine.getSession().getLocalCertificates();
503
+ if (cert.length > 0) {
504
+ return X509Cert.wrap(getRuntime(), cert[0]);
505
+ }
506
+ } catch (CertificateEncodingException ex) {
507
+ throw X509Cert.newCertificateError(getRuntime(), ex);
508
+ }
509
+ return getRuntime().getNil();
510
+ }
511
+
512
+ @JRubyMethod
513
+ public IRubyObject peer_cert() {
514
+ try {
515
+ Certificate[] cert = engine.getSession().getPeerCertificates();
516
+ if (cert.length > 0) {
517
+ return X509Cert.wrap(getRuntime(), cert[0]);
518
+ }
519
+ } catch (CertificateEncodingException ex) {
520
+ throw X509Cert.newCertificateError(getRuntime(), ex);
521
+ } catch (SSLPeerUnverifiedException ex) {
522
+ Logger.getLogger(SSLSocket.class.getName()).log(Level.SEVERE, null, ex);
523
+ }
524
+ return getRuntime().getNil();
525
+ }
526
+
527
+ @JRubyMethod
528
+ public IRubyObject peer_cert_chain() {
529
+ try {
530
+ javax.security.cert.Certificate[] certs = engine.getSession().getPeerCertificateChain();
531
+
532
+ RubyArray arr = getRuntime().newArray(certs.length);
533
+ for(int i = 0 ; i < certs.length; i++ ) {
534
+ arr.add(X509Cert.wrap(getRuntime(), certs[i]));
535
+ }
536
+ return arr;
537
+ } catch (javax.security.cert.CertificateEncodingException e) {
538
+ throw X509Cert.newCertificateError(getRuntime(), e);
539
+ } catch (SSLPeerUnverifiedException ex) {
540
+ Logger.getLogger(SSLSocket.class.getName()).log(Level.SEVERE, null, ex);
541
+ }
542
+ return getRuntime().getNil();
543
+ }
544
+
545
+ @JRubyMethod
546
+ public IRubyObject cipher() {
547
+ return getRuntime().newString(engine.getSession().getCipherSuite());
548
+ }
549
+
550
+ @JRubyMethod
551
+ public IRubyObject state() {
552
+ System.err.println("WARNING: unimplemented method called: SSLSocket#state");
553
+ return getRuntime().getNil();
554
+ }
555
+
556
+ @JRubyMethod
557
+ public IRubyObject pending() {
558
+ System.err.println("WARNING: unimplemented method called: SSLSocket#pending");
559
+ return getRuntime().getNil();
560
+ }
561
+ }// SSLSocket