zeroc-ice 3.6b1 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
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)