zeroc-ice 3.6b1 → 3.6.0

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 (679) hide show
  1. checksums.yaml +4 -4
  2. data/{ext/ice/BZIP_LICENSE → BZIP2_LICENSE} +0 -0
  3. data/ICE_LICENSE +8 -14
  4. data/LICENSE +2 -1
  5. data/{ext/ice/MCPP_LICENSE → MCPP_LICENSE} +2 -9
  6. data/bin/slice2rb +1 -1
  7. data/ext/Communicator.cpp +1 -1
  8. data/ext/Communicator.h +1 -1
  9. data/ext/Config.h +1 -22
  10. data/ext/Connection.cpp +125 -13
  11. data/ext/Connection.h +1 -1
  12. data/ext/Endpoint.cpp +62 -3
  13. data/ext/Endpoint.h +1 -1
  14. data/ext/ImplicitContext.cpp +1 -1
  15. data/ext/ImplicitContext.h +1 -1
  16. data/ext/Init.cpp +8 -1
  17. data/ext/Logger.cpp +1 -1
  18. data/ext/Logger.h +1 -1
  19. data/ext/ObjectFactory.cpp +1 -1
  20. data/ext/ObjectFactory.h +1 -1
  21. data/ext/Operation.cpp +1 -1
  22. data/ext/Operation.h +1 -1
  23. data/ext/Properties.cpp +1 -1
  24. data/ext/Properties.h +1 -1
  25. data/ext/Proxy.cpp +1 -1
  26. data/ext/Proxy.h +1 -1
  27. data/ext/Slice.cpp +1 -1
  28. data/ext/Slice.h +1 -1
  29. data/ext/Types.cpp +65 -17
  30. data/ext/Types.h +4 -1
  31. data/ext/Util.cpp +49 -58
  32. data/ext/Util.h +1 -1
  33. data/ext/extconf.rb +17 -15
  34. data/ext/ice/cpp/include/Ice/ACMF.h +1 -1
  35. data/ext/ice/cpp/include/Ice/Application.h +1 -1
  36. data/ext/ice/cpp/include/Ice/AsyncResult.h +1 -1
  37. data/ext/ice/cpp/include/Ice/AsyncResultF.h +1 -1
  38. data/ext/ice/cpp/include/Ice/BasicStream.h +1 -1
  39. data/ext/ice/cpp/include/Ice/BatchRequestInterceptor.h +52 -0
  40. data/ext/ice/cpp/include/Ice/BatchRequestQueueF.h +25 -0
  41. data/ext/ice/cpp/include/Ice/Buffer.h +1 -1
  42. data/ext/ice/cpp/include/Ice/BuiltinSequences.h +12 -4
  43. data/ext/ice/cpp/include/Ice/Communicator.h +12 -4
  44. data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +1 -1
  45. data/ext/ice/cpp/include/Ice/CommunicatorF.h +12 -4
  46. data/ext/ice/cpp/include/Ice/Config.h +13 -8
  47. data/ext/ice/cpp/include/Ice/Connection.h +41 -16
  48. data/ext/ice/cpp/include/Ice/ConnectionAsync.h +1 -1
  49. data/ext/ice/cpp/include/Ice/ConnectionF.h +12 -4
  50. data/ext/ice/cpp/include/Ice/ConnectionFactoryF.h +1 -1
  51. data/ext/ice/cpp/include/Ice/ConnectionIF.h +1 -1
  52. data/ext/ice/cpp/include/Ice/Current.h +12 -4
  53. data/ext/ice/cpp/include/Ice/DefaultObjectFactory.h +1 -1
  54. data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +1 -1
  55. data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +1 -1
  56. data/ext/ice/cpp/include/Ice/Dispatcher.h +1 -1
  57. data/ext/ice/cpp/include/Ice/DynamicLibrary.h +1 -1
  58. data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +1 -1
  59. data/ext/ice/cpp/include/Ice/Endpoint.h +16 -6
  60. data/ext/ice/cpp/include/Ice/EndpointF.h +12 -4
  61. data/ext/ice/cpp/include/Ice/EndpointTypes.h +12 -4
  62. data/ext/ice/cpp/include/Ice/Exception.h +3 -3
  63. data/ext/ice/cpp/include/Ice/FacetMap.h +12 -4
  64. data/ext/ice/cpp/include/Ice/FactoryTable.h +1 -1
  65. data/ext/ice/cpp/include/Ice/FactoryTableInit.h +1 -1
  66. data/ext/ice/cpp/include/Ice/Format.h +1 -1
  67. data/ext/ice/cpp/include/Ice/Functional.h +1 -1
  68. data/ext/ice/cpp/include/Ice/GCObject.h +5 -1
  69. data/ext/ice/cpp/include/Ice/Handle.h +1 -1
  70. data/ext/ice/cpp/include/Ice/Ice.h +4 -3
  71. data/ext/ice/cpp/include/Ice/Identity.h +13 -5
  72. data/ext/ice/cpp/include/Ice/ImplicitContext.h +12 -4
  73. data/ext/ice/cpp/include/Ice/ImplicitContextF.h +12 -4
  74. data/ext/ice/cpp/include/Ice/Incoming.h +1 -1
  75. data/ext/ice/cpp/include/Ice/IncomingAsync.h +1 -1
  76. data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +1 -1
  77. data/ext/ice/cpp/include/Ice/Initialize.h +4 -2
  78. data/ext/ice/cpp/include/Ice/InstanceF.h +1 -1
  79. data/ext/ice/cpp/include/Ice/Instrumentation.h +12 -4
  80. data/ext/ice/cpp/include/Ice/InstrumentationF.h +12 -4
  81. data/ext/ice/cpp/include/Ice/LocalException.h +12 -4
  82. data/ext/ice/cpp/include/Ice/LocalObject.h +1 -1
  83. data/ext/ice/cpp/include/Ice/LocalObjectF.h +1 -1
  84. data/ext/ice/cpp/include/Ice/Locator.h +137 -129
  85. data/ext/ice/cpp/include/Ice/LocatorF.h +12 -4
  86. data/ext/ice/cpp/include/Ice/Logger.h +12 -4
  87. data/ext/ice/cpp/include/Ice/LoggerF.h +12 -4
  88. data/ext/ice/cpp/include/Ice/LoggerUtil.h +1 -1
  89. data/ext/ice/cpp/include/Ice/Metrics.h +144 -136
  90. data/ext/ice/cpp/include/Ice/MetricsAdminI.h +1 -1
  91. data/ext/ice/cpp/include/Ice/MetricsFunctional.h +1 -1
  92. data/ext/ice/cpp/include/Ice/MetricsObserverI.h +35 -26
  93. data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +1 -1
  94. data/ext/ice/cpp/include/Ice/Object.h +1 -1
  95. data/ext/ice/cpp/include/Ice/ObjectAdapter.h +12 -4
  96. data/ext/ice/cpp/include/Ice/ObjectAdapterF.h +12 -4
  97. data/ext/ice/cpp/include/Ice/ObjectAdapterFactoryF.h +1 -1
  98. data/ext/ice/cpp/include/Ice/ObjectF.h +1 -1
  99. data/ext/ice/cpp/include/Ice/ObjectFactory.h +12 -4
  100. data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +12 -4
  101. data/ext/ice/cpp/include/Ice/ObjectFactoryManagerF.h +1 -1
  102. data/ext/ice/cpp/include/Ice/ObserverHelper.h +1 -1
  103. data/ext/ice/cpp/include/Ice/Outgoing.h +67 -39
  104. data/ext/ice/cpp/include/Ice/OutgoingAsync.h +31 -34
  105. data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +4 -4
  106. data/ext/ice/cpp/include/Ice/Plugin.h +12 -4
  107. data/ext/ice/cpp/include/Ice/PluginF.h +12 -4
  108. data/ext/ice/cpp/include/Ice/Process.h +36 -28
  109. data/ext/ice/cpp/include/Ice/ProcessF.h +12 -4
  110. data/ext/ice/cpp/include/Ice/Properties.h +12 -4
  111. data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +86 -78
  112. data/ext/ice/cpp/include/Ice/PropertiesF.h +12 -4
  113. data/ext/ice/cpp/include/Ice/Protocol.h +1 -1
  114. data/ext/ice/cpp/include/Ice/Proxy.h +6 -2
  115. data/ext/ice/cpp/include/Ice/ProxyF.h +1 -1
  116. data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +1 -1
  117. data/ext/ice/cpp/include/Ice/ProxyHandle.h +1 -1
  118. data/ext/ice/cpp/include/Ice/ReferenceF.h +1 -1
  119. data/ext/ice/cpp/include/Ice/RemoteLogger.h +137 -129
  120. data/ext/ice/cpp/include/Ice/RequestHandlerF.h +1 -1
  121. data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +1 -1
  122. data/ext/ice/cpp/include/Ice/Router.h +37 -29
  123. data/ext/ice/cpp/include/Ice/RouterF.h +12 -4
  124. data/ext/ice/cpp/include/Ice/ServantLocator.h +12 -4
  125. data/ext/ice/cpp/include/Ice/ServantLocatorF.h +12 -4
  126. data/ext/ice/cpp/include/Ice/ServantManagerF.h +1 -1
  127. data/ext/ice/cpp/include/Ice/Service.h +1 -1
  128. data/ext/ice/cpp/include/Ice/SliceChecksumDict.h +12 -4
  129. data/ext/ice/cpp/include/Ice/SliceChecksums.h +1 -1
  130. data/ext/ice/cpp/include/Ice/SlicedData.h +1 -6
  131. data/ext/ice/cpp/include/Ice/SlicedDataF.h +1 -1
  132. data/ext/ice/cpp/include/Ice/Stream.h +3 -5
  133. data/ext/ice/cpp/include/Ice/StreamF.h +1 -1
  134. data/ext/ice/cpp/include/Ice/StreamHelpers.h +1 -1
  135. data/ext/ice/cpp/include/Ice/ThreadPoolF.h +1 -1
  136. data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +1 -1
  137. data/ext/ice/cpp/include/Ice/Version.h +14 -6
  138. data/ext/ice/cpp/include/IceSSL/Config.h +19 -1
  139. data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +61 -7
  140. data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +52 -5
  141. data/ext/ice/cpp/include/IceSSL/IceSSL.h +2 -2
  142. data/ext/ice/cpp/include/IceSSL/Plugin.h +32 -26
  143. data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +1 -1
  144. data/ext/ice/cpp/include/IceUtil/Atomic.h +186 -0
  145. data/ext/ice/cpp/include/IceUtil/Cache.h +1 -1
  146. data/ext/ice/cpp/include/IceUtil/Cond.h +1 -1
  147. data/ext/ice/cpp/include/IceUtil/Config.h +31 -20
  148. data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +1 -1
  149. data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +1 -1
  150. data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +9 -2
  151. data/ext/ice/cpp/include/IceUtil/Exception.h +4 -3
  152. data/ext/ice/cpp/include/IceUtil/Functional.h +1 -1
  153. data/ext/ice/cpp/include/IceUtil/Handle.h +1 -1
  154. data/ext/ice/cpp/include/IceUtil/IceUtil.h +2 -2
  155. data/ext/ice/cpp/include/IceUtil/IconvStringConverter.h +1 -1
  156. data/ext/ice/cpp/include/IceUtil/InputUtil.h +1 -1
  157. data/ext/ice/cpp/include/IceUtil/Iterator.h +1 -1
  158. data/ext/ice/cpp/include/IceUtil/Lock.h +1 -1
  159. data/ext/ice/cpp/include/IceUtil/Monitor.h +1 -1
  160. data/ext/ice/cpp/include/IceUtil/Mutex.h +1 -1
  161. data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +1 -1
  162. data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +1 -1
  163. data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +1 -1
  164. data/ext/ice/cpp/include/IceUtil/Optional.h +1 -1
  165. data/ext/ice/cpp/include/IceUtil/Options.h +1 -1
  166. data/ext/ice/cpp/include/IceUtil/OutputUtil.h +8 -11
  167. data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +1 -1
  168. data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +5 -1
  169. data/ext/ice/cpp/include/IceUtil/Random.h +1 -1
  170. data/ext/ice/cpp/include/IceUtil/RecMutex.h +1 -1
  171. data/ext/ice/cpp/include/IceUtil/SHA1.h +8 -26
  172. data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +5 -5
  173. data/ext/ice/cpp/include/IceUtil/ScopedArray.h +1 -1
  174. data/ext/ice/cpp/include/IceUtil/Shared.h +3 -37
  175. data/ext/ice/cpp/include/IceUtil/StringUtil.h +1 -1
  176. data/ext/ice/cpp/include/IceUtil/Thread.h +1 -1
  177. data/ext/ice/cpp/include/IceUtil/ThreadException.h +1 -1
  178. data/ext/ice/cpp/include/IceUtil/Time.h +1 -1
  179. data/ext/ice/cpp/include/IceUtil/Timer.h +1 -1
  180. data/ext/ice/cpp/include/IceUtil/UUID.h +1 -1
  181. data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +1 -1
  182. data/ext/ice/cpp/include/IceUtil/UniquePtr.h +1 -1
  183. data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +7 -6
  184. data/ext/ice/cpp/include/Slice/Checksum.h +1 -1
  185. data/ext/ice/cpp/include/Slice/CsUtil.h +1 -1
  186. data/ext/ice/cpp/include/Slice/DotNetNames.h +1 -1
  187. data/ext/ice/cpp/include/Slice/FileTracker.h +1 -1
  188. data/ext/ice/cpp/include/Slice/JavaUtil.h +3 -1
  189. data/ext/ice/cpp/include/Slice/ObjCUtil.h +127 -0
  190. data/ext/ice/cpp/include/Slice/PHPUtil.h +1 -1
  191. data/ext/ice/cpp/include/Slice/Parser.h +18 -12
  192. data/ext/ice/cpp/include/Slice/Preprocessor.h +6 -4
  193. data/ext/ice/cpp/include/Slice/PythonUtil.h +1 -1
  194. data/ext/ice/cpp/include/Slice/RubyUtil.h +1 -1
  195. data/ext/ice/cpp/include/Slice/Util.h +20 -2
  196. data/ext/ice/cpp/src/Ice/ACM.cpp +1 -1
  197. data/ext/ice/cpp/src/Ice/ACM.h +1 -1
  198. data/ext/ice/cpp/src/Ice/Acceptor.cpp +1 -1
  199. data/ext/ice/cpp/src/Ice/Acceptor.h +1 -1
  200. data/ext/ice/cpp/src/Ice/AcceptorF.h +1 -1
  201. data/ext/ice/cpp/src/Ice/AsyncResult.cpp +1 -1
  202. data/ext/ice/cpp/src/Ice/Base64.cpp +1 -1
  203. data/ext/ice/cpp/src/Ice/Base64.h +1 -1
  204. data/ext/ice/cpp/src/Ice/BasicStream.cpp +7 -5
  205. data/ext/ice/cpp/src/Ice/BatchRequestQueue.cpp +227 -0
  206. data/ext/ice/cpp/src/Ice/BatchRequestQueue.h +59 -0
  207. data/ext/ice/cpp/src/Ice/Buffer.cpp +3 -3
  208. data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +10 -4
  209. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +82 -282
  210. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +8 -21
  211. data/ext/ice/cpp/src/Ice/Communicator.cpp +11 -5
  212. data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +10 -4
  213. data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +6 -6
  214. data/ext/ice/cpp/src/Ice/CommunicatorI.h +1 -1
  215. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +42 -180
  216. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +10 -19
  217. data/ext/ice/cpp/src/Ice/ConnectRequestHandlerF.h +25 -0
  218. data/ext/ice/cpp/src/Ice/Connection.cpp +17 -11
  219. data/ext/ice/cpp/src/Ice/ConnectionF.cpp +10 -4
  220. data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +137 -51
  221. data/ext/ice/cpp/src/Ice/ConnectionFactory.h +18 -8
  222. data/ext/ice/cpp/src/Ice/ConnectionI.cpp +105 -391
  223. data/ext/ice/cpp/src/Ice/ConnectionI.h +25 -23
  224. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +5 -29
  225. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +3 -8
  226. data/ext/ice/cpp/src/Ice/Connector.cpp +1 -1
  227. data/ext/ice/cpp/src/Ice/Connector.h +1 -1
  228. data/ext/ice/cpp/src/Ice/ConnectorF.h +1 -1
  229. data/ext/ice/cpp/src/Ice/Current.cpp +10 -4
  230. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +1 -1
  231. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +1 -1
  232. data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +1 -1
  233. data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +1 -1
  234. data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +1 -1
  235. data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +1 -1
  236. data/ext/ice/cpp/src/Ice/Endpoint.cpp +17 -11
  237. data/ext/ice/cpp/src/Ice/EndpointF.cpp +10 -4
  238. data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +19 -1
  239. data/ext/ice/cpp/src/Ice/EndpointFactory.h +13 -1
  240. data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +1 -1
  241. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +1 -1
  242. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +1 -1
  243. data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +1 -1
  244. data/ext/ice/cpp/src/Ice/EndpointI.cpp +1 -1
  245. data/ext/ice/cpp/src/Ice/EndpointI.h +33 -1
  246. data/ext/ice/cpp/src/Ice/EndpointIF.h +1 -1
  247. data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +10 -4
  248. data/ext/ice/cpp/src/Ice/EventHandler.cpp +1 -1
  249. data/ext/ice/cpp/src/Ice/EventHandler.h +4 -1
  250. data/ext/ice/cpp/src/Ice/EventHandlerF.h +1 -1
  251. data/ext/ice/cpp/src/Ice/Exception.cpp +20 -11
  252. data/ext/ice/cpp/src/Ice/FacetMap.cpp +10 -4
  253. data/ext/ice/cpp/src/Ice/FactoryTable.cpp +1 -1
  254. data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +2 -2
  255. data/ext/ice/cpp/src/Ice/GCObject.cpp +1 -1
  256. data/ext/ice/cpp/src/Ice/HashUtil.h +1 -1
  257. data/ext/ice/cpp/src/Ice/HttpParser.cpp +27 -15
  258. data/ext/ice/cpp/src/Ice/HttpParser.h +4 -6
  259. data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +7 -1
  260. data/ext/ice/cpp/src/Ice/IPEndpointI.h +2 -1
  261. data/ext/ice/cpp/src/Ice/IPEndpointIF.h +1 -1
  262. data/ext/ice/cpp/src/Ice/Identity.cpp +11 -5
  263. data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +11 -5
  264. data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +10 -4
  265. data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +1 -1
  266. data/ext/ice/cpp/src/Ice/ImplicitContextI.h +1 -1
  267. data/ext/ice/cpp/src/Ice/Incoming.cpp +22 -20
  268. data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +1 -1
  269. data/ext/ice/cpp/src/Ice/IncomingRequest.h +1 -1
  270. data/ext/ice/cpp/src/Ice/Initialize.cpp +31 -5
  271. data/ext/ice/cpp/src/Ice/Instance.cpp +102 -59
  272. data/ext/ice/cpp/src/Ice/Instance.h +28 -2
  273. data/ext/ice/cpp/src/Ice/Instrumentation.cpp +20 -14
  274. data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +10 -4
  275. data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +1 -1
  276. data/ext/ice/cpp/src/Ice/InstrumentationI.h +1 -1
  277. data/ext/ice/cpp/src/Ice/LocalException.cpp +10 -4
  278. data/ext/ice/cpp/src/Ice/LocalObject.cpp +1 -1
  279. data/ext/ice/cpp/src/Ice/Locator.cpp +83 -77
  280. data/ext/ice/cpp/src/Ice/LocatorF.cpp +10 -4
  281. data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +77 -69
  282. data/ext/ice/cpp/src/Ice/LocatorInfo.h +1 -1
  283. data/ext/ice/cpp/src/Ice/LocatorInfoF.h +1 -1
  284. data/ext/ice/cpp/src/Ice/Logger.cpp +11 -5
  285. data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +1 -1
  286. data/ext/ice/cpp/src/Ice/LoggerAdminI.h +1 -1
  287. data/ext/ice/cpp/src/Ice/LoggerF.cpp +10 -4
  288. data/ext/ice/cpp/src/Ice/LoggerI.cpp +10 -8
  289. data/ext/ice/cpp/src/Ice/LoggerI.h +1 -1
  290. data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +2 -2
  291. data/ext/ice/cpp/src/Ice/Metrics.cpp +122 -116
  292. data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +1 -1
  293. data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +1 -1
  294. data/ext/ice/cpp/src/Ice/Network.cpp +63 -19
  295. data/ext/ice/cpp/src/Ice/Network.h +10 -3
  296. data/ext/ice/cpp/src/Ice/NetworkF.h +1 -1
  297. data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +1 -1
  298. data/ext/ice/cpp/src/Ice/NetworkProxy.h +1 -1
  299. data/ext/ice/cpp/src/Ice/NetworkProxyF.h +1 -1
  300. data/ext/ice/cpp/src/Ice/Object.cpp +1 -1
  301. data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +11 -5
  302. data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +10 -4
  303. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +9 -9
  304. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +2 -2
  305. data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +3 -3
  306. data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +5 -5
  307. data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +11 -5
  308. data/ext/ice/cpp/src/Ice/ObjectFactoryF.cpp +10 -4
  309. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +9 -10
  310. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +1 -1
  311. data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +1 -1
  312. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +6 -5
  313. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +1 -1
  314. data/ext/ice/cpp/src/Ice/Outgoing.cpp +209 -254
  315. data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +120 -106
  316. data/ext/ice/cpp/src/Ice/Plugin.cpp +12 -6
  317. data/ext/ice/cpp/src/Ice/PluginF.cpp +10 -4
  318. data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +21 -2
  319. data/ext/ice/cpp/src/Ice/Process.cpp +25 -19
  320. data/ext/ice/cpp/src/Ice/ProcessF.cpp +10 -4
  321. data/ext/ice/cpp/src/Ice/Properties.cpp +11 -5
  322. data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +39 -33
  323. data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +1 -1
  324. data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +1 -1
  325. data/ext/ice/cpp/src/Ice/PropertiesF.cpp +10 -4
  326. data/ext/ice/cpp/src/Ice/PropertiesI.cpp +1 -1
  327. data/ext/ice/cpp/src/Ice/PropertiesI.h +1 -1
  328. data/ext/ice/cpp/src/Ice/PropertyNames.cpp +12 -8
  329. data/ext/ice/cpp/src/Ice/PropertyNames.h +2 -2
  330. data/ext/ice/cpp/src/Ice/Protocol.cpp +7 -7
  331. data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +9 -6
  332. data/ext/ice/cpp/src/Ice/ProtocolInstance.h +25 -7
  333. data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +1 -1
  334. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +1 -1
  335. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +1 -1
  336. data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +1 -1
  337. data/ext/ice/cpp/src/Ice/Proxy.cpp +32 -13
  338. data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +1 -1
  339. data/ext/ice/cpp/src/Ice/ProxyFactory.h +1 -1
  340. data/ext/ice/cpp/src/Ice/Reference.cpp +101 -86
  341. data/ext/ice/cpp/src/Ice/Reference.h +16 -9
  342. data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +1 -1
  343. data/ext/ice/cpp/src/Ice/ReferenceFactory.h +1 -1
  344. data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +1 -1
  345. data/ext/ice/cpp/src/Ice/RegisterPlugins.cpp +28 -0
  346. data/ext/ice/cpp/src/Ice/RegisterPlugins.h +25 -0
  347. data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +92 -86
  348. data/ext/ice/cpp/src/Ice/ReplyStatus.h +1 -1
  349. data/ext/ice/cpp/src/Ice/RequestHandler.cpp +1 -1
  350. data/ext/ice/cpp/src/Ice/RequestHandler.h +4 -8
  351. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +24 -16
  352. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +5 -4
  353. data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +1 -1
  354. data/ext/ice/cpp/src/Ice/ResponseHandler.h +3 -3
  355. data/ext/ice/cpp/src/Ice/RetryQueue.cpp +16 -5
  356. data/ext/ice/cpp/src/Ice/RetryQueue.h +3 -2
  357. data/ext/ice/cpp/src/Ice/RetryQueueF.h +1 -1
  358. data/ext/ice/cpp/src/Ice/Router.cpp +27 -21
  359. data/ext/ice/cpp/src/Ice/RouterF.cpp +10 -4
  360. data/ext/ice/cpp/src/Ice/RouterInfo.cpp +1 -1
  361. data/ext/ice/cpp/src/Ice/RouterInfo.h +1 -1
  362. data/ext/ice/cpp/src/Ice/RouterInfoF.h +1 -1
  363. data/ext/ice/cpp/src/Ice/Selector.cpp +480 -1
  364. data/ext/ice/cpp/src/Ice/Selector.h +130 -1
  365. data/ext/ice/cpp/src/Ice/ServantLocator.cpp +11 -5
  366. data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +10 -4
  367. data/ext/ice/cpp/src/Ice/ServantManager.cpp +29 -23
  368. data/ext/ice/cpp/src/Ice/ServantManager.h +1 -1
  369. data/ext/ice/cpp/src/Ice/SharedContext.h +1 -1
  370. data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +10 -4
  371. data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +1 -1
  372. data/ext/ice/cpp/src/Ice/SlicedData.cpp +1 -1
  373. data/ext/ice/cpp/src/Ice/Stream.cpp +1 -1
  374. data/ext/ice/cpp/src/Ice/StreamI.cpp +1 -1
  375. data/ext/ice/cpp/src/Ice/StreamI.h +1 -1
  376. data/ext/ice/cpp/src/Ice/StreamSocket.cpp +30 -22
  377. data/ext/ice/cpp/src/Ice/StreamSocket.h +7 -4
  378. data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +1 -1
  379. data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +1 -1
  380. data/ext/ice/cpp/src/Ice/SysLoggerI.h +1 -1
  381. data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +8 -8
  382. data/ext/ice/cpp/src/Ice/TcpAcceptor.h +1 -1
  383. data/ext/ice/cpp/src/Ice/TcpConnector.cpp +1 -1
  384. data/ext/ice/cpp/src/Ice/TcpConnector.h +1 -1
  385. data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +21 -38
  386. data/ext/ice/cpp/src/Ice/TcpEndpointI.h +5 -6
  387. data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +29 -4
  388. data/ext/ice/cpp/src/Ice/TcpTransceiver.h +7 -2
  389. data/ext/ice/cpp/src/Ice/ThreadPool.cpp +2 -2
  390. data/ext/ice/cpp/src/Ice/ThreadPool.h +1 -1
  391. data/ext/ice/cpp/src/Ice/TraceLevels.cpp +2 -2
  392. data/ext/ice/cpp/src/Ice/TraceLevels.h +1 -1
  393. data/ext/ice/cpp/src/Ice/TraceLevelsF.h +1 -1
  394. data/ext/ice/cpp/src/Ice/TraceUtil.cpp +16 -7
  395. data/ext/ice/cpp/src/Ice/TraceUtil.h +1 -1
  396. data/ext/ice/cpp/src/Ice/Transceiver.cpp +1 -1
  397. data/ext/ice/cpp/src/Ice/Transceiver.h +2 -1
  398. data/ext/ice/cpp/src/Ice/TransceiverF.h +1 -1
  399. data/ext/ice/cpp/src/Ice/UdpConnector.cpp +1 -1
  400. data/ext/ice/cpp/src/Ice/UdpConnector.h +1 -1
  401. data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +13 -39
  402. data/ext/ice/cpp/src/Ice/UdpEndpointI.h +2 -5
  403. data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +46 -10
  404. data/ext/ice/cpp/src/Ice/UdpTransceiver.h +3 -2
  405. data/ext/ice/cpp/src/Ice/Version.cpp +12 -6
  406. data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +1 -1
  407. data/ext/ice/cpp/src/Ice/WSAcceptor.h +1 -1
  408. data/ext/ice/cpp/src/Ice/WSConnector.cpp +1 -1
  409. data/ext/ice/cpp/src/Ice/WSConnector.h +1 -1
  410. data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +6 -38
  411. data/ext/ice/cpp/src/Ice/WSEndpoint.h +12 -1
  412. data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +31 -35
  413. data/ext/ice/cpp/src/Ice/WSTransceiver.h +13 -1
  414. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +66 -60
  415. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +106 -100
  416. data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +1 -1
  417. data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +1 -1
  418. data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +76 -36
  419. data/ext/ice/cpp/src/IceDiscovery/LookupI.h +1 -1
  420. data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +19 -6
  421. data/ext/ice/cpp/src/IceDiscovery/PluginI.h +1 -1
  422. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.cpp +452 -0
  423. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.h +732 -0
  424. data/ext/ice/cpp/src/IceLocatorDiscovery/PluginI.cpp +520 -0
  425. data/ext/ice/cpp/src/IceLocatorDiscovery/PluginI.h +36 -0
  426. data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +8 -8
  427. data/ext/ice/cpp/src/IceSSL/AcceptorI.h +1 -1
  428. data/ext/ice/cpp/src/IceSSL/Certificate.cpp +49 -47
  429. data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +13 -5
  430. data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +1 -1
  431. data/ext/ice/cpp/src/IceSSL/ConnectorI.h +1 -1
  432. data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +10 -38
  433. data/ext/ice/cpp/src/IceSSL/EndpointI.h +4 -3
  434. data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +13 -5
  435. data/ext/ice/cpp/src/IceSSL/Instance.cpp +2 -2
  436. data/ext/ice/cpp/src/IceSSL/Instance.h +1 -1
  437. data/ext/ice/cpp/src/IceSSL/InstanceF.h +1 -1
  438. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +107 -111
  439. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +130 -47
  440. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +11 -3
  441. data/ext/ice/cpp/src/IceSSL/PluginI.cpp +8 -14
  442. data/ext/ice/cpp/src/IceSSL/PluginI.h +1 -1
  443. data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +1 -1
  444. data/ext/ice/cpp/src/IceSSL/RFC2253.h +1 -1
  445. data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +238 -156
  446. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +93 -66
  447. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +7 -3
  448. data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +2 -2
  449. data/ext/ice/cpp/src/IceSSL/SSLEngine.h +32 -35
  450. data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +1 -1
  451. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +244 -360
  452. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +59 -29
  453. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +8 -4
  454. data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +1 -1
  455. data/ext/ice/cpp/src/IceSSL/TrustManager.h +1 -1
  456. data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +1 -1
  457. data/ext/ice/cpp/src/IceSSL/Util.cpp +427 -620
  458. data/ext/ice/cpp/src/IceSSL/Util.h +72 -15
  459. data/ext/ice/cpp/src/IceUtil/ArgVector.cpp +1 -1
  460. data/ext/ice/cpp/src/IceUtil/ArgVector.h +1 -1
  461. data/ext/ice/cpp/src/IceUtil/Cond.cpp +1 -1
  462. data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +1 -1
  463. data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +1 -1
  464. data/ext/ice/cpp/src/IceUtil/CountDownLatch.cpp +1 -1
  465. data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +1 -1
  466. data/ext/ice/cpp/src/IceUtil/Exception.cpp +105 -96
  467. data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +2 -1
  468. data/ext/ice/cpp/src/IceUtil/FileUtil.h +9 -1
  469. data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +1 -1
  470. data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +1 -1
  471. data/ext/ice/cpp/src/IceUtil/Options.cpp +1 -1
  472. data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +12 -25
  473. data/ext/ice/cpp/src/IceUtil/Random.cpp +1 -1
  474. data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +1 -1
  475. data/ext/ice/cpp/src/IceUtil/SHA1.cpp +72 -10
  476. data/ext/ice/cpp/src/IceUtil/Shared.cpp +3 -132
  477. data/ext/ice/cpp/src/IceUtil/StopWatch.h +1 -1
  478. data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +1 -1
  479. data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +1 -1
  480. data/ext/ice/cpp/src/IceUtil/Thread.cpp +16 -1
  481. data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +1 -1
  482. data/ext/ice/cpp/src/IceUtil/Time.cpp +1 -1
  483. data/ext/ice/cpp/src/IceUtil/Timer.cpp +1 -1
  484. data/ext/ice/cpp/src/IceUtil/UUID.cpp +1 -1
  485. data/ext/ice/cpp/src/IceUtil/Unicode.cpp +1 -1
  486. data/ext/ice/cpp/src/IceUtil/Unicode.h +1 -1
  487. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +62 -55
  488. data/ext/ice/cpp/src/Slice/Checksum.cpp +1 -1
  489. data/ext/ice/cpp/src/Slice/CsUtil.cpp +8 -29
  490. data/ext/ice/cpp/src/Slice/DotNetNames.cpp +1 -1
  491. data/ext/ice/cpp/src/Slice/FileTracker.cpp +1 -1
  492. data/ext/ice/cpp/src/Slice/Grammar.cpp +1 -1
  493. data/ext/ice/cpp/src/Slice/GrammarUtil.h +1 -1
  494. data/ext/ice/cpp/src/Slice/JavaUtil.cpp +145 -172
  495. data/ext/ice/cpp/src/Slice/MD5.cpp +1 -1
  496. data/ext/ice/cpp/src/Slice/MD5.h +1 -1
  497. data/ext/ice/cpp/src/Slice/ObjCUtil.cpp +1310 -0
  498. data/ext/ice/cpp/src/Slice/PHPUtil.cpp +1 -1
  499. data/ext/ice/cpp/src/Slice/Parser.cpp +65 -187
  500. data/ext/ice/cpp/src/Slice/Preprocessor.cpp +61 -9
  501. data/ext/ice/cpp/src/Slice/Python.cpp +36 -3
  502. data/ext/ice/cpp/src/Slice/PythonUtil.cpp +10 -10
  503. data/ext/ice/cpp/src/Slice/Ruby.cpp +34 -3
  504. data/ext/ice/cpp/src/Slice/RubyUtil.cpp +8 -7
  505. data/ext/ice/cpp/src/Slice/Scanner.cpp +1 -1
  506. data/ext/ice/cpp/src/Slice/Util.cpp +137 -30
  507. data/ext/ice/mcpp/LICENSE +29 -0
  508. data/ext/ice/mcpp/Makefile +60 -0
  509. data/ext/ice/mcpp/Makefile.mak +46 -0
  510. data/ext/ice/mcpp/README.md +30 -0
  511. data/ext/ice/mcpp/config.h +89 -0
  512. data/ext/ice/mcpp/configed.H +1 -146
  513. data/ext/ice/mcpp/directive.c +115 -410
  514. data/ext/ice/mcpp/eval.c +38 -377
  515. data/ext/ice/mcpp/expand.c +155 -852
  516. data/ext/ice/mcpp/internal.H +10 -44
  517. data/ext/ice/mcpp/main.c +6 -345
  518. data/ext/ice/mcpp/mbchar.c +17 -654
  519. data/ext/ice/mcpp/mcpp.gyp +62 -0
  520. data/ext/ice/mcpp/support.c +116 -943
  521. data/ext/ice/mcpp/system.H +0 -23
  522. data/ext/ice/mcpp/system.c +81 -2321
  523. data/ice.gemspec +3 -4
  524. data/lib/Glacier2.rb +1 -1
  525. data/lib/Glacier2/Metrics.rb +2 -2
  526. data/lib/Glacier2/PermissionsVerifier.rb +2 -2
  527. data/lib/Glacier2/PermissionsVerifierF.rb +2 -2
  528. data/lib/Glacier2/Router.rb +2 -2
  529. data/lib/Glacier2/RouterF.rb +2 -2
  530. data/lib/Glacier2/SSLInfo.rb +2 -2
  531. data/lib/Glacier2/Session.rb +2 -2
  532. data/lib/Ice.rb +1 -1
  533. data/lib/Ice/BuiltinSequences.rb +2 -2
  534. data/lib/Ice/Communicator.rb +2 -2
  535. data/lib/Ice/CommunicatorF.rb +2 -2
  536. data/lib/Ice/Connection.rb +26 -14
  537. data/lib/Ice/ConnectionF.rb +2 -2
  538. data/lib/Ice/Current.rb +2 -2
  539. data/lib/Ice/Endpoint.rb +4 -2
  540. data/lib/Ice/EndpointF.rb +2 -2
  541. data/lib/Ice/EndpointTypes.rb +2 -2
  542. data/lib/Ice/FacetMap.rb +2 -2
  543. data/lib/Ice/Identity.rb +2 -2
  544. data/lib/Ice/ImplicitContext.rb +2 -2
  545. data/lib/Ice/ImplicitContextF.rb +2 -2
  546. data/lib/Ice/Instrumentation.rb +2 -2
  547. data/lib/Ice/InstrumentationF.rb +2 -2
  548. data/lib/Ice/LocalException.rb +2 -2
  549. data/lib/Ice/Locator.rb +2 -2
  550. data/lib/Ice/LocatorF.rb +2 -2
  551. data/lib/Ice/Logger.rb +2 -2
  552. data/lib/Ice/LoggerF.rb +2 -2
  553. data/lib/Ice/Metrics.rb +2 -2
  554. data/lib/Ice/ObjectAdapterF.rb +2 -2
  555. data/lib/Ice/ObjectFactory.rb +2 -2
  556. data/lib/Ice/ObjectFactoryF.rb +2 -2
  557. data/lib/Ice/Plugin.rb +2 -2
  558. data/lib/Ice/PluginF.rb +2 -2
  559. data/lib/Ice/Process.rb +2 -2
  560. data/lib/Ice/ProcessF.rb +2 -2
  561. data/lib/Ice/Properties.rb +2 -2
  562. data/lib/Ice/PropertiesAdmin.rb +2 -2
  563. data/lib/Ice/PropertiesF.rb +2 -2
  564. data/lib/Ice/Router.rb +2 -2
  565. data/lib/Ice/RouterF.rb +2 -2
  566. data/lib/Ice/SliceChecksumDict.rb +2 -2
  567. data/lib/Ice/Version.rb +2 -2
  568. data/lib/IceBox.rb +1 -1
  569. data/lib/IceBox/IceBox.rb +2 -2
  570. data/lib/IceGrid.rb +1 -1
  571. data/lib/IceGrid/Admin.rb +2 -2
  572. data/lib/IceGrid/Descriptor.rb +2 -2
  573. data/lib/IceGrid/Exception.rb +2 -2
  574. data/lib/IceGrid/FileParser.rb +2 -2
  575. data/lib/IceGrid/Locator.rb +2 -2
  576. data/lib/IceGrid/Observer.rb +2 -2
  577. data/lib/IceGrid/Query.rb +2 -2
  578. data/lib/IceGrid/Registry.rb +2 -2
  579. data/lib/IceGrid/Session.rb +2 -2
  580. data/lib/IceGrid/UserAccountMapper.rb +2 -2
  581. data/lib/IcePatch2.rb +1 -1
  582. data/lib/IcePatch2/FileInfo.rb +52 -2
  583. data/lib/IcePatch2/FileServer.rb +33 -4
  584. data/lib/IceStorm.rb +1 -1
  585. data/lib/IceStorm/IceStorm.rb +2 -2
  586. data/lib/IceStorm/Metrics.rb +2 -2
  587. data/slice/Freeze/BackgroundSaveEvictor.ice +2 -2
  588. data/slice/Freeze/CatalogData.ice +2 -2
  589. data/slice/Freeze/Connection.ice +2 -2
  590. data/slice/Freeze/ConnectionF.ice +2 -2
  591. data/slice/Freeze/DB.ice +2 -2
  592. data/slice/Freeze/Evictor.ice +2 -2
  593. data/slice/Freeze/EvictorF.ice +2 -2
  594. data/slice/Freeze/EvictorStorage.ice +2 -2
  595. data/slice/Freeze/Exception.ice +2 -2
  596. data/slice/Freeze/Transaction.ice +2 -2
  597. data/slice/Freeze/TransactionalEvictor.ice +2 -2
  598. data/slice/Glacier2/Metrics.ice +7 -6
  599. data/slice/Glacier2/PermissionsVerifier.ice +4 -3
  600. data/slice/Glacier2/PermissionsVerifierF.ice +3 -2
  601. data/slice/Glacier2/Router.ice +4 -3
  602. data/slice/Glacier2/RouterF.ice +3 -2
  603. data/slice/Glacier2/SSLInfo.ice +3 -2
  604. data/slice/Glacier2/Session.ice +12 -11
  605. data/slice/Ice/BuiltinSequences.ice +4 -3
  606. data/slice/Ice/Communicator.ice +22 -25
  607. data/slice/Ice/CommunicatorF.ice +3 -2
  608. data/slice/Ice/Connection.ice +39 -11
  609. data/slice/Ice/ConnectionF.ice +3 -2
  610. data/slice/Ice/Current.ice +4 -3
  611. data/slice/Ice/Endpoint.ice +11 -3
  612. data/slice/Ice/EndpointF.ice +3 -2
  613. data/slice/Ice/EndpointTypes.ice +3 -2
  614. data/slice/Ice/FacetMap.ice +3 -2
  615. data/slice/Ice/Identity.ice +3 -2
  616. data/slice/Ice/ImplicitContext.ice +3 -2
  617. data/slice/Ice/ImplicitContextF.ice +3 -2
  618. data/slice/Ice/Instrumentation.ice +4 -2
  619. data/slice/Ice/InstrumentationF.ice +4 -2
  620. data/slice/Ice/LocalException.ice +29 -10
  621. data/slice/Ice/Locator.ice +5 -3
  622. data/slice/Ice/LocatorF.ice +3 -2
  623. data/slice/Ice/Logger.ice +3 -2
  624. data/slice/Ice/LoggerF.ice +3 -2
  625. data/slice/Ice/Metrics.ice +15 -14
  626. data/slice/Ice/ObjectAdapter.ice +5 -4
  627. data/slice/Ice/ObjectAdapterF.ice +3 -2
  628. data/slice/Ice/ObjectFactory.ice +3 -2
  629. data/slice/Ice/ObjectFactoryF.ice +3 -2
  630. data/slice/Ice/Plugin.ice +3 -2
  631. data/slice/Ice/PluginF.ice +3 -2
  632. data/slice/Ice/Process.ice +3 -2
  633. data/slice/Ice/ProcessF.ice +3 -2
  634. data/slice/Ice/Properties.ice +3 -2
  635. data/slice/Ice/PropertiesAdmin.ice +3 -2
  636. data/slice/Ice/PropertiesF.ice +3 -2
  637. data/slice/Ice/RemoteLogger.ice +3 -2
  638. data/slice/Ice/Router.ice +3 -2
  639. data/slice/Ice/RouterF.ice +3 -2
  640. data/slice/Ice/ServantLocator.ice +3 -2
  641. data/slice/Ice/ServantLocatorF.ice +3 -2
  642. data/slice/Ice/SliceChecksumDict.ice +3 -2
  643. data/slice/Ice/Version.ice +3 -2
  644. data/slice/IceBox/IceBox.ice +2 -2
  645. data/slice/IceDiscovery/IceDiscovery.ice +2 -2
  646. data/slice/IceGrid/Admin.ice +49 -48
  647. data/slice/IceGrid/Descriptor.ice +3 -2
  648. data/slice/IceGrid/Exception.ice +6 -5
  649. data/slice/IceGrid/FileParser.ice +4 -3
  650. data/slice/IceGrid/Locator.ice +4 -3
  651. data/slice/IceGrid/Observer.ice +28 -27
  652. data/slice/IceGrid/PluginFacade.ice +3 -2
  653. data/slice/IceGrid/Query.ice +3 -2
  654. data/slice/IceGrid/Registry.ice +4 -3
  655. data/slice/IceGrid/Session.ice +9 -8
  656. data/slice/IceGrid/UserAccountMapper.ice +4 -3
  657. data/slice/{IceGrid/Discovery.ice → IceLocatorDiscovery/IceLocatorDiscovery.ice} +12 -14
  658. data/slice/IcePatch2/FileInfo.ice +31 -2
  659. data/slice/IcePatch2/FileServer.ice +63 -5
  660. data/slice/IceSSL/ConnectionInfo.ice +17 -2
  661. data/slice/IceSSL/EndpointInfo.ice +21 -3
  662. data/slice/IceStorm/IceStorm.ice +3 -2
  663. data/slice/IceStorm/Metrics.ice +4 -3
  664. metadata +27 -23
  665. data/ext/ice/cpp/include/Ice/Makefile +0 -26
  666. data/ext/ice/cpp/include/IceSSL/Makefile +0 -26
  667. data/ext/ice/cpp/include/IceUtil/Makefile +0 -26
  668. data/ext/ice/cpp/include/Slice/Makefile +0 -26
  669. data/ext/ice/cpp/src/Ice/Application.cpp +0 -760
  670. data/ext/ice/cpp/src/Ice/EventLoggerMsg.h +0 -53
  671. data/ext/ice/cpp/src/Ice/Makefile +0 -190
  672. data/ext/ice/cpp/src/Ice/Service.cpp +0 -1897
  673. data/ext/ice/cpp/src/IceDiscovery/Makefile +0 -61
  674. data/ext/ice/cpp/src/IceSSL/Makefile +0 -82
  675. data/ext/ice/cpp/src/IceUtil/Makefile +0 -68
  676. data/ext/ice/cpp/src/Slice/Makefile +0 -65
  677. data/ext/ice/mcpp/config.h.Darwin +0 -227
  678. data/ext/ice/mcpp/config.h.Linux +0 -227
  679. data/ext/ice/mcpp/config.h.MINGW +0 -7
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -65,6 +65,19 @@ Init init;
65
65
  }
66
66
  #endif
67
67
 
68
+ extern "C"
69
+ {
70
+
71
+ int
72
+ IceSSL_opensslVerifyCallback(int ok, X509_STORE_CTX* ctx)
73
+ {
74
+ SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
75
+ TransceiverI* p = reinterpret_cast<TransceiverI*>(SSL_get_ex_data(ssl, 0));
76
+ return p->verifyCallback(ok, ctx);
77
+ }
78
+
79
+ }
80
+
68
81
  IceInternal::NativeInfoPtr
69
82
  IceSSL::TransceiverI::getNativeInfo()
70
83
  {
@@ -102,6 +115,35 @@ IceSSL::TransceiverI::initialize(IceInternal::Buffer& readBuffer, IceInternal::B
102
115
  throw ex;
103
116
  }
104
117
  SSL_set_bio(_ssl, bio, bio);
118
+
119
+ //
120
+ // Store a pointer to ourself for use in OpenSSL callbacks.
121
+ //
122
+ SSL_set_ex_data(_ssl, 0, this);
123
+
124
+ //
125
+ // Determine whether a certificate is required from the peer.
126
+ //
127
+ {
128
+ int sslVerifyMode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
129
+ switch(_engine->getVerifyPeer())
130
+ {
131
+ case 0:
132
+ sslVerifyMode = SSL_VERIFY_NONE;
133
+ break;
134
+ case 1:
135
+ sslVerifyMode = SSL_VERIFY_PEER;
136
+ break;
137
+ case 2:
138
+ sslVerifyMode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
139
+ break;
140
+ default:
141
+ {
142
+ assert(false);
143
+ }
144
+ }
145
+ SSL_set_verify(_ssl, sslVerifyMode, IceSSL_opensslVerifyCallback);
146
+ }
105
147
  }
106
148
 
107
149
  while(!SSL_is_init_finished(_ssl))
@@ -125,7 +167,6 @@ IceSSL::TransceiverI::initialize(IceInternal::Buffer& readBuffer, IceInternal::B
125
167
  #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x100000bfL
126
168
  sync.release();
127
169
  #endif
128
-
129
170
  if(ret <= 0)
130
171
  {
131
172
  switch(SSL_get_error(_ssl, ret))
@@ -217,8 +258,7 @@ IceSSL::TransceiverI::initialize(IceInternal::Buffer& readBuffer, IceInternal::B
217
258
  if(_engine->securityTraceLevel() >= 1)
218
259
  {
219
260
  ostringstream ostr;
220
- ostr << "IceSSL: ignoring certificate verification failure:\n"
221
- << X509_verify_cert_error_string(result);
261
+ ostr << "IceSSL: ignoring certificate verification failure:\n" << X509_verify_cert_error_string(result);
222
262
  _instance->logger()->trace(_instance->traceCategory(), ostr.str());
223
263
  }
224
264
  }
@@ -236,7 +276,12 @@ IceSSL::TransceiverI::initialize(IceInternal::Buffer& readBuffer, IceInternal::B
236
276
  throw ex;
237
277
  }
238
278
  }
239
- _engine->verifyPeer(_stream->fd(), _host, getNativeConnectionInfo());
279
+ else
280
+ {
281
+ _verified = true;
282
+ }
283
+
284
+ _engine->verifyPeer(_stream->fd(), _host, NativeConnectionInfoPtr::dynamicCast(getInfo()));
240
285
 
241
286
  if(_engine->securityTraceLevel() >= 1)
242
287
  {
@@ -529,7 +574,18 @@ IceSSL::TransceiverI::toDetailedString() const
529
574
  Ice::ConnectionInfoPtr
530
575
  IceSSL::TransceiverI::getInfo() const
531
576
  {
532
- return getNativeConnectionInfo();
577
+ NativeConnectionInfoPtr info = new NativeConnectionInfo();
578
+ fillConnectionInfo(info, info->nativeCerts);
579
+ return info;
580
+ }
581
+
582
+ Ice::ConnectionInfoPtr
583
+ IceSSL::TransceiverI::getWSInfo(const Ice::HeaderDict& headers) const
584
+ {
585
+ WSSNativeConnectionInfoPtr info = new WSSNativeConnectionInfo();
586
+ fillConnectionInfo(info, info->nativeCerts);
587
+ info->headers = headers;
588
+ return info;
533
589
  }
534
590
 
535
591
  void
@@ -537,6 +593,57 @@ IceSSL::TransceiverI::checkSendSize(const IceInternal::Buffer&)
537
593
  {
538
594
  }
539
595
 
596
+ void
597
+ IceSSL::TransceiverI::setBufferSize(int rcvSize, int sndSize)
598
+ {
599
+ _stream->setBufferSize(rcvSize, sndSize);
600
+ }
601
+
602
+ int
603
+ IceSSL::TransceiverI::verifyCallback(int ok, X509_STORE_CTX* c)
604
+ {
605
+ if(!ok && _engine->securityTraceLevel() >= 1)
606
+ {
607
+ X509* cert = X509_STORE_CTX_get_current_cert(c);
608
+ int err = X509_STORE_CTX_get_error(c);
609
+ char buf[256];
610
+
611
+ Trace out(_engine->getLogger(), _engine->securityTraceCategory());
612
+ out << "certificate verification failure\n";
613
+
614
+ X509_NAME_oneline(X509_get_issuer_name(cert), buf, static_cast<int>(sizeof(buf)));
615
+ out << "issuer = " << buf << '\n';
616
+ X509_NAME_oneline(X509_get_subject_name(cert), buf, static_cast<int>(sizeof(buf)));
617
+ out << "subject = " << buf << '\n';
618
+ out << "depth = " << X509_STORE_CTX_get_error_depth(c) << '\n';
619
+ out << "error = " << X509_verify_cert_error_string(err) << '\n';
620
+ out << IceInternal::fdToString(SSL_get_fd(_ssl));
621
+ }
622
+
623
+ //
624
+ // Initialize the native certs with the verified certificate chain. SSL_get_peer_cert_chain
625
+ // doesn't return the verified chain, it returns the chain sent by the peer.
626
+ //
627
+ STACK_OF(X509)* chain = X509_STORE_CTX_get1_chain(c);
628
+ if(chain != 0)
629
+ {
630
+ _nativeCerts.clear();
631
+ for(int i = 0; i < sk_X509_num(chain); ++i)
632
+ {
633
+ _nativeCerts.push_back(new Certificate(X509_dup(sk_X509_value(chain, i))));
634
+ }
635
+ sk_X509_pop_free(chain, X509_free);
636
+ }
637
+
638
+ //
639
+ // Always return 1 to prevent SSL_connect/SSL_accept from
640
+ // returning SSL_ERROR_SSL for verification failures. This ensure
641
+ // that we can raise SecurityException for verification failures
642
+ // rather than a ProtocolException.
643
+ //
644
+ return 1;
645
+ }
646
+
540
647
  IceSSL::TransceiverI::TransceiverI(const InstancePtr& instance, const IceInternal::StreamSocketPtr& stream,
541
648
  const string& hostOrAdapterName, bool incoming) :
542
649
  _instance(instance),
@@ -545,6 +652,7 @@ IceSSL::TransceiverI::TransceiverI(const InstancePtr& instance, const IceInterna
545
652
  _adapterName(incoming ? hostOrAdapterName : ""),
546
653
  _incoming(incoming),
547
654
  _stream(stream),
655
+ _verified(false),
548
656
  _ssl(0)
549
657
  {
550
658
  }
@@ -553,55 +661,30 @@ IceSSL::TransceiverI::~TransceiverI()
553
661
  {
554
662
  }
555
663
 
556
- NativeConnectionInfoPtr
557
- IceSSL::TransceiverI::getNativeConnectionInfo() const
664
+ void
665
+ IceSSL::TransceiverI::fillConnectionInfo(const ConnectionInfoPtr& info, std::vector<CertificatePtr>& nativeCerts) const
558
666
  {
559
- NativeConnectionInfoPtr info = new NativeConnectionInfo();
560
- IceInternal::fdToAddressAndPort(_stream->fd(), info->localAddress, info->localPort, info->remoteAddress,
667
+ IceInternal::fdToAddressAndPort(_stream->fd(), info->localAddress, info->localPort, info->remoteAddress,
561
668
  info->remotePort);
562
-
669
+ if(_stream->fd() != INVALID_SOCKET)
670
+ {
671
+ info->rcvSize = IceInternal::getRecvBufferSize(_stream->fd());
672
+ info->sndSize = IceInternal::getSendBufferSize(_stream->fd());
673
+ }
674
+ info->adapterName = _adapterName;
675
+ info->incoming = _incoming;
676
+ info->verified = _verified;
677
+ nativeCerts = _nativeCerts;
678
+ for(vector<CertificatePtr>::const_iterator p = _nativeCerts.begin(); p != _nativeCerts.end(); ++p)
679
+ {
680
+ info->certs.push_back((*p)->encode());
681
+ }
563
682
  if(_ssl != 0)
564
683
  {
565
- //
566
- // On the client side, SSL_get_peer_cert_chain returns the entire chain of certs.
567
- // On the server side, the peer certificate must be obtained separately.
568
- //
569
- // Since we have no clear idea whether the connection is server or client side,
570
- // the peer certificate is obtained separately and compared against the first
571
- // certificate in the chain. If they are not the same, it is added to the chain.
572
- //
573
- X509* cert = SSL_get_peer_certificate(_ssl);
574
- STACK_OF(X509)* chain = SSL_get_peer_cert_chain(_ssl);
575
- if(cert != 0 && (chain == 0 || sk_X509_num(chain) == 0 || cert != sk_X509_value(chain, 0)))
576
- {
577
- CertificatePtr certificate = new Certificate(cert);
578
- info->nativeCerts.push_back(certificate);
579
- info->certs.push_back(certificate->encode());
580
- }
581
- else
582
- {
583
- X509_free(cert);
584
- }
585
-
586
- if(chain != 0)
587
- {
588
- for(int i = 0; i < sk_X509_num(chain); ++i)
589
- {
590
- //
591
- // Duplicate the certificate since the stack comes straight from the SSL connection.
592
- //
593
- CertificatePtr certificate = new Certificate(X509_dup(sk_X509_value(chain, i)));
594
- info->nativeCerts.push_back(certificate);
595
- info->certs.push_back(certificate->encode());
596
- }
597
- }
598
-
599
684
  info->cipher = SSL_get_cipher_name(_ssl); // Nothing needs to be free'd.
600
685
  }
601
-
602
686
  info->adapterName = _adapterName;
603
687
  info->incoming = _incoming;
604
- return info;
605
688
  }
606
689
 
607
690
  #endif
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -11,6 +11,7 @@
11
11
  #define ICE_SSL_TRANSCEIVER_I_H
12
12
 
13
13
  #include <IceSSL/Config.h>
14
+ #include <IceSSL/Util.h>
14
15
  #include <IceSSL/InstanceF.h>
15
16
  #include <IceSSL/Plugin.h>
16
17
  #include <IceSSL/SSLEngineF.h>
@@ -18,6 +19,7 @@
18
19
  #include <Ice/Transceiver.h>
19
20
  #include <Ice/Network.h>
20
21
  #include <Ice/StreamSocket.h>
22
+ #include <Ice/WSTransceiver.h>
21
23
 
22
24
  #ifdef ICE_USE_OPENSSL
23
25
 
@@ -30,7 +32,7 @@ namespace IceSSL
30
32
  class ConnectorI;
31
33
  class AcceptorI;
32
34
 
33
- class TransceiverI : public IceInternal::Transceiver
35
+ class TransceiverI : public IceInternal::Transceiver, public IceInternal::WSTransceiverDelegate
34
36
  {
35
37
  public:
36
38
 
@@ -45,14 +47,18 @@ public:
45
47
  virtual std::string toString() const;
46
48
  virtual std::string toDetailedString() const;
47
49
  virtual Ice::ConnectionInfoPtr getInfo() const;
50
+ virtual Ice::ConnectionInfoPtr getWSInfo(const Ice::HeaderDict&) const;
48
51
  virtual void checkSendSize(const IceInternal::Buffer&);
52
+ virtual void setBufferSize(int rcvSize, int sndSize);
53
+
54
+ int verifyCallback(int , X509_STORE_CTX*);
49
55
 
50
56
  private:
51
57
 
52
58
  TransceiverI(const InstancePtr&, const IceInternal::StreamSocketPtr&, const std::string&, bool);
53
59
  virtual ~TransceiverI();
54
60
 
55
- virtual NativeConnectionInfoPtr getNativeConnectionInfo() const;
61
+ void fillConnectionInfo(const ConnectionInfoPtr&, std::vector<CertificatePtr>&) const;
56
62
 
57
63
  friend class ConnectorI;
58
64
  friend class AcceptorI;
@@ -63,6 +69,8 @@ private:
63
69
  const std::string _adapterName;
64
70
  const bool _incoming;
65
71
  const IceInternal::StreamSocketPtr _stream;
72
+ bool _verified;
73
+ std::vector<CertificatePtr> _nativeCerts;
66
74
 
67
75
  SSL* _ssl;
68
76
  };
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -12,7 +12,6 @@
12
12
  #include <IceSSL/SSLEngine.h>
13
13
  #include <IceSSL/EndpointI.h>
14
14
 
15
- #include <Ice/WSEndpoint.h>
16
15
  #include <Ice/ProtocolPluginFacade.h>
17
16
  #include <Ice/ProtocolInstance.h>
18
17
  #include <Ice/LocalException.h>
@@ -27,7 +26,7 @@ using namespace IceSSL;
27
26
  extern "C"
28
27
  {
29
28
 
30
- ICE_DECLSPEC_EXPORT Ice::Plugin*
29
+ ICE_SSL_API Ice::Plugin*
31
30
  createIceSSL(const CommunicatorPtr& communicator, const string& /*name*/, const StringSeq& /*args*/)
32
31
  {
33
32
  return new PluginI(communicator);
@@ -38,28 +37,23 @@ createIceSSL(const CommunicatorPtr& communicator, const string& /*name*/, const
38
37
  //
39
38
  // Plugin implementation.
40
39
  //
41
- IceSSL::PluginI::PluginI(const Ice::CommunicatorPtr& communicator)
40
+ IceSSL::PluginI::PluginI(const Ice::CommunicatorPtr& com)
42
41
  {
43
42
  #if defined(ICE_USE_SECURE_TRANSPORT)
44
- _engine = new SecureTransportEngine(communicator);
43
+ _engine = new SecureTransportEngine(com);
45
44
  #elif defined(ICE_USE_SCHANNEL)
46
- _engine = new SChannelEngine(communicator);
45
+ _engine = new SChannelEngine(com);
47
46
  #else
48
- _engine = new OpenSSLEngine(communicator);
47
+ _engine = new OpenSSLEngine(com);
49
48
  #endif
50
-
51
- IceInternal::ProtocolPluginFacadePtr facade = IceInternal::getProtocolPluginFacade(communicator);
52
-
49
+
53
50
  //
54
51
  // Register the endpoint factory. We have to do this now, rather
55
52
  // than in initialize, because the communicator may need to
56
53
  // interpret proxies before the plug-in is fully initialized.
57
54
  //
58
55
  IceInternal::EndpointFactoryPtr sslFactory = new EndpointFactoryI(new Instance(_engine, EndpointType, "ssl"));
59
- facade->addEndpointFactory(sslFactory);
60
-
61
- IceInternal::ProtocolInstancePtr wss = new IceInternal::ProtocolInstance(communicator, WSSEndpointType, "wss");
62
- facade->addEndpointFactory(new IceInternal::WSEndpointFactory(wss, sslFactory->clone(wss)));
56
+ IceInternal::getProtocolPluginFacade(com)->addEndpointFactory(sslFactory);
63
57
  }
64
58
 
65
59
  void
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -31,7 +31,7 @@ Shared* IceSSL::upCast(IceSSL::SChannelEngine* p) { return p; }
31
31
  namespace
32
32
  {
33
33
 
34
- # ifdef __MINGW32__
34
+ #if defined(__MINGW32__) || (defined(_MSC_VER) && (_MSC_VER <= 1500))
35
35
  //
36
36
  // CERT_CHAIN_ENGINE_CONFIG struct in mingw headers doesn't include
37
37
  // new members added in Windows 7, we add our ouwn definition and
@@ -53,36 +53,63 @@ struct CertChainEngineConfig
53
53
  HCERTSTORE hExclusiveRoot;
54
54
  HCERTSTORE hExclusiveTrustedPeople;
55
55
  };
56
- # endif
56
+
57
+ #endif
57
58
 
58
59
  void
59
- addCertificateToStore(const string& file, HCERTSTORE store, PCCERT_CONTEXT* cert = 0)
60
+ addCertificatesToStore(const string& file, HCERTSTORE store, PCCERT_CONTEXT* cert = 0)
60
61
  {
61
62
  vector<char> buffer;
62
63
  readFile(file, buffer);
63
- vector<BYTE> outBuffer;
64
- outBuffer.resize(buffer.size());
65
- DWORD outLength = static_cast<DWORD>(outBuffer.size());
66
-
67
- if(!CryptStringToBinary(&buffer[0], static_cast<DWORD>(buffer.size()), CRYPT_STRING_BASE64HEADER,
68
- &outBuffer[0], &outLength, 0, 0))
64
+ if(buffer.empty())
69
65
  {
70
- //
71
- // Base64 data should always be bigger than binary
72
- //
73
- assert(GetLastError() != ERROR_MORE_DATA);
74
- throw PluginInitializationException(__FILE__, __LINE__,
75
- "IceSSL: error decoding certificate:\n" + lastErrorToString());
66
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: certificate file is empty:\n" + file);
76
67
  }
77
68
 
78
- if(!CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &outBuffer[0],
79
- outLength, CERT_STORE_ADD_NEW, cert))
69
+ string strbuf(buffer.begin(), buffer.end());
70
+ string::size_type size, startpos, endpos = 0;
71
+ bool first = true;
72
+ while(true)
80
73
  {
81
- if(GetLastError() != static_cast<DWORD>(CRYPT_E_EXISTS))
74
+ startpos = strbuf.find("-----BEGIN CERTIFICATE-----", endpos);
75
+ if(startpos != string::npos)
76
+ {
77
+ endpos = strbuf.find("-----END CERTIFICATE-----", startpos);
78
+ size = endpos - startpos + sizeof("-----END CERTIFICATE-----");
79
+ }
80
+ else if(first)
82
81
  {
82
+ startpos = 0;
83
+ endpos = string::npos;
84
+ size = strbuf.size();
85
+ }
86
+ else
87
+ {
88
+ break;
89
+ }
90
+
91
+ vector<BYTE> outBuffer;
92
+ outBuffer.resize(size);
93
+ DWORD outLength = static_cast<DWORD>(outBuffer.size());
94
+ if(!CryptStringToBinary(&buffer[startpos], static_cast<DWORD>(size), CRYPT_STRING_ANY, &outBuffer[0],
95
+ &outLength, 0, 0))
96
+ {
97
+ assert(GetLastError() != ERROR_MORE_DATA); // Base64 data should always be bigger than binary
83
98
  throw PluginInitializationException(__FILE__, __LINE__,
84
- "IceSSL: error decoding certificate:\n" + lastErrorToString());
99
+ "IceSSL: error decoding certificate:\n" + lastErrorToString());
85
100
  }
101
+
102
+ if(!CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &outBuffer[0],
103
+ outLength, CERT_STORE_ADD_NEW, first ? cert : 0))
104
+ {
105
+ if(GetLastError() != static_cast<DWORD>(CRYPT_E_EXISTS))
106
+ {
107
+ throw PluginInitializationException(__FILE__, __LINE__,
108
+ "IceSSL: error decoding certificate:\n" + lastErrorToString());
109
+ }
110
+ }
111
+
112
+ first = false;
86
113
  }
87
114
  }
88
115
 
@@ -189,16 +216,16 @@ SChannelEngine::initialize()
189
216
  defaultProtocols.push_back("tls1_0");
190
217
  defaultProtocols.push_back("tls1_1");
191
218
  defaultProtocols.push_back("tls1_2");
192
- const_cast<DWORD&>(_protocols) =
193
- parseProtocols(properties->getPropertyAsListWithDefault(prefix + "Protocols", defaultProtocols));
219
+ const_cast<DWORD&>(_protocols) =
220
+ parseProtocols(properties->getPropertyAsListWithDefault(prefix + "Protocols", defaultProtocols));
194
221
 
195
222
  //
196
223
  // Check for a default directory. We look in this directory for
197
224
  // files mentioned in the configuration.
198
225
  //
199
- string defaultDir = properties->getProperty(prefix + "DefaultDir");
226
+ const string defaultDir = properties->getProperty(prefix + "DefaultDir");
200
227
 
201
- int passwordRetryMax = properties->getPropertyAsIntWithDefault(prefix + "PasswordRetryMax", 3);
228
+ const int passwordRetryMax = properties->getPropertyAsIntWithDefault(prefix + "PasswordRetryMax", 3);
202
229
  PasswordPromptPtr passwordPrompt = getPasswordPrompt();
203
230
  setPassword(properties->getProperty(prefix + "Password"));
204
231
 
@@ -229,38 +256,50 @@ SChannelEngine::initialize()
229
256
  getLogger()->trace(securityTraceCategory(), os.str());
230
257
  }
231
258
 
232
- string certStore = properties->getPropertyWithDefault(prefix + "CertStore", "CurrentUser");
233
- if(certStore != "CurrentUser" && certStore != "LocalMachine")
259
+ string certStoreLocation = properties->getPropertyWithDefault(prefix + "CertStoreLocation", "CurrentUser");
260
+ if(certStoreLocation != "CurrentUser" && certStoreLocation != "LocalMachine")
234
261
  {
235
- getLogger()->warning("Invalid IceSSL.CertStore value `" + certStore + "' adjusted to `CurrentUser'");
236
- certStore = "CurrentUser";
262
+ getLogger()->warning("invalid IceSSL.CertStoreLocation value `" + certStoreLocation +
263
+ "' adjusted to `CurrentUser'");
264
+ certStoreLocation = "CurrentUser";
237
265
  }
238
266
 
239
267
  //
240
268
  // Create trusted CA store with contents of CertAuthFile
241
269
  //
242
- string caFile = properties->getProperty(prefix + "CertAuthFile");
243
- if(!caFile.empty())
270
+ string caFile = properties->getProperty(prefix + "CAs");
271
+ if(caFile.empty())
272
+ {
273
+ caFile = properties->getProperty(prefix + "CertAuthFile");
274
+ }
275
+ if(!caFile.empty() || properties->getPropertyAsInt("IceSSL.UsePlatformCAs") <= 0)
244
276
  {
245
277
  _rootStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 0, 0);
246
278
  if(!_rootStore)
247
279
  {
248
280
  throw PluginInitializationException(__FILE__, __LINE__,
249
- "IceSSL: error creating in memory certificate store:\n" + lastErrorToString());
281
+ "IceSSL: error creating in memory certificate store:\n" +
282
+ lastErrorToString());
250
283
  }
251
-
252
- if(!checkPath(caFile, defaultDir, false))
284
+ }
285
+ if(!caFile.empty())
286
+ {
287
+ string resolved;
288
+ if(!checkPath(caFile, defaultDir, false, resolved))
253
289
  {
254
290
  throw PluginInitializationException(__FILE__, __LINE__,
255
291
  "IceSSL: CA certificate file not found:\n" + caFile);
256
292
  }
257
293
 
258
- addCertificateToStore(caFile, _rootStore);
294
+ addCertificatesToStore(resolved, _rootStore);
295
+ }
259
296
 
297
+ if(_rootStore)
298
+ {
260
299
  //
261
300
  // Create a chain engine that uses our Trusted Root Store
262
301
  //
263
- #ifdef __MINGW32__
302
+ #if defined(__MINGW32__) || (defined(_MSC_VER) && (_MSC_VER <= 1500))
264
303
  CertChainEngineConfig config;
265
304
  memset(&config, 0, sizeof(CertChainEngineConfig));
266
305
  config.cbSize = sizeof(CertChainEngineConfig);
@@ -275,40 +314,30 @@ SChannelEngine::initialize()
275
314
  // Build the chain using the LocalMachine registry location as opposed
276
315
  // to the CurrentUser location.
277
316
  //
278
- if(certStore == "LocalMachine")
317
+ if(certStoreLocation == "LocalMachine")
279
318
  {
280
319
  config.dwFlags = CERT_CHAIN_USE_LOCAL_MACHINE_STORE;
281
320
  }
282
321
 
283
- #ifdef __MINGW32__
322
+ #if defined(__MINGW32__) || (defined(_MSC_VER) && (_MSC_VER <= 1500))
284
323
  if(!CertCreateCertificateChainEngine(reinterpret_cast<CERT_CHAIN_ENGINE_CONFIG*>(&config), &_chainEngine))
285
324
  #else
286
325
  if(!CertCreateCertificateChainEngine(&config, &_chainEngine))
287
326
  #endif
288
327
  {
289
328
  throw PluginInitializationException(__FILE__, __LINE__,
290
- "IceSSL: error creating certificate chain engine:\n" + lastErrorToString());
329
+ "IceSSL: error creating certificate chain engine:\n" +
330
+ lastErrorToString());
291
331
  }
292
332
  }
293
333
  else
294
334
  {
295
- _chainEngine = (certStore == "LocalMachine") ? HCCE_LOCAL_MACHINE : HCCE_CURRENT_USER;
296
- }
297
-
298
- //
299
- // Import the application certificate and private keys.
300
- //
301
- string keySet = properties->getPropertyWithDefault(prefix + "KeySet", "DefaultKeySet");
302
- if(keySet != "DefaultKeySet" && keySet != "UserKeySet" && keySet != "MachineKeySet")
303
- {
304
- getLogger()->warning("Invalid IceSSL.KeySet value `" + keySet + "' adjusted to `DefaultKeySet'");
305
- keySet = "DefaultKeySet";
335
+ _chainEngine = (certStoreLocation == "LocalMachine") ? HCCE_LOCAL_MACHINE : HCCE_CURRENT_USER;
306
336
  }
307
337
 
308
- DWORD importFlags = (keySet == "MachineKeySet") ? CRYPT_MACHINE_KEYSET : CRYPT_USER_KEYSET;
309
-
310
338
  string certFile = properties->getProperty(prefix + "CertFile");
311
- string keyFile = properties->getPropertyWithDefault(prefix + "KeyFile", certFile);
339
+ string keyFile = properties->getProperty(prefix + "KeyFile");
340
+ string findCert = properties->getProperty("IceSSL.FindCert");
312
341
 
313
342
  if(!certFile.empty())
314
343
  {
@@ -320,29 +349,39 @@ SChannelEngine::initialize()
320
349
  }
321
350
 
322
351
  vector<string> keyFiles;
323
- if(!splitString(keyFile, IceUtilInternal::pathsep, keyFiles) || keyFiles.size() > 2)
352
+ if(!keyFile.empty())
324
353
  {
325
- throw PluginInitializationException(__FILE__, __LINE__,
326
- "IceSSL: invalid value for " + prefix + "KeyFile:\n" + keyFile);
327
- }
354
+ if(!splitString(keyFile, IceUtilInternal::pathsep, keyFiles) || keyFiles.size() > 2)
355
+ {
356
+ throw PluginInitializationException(__FILE__, __LINE__,
357
+ "IceSSL: invalid value for " + prefix + "KeyFile:\n" + keyFile);
358
+ }
328
359
 
329
- if(certFiles.size() != keyFiles.size())
330
- {
331
- throw PluginInitializationException(__FILE__, __LINE__,
332
- "IceSSL: " + prefix + "KeyFile does not agree with " + prefix + "CertFile");
360
+ if(certFiles.size() != keyFiles.size())
361
+ {
362
+ throw PluginInitializationException(__FILE__, __LINE__,
363
+ "IceSSL: " + prefix + "KeyFile does not agree with " + prefix + "CertFile");
364
+ }
333
365
  }
334
366
 
335
367
  for(size_t i = 0; i < certFiles.size(); ++i)
336
368
  {
337
369
  string certFile = certFiles[i];
338
- if(!checkPath(certFile, defaultDir, false))
370
+ string resolved;
371
+ if(!checkPath(certFile, defaultDir, false, resolved))
339
372
  {
340
373
  throw PluginInitializationException(__FILE__, __LINE__,
341
374
  "IceSSL: certificate file not found:\n" + certFile);
342
375
  }
376
+ certFile = resolved;
343
377
 
344
378
  vector<char> buffer;
345
379
  readFile(certFile, buffer);
380
+ if(buffer.empty())
381
+ {
382
+ throw PluginInitializationException(__FILE__, __LINE__,
383
+ "IceSSL: certificate file is empty:\n" + certFile);
384
+ }
346
385
 
347
386
  CRYPT_DATA_BLOB pfxBlob;
348
387
  pfxBlob.cbData = static_cast<DWORD>(buffer.size());
@@ -352,6 +391,7 @@ SChannelEngine::initialize()
352
391
  PCCERT_CONTEXT cert = 0;
353
392
  int err = 0;
354
393
  int count = 0;
394
+ DWORD importFlags = (certStoreLocation == "LocalMachine") ? CRYPT_MACHINE_KEYSET : CRYPT_USER_KEYSET;
355
395
  do
356
396
  {
357
397
  string s = password(false);
@@ -362,19 +402,48 @@ SChannelEngine::initialize()
362
402
 
363
403
  if(store)
364
404
  {
365
- _stores.push_back(store);
366
- cert = CertFindCertificateInStore(store, X509_ASN_ENCODING, 0, CERT_FIND_ANY, 0, cert);
405
+ //
406
+ // Try to find a certificate chain.
407
+ //
408
+ CERT_CHAIN_FIND_BY_ISSUER_PARA para;
409
+ memset(&para, 0, sizeof(CERT_CHAIN_FIND_BY_ISSUER_PARA));
410
+ para.cbSize = sizeof(CERT_CHAIN_FIND_BY_ISSUER_PARA);
411
+
412
+ DWORD ff = CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG; // Don't fetch anything from the Internet
413
+ PCCERT_CHAIN_CONTEXT chain = 0;
414
+ while(!cert)
415
+ {
416
+ chain = CertFindChainInStore(store, X509_ASN_ENCODING, ff, CERT_CHAIN_FIND_BY_ISSUER, &para, chain);
417
+ if(!chain)
418
+ {
419
+ break; // No more chains found in the store.
420
+ }
421
+
422
+ if(chain->cChain > 0 && chain->rgpChain[0]->cElement > 0)
423
+ {
424
+ cert = CertDuplicateCertificateContext(chain->rgpChain[0]->rgpElement[0]->pCertContext);
425
+ }
426
+ CertFreeCertificateChain(chain);
427
+ }
428
+
429
+ //
430
+ // Check if we can find a certificate if we couldn't find a chain.
431
+ //
432
+ if(!cert)
433
+ {
434
+ cert = CertFindCertificateInStore(store, X509_ASN_ENCODING, 0, CERT_FIND_ANY, 0, cert);
435
+ }
367
436
  if(!cert)
368
437
  {
369
438
  throw PluginInitializationException(__FILE__, __LINE__,
370
- "IceSSL: certificate error:\n" + lastErrorToString());
439
+ "IceSSL: certificate error:\n" + lastErrorToString());
371
440
  }
372
- _certs.push_back(cert);
441
+ _allCerts.push_back(cert);
442
+ _stores.push_back(store);
373
443
  continue;
374
444
  }
375
445
 
376
446
  assert(err);
377
-
378
447
  if(err != CRYPT_E_BAD_ENCODE)
379
448
  {
380
449
  throw PluginInitializationException(__FILE__, __LINE__,
@@ -384,14 +453,24 @@ SChannelEngine::initialize()
384
453
  //
385
454
  // Try to load certificate & key as PEM files.
386
455
  //
456
+ if(keyFiles.empty())
457
+ {
458
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: no key file specified");
459
+ }
460
+
387
461
  err = 0;
388
462
  keyFile = keyFiles[i];
389
- if(!checkPath(keyFile, defaultDir, false))
463
+ if(!checkPath(keyFile, defaultDir, false, resolved))
390
464
  {
391
465
  throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: key file not found:\n" + keyFile);
392
466
  }
467
+ keyFile = resolved;
393
468
 
394
469
  readFile(keyFile, buffer);
470
+ if(buffer.empty())
471
+ {
472
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: key file is empty:\n" + keyFile);
473
+ }
395
474
 
396
475
  vector<BYTE> outBuffer;
397
476
  outBuffer.resize(buffer.size());
@@ -403,31 +482,56 @@ SChannelEngine::initialize()
403
482
  if(!CryptStringToBinary(&buffer[0], static_cast<DWORD>(buffer.size()), CRYPT_STRING_BASE64HEADER,
404
483
  &outBuffer[0], &outLength, 0, 0))
405
484
  {
406
- throw PluginInitializationException(__FILE__, __LINE__,
407
- "IceSSL: error decoding key:\n" + lastErrorToString());
485
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: error decoding key `" + keyFile +
486
+ "':\n" + lastErrorToString());
408
487
  }
409
488
 
410
489
  PCRYPT_PRIVATE_KEY_INFO keyInfo = 0;
411
490
  BYTE* key = 0;
412
491
  HCRYPTKEY hKey = 0;
413
-
414
492
  try
415
493
  {
494
+ //
495
+ // First try to decode as a PKCS#8 key, if that fails try PKCS#1.
496
+ //
416
497
  DWORD decodedLength = 0;
417
- if(!CryptDecodeObjectEx(X509_ASN_ENCODING, PKCS_PRIVATE_KEY_INFO, &outBuffer[0], outLength,
418
- CRYPT_DECODE_ALLOC_FLAG, 0, &keyInfo, &decodedLength))
498
+ if(CryptDecodeObjectEx(X509_ASN_ENCODING, PKCS_PRIVATE_KEY_INFO, &outBuffer[0], outLength,
499
+ CRYPT_DECODE_ALLOC_FLAG, 0, &keyInfo, &decodedLength))
419
500
  {
420
- throw PluginInitializationException(__FILE__, __LINE__,
421
- "IceSSL: error decoding key:\n" + lastErrorToString());
501
+ //
502
+ // Check that we are using a RSA Key
503
+ //
504
+ if(strcmp(keyInfo->Algorithm.pszObjId, szOID_RSA_RSA))
505
+ {
506
+ throw PluginInitializationException(__FILE__, __LINE__,
507
+ string("IceSSL: error unknow key algorithm: `") +
508
+ keyInfo->Algorithm.pszObjId + "'");
509
+ }
510
+
511
+ //
512
+ // Decode the private key BLOB
513
+ //
514
+ if(!CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY,
515
+ keyInfo->PrivateKey.pbData, keyInfo->PrivateKey.cbData,
516
+ CRYPT_DECODE_ALLOC_FLAG, 0, &key, &outLength))
517
+ {
518
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: error decoding key `" +
519
+ keyFile + "':\n" + lastErrorToString());
520
+ }
521
+ LocalFree(keyInfo);
522
+ keyInfo = 0;
422
523
  }
423
-
424
- //
425
- // Check that we are using a RSA Key
426
- //
427
- if(strcmp(keyInfo->Algorithm.pszObjId, szOID_RSA_RSA))
524
+ else
428
525
  {
429
- throw PluginInitializationException(__FILE__, __LINE__,
430
- string("IceSSL: error unknow key algorithm: `") + keyInfo->Algorithm.pszObjId + "'");
526
+ //
527
+ // Decode the private key BLOB
528
+ //
529
+ if(!CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY,
530
+ &outBuffer[0], outLength, CRYPT_DECODE_ALLOC_FLAG, 0, &key, &outLength))
531
+ {
532
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: error decoding key `" +
533
+ keyFile + "':\n" + lastErrorToString());
534
+ }
431
535
  }
432
536
 
433
537
  //
@@ -436,35 +540,26 @@ SChannelEngine::initialize()
436
540
  const wstring keySetName = stringToWstring(generateUUID());
437
541
  HCRYPTPROV cryptProv = 0;
438
542
 
439
- DWORD contextFlags = (keySet == "MachineKeySet") ? CRYPT_MACHINE_KEYSET | CRYPT_NEWKEYSET :
440
- CRYPT_NEWKEYSET;
441
-
442
- if(!CryptAcquireContextW(&cryptProv, keySetName.c_str(), MS_DEF_PROV_W, PROV_RSA_FULL, contextFlags))
543
+ DWORD contextFlags = CRYPT_NEWKEYSET;
544
+ if(certStoreLocation == "LocalMachine")
443
545
  {
444
- throw PluginInitializationException(__FILE__, __LINE__,
445
- "IceSSL: error acquiring cryptographic context:\n" + lastErrorToString());
446
- }
546
+ contextFlags |= CRYPT_MACHINE_KEYSET;
547
+ } ;
447
548
 
448
- //
449
- // Decode the private key BLOB
450
- //
451
- if(!CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY,
452
- keyInfo->PrivateKey.pbData, keyInfo->PrivateKey.cbData,
453
- CRYPT_DECODE_ALLOC_FLAG, 0, &key, &outLength))
549
+ if(!CryptAcquireContextW(&cryptProv, keySetName.c_str(), MS_ENHANCED_PROV_W, PROV_RSA_FULL,
550
+ contextFlags))
454
551
  {
455
- throw PluginInitializationException(__FILE__, __LINE__,
456
- "IceSSL: error decoding key:\n" + lastErrorToString());
552
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: error acquiring cryptographic "
553
+ "context:\n" + lastErrorToString());
457
554
  }
458
- LocalFree(keyInfo);
459
- keyInfo = 0;
460
555
 
461
556
  //
462
557
  // Import the private key
463
558
  //
464
559
  if(!CryptImportKey(cryptProv, key, outLength, 0, 0, &hKey))
465
560
  {
466
- throw PluginInitializationException(__FILE__, __LINE__,
467
- "IceSSL: error importing key:\n" + lastErrorToString());
561
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: error importing key `" + keyFile +
562
+ "':\n" + lastErrorToString());
468
563
  }
469
564
  LocalFree(key);
470
565
  key = 0;
@@ -478,11 +573,11 @@ SChannelEngine::initialize()
478
573
  store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 0, 0);
479
574
  if(!store)
480
575
  {
481
- throw PluginInitializationException(__FILE__, __LINE__,
482
- "IceSSL: error creating certificate store:\n" + lastErrorToString());
576
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: error creating certificate "
577
+ "store:\n" + lastErrorToString());
483
578
  }
484
579
 
485
- addCertificateToStore(certFile, store, &cert);
580
+ addCertificatesToStore(certFile, store, &cert);
486
581
 
487
582
  //
488
583
  // Associate key & certificate
@@ -493,14 +588,14 @@ SChannelEngine::initialize()
493
588
  keyProvInfo.pwszProvName = const_cast<wchar_t*>(MS_DEF_PROV_W);
494
589
  keyProvInfo.dwProvType = PROV_RSA_FULL;
495
590
  keyProvInfo.dwKeySpec = AT_KEYEXCHANGE;
496
-
497
591
  if(!CertSetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, 0, &keyProvInfo))
498
592
  {
499
- throw PluginInitializationException(__FILE__, __LINE__,
500
- "IceSSL: error seting certificate property:\n" + lastErrorToString());
593
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: error seting certificate "
594
+ "property:\n" + lastErrorToString());
501
595
  }
502
596
 
503
- _certs.push_back(cert);
597
+ _importedCerts.push_back(cert);
598
+ _allCerts.push_back(cert);
504
599
  _stores.push_back(store);
505
600
  }
506
601
  catch(...)
@@ -532,31 +627,16 @@ SChannelEngine::initialize()
532
627
  throw;
533
628
  }
534
629
  }
535
-
536
- _allCerts.insert(_allCerts.end(), _certs.begin(), _certs.end());
537
630
  }
538
-
539
- const string findPrefix = prefix + "FindCert.";
540
- map<string, string> certProps = properties->getPropertiesForPrefix(findPrefix);
541
- if(!certProps.empty())
631
+ else if(!findCert.empty())
542
632
  {
543
- for(map<string, string>::const_iterator i = certProps.begin(); i != certProps.end(); ++i)
544
- {
545
- const string name = i->first;
546
- const string val = i->second;
547
-
548
- if(!val.empty())
549
- {
550
- string storeSpec = name.substr(findPrefix.size());
551
- vector<PCCERT_CONTEXT> certs = findCertificates(name, storeSpec, val, _stores);
552
- _allCerts.insert(_allCerts.end(), certs.begin(), certs.end());
553
- }
554
- }
555
-
556
- if(_allCerts.empty())
633
+ string certStore = properties->getPropertyWithDefault(prefix + "CertStore", "My");
634
+ vector<PCCERT_CONTEXT> certs = findCertificates(certStoreLocation, certStore, findCert, _stores);
635
+ if(certs.empty())
557
636
  {
558
637
  throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: no certificates found");
559
638
  }
639
+ _allCerts.insert(_allCerts.end(), certs.begin(), certs.end());
560
640
  }
561
641
  _initialized = true;
562
642
  }
@@ -627,10 +707,15 @@ SChannelEngine::newCredentialsHandle(bool incoming)
627
707
  // the root certificate either way.
628
708
  //
629
709
  cred.dwFlags = SCH_CRED_NO_SYSTEM_MAPPER;
630
- if(_rootStore)
631
- {
632
- cred.hRootStore = _rootStore;
633
- }
710
+
711
+ //
712
+ // There's no way to prevent SChannel from sending "CA names" to the
713
+ // client. Recent Windows versions don't CA names but older ones do
714
+ // send all the trusted root CA names. We provide the root store to
715
+ // ensure that for these older Windows versions, we also include the
716
+ // CA names of our trusted roots.
717
+ //
718
+ cred.hRootStore = _rootStore;
634
719
  }
635
720
  else
636
721
  {
@@ -646,9 +731,9 @@ SChannelEngine::newCredentialsHandle(bool incoming)
646
731
  CredHandle credHandle;
647
732
  memset(&credHandle, 0, sizeof(credHandle));
648
733
 
649
- SECURITY_STATUS err =
650
- AcquireCredentialsHandle(0, const_cast<char*>(UNISP_NAME), (incoming ? SECPKG_CRED_INBOUND : SECPKG_CRED_OUTBOUND), 0, &cred, 0,
651
- 0, &credHandle, 0);
734
+ SECURITY_STATUS err = AcquireCredentialsHandle(0, const_cast<char*>(UNISP_NAME),
735
+ (incoming ? SECPKG_CRED_INBOUND : SECPKG_CRED_OUTBOUND),
736
+ 0, &cred, 0, 0, &credHandle, 0);
652
737
 
653
738
  if(err != SEC_E_OK)
654
739
  {
@@ -692,33 +777,30 @@ SChannelEngine::destroy()
692
777
  CertCloseStore(_rootStore, 0);
693
778
  }
694
779
 
695
- for(vector<PCCERT_CONTEXT>::const_iterator i = _allCerts.begin(); i != _allCerts.end(); ++i)
780
+ for(vector<PCCERT_CONTEXT>::const_iterator i = _importedCerts.begin(); i != _importedCerts.end(); ++i)
696
781
  {
697
- PCCERT_CONTEXT cert = *i;
698
-
699
782
  //
700
- // Only remove the keysets we create.
783
+ // Retrieve the certificate CERT_KEY_PROV_INFO_PROP_ID property, we use the CRYPT_KEY_PROV_INFO
784
+ // data to remove the key set associated with the certificate.
701
785
  //
702
- if(find(_certs.begin(), _certs.end(), cert) != _certs.end())
786
+ DWORD length = 0;
787
+ if(!CertGetCertificateContextProperty(*i, CERT_KEY_PROV_INFO_PROP_ID, 0, &length))
703
788
  {
704
- //
705
- // Retrieve the certificate CERT_KEY_PROV_INFO_PROP_ID property, we use the CRYPT_KEY_PROV_INFO
706
- // data to then remove the key set associated with the certificate.
707
- //
708
- DWORD length = 0;
709
- if(CertGetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, 0, &length))
710
- {
711
- vector<char> buf(length);
712
- if(CertGetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, &buf[0], &length))
713
- {
714
- CRYPT_KEY_PROV_INFO* keyProvInfo = reinterpret_cast<CRYPT_KEY_PROV_INFO*>(&buf[0]);
715
- HCRYPTPROV cryptProv = 0;
716
- CryptAcquireContextW(&cryptProv, keyProvInfo->pwszContainerName, keyProvInfo->pwszProvName,
717
- keyProvInfo->dwProvType, CRYPT_DELETEKEYSET);
718
- }
719
- CertFreeCertificateContext(cert);
720
- }
789
+ continue;
790
+ }
791
+ vector<char> buf(length);
792
+ if(!CertGetCertificateContextProperty(*i, CERT_KEY_PROV_INFO_PROP_ID, &buf[0], &length))
793
+ {
794
+ continue;
721
795
  }
796
+ CRYPT_KEY_PROV_INFO* key = reinterpret_cast<CRYPT_KEY_PROV_INFO*>(&buf[0]);
797
+ HCRYPTPROV prov = 0;
798
+ CryptAcquireContextW(&prov, key->pwszContainerName, key->pwszProvName, key->dwProvType, CRYPT_DELETEKEYSET);
799
+ }
800
+
801
+ for(vector<PCCERT_CONTEXT>::const_iterator i = _allCerts.begin(); i != _allCerts.end(); ++i)
802
+ {
803
+ CertFreeCertificateContext(*i);
722
804
  }
723
805
 
724
806
  for(vector<HCERTSTORE>::const_iterator i = _stores.begin(); i != _stores.end(); ++i)