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.
@@ -95,7 +95,7 @@ socketRead(SSLConnectionRef connection, void* data, size_t* length)
95
95
  return transceiver->readRaw(reinterpret_cast<char*>(data), length);
96
96
  }
97
97
 
98
- void
98
+ bool
99
99
  checkTrustResult(SecTrustRef trust, const SecureTransportEnginePtr& engine, const InstancePtr& instance)
100
100
  {
101
101
  OSStatus err = noErr;
@@ -112,7 +112,7 @@ checkTrustResult(SecTrustRef trust, const SecureTransportEnginePtr& engine, cons
112
112
  //
113
113
  if((err = SecTrustSetNetworkFetchAllowed(trust, false)))
114
114
  {
115
- throw ProtocolException(__FILE__, __LINE__, "IceSSL: handshake failure:\n" + errorToString(err));
115
+ throw SecurityException(__FILE__, __LINE__, "IceSSL: handshake failure:\n" + errorToString(err));
116
116
  }
117
117
 
118
118
  //
@@ -120,7 +120,7 @@ checkTrustResult(SecTrustRef trust, const SecureTransportEnginePtr& engine, cons
120
120
  //
121
121
  if((err = SecTrustEvaluate(trust, &trustResult)))
122
122
  {
123
- throw ProtocolException(__FILE__, __LINE__, "IceSSL: handshake failure:\n" + errorToString(err));
123
+ throw SecurityException(__FILE__, __LINE__, "IceSSL: handshake failure:\n" + errorToString(err));
124
124
  }
125
125
  }
126
126
 
@@ -132,14 +132,15 @@ checkTrustResult(SecTrustRef trust, const SecureTransportEnginePtr& engine, cons
132
132
  //
133
133
  // Trust verify success.
134
134
  //
135
- break;
135
+ return true;
136
136
  }
137
- case kSecTrustResultInvalid:
138
- //case kSecTrustResultConfirm: // Used in old OS X versions
139
- case kSecTrustResultDeny:
140
- case kSecTrustResultRecoverableTrustFailure:
141
- case kSecTrustResultFatalTrustFailure:
142
- case kSecTrustResultOtherError:
137
+ default:
138
+ // case kSecTrustResultInvalid:
139
+ // //case kSecTrustResultConfirm: // Used in old OS X versions
140
+ // case kSecTrustResultDeny:
141
+ // case kSecTrustResultRecoverableTrustFailure:
142
+ // case kSecTrustResultFatalTrustFailure:
143
+ // case kSecTrustResultOtherError:
143
144
  {
144
145
  if(engine->getVerifyPeer() == 0)
145
146
  {
@@ -149,7 +150,7 @@ checkTrustResult(SecTrustRef trust, const SecureTransportEnginePtr& engine, cons
149
150
  os << "IceSSL: ignoring certificate verification failure\n" << trustResultDescription(trustResult);
150
151
  instance->logger()->trace(instance->traceCategory(), os.str());
151
152
  }
152
- break;
153
+ return false;
153
154
  }
154
155
  else
155
156
  {
@@ -160,7 +161,7 @@ checkTrustResult(SecTrustRef trust, const SecureTransportEnginePtr& engine, cons
160
161
  {
161
162
  instance->logger()->trace(instance->traceCategory(), msg);
162
163
  }
163
- throw ProtocolException(__FILE__, __LINE__, msg);
164
+ throw SecurityException(__FILE__, __LINE__, msg);
164
165
  }
165
166
  }
166
167
  }
@@ -197,7 +198,7 @@ IceSSL::TransceiverI::initialize(IceInternal::Buffer& readBuffer, IceInternal::B
197
198
 
198
199
  if((err = SSLSetConnection(_ssl, reinterpret_cast<SSLConnectionRef>(this))))
199
200
  {
200
- throw SecurityException(__FILE__, __LINE__, "IceSSL: setting SSL connection failed\n" +
201
+ throw SecurityException(__FILE__, __LINE__, "IceSSL: setting SSL connection failed\n" +
201
202
  errorToString(err));
202
203
  }
203
204
  }
@@ -226,14 +227,17 @@ IceSSL::TransceiverI::initialize(IceInternal::Buffer& readBuffer, IceInternal::B
226
227
  err = SSLCopyPeerTrust(_ssl, &_trust);
227
228
  if(_incoming && err == errSSLBadCert && _engine->getVerifyPeer() == 1)
228
229
  {
229
- // This happens in 10.10 when the client doesn't provide
230
- // a certificate and the server is configured to try
231
- // authenticate
230
+ //
231
+ // This is expected if the client doesn't provide a
232
+ // certificate (occurs since 10.10). The server is
233
+ // configured to verify to not require the client
234
+ // certificate so we ignore the failure.
235
+ //
232
236
  continue;
233
237
  }
234
238
  if(err == noErr)
235
239
  {
236
- checkTrustResult(_trust, _engine, _instance);
240
+ _verified = checkTrustResult(_trust, _engine, _instance);
237
241
  continue; // Call SSLHandshake to resume the handsake.
238
242
  }
239
243
  // Let it fall through, this will raise a SecurityException with the SSLCopyPeerTrust error.
@@ -254,7 +258,7 @@ IceSSL::TransceiverI::initialize(IceInternal::Buffer& readBuffer, IceInternal::B
254
258
  << "remote address = " << desc << "\n" << errorToString(err);
255
259
  throw ProtocolException(__FILE__, __LINE__, os.str());
256
260
  }
257
- _engine->verifyPeer(_stream->fd(), _host, getNativeConnectionInfo());
261
+ _engine->verifyPeer(_stream->fd(), _host, NativeConnectionInfoPtr::dynamicCast(getInfo()));
258
262
 
259
263
  if(_instance->engine()->securityTraceLevel() >= 1)
260
264
  {
@@ -481,7 +485,18 @@ IceSSL::TransceiverI::toDetailedString() const
481
485
  Ice::ConnectionInfoPtr
482
486
  IceSSL::TransceiverI::getInfo() const
483
487
  {
484
- return getNativeConnectionInfo();
488
+ NativeConnectionInfoPtr info = new NativeConnectionInfo();
489
+ fillConnectionInfo(info, info->nativeCerts);
490
+ return info;
491
+ }
492
+
493
+ Ice::ConnectionInfoPtr
494
+ IceSSL::TransceiverI::getWSInfo(const Ice::HeaderDict& headers) const
495
+ {
496
+ WSSNativeConnectionInfoPtr info = new WSSNativeConnectionInfo();
497
+ fillConnectionInfo(info, info->nativeCerts);
498
+ info->headers = headers;
499
+ return info;
485
500
  }
486
501
 
487
502
  void
@@ -489,9 +504,15 @@ IceSSL::TransceiverI::checkSendSize(const IceInternal::Buffer&)
489
504
  {
490
505
  }
491
506
 
492
- IceSSL::TransceiverI::TransceiverI(const InstancePtr& instance,
493
- const IceInternal::StreamSocketPtr& stream,
494
- const string& hostOrAdapterName,
507
+ void
508
+ IceSSL::TransceiverI::setBufferSize(int rcvSize, int sndSize)
509
+ {
510
+ _stream->setBufferSize(rcvSize, sndSize);
511
+ }
512
+
513
+ IceSSL::TransceiverI::TransceiverI(const InstancePtr& instance,
514
+ const IceInternal::StreamSocketPtr& stream,
515
+ const string& hostOrAdapterName,
495
516
  bool incoming) :
496
517
  _instance(instance),
497
518
  _engine(SecureTransportEnginePtr::dynamicCast(instance->engine())),
@@ -501,6 +522,7 @@ IceSSL::TransceiverI::TransceiverI(const InstancePtr& instance,
501
522
  _stream(stream),
502
523
  _ssl(0),
503
524
  _trust(0),
525
+ _verified(false),
504
526
  _buffered(0)
505
527
  {
506
528
  //
@@ -515,12 +537,16 @@ IceSSL::TransceiverI::~TransceiverI()
515
537
  {
516
538
  }
517
539
 
518
- NativeConnectionInfoPtr
519
- IceSSL::TransceiverI::getNativeConnectionInfo() const
540
+ void
541
+ IceSSL::TransceiverI::fillConnectionInfo(const ConnectionInfoPtr& info, std::vector<CertificatePtr>& nativeCerts) const
520
542
  {
521
- NativeConnectionInfoPtr info = new NativeConnectionInfo();
522
- IceInternal::fdToAddressAndPort(_stream->fd(), info->localAddress, info->localPort, info->remoteAddress,
543
+ IceInternal::fdToAddressAndPort(_stream->fd(), info->localAddress, info->localPort, info->remoteAddress,
523
544
  info->remotePort);
545
+ if(_stream->fd() != INVALID_SOCKET)
546
+ {
547
+ info->rcvSize = IceInternal::getRecvBufferSize(_stream->fd());
548
+ info->sndSize = IceInternal::getSendBufferSize(_stream->fd());
549
+ }
524
550
 
525
551
  if(_ssl)
526
552
  {
@@ -530,18 +556,22 @@ IceSSL::TransceiverI::getNativeConnectionInfo() const
530
556
  CFRetain(cert);
531
557
 
532
558
  CertificatePtr certificate = new Certificate(cert);
533
- info->nativeCerts.push_back(certificate);
559
+ nativeCerts.push_back(certificate);
534
560
  info->certs.push_back(certificate->encode());
535
561
  }
536
562
 
537
563
  SSLCipherSuite cipher;
538
564
  SSLGetNegotiatedCipher(_ssl, &cipher);
539
565
  info->cipher = _engine->getCipherName(cipher);
566
+ info->verified = _verified;
567
+ }
568
+ else
569
+ {
570
+ info->verified = false;
540
571
  }
541
572
 
542
573
  info->adapterName = _adapterName;
543
574
  info->incoming = _incoming;
544
- return info;
545
575
  }
546
576
 
547
577
  OSStatus
@@ -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.
@@ -18,6 +18,7 @@
18
18
  #include <Ice/Transceiver.h>
19
19
  #include <Ice/Network.h>
20
20
  #include <Ice/StreamSocket.h>
21
+ #include <Ice/WSTransceiver.h>
21
22
 
22
23
  #ifdef ICE_USE_SECURE_TRANSPORT
23
24
 
@@ -30,7 +31,7 @@ namespace IceSSL
30
31
  class ConnectorI;
31
32
  class AcceptorI;
32
33
 
33
- class TransceiverI : public IceInternal::Transceiver
34
+ class TransceiverI : public IceInternal::Transceiver, public IceInternal::WSTransceiverDelegate
34
35
  {
35
36
  public:
36
37
 
@@ -46,7 +47,9 @@ public:
46
47
  virtual std::string toString() const;
47
48
  virtual std::string toDetailedString() const;
48
49
  virtual Ice::ConnectionInfoPtr getInfo() const;
50
+ virtual Ice::ConnectionInfoPtr getWSInfo(const Ice::HeaderDict&) const;
49
51
  virtual void checkSendSize(const IceInternal::Buffer&);
52
+ virtual void setBufferSize(int rcvSize, int sndSize);
50
53
 
51
54
  OSStatus writeRaw(const char*, size_t*) const;
52
55
  OSStatus readRaw(char*, size_t*) const;
@@ -56,7 +59,7 @@ private:
56
59
  TransceiverI(const InstancePtr&, const IceInternal::StreamSocketPtr&, const std::string&, bool);
57
60
  virtual ~TransceiverI();
58
61
 
59
- virtual NativeConnectionInfoPtr getNativeConnectionInfo() const;
62
+ void fillConnectionInfo(const ConnectionInfoPtr&, std::vector<CertificatePtr>&) const;
60
63
 
61
64
  friend class ConnectorI;
62
65
  friend class AcceptorI;
@@ -70,7 +73,8 @@ private:
70
73
 
71
74
  SSLContextRef _ssl;
72
75
  SecTrustRef _trust;
73
-
76
+ bool _verified;
77
+
74
78
  size_t _buffered;
75
79
  enum SSLWantFlags
76
80
  {
@@ -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.
@@ -24,7 +24,7 @@
24
24
  # include <openssl/err.h>
25
25
  //
26
26
  // Avoid old style cast warnings from OpenSSL macros
27
- //
27
+ //
28
28
  # pragma GCC diagnostic ignored "-Wold-style-cast"
29
29
  #endif
30
30
 
@@ -41,22 +41,26 @@ IceSSL::readFile(const string& file, vector<char>& buffer)
41
41
  {
42
42
  throw CertificateReadException(__FILE__, __LINE__, "error opening file " + file);
43
43
  }
44
-
44
+
45
45
  is.seekg(0, is.end);
46
46
  buffer.resize(static_cast<int>(is.tellg()));
47
47
  is.seekg(0, is.beg);
48
-
49
- is.read(&buffer[0], buffer.size());
50
-
51
- if(!is.good())
48
+
49
+ if(!buffer.empty())
52
50
  {
53
- throw CertificateReadException(__FILE__, __LINE__, "error reading file " + file);
51
+ is.read(&buffer[0], buffer.size());
52
+ if(!is.good())
53
+ {
54
+ throw CertificateReadException(__FILE__, __LINE__, "error reading file " + file);
55
+ }
54
56
  }
55
57
  }
56
58
 
57
59
  #ifndef ICE_USE_OPENSSL
60
+
58
61
  namespace
59
62
  {
63
+
60
64
  bool
61
65
  parseBytes(const string& arg, vector<unsigned char>& buffer)
62
66
  {
@@ -95,10 +99,13 @@ parseBytes(const string& arg, vector<unsigned char>& buffer)
95
99
  }
96
100
  return true;
97
101
  }
102
+
98
103
  }
104
+
99
105
  #endif
100
106
 
101
- #ifdef ICE_USE_OPENSSL
107
+ #if defined(ICE_USE_OPENSSL)
108
+
102
109
  namespace
103
110
  {
104
111
 
@@ -426,7 +433,7 @@ IceSSL::errorToString(OSStatus status)
426
433
  return os.str();
427
434
  }
428
435
 
429
- std::string
436
+ std::string
430
437
  IceSSL::fromCFString(CFStringRef v)
431
438
  {
432
439
  string s;
@@ -448,13 +455,13 @@ IceSSL::getCertificateProperty(SecCertificateRef cert, CFTypeRef key)
448
455
  CFErrorRef err = 0;
449
456
  CFDictionaryRef values = SecCertificateCopyValues(cert, keys, &err);
450
457
  CFRelease(keys);
451
-
452
458
  if(err)
453
459
  {
454
- CertificateEncodingException ex(__FILE__, __LINE__, err);
455
- throw ex;
460
+ ostringstream os;
461
+ os << "IceSSL: error getting property for certificate:\n" << errorToString(err);
462
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
456
463
  }
457
-
464
+
458
465
  assert(values);
459
466
  CFDictionaryRef property = (CFDictionaryRef)CFDictionaryGetValue(values, key);
460
467
  if(property)
@@ -468,540 +475,351 @@ IceSSL::getCertificateProperty(SecCertificateRef cert, CFTypeRef key)
468
475
  namespace
469
476
  {
470
477
 
471
- //
472
- // Retrive the certificate subject key identifier, the caller must release the returned CFData
473
- // object.
474
- //
475
- CFDataRef
476
- getSubjectKeyIdentifier(SecCertificateRef cert)
477
- {
478
- CFDataRef data = 0;
479
- CFDictionaryRef property = getCertificateProperty(cert, kSecOIDSubjectKeyIdentifier);
480
- if(property)
481
- {
482
- CFArrayRef propertyValues = (CFArrayRef)CFDictionaryGetValue(property, kSecPropertyKeyValue);
483
- for(int i = 0, length = CFArrayGetCount(propertyValues); i < length; ++i)
484
- {
485
- CFDictionaryRef dict = (CFDictionaryRef)CFArrayGetValueAtIndex(propertyValues, i);
486
- CFStringRef label = (CFStringRef)CFDictionaryGetValue(dict, kSecPropertyKeyLabel);
487
- if(CFEqual(label, CFSTR("Key Identifier")))
488
- {
489
- data = (CFDataRef)CFDictionaryGetValue(dict, kSecPropertyKeyValue);
490
- CFRetain(data);
491
- break;
492
- }
493
- }
494
- CFRelease(property);
495
- }
496
- return data;
497
- }
498
-
499
478
  //
500
479
  // Check the certificate basic constraints to check if the certificate is marked as a CA.
501
480
  //
502
481
  bool
503
482
  isCA(SecCertificateRef cert)
504
483
  {
505
- bool ca = false;
506
- CFDictionaryRef property = getCertificateProperty(cert, kSecOIDBasicConstraints);
484
+ UniqueRef<CFDictionaryRef> property(getCertificateProperty(cert, kSecOIDBasicConstraints));
507
485
  if(property)
508
486
  {
509
- CFArrayRef propertyValues = (CFArrayRef)CFDictionaryGetValue(property, kSecPropertyKeyValue);
487
+ CFArrayRef propertyValues = (CFArrayRef)CFDictionaryGetValue(property.get(), kSecPropertyKeyValue);
510
488
  for(int i = 0, size = CFArrayGetCount(propertyValues); i < size; ++i)
511
489
  {
512
490
  CFDictionaryRef dict = (CFDictionaryRef)CFArrayGetValueAtIndex(propertyValues, i);
513
491
  CFStringRef label = (CFStringRef)CFDictionaryGetValue(dict, kSecPropertyKeyLabel);
514
492
  if(CFEqual(label, CFSTR("Certificate Authority")))
515
493
  {
516
- CFStringRef value = (CFStringRef)CFDictionaryGetValue(dict, kSecPropertyKeyValue);
517
- if(CFEqual(value, CFSTR("Yes")))
518
- {
519
- ca = true;
520
- }
521
- break;
494
+ return CFEqual((CFStringRef)CFDictionaryGetValue(dict, kSecPropertyKeyValue), CFSTR("Yes"));
522
495
  }
523
496
  }
524
- CFRelease(property);
525
- }
526
- return ca;
527
- }
528
-
529
- //
530
- // Search the keychain for an existing item with the same hash and type,
531
- // the hash is the certificate subject key identifier. For private key
532
- // items the hash should match kSecAttrApplicationLabel attribute, for
533
- // certificate items it should match the kSecAttrSubjectKeyID attribute.
534
- //
535
- SecKeychainItemRef
536
- copyMatching(SecKeychainRef keychain, CFDataRef hash, CFTypeRef type)
537
- {
538
- assert(keychain);
539
- assert(hash);
540
- assert(type == kSecClassKey || type == kSecClassCertificate);
541
-
542
- const void* values[] = {keychain};
543
- CFArrayRef searchList = CFArrayCreate(kCFAllocatorDefault, values, 1, &kCFTypeArrayCallBacks);
544
-
545
- CFMutableDictionaryRef query =
546
- CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
547
-
548
- CFDictionarySetValue(query, kSecClass, type);
549
- CFDictionarySetValue(query, kSecMatchLimit, kSecMatchLimitOne);
550
- CFDictionarySetValue(query, kSecMatchSearchList, searchList);
551
- CFDictionarySetValue(query, type == kSecClassKey ? kSecAttrApplicationLabel : kSecAttrSubjectKeyID, hash);
552
- CFDictionarySetValue(query, kSecReturnRef, kCFBooleanTrue);
553
-
554
- SecKeychainItemRef item = 0;
555
- OSStatus err = SecItemCopyMatching(query, (CFTypeRef*)&item);
556
-
557
- CFRelease(searchList);
558
- CFRelease(query);
559
-
560
- if(err != noErr && err != errSecItemNotFound)
561
- {
562
- throw CertificateReadException(__FILE__, __LINE__,
563
- "Error searching for keychain items\n" + errorToString(err));
564
497
  }
565
-
566
- return item;
567
- }
568
-
569
- //
570
- // Add an item to the keychain, if the keychain already has this item return the existing item,
571
- // otherwise return the new added item.
572
- //
573
- SecKeychainItemRef
574
- addToKeychain(SecKeychainRef keychain, SecKeychainItemRef item, CFDataRef hash, CFTypeRef type)
575
- {
576
- assert(keychain);
577
- assert(item);
578
- assert(hash);
579
-
580
- SecKeychainItemRef newItem = copyMatching(keychain, hash, type);
581
- if(!newItem)
582
- {
583
- CFMutableDictionaryRef query = CFDictionaryCreateMutable(kCFAllocatorDefault,
584
- 0,
585
- &kCFTypeDictionaryKeyCallBacks,
586
- &kCFTypeDictionaryValueCallBacks);
587
-
588
- CFDictionarySetValue(query, kSecUseKeychain, keychain);
589
- CFDictionarySetValue(query, kSecClass, type);
590
- CFDictionarySetValue(query, kSecValueRef, item);
591
- CFDictionarySetValue(query, kSecReturnRef, kCFBooleanTrue);
592
-
593
- CFArrayRef added = 0;
594
- OSStatus err = SecItemAdd(query, (CFTypeRef*)&added);
595
- CFRelease(query);
596
-
597
- if(err != noErr)
598
- {
599
- ostringstream os;
600
- os << "Failure adding " << (type == kSecClassKey ? "key" : "certificate")
601
- << " to keychain\n" << errorToString(err);
602
- throw CertificateReadException(__FILE__, __LINE__, os.str());
603
- }
604
- newItem = (SecKeychainItemRef)CFArrayGetValueAtIndex(added, 0);
605
- CFRetain(newItem);
606
- CFRelease(added);
607
- }
608
-
609
- assert(newItem);
610
-
611
- return newItem;
498
+ return false;
612
499
  }
613
500
 
614
501
  //
615
502
  // Load keychain items (Certificates or Private Keys) from a file. On return items param contain
616
503
  // the list of items, the caller must release it.
617
504
  //
618
- void
619
- loadKeychainItems(CFArrayRef* items, CFTypeRef type, const string& file, SecExternalFormat* format,
620
- SecKeychainRef keychain, const string& passphrase, const PasswordPromptPtr& prompt,
621
- int passwordRetryMax)
505
+ CFArrayRef
506
+ loadKeychainItems(const string& file, SecExternalItemType type, SecKeychainRef keychain, const string& passphrase,
507
+ const PasswordPromptPtr& prompt, int retryMax)
622
508
  {
623
- assert(type == kSecClassCertificate || type == kSecClassKey);
624
509
  vector<char> buffer;
625
510
  readFile(file, buffer);
626
-
627
- CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault,
628
- reinterpret_cast<const UInt8*>(&buffer[0]),
629
- buffer.size(),
630
- kCFAllocatorNull);
631
-
632
- SecExternalItemType itemType = kSecItemTypeUnknown;
633
-
511
+ UniqueRef<CFDataRef> data(CFDataCreateWithBytesNoCopy(kCFAllocatorDefault,
512
+ reinterpret_cast<const UInt8*>(&buffer[0]),
513
+ buffer.size(),
514
+ kCFAllocatorNull));
515
+
634
516
  SecItemImportExportKeyParameters params;
635
517
  memset(&params, 0, sizeof(params));
636
518
  params.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION;
637
-
519
+ params.flags |= kSecKeyNoAccessControl;
520
+ if(!passphrase.empty())
638
521
  {
639
- const void* values[] = {kSecACLAuthorizationAny};
640
- params.keyUsage = CFArrayCreate(0, values, 1, 0);
522
+ params.passphrase = toCFString(passphrase);
641
523
  }
642
-
643
- params.flags |= kSecKeyNoAccessControl;
644
524
 
645
- OSStatus err = noErr;
646
- int count = 0;
647
-
648
- while(true)
525
+ CFArrayRef items;
526
+ SecExternalItemType importType = type;
527
+ SecExternalFormat format = type == kSecItemTypeUnknown ? kSecFormatPKCS12 : kSecFormatUnknown;
528
+ UniqueRef<CFStringRef> path(toCFString(file));
529
+ OSStatus err = SecItemImport(data.get(), path.get(), &format, &importType, 0, &params, keychain, &items);
530
+
531
+ //
532
+ // If passphrase failure and no password was configured, we obtain
533
+ // the password from the given prompt or configure the import to
534
+ // prompt the user with an alert dialog.
535
+ //
536
+ if(passphrase.empty() &&
537
+ (err == errSecPassphraseRequired || err == errSecInvalidData || err == errSecPkcs12VerifyFailure))
649
538
  {
650
- if(!passphrase.empty())
651
- {
652
- assert(!params.passphrase);
653
- params.passphrase = toCFString(passphrase);
654
- }
655
- err = SecItemImport(data, 0, format, &itemType, 0, &params, *format == kSecFormatPKCS12 ? keychain : 0,
656
- items);
657
- if(params.passphrase)
658
- {
659
- CFRelease(params.passphrase);
660
- params.passphrase = 0;
661
- }
662
-
663
- if(err == noErr)
664
- {
665
- break;
666
- }
667
-
668
- //
669
- // Try PKCS12 format.
670
- //
671
- if(err == errSecUnknownFormat && *format != kSecFormatPKCS12)
672
- {
673
- *format = kSecFormatPKCS12;
674
- itemType = kSecItemTypeAggregate;
675
- continue;
676
- }
677
-
678
- //
679
- // Error
680
- //
681
- if(!passphrase.empty() || (err != errSecPassphraseRequired &&
682
- err != errSecInvalidData &&
683
- err != errSecPkcs12VerifyFailure))
684
- {
685
- break;
686
- }
687
-
688
- if(prompt && count < passwordRetryMax)
689
- {
690
- params.passphrase = toCFString(prompt->getPassword());
691
- }
692
- //
693
- // Configure the default OS X password prompt if passphrase is required
694
- // and the user doesn't provide a passphrase or password prompt.
695
- //
696
- else if(!prompt && !(params.flags & kSecKeySecurePassphrase))
539
+ if(!prompt)
697
540
  {
698
541
  params.flags |= kSecKeySecurePassphrase;
699
542
  ostringstream os;
700
543
  os << "Enter the password for\n" << file;
701
544
  params.alertPrompt = toCFString(os.str());
702
- continue;
703
545
  }
704
- //
705
- // Password retry.
706
- //
707
- if(++count >= passwordRetryMax)
546
+
547
+ int count = 0;
548
+ while((err == errSecPassphraseRequired || err == errSecInvalidData || err == errSecPkcs12VerifyFailure) &&
549
+ count < retryMax)
708
550
  {
709
- break;
551
+ if(prompt)
552
+ {
553
+ if(params.passphrase)
554
+ {
555
+ CFRelease(params.passphrase);
556
+ }
557
+ params.passphrase = toCFString(prompt->getPassword());
558
+ }
559
+ err = SecItemImport(data.get(), path.get(), &format, &importType, 0, &params, keychain, &items);
560
+ ++count;
561
+ }
562
+
563
+ if(params.alertPrompt)
564
+ {
565
+ CFRelease(params.alertPrompt);
710
566
  }
711
567
  }
712
-
713
- if(params.alertPrompt)
568
+
569
+ if(params.passphrase)
714
570
  {
715
- CFRelease(params.alertPrompt);
571
+ CFRelease(params.passphrase);
716
572
  }
717
-
718
- CFRelease(data);
719
-
573
+
720
574
  if(err != noErr)
721
575
  {
722
576
  ostringstream os;
723
- os << "Error reading " << (type == kSecClassCertificate ? "certificate " : "private key ")
724
- << "from file: `" << file << "'\n" << errorToString(err);
577
+ os << "IceSSL: error reading " << (type == kSecItemTypePrivateKey ? "private key" : "certificate");
578
+ os << " `" << file << "':\n" << errorToString(err);
725
579
  throw CertificateReadException(__FILE__, __LINE__, os.str());
726
580
  }
727
- }
728
-
729
- }
730
581
 
731
- //
732
- // Helper function to generate the private key label (display name) used
733
- // in the keychain.
734
- //
735
- string
736
- IceSSL::keyLabel(SecCertificateRef cert)
737
- {
738
- CFStringRef commonName;
739
- OSStatus err = SecCertificateCopyCommonName(cert, &commonName);
740
- if(err != noErr)
582
+ if(type != kSecItemTypeUnknown && importType != kSecItemTypeAggregate && importType != type)
741
583
  {
742
- throw CertificateReadException(__FILE__, __LINE__, "certificate error:\n" + errorToString(err));
584
+ CFRelease(items);
585
+ ostringstream os;
586
+ os << "IceSSL: error reading " << (type == kSecItemTypePrivateKey ? "private key" : "certificate");
587
+ os << " `" << file << "' doesn't contain the expected item";
588
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
743
589
  }
744
- string label = fromCFString(commonName);
745
- CFRelease(commonName);
746
- return label.empty() ? "Imported Private Key" : (label + " - Private Key");
590
+
591
+ return items;
592
+ }
593
+
747
594
  }
748
595
 
749
596
  //
750
597
  // Imports a certificate private key and optionally add it to a keychain.
751
598
  //
752
- void
753
- IceSSL::loadPrivateKey(SecKeyRef* key, const string& label, CFDataRef hash, SecKeychainRef keychain,
754
- const string& file, const string& passphrase, const PasswordPromptPtr& prompt,
755
- int passwordRetryMax)
599
+ SecIdentityRef
600
+ IceSSL::loadPrivateKey(const string& file, SecCertificateRef cert, SecKeychainRef keychain, const string& password,
601
+ const PasswordPromptPtr& prompt, int retryMax)
756
602
  {
757
- assert(key);
758
- CFArrayRef items = 0;
759
- try
603
+ //
604
+ // Check if we already imported the certificate
605
+ //
606
+ UniqueRef<CFDataRef> hash;
607
+ UniqueRef<CFDictionaryRef> subjectKeyProperty(getCertificateProperty(cert, kSecOIDSubjectKeyIdentifier));
608
+ if(subjectKeyProperty)
760
609
  {
761
- SecExternalFormat format = kSecFormatUnknown;
762
- loadKeychainItems(&items, kSecClassKey, file, &format, keychain, passphrase, prompt, passwordRetryMax);
763
- if(items)
610
+ CFArrayRef values = (CFArrayRef)CFDictionaryGetValue(subjectKeyProperty.get(), kSecPropertyKeyValue);
611
+ for(int i = 0; i < CFArrayGetCount(values); ++i)
764
612
  {
765
- int count = CFArrayGetCount(items);
766
- for(int i = 0; i < count; ++i)
613
+ CFDictionaryRef dict = (CFDictionaryRef)CFArrayGetValueAtIndex(values, i);
614
+ if(CFEqual(CFDictionaryGetValue(dict, kSecPropertyKeyLabel), CFSTR("Key Identifier")))
767
615
  {
768
- SecKeychainItemRef item = (SecKeychainItemRef)CFArrayGetValueAtIndex(items, 0);
769
- if(SecKeyGetTypeID() == CFGetTypeID(item))
770
- {
771
- CFRetain(item);
772
- *key = (SecKeyRef)item;
773
-
774
- CFRelease(items);
775
- items = 0;
776
-
777
- if(keychain)
778
- {
779
- SecKeychainItemRef newItem = addToKeychain(keychain, item, hash, kSecClassKey);
780
- assert(newItem);
781
- CFRelease(*key);
782
- *key = (SecKeyRef)newItem;
783
- if(hash)
784
- {
785
- //
786
- // Create the association between the private key and the certificate,
787
- // kSecKeyLabel attribute should match the subject key identifier.
788
- //
789
- SecKeychainAttribute attr;
790
- attr.tag = kSecKeyLabel;
791
- attr.data = (void*)CFDataGetBytePtr(hash);
792
- attr.length = CFDataGetLength(hash);
793
-
794
- SecKeychainAttributeList attrs;
795
- attrs.attr = &attr;
796
- attrs.count = 1;
797
-
798
- SecKeychainItemModifyAttributesAndData(newItem, &attrs, 0, 0);
799
- }
800
-
801
- if(!label.empty())
802
- {
803
- //
804
- // kSecKeyPrintName attribute correspond to the keychain display
805
- // name.
806
- //
807
- SecKeychainAttribute att;
808
- att.tag = kSecKeyPrintName;
809
- att.data = (void*)label.c_str();
810
- att.length = label.size();
811
-
812
- SecKeychainAttributeList attrs;
813
- attrs.attr = &att;
814
- attrs.count = 1;
815
-
816
- SecKeychainItemModifyAttributesAndData(newItem, &attrs, 0, 0);
817
- }
818
- }
819
- break;
820
- }
616
+ hash.retain(CFDictionaryGetValue(dict, kSecPropertyKeyValue));
617
+ break;
821
618
  }
822
619
  }
823
-
824
- if(!*key)
825
- {
826
- throw CertificateReadException(__FILE__, __LINE__,
827
- "Certificate error:\n error importing certificate from " + file);
828
- }
829
620
  }
830
- catch(...)
831
- {
832
- if(items)
621
+
622
+ const void* values[] = { keychain };
623
+ UniqueRef<CFArrayRef> searchList(CFArrayCreate(kCFAllocatorDefault, values, 1, &kCFTypeArrayCallBacks));
624
+
625
+ UniqueRef<CFMutableDictionaryRef> query(CFDictionaryCreateMutable(0,
626
+ 0,
627
+ &kCFTypeDictionaryKeyCallBacks,
628
+ &kCFTypeDictionaryValueCallBacks));
629
+
630
+ CFDictionarySetValue(query.get(), kSecClass, kSecClassCertificate);
631
+ CFDictionarySetValue(query.get(), kSecMatchLimit, kSecMatchLimitOne);
632
+ CFDictionarySetValue(query.get(), kSecMatchSearchList, searchList.get());
633
+ CFDictionarySetValue(query.get(), kSecAttrSubjectKeyID, hash.get());
634
+ CFDictionarySetValue(query.get(), kSecReturnRef, kCFBooleanTrue);
635
+
636
+ CFTypeRef value = 0;
637
+ OSStatus err = SecItemCopyMatching(query.get(), &value);
638
+ UniqueRef<SecCertificateRef> item(value);
639
+ if(err == noErr)
640
+ {
641
+ //
642
+ // If the certificate has already been imported, create the
643
+ // identity. The key should also have been imported.
644
+ //
645
+ SecIdentityRef identity;
646
+ err = SecIdentityCreateWithCertificate(keychain, item.get(), &identity);
647
+ if(err != noErr)
833
648
  {
834
- CFRelease(items);
649
+ ostringstream os;
650
+ os << "IceSSL: error creating certificate identity:\n" << errorToString(err);
651
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
835
652
  }
836
-
837
- if(*key)
653
+ return identity;
654
+ }
655
+ else if(err != errSecItemNotFound)
656
+ {
657
+ ostringstream os;
658
+ os << "IceSSL: error searching for keychain items:\n" << errorToString(err);
659
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
660
+ }
661
+
662
+ //
663
+ // If the certificate isn't already in the keychain, load the
664
+ // private key into the keychain and add the certificate.
665
+ //
666
+ UniqueRef<CFArrayRef> items(loadKeychainItems(file, kSecItemTypePrivateKey, keychain, password, prompt, retryMax));
667
+ int count = CFArrayGetCount(items.get());
668
+ UniqueRef<SecKeyRef> key;
669
+ for(int i = 0; i < count; ++i)
670
+ {
671
+ SecKeychainItemRef item = (SecKeychainItemRef)CFArrayGetValueAtIndex(items.get(), 0);
672
+ if(SecKeyGetTypeID() == CFGetTypeID(item))
838
673
  {
839
- CFRelease(*key);
840
- *key = 0;
674
+ key.retain(item);
675
+ break;
841
676
  }
842
-
843
- throw;
844
677
  }
678
+ if(!key)
679
+ {
680
+ throw CertificateReadException(__FILE__, __LINE__, "IceSSL: no key in file `" + file + "'");
681
+ }
682
+
683
+ //
684
+ // Add the certificate to the keychain
685
+ //
686
+ query.reset(CFDictionaryCreateMutable(kCFAllocatorDefault,
687
+ 0,
688
+ &kCFTypeDictionaryKeyCallBacks,
689
+ &kCFTypeDictionaryValueCallBacks));
690
+
691
+ CFDictionarySetValue(query.get(), kSecUseKeychain, keychain);
692
+ CFDictionarySetValue(query.get(), kSecClass, kSecClassCertificate);
693
+ CFDictionarySetValue(query.get(), kSecValueRef, cert);
694
+ CFDictionarySetValue(query.get(), kSecReturnRef, kCFBooleanTrue);
695
+
696
+ value = 0;
697
+ err = SecItemAdd(query.get(), (CFTypeRef*)&value);
698
+ UniqueRef<CFArrayRef> added(value);
699
+ if(err != noErr)
700
+ {
701
+ ostringstream os;
702
+ os << "IceSSL: failure adding certificate to keychain\n" << errorToString(err);
703
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
704
+ }
705
+ item.retain(CFArrayGetValueAtIndex(added.get(), 0));
706
+
707
+ //
708
+ // Create the association between the private key and the certificate,
709
+ // kSecKeyLabel attribute should match the subject key identifier.
710
+ //
711
+ vector<SecKeychainAttribute> attributes;
712
+ if(hash)
713
+ {
714
+ SecKeychainAttribute attr;
715
+ attr.tag = kSecKeyLabel;
716
+ attr.data = (void*)CFDataGetBytePtr(hash.get());
717
+ attr.length = CFDataGetLength(hash.get());
718
+ attributes.push_back(attr);
719
+ }
720
+
721
+ //
722
+ // kSecKeyPrintName attribute correspond to the keychain display
723
+ // name.
724
+ //
725
+ string label;
726
+ CFStringRef commonName = 0;
727
+ if(SecCertificateCopyCommonName(item.get(), &commonName) == noErr)
728
+ {
729
+ label = fromCFString(commonName);
730
+ CFRelease(commonName);
731
+
732
+ SecKeychainAttribute attr;
733
+ attr.tag = kSecKeyPrintName;
734
+ attr.data = (void*)label.c_str();
735
+ attr.length = label.size();
736
+ attributes.push_back(attr);
737
+ }
738
+
739
+ SecKeychainAttributeList attrs;
740
+ attrs.attr = &attributes[0];
741
+ attrs.count = attributes.size();
742
+ SecKeychainItemModifyAttributesAndData((SecKeychainItemRef)key.get(), &attrs, 0, 0);
743
+
744
+ SecIdentityRef identity;
745
+ err = SecIdentityCreateWithCertificate(keychain, item.get(), &identity);
746
+ if(err != noErr)
747
+ {
748
+ ostringstream os;
749
+ os << "IceSSL: error creating certificate identity:\n" << errorToString(err);
750
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
751
+ }
752
+ return identity;
845
753
  }
846
754
 
847
755
  //
848
- // Imports a certificate and private key and optionally add then to a keychain.
756
+ // Imports a certificate (it might contain an identity or certificate depending on the format).
849
757
  //
850
- void
851
- IceSSL::loadCertificate(SecCertificateRef* cert, CFDataRef* hash, SecKeyRef* key, SecKeychainRef keychain,
852
- const string& file, const string& passphrase, const PasswordPromptPtr& prompt,
853
- int passwordRetryMax)
758
+ CFArrayRef
759
+ IceSSL::loadCertificateChain(const string& file, const string& keyFile, SecKeychainRef keychain,
760
+ const string& password, const PasswordPromptPtr& prompt, int retryMax)
854
761
  {
855
- assert(cert);
856
- CFArrayRef items = 0;
857
- SecIdentityRef identity = 0;
858
-
859
- try
762
+ if(keyFile.empty())
860
763
  {
861
- SecExternalFormat format = kSecFormatUnknown;
862
- loadKeychainItems(&items, kSecClassCertificate, file, &format, keychain, passphrase, prompt, passwordRetryMax);
863
-
864
- if(items)
865
- {
866
- int count = CFArrayGetCount(items);
867
-
868
- for(int i = 0; i < count; ++i)
869
- {
870
- SecKeychainItemRef item = (SecKeychainItemRef)CFArrayGetValueAtIndex(items, i);
871
- if(format == kSecFormatPKCS12)
872
- {
873
- OSStatus err = noErr;
874
- if(SecIdentityGetTypeID() == CFGetTypeID(item))
875
- {
876
- if((err = SecIdentityCopyCertificate((SecIdentityRef)item, cert)) != noErr)
877
- {
878
- throw CertificateReadException(__FILE__, __LINE__, "Certificate error:\n" +
879
- errorToString(err));
880
- }
881
-
882
- if((err = SecIdentityCopyPrivateKey((SecIdentityRef)item, key)) != noErr)
883
- {
884
- throw CertificateReadException(__FILE__, __LINE__, "Certificate error:\n" +
885
- errorToString(err));
886
- }
887
- break;
888
- }
889
- else if(SecCertificateGetTypeID() == CFGetTypeID(item))
890
- {
891
- CFRetain(item);
892
- *cert = (SecCertificateRef)item;
893
-
894
- if((err = SecIdentityCreateWithCertificate(keychain, *cert, &identity)) != noErr)
895
- {
896
- throw CertificateReadException(__FILE__, __LINE__, "Certificate error:\n" +
897
- errorToString(err));
898
- }
899
- if((err = SecIdentityCopyPrivateKey(identity, key)) != noErr)
900
- {
901
- throw CertificateReadException(__FILE__, __LINE__, "Certificate error:\n" +
902
- errorToString(err));
903
- }
904
-
905
- CFRelease(identity);
906
- identity = 0;
907
- break;
908
- }
909
- }
910
- else if(SecCertificateGetTypeID() == CFGetTypeID(item))
911
- {
912
- CFRetain(item);
913
- *cert = (SecCertificateRef)item;
914
-
915
- //
916
- // Copy the public key hash, that is used when added the private key
917
- // to create an association between the certificate and the corresponding
918
- // private key.
919
- //
920
- if(hash)
921
- {
922
- *hash = getSubjectKeyIdentifier(*cert);
923
-
924
- if(keychain)
925
- {
926
- SecKeychainItemRef newItem = addToKeychain(keychain, item, *hash, kSecClassCertificate);
927
- assert(newItem);
928
- CFRelease(*cert);
929
- *cert = (SecCertificateRef)newItem;
930
- }
931
- }
932
- break;
933
- }
934
- }
935
-
936
- CFRelease(items);
937
- items = 0;
938
- }
939
-
940
- if(!*cert)
941
- {
942
- throw CertificateReadException(__FILE__, __LINE__,
943
- "Certificate error:\n error importing certificate from " + file);
944
- }
764
+ return loadKeychainItems(file, kSecItemTypeUnknown, keychain, password, prompt, retryMax);
945
765
  }
946
- catch(...)
766
+ else
947
767
  {
948
- if(*cert)
949
- {
950
- CFRelease(*cert);
951
- *cert = 0;
952
- }
953
-
954
- if(hash && *hash)
955
- {
956
- CFRelease(*hash);
957
- *hash = 0;
958
- }
959
-
960
- if(items)
961
- {
962
- CFRelease(items);
963
- }
964
-
965
- if(identity)
966
- {
967
- CFRelease(identity);
968
- }
969
-
970
- if(key && *key)
768
+ //
769
+ // Load the certificate, don't load into the keychain as it
770
+ // might already have been imported.
771
+ //
772
+ UniqueRef<CFArrayRef> items(loadKeychainItems(file, kSecItemTypeCertificate, 0, password, prompt, retryMax));
773
+ SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(items.get(), 0);
774
+ if(SecCertificateGetTypeID() != CFGetTypeID(cert))
971
775
  {
972
- CFRelease(*key);
973
- *key = 0;
776
+ ostringstream os;
777
+ os << "IceSSL: couldn't find certificate in `" << file << "'";
778
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
974
779
  }
975
-
976
- throw;
780
+
781
+ //
782
+ // Load the private key for the given certificate. This will
783
+ // add the certificate/key to the keychain if they aren't
784
+ // already present in the keychain.
785
+ //
786
+ UniqueRef<SecIdentityRef> identity(loadPrivateKey(keyFile, cert, keychain, password, prompt, retryMax));
787
+ CFMutableArrayRef a = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, items.get());
788
+ CFArraySetValueAtIndex(a, 0, identity.get());
789
+ return a;
977
790
  }
978
791
  }
979
792
 
793
+ SecCertificateRef
794
+ IceSSL::loadCertificate(const string& file)
795
+ {
796
+ CFArrayRef items = loadKeychainItems(file, kSecItemTypeCertificate, 0, "", 0, 0);
797
+ SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(items, 0);
798
+ CFRetain(cert);
799
+ CFRelease(items);
800
+ return cert;
801
+ }
802
+
980
803
  CFArrayRef
981
- IceSSL::loadCACertificates(const string& file, const string& passphrase, const PasswordPromptPtr& prompt,
982
- int passwordRetryMax)
804
+ IceSSL::loadCACertificates(const string& file)
983
805
  {
984
- CFArrayRef items = 0;
985
- SecExternalFormat format = kSecFormatUnknown;
986
- loadKeychainItems(&items, kSecClassCertificate, file, &format, 0, passphrase, prompt, passwordRetryMax);
806
+ UniqueRef<CFArrayRef> items(loadKeychainItems(file, kSecItemTypeCertificate, 0, "", 0, 0));
987
807
  CFMutableArrayRef certificateAuthorities = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
988
- if(items)
808
+ int count = CFArrayGetCount(items.get());
809
+ for(CFIndex i = 0; i < count; ++i)
989
810
  {
990
- for(CFIndex i = 0, size = CFArrayGetCount(items); i < size; ++i)
811
+ SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(items.get(), i);
812
+ assert(SecCertificateGetTypeID() == CFGetTypeID(cert));
813
+ if(isCA(cert))
991
814
  {
992
- SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(items, i);
993
- if(isCA(cert))
994
- {
995
- CFArrayAppendValue(certificateAuthorities, cert);
996
- }
815
+ CFArrayAppendValue(certificateAuthorities, cert);
997
816
  }
998
- CFRelease(items);
999
817
  }
1000
818
  return certificateAuthorities;
1001
819
  }
1002
820
 
1003
821
  SecCertificateRef
1004
- IceSSL::findCertificates(SecKeychainRef keychain, const string& prop, const string& value)
822
+ IceSSL::findCertificate(SecKeychainRef keychain, const string& value)
1005
823
  {
1006
824
  //
1007
825
  // Search the keychain using key:value pairs. The following keys are supported:
@@ -1013,17 +831,19 @@ IceSSL::findCertificates(SecKeychainRef keychain, const string& prop, const stri
1013
831
  //
1014
832
  // A value must be enclosed in single or double quotes if it contains whitespace.
1015
833
  //
1016
- CFMutableDictionaryRef query =
1017
- CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
1018
-
834
+ UniqueRef<CFMutableDictionaryRef> query(CFDictionaryCreateMutable(0,
835
+ 0,
836
+ &kCFTypeDictionaryKeyCallBacks,
837
+ &kCFTypeDictionaryValueCallBacks));
838
+
1019
839
  const void* values[] = { keychain };
1020
- CFArrayRef searchList = CFArrayCreate(kCFAllocatorDefault, values, 1, &kCFTypeArrayCallBacks);
1021
-
1022
- CFDictionarySetValue(query, kSecMatchLimit, kSecMatchLimitOne);
1023
- CFDictionarySetValue(query, kSecMatchSearchList, searchList);
1024
- CFDictionarySetValue(query, kSecClass, kSecClassCertificate);
1025
- CFDictionarySetValue(query, kSecReturnRef, kCFBooleanTrue);
1026
- CFDictionarySetValue(query, kSecMatchCaseInsensitive, kCFBooleanTrue);
840
+ UniqueRef<CFArrayRef> searchList(CFArrayCreate(kCFAllocatorDefault, values, 1, &kCFTypeArrayCallBacks));
841
+
842
+ CFDictionarySetValue(query.get(), kSecMatchLimit, kSecMatchLimitOne);
843
+ CFDictionarySetValue(query.get(), kSecMatchSearchList, searchList.get());
844
+ CFDictionarySetValue(query.get(), kSecClass, kSecClassCertificate);
845
+ CFDictionarySetValue(query.get(), kSecReturnRef, kCFBooleanTrue);
846
+ CFDictionarySetValue(query.get(), kSecMatchCaseInsensitive, kCFBooleanTrue);
1027
847
 
1028
848
  size_t start = 0;
1029
849
  size_t pos;
@@ -1031,145 +851,107 @@ IceSSL::findCertificates(SecKeychainRef keychain, const string& prop, const stri
1031
851
  {
1032
852
  string field = IceUtilInternal::toUpper(IceUtilInternal::trim(value.substr(start, pos - start)));
1033
853
  string arg;
1034
- try
854
+ if(field != "LABEL" && field != "SERIAL" && field != "SUBJECT" && field != "SUBJECTKEYID")
1035
855
  {
1036
- if(field != "LABEL" && field != "SERIAL" && field != "SUBJECT" && field != "SUBJECTKEYID")
1037
- {
1038
- throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: unknown key in `" + value + "'");
1039
- }
856
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: unknown key in `" + value + "'");
857
+ }
1040
858
 
1041
- start = pos + 1;
1042
- while(start < value.size() && (value[start] == ' ' || value[start] == '\t'))
1043
- {
1044
- ++start;
1045
- }
1046
-
1047
- if(start == value.size())
1048
- {
1049
- throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: missing argument in `" + value + "'");
1050
- }
859
+ start = pos + 1;
860
+ while(start < value.size() && (value[start] == ' ' || value[start] == '\t'))
861
+ {
862
+ ++start;
863
+ }
864
+
865
+ if(start == value.size())
866
+ {
867
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: missing argument in `" + value + "'");
868
+ }
1051
869
 
1052
- if(value[start] == '"' || value[start] == '\'')
870
+ if(value[start] == '"' || value[start] == '\'')
871
+ {
872
+ size_t end = start;
873
+ ++end;
874
+ while(end < value.size())
1053
875
  {
1054
- size_t end = start;
1055
- ++end;
1056
- while(end < value.size())
1057
- {
1058
- if(value[end] == value[start] && value[end - 1] != '\\')
1059
- {
1060
- break;
1061
- }
1062
- ++end;
1063
- }
1064
- if(end == value.size() || value[end] != value[start])
876
+ if(value[end] == value[start] && value[end - 1] != '\\')
1065
877
  {
1066
- throw PluginInitializationException(__FILE__, __LINE__,
1067
- "IceSSL: unmatched quote in `" + value + "'");
878
+ break;
1068
879
  }
1069
- ++start;
1070
- arg = value.substr(start, end - start);
1071
- start = end + 1;
880
+ ++end;
1072
881
  }
1073
- else
882
+ if(end == value.size() || value[end] != value[start])
1074
883
  {
1075
- size_t end = value.find_first_of(" \t", start);
1076
- if(end == string::npos)
1077
- {
1078
- arg = value.substr(start);
1079
- start = value.size();
1080
- }
1081
- else
1082
- {
1083
- arg = value.substr(start, end - start);
1084
- start = end + 1;
1085
- }
884
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: unmatched quote in `" + value + "'");
1086
885
  }
886
+ ++start;
887
+ arg = value.substr(start, end - start);
888
+ start = end + 1;
1087
889
  }
1088
- catch(...)
890
+ else
1089
891
  {
1090
- CFRelease(searchList);
1091
- CFRelease(query);
1092
- throw;
892
+ size_t end = value.find_first_of(" \t", start);
893
+ if(end == string::npos)
894
+ {
895
+ arg = value.substr(start);
896
+ start = value.size();
897
+ }
898
+ else
899
+ {
900
+ arg = value.substr(start, end - start);
901
+ start = end + 1;
902
+ }
1093
903
  }
1094
904
 
1095
905
  if(field == "SUBJECT" || field == "LABEL")
1096
906
  {
1097
- CFDictionarySetValue(query, field == "LABEL" ? kSecAttrLabel : kSecMatchSubjectContains, toCFString(arg));
907
+ UniqueRef<CFStringRef> v(toCFString(arg));
908
+ CFDictionarySetValue(query.get(), field == "LABEL" ? kSecAttrLabel : kSecMatchSubjectContains, v.get());
1098
909
  }
1099
910
  else if(field == "SUBJECTKEYID" || field == "SERIAL")
1100
911
  {
1101
912
  vector<unsigned char> buffer;
1102
913
  if(!parseBytes(arg, buffer))
1103
914
  {
1104
- throw PluginInitializationException(__FILE__, __LINE__,
1105
- "IceSSL: invalid value `" + value + "' for property `" + prop + "'");
915
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: invalid value `" + value + "'");
1106
916
  }
1107
- CFDataRef data = CFDataCreate(kCFAllocatorDefault, &buffer[0], buffer.size());
1108
- CFDictionarySetValue(query, field == "SUBJECTKEYID" ? kSecAttrSubjectKeyID : kSecAttrSerialNumber, data);
917
+ UniqueRef<CFDataRef> v(CFDataCreate(kCFAllocatorDefault, &buffer[0], buffer.size()));
918
+ CFDictionarySetValue(query.get(), field == "SUBJECTKEYID" ? kSecAttrSubjectKeyID : kSecAttrSerialNumber,
919
+ v.get());
1109
920
  }
1110
921
  }
1111
922
 
1112
- SecKeychainItemRef item = 0;
1113
- OSStatus err = SecItemCopyMatching(query, (CFTypeRef*)&item);
1114
- CFRelease(searchList);
1115
- CFRelease(query);
1116
- if(err != noErr && err != errSecItemNotFound)
923
+ if(CFDictionaryGetCount(query.get()) == 5)
1117
924
  {
1118
- throw PluginInitializationException(__FILE__, __LINE__,
1119
- "Error searching for keychain items\n" + errorToString(err));
925
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: invalid value `" + value + "'");
1120
926
  }
1121
- return (SecCertificateRef)item;
1122
- }
1123
- #elif defined(ICE_USE_SCHANNEL)
1124
927
 
1125
- namespace
1126
- {
1127
- //
1128
- // Parse a string of the form "location.name" into two parts.
1129
- //
1130
- void
1131
- parseStore(const string& prop, const string& store, DWORD& loc, string& sname)
1132
- {
1133
- size_t pos = store.find('.');
1134
- if(pos == string::npos)
928
+ SecCertificateRef cert = 0;
929
+ OSStatus err = SecItemCopyMatching(query.get(), (CFTypeRef*)&cert);
930
+ if(err != noErr)
1135
931
  {
1136
- throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: property `" + prop + "' has invalid format");
932
+ throw PluginInitializationException(__FILE__, __LINE__,
933
+ "IceSSL: find certificate `" + value + "' failed:\n" + errorToString(err));
1137
934
  }
935
+ return cert;
936
+ }
1138
937
 
1139
- const string sloc = IceUtilInternal::toUpper(store.substr(0, pos));
1140
- if(sloc == "CURRENTUSER")
1141
- {
1142
- loc = CERT_SYSTEM_STORE_CURRENT_USER;
1143
- }
1144
- else if(sloc == "LOCALMACHINE")
1145
- {
1146
- loc = CERT_SYSTEM_STORE_LOCAL_MACHINE;
1147
- }
1148
- else
1149
- {
1150
- throw PluginInitializationException(__FILE__, __LINE__,
1151
- "IceSSL: unknown store location `" + sloc + "' in " + prop);
1152
- }
938
+ #elif defined(ICE_USE_SCHANNEL)
1153
939
 
1154
- sname = store.substr(pos + 1);
1155
- if(sname.empty())
1156
- {
1157
- throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: invalid store name in " + prop);
1158
- }
1159
- }
940
+ namespace
941
+ {
1160
942
 
1161
943
  void
1162
944
  addMatchingCertificates(HCERTSTORE source, HCERTSTORE target, DWORD findType, const void* findParam)
1163
945
  {
1164
946
  PCCERT_CONTEXT next = 0;
1165
947
  do
1166
- {
1167
- if((next = CertFindCertificateInStore(source, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
948
+ {
949
+ if((next = CertFindCertificateInStore(source, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
1168
950
  findType, findParam, next)))
1169
951
  {
1170
952
  if(!CertAddCertificateContextToStore(target, next, CERT_STORE_ADD_ALWAYS, 0))
1171
953
  {
1172
- throw PluginInitializationException(__FILE__, __LINE__,
954
+ throw PluginInitializationException(__FILE__, __LINE__,
1173
955
  "IceSSL: error adding certificate to store:\n" + IceUtilInternal::lastErrorToString());
1174
956
  }
1175
957
  }
@@ -1179,18 +961,24 @@ addMatchingCertificates(HCERTSTORE source, HCERTSTORE target, DWORD findType, co
1179
961
 
1180
962
  }
1181
963
 
1182
- vector<PCCERT_CONTEXT>
1183
- IceSSL::findCertificates(const string& prop, const string& storeSpec, const string& value, vector<HCERTSTORE>& stores)
964
+ vector<PCCERT_CONTEXT>
965
+ IceSSL::findCertificates(const string& location, const string& name, const string& value, vector<HCERTSTORE>& stores)
1184
966
  {
1185
- DWORD storeLoc = 0;
1186
- string storeName;
1187
- parseStore(prop, storeSpec, storeLoc, storeName);
967
+ DWORD storeLoc;
968
+ if(location == "CurrentUser")
969
+ {
970
+ storeLoc = CERT_SYSTEM_STORE_CURRENT_USER;
971
+ }
972
+ else
973
+ {
974
+ storeLoc = CERT_SYSTEM_STORE_LOCAL_MACHINE;
975
+ }
1188
976
 
1189
- HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, storeLoc, stringToWstring(storeName).c_str());
977
+ HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, storeLoc, stringToWstring(name).c_str());
1190
978
  if(!store)
1191
979
  {
1192
- throw PluginInitializationException(__FILE__, __LINE__,
1193
- "IceSSL: failure while opening store specified by " + prop + ":\n" + IceUtilInternal::lastErrorToString());
980
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: failed to open certificate store `" + name +
981
+ "':\n" + IceUtilInternal::lastErrorToString());
1194
982
  }
1195
983
 
1196
984
  //
@@ -1214,12 +1002,16 @@ IceSSL::findCertificates(const string& prop, const string& storeSpec, const stri
1214
1002
  {
1215
1003
  if(value != "*")
1216
1004
  {
1005
+ if(value.find(':', 0) == string::npos)
1006
+ {
1007
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: no key in `" + value + "'");
1008
+ }
1217
1009
  size_t start = 0;
1218
1010
  size_t pos;
1219
1011
  while((pos = value.find(':', start)) != string::npos)
1220
1012
  {
1221
1013
  string field = IceUtilInternal::toUpper(IceUtilInternal::trim(value.substr(start, pos - start)));
1222
- if(field != "SUBJECT" && field != "SUBJECTDN" && field != "ISSUER" && field != "ISSUERDN" &&
1014
+ if(field != "SUBJECT" && field != "SUBJECTDN" && field != "ISSUER" && field != "ISSUERDN" &&
1223
1015
  field != "THUMBPRINT" && field != "SUBJECTKEYID" && field != "SERIAL")
1224
1016
  {
1225
1017
  throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: unknown key in `" + value + "'");
@@ -1230,10 +1022,11 @@ IceSSL::findCertificates(const string& prop, const string& storeSpec, const stri
1230
1022
  {
1231
1023
  ++start;
1232
1024
  }
1233
-
1025
+
1234
1026
  if(start == value.size())
1235
1027
  {
1236
- throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: missing argument in `" + value + "'");
1028
+ throw PluginInitializationException(__FILE__, __LINE__,
1029
+ "IceSSL: missing argument in `" + value + "'");
1237
1030
  }
1238
1031
 
1239
1032
  string arg;
@@ -1251,7 +1044,7 @@ IceSSL::findCertificates(const string& prop, const string& storeSpec, const stri
1251
1044
  }
1252
1045
  if(end == value.size() || value[end] != value[start])
1253
1046
  {
1254
- throw PluginInitializationException(__FILE__, __LINE__,
1047
+ throw PluginInitializationException(__FILE__, __LINE__,
1255
1048
  "IceSSL: unmatched quote in `" + value + "'");
1256
1049
  }
1257
1050
  ++start;
@@ -1276,7 +1069,7 @@ IceSSL::findCertificates(const string& prop, const string& storeSpec, const stri
1276
1069
  tmpStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 0, 0);
1277
1070
  if(!tmpStore)
1278
1071
  {
1279
- throw PluginInitializationException(__FILE__, __LINE__,
1072
+ throw PluginInitializationException(__FILE__, __LINE__,
1280
1073
  "IceSSL: error adding certificate to store:\n" + IceUtilInternal::lastErrorToString());
1281
1074
  }
1282
1075
 
@@ -1289,35 +1082,45 @@ IceSSL::findCertificates(const string& prop, const string& storeSpec, const stri
1289
1082
  else if(field == "SUBJECTDN" || field == "ISSUERDN")
1290
1083
  {
1291
1084
  const wstring argW = stringToWstring(arg);
1292
- DWORD length = 0;
1293
- if(!CertStrToNameW(X509_ASN_ENCODING, argW.c_str(), CERT_OID_NAME_STR | CERT_NAME_STR_REVERSE_FLAG,
1294
- 0, 0, &length, 0))
1085
+ DWORD flags[] = {
1086
+ CERT_OID_NAME_STR,
1087
+ CERT_OID_NAME_STR | CERT_NAME_STR_REVERSE_FLAG,
1088
+ CERT_OID_NAME_STR | CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG,
1089
+ CERT_OID_NAME_STR | CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG | CERT_NAME_STR_REVERSE_FLAG
1090
+ };
1091
+ for(size_t i = 0; i < sizeof(flags) / sizeof(DWORD); ++i)
1295
1092
  {
1296
- throw PluginInitializationException(__FILE__, __LINE__,
1297
- "IceSSL: invalid value `" + value + "' for property `" + prop + "'\n" +
1298
- IceUtilInternal::lastErrorToString());
1299
- }
1093
+ DWORD length = 0;
1094
+ if(!CertStrToNameW(X509_ASN_ENCODING, argW.c_str(), flags[i], 0, 0, &length, 0))
1095
+ {
1096
+ throw PluginInitializationException(
1097
+ __FILE__, __LINE__,
1098
+ "IceSSL: invalid value `" + value + "' for `IceSSL.FindCert' property:\n" +
1099
+ IceUtilInternal::lastErrorToString());
1100
+ }
1300
1101
 
1301
- vector<BYTE> buffer(length);
1302
- if(!CertStrToNameW(X509_ASN_ENCODING, argW.c_str(), CERT_OID_NAME_STR | CERT_NAME_STR_REVERSE_FLAG,
1303
- 0, &buffer[0], &length, 0))
1304
- {
1305
- throw PluginInitializationException(__FILE__, __LINE__,
1306
- "IceSSL: invalid value `" + value + "' for property `" + prop + "'\n" +
1307
- IceUtilInternal::lastErrorToString());
1308
- }
1102
+ vector<BYTE> buffer(length);
1103
+ if(!CertStrToNameW(X509_ASN_ENCODING, argW.c_str(), flags[i], 0, &buffer[0], &length, 0))
1104
+ {
1105
+ throw PluginInitializationException(
1106
+ __FILE__, __LINE__,
1107
+ "IceSSL: invalid value `" + value + "' for `IceSSL.FindCert' property:\n" +
1108
+ IceUtilInternal::lastErrorToString());
1109
+ }
1309
1110
 
1310
- CERT_NAME_BLOB name = { length, &buffer[0] };
1311
- DWORD findType = field == "SUBJECTDN" ? CERT_FIND_SUBJECT_NAME : CERT_FIND_ISSUER_NAME;
1312
- addMatchingCertificates(store, tmpStore, findType, &name);
1111
+ CERT_NAME_BLOB name = { length, &buffer[0] };
1112
+
1113
+ DWORD findType = field == "SUBJECTDN" ? CERT_FIND_SUBJECT_NAME : CERT_FIND_ISSUER_NAME;
1114
+ addMatchingCertificates(store, tmpStore, findType, &name);
1115
+ }
1313
1116
  }
1314
1117
  else if(field == "THUMBPRINT" || field == "SUBJECTKEYID")
1315
1118
  {
1316
1119
  vector<BYTE> buffer;
1317
1120
  if(!parseBytes(arg, buffer))
1318
1121
  {
1319
- throw PluginInitializationException(__FILE__, __LINE__,
1320
- "IceSSL: invalid value `" + value + "' for property `" + prop + "'");
1122
+ throw PluginInitializationException(__FILE__, __LINE__,
1123
+ "IceSSL: invalid `IceSSL.FindCert' property: can't decode the value");
1321
1124
  }
1322
1125
 
1323
1126
  CRYPT_HASH_BLOB hash = { static_cast<DWORD>(buffer.size()), &buffer[0] };
@@ -1329,22 +1132,22 @@ IceSSL::findCertificates(const string& prop, const string& storeSpec, const stri
1329
1132
  vector<BYTE> buffer;
1330
1133
  if(!parseBytes(arg, buffer))
1331
1134
  {
1332
- throw PluginInitializationException(__FILE__, __LINE__,
1333
- "IceSSL: invalid value `" + value + "' for property `" + prop + "'");
1135
+ throw PluginInitializationException(__FILE__, __LINE__,
1136
+ "IceSSL: invalid value `" + value + "' for `IceSSL.FindCert' property");
1334
1137
  }
1335
-
1138
+
1336
1139
  CRYPT_INTEGER_BLOB serial = { static_cast<DWORD>(buffer.size()), &buffer[0] };
1337
1140
  PCCERT_CONTEXT next = 0;
1338
1141
  do
1339
1142
  {
1340
- if((next = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
1143
+ if((next = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
1341
1144
  CERT_FIND_ANY, 0, next)))
1342
1145
  {
1343
1146
  if(CertCompareIntegerBlob(&serial, &next->pCertInfo->SerialNumber))
1344
1147
  {
1345
1148
  if(!CertAddCertificateContextToStore(tmpStore, next, CERT_STORE_ADD_ALWAYS, 0))
1346
1149
  {
1347
- throw PluginInitializationException(__FILE__, __LINE__,
1150
+ throw PluginInitializationException(__FILE__, __LINE__,
1348
1151
  "IceSSL: error adding certificate to store:\n" +
1349
1152
  IceUtilInternal::lastErrorToString());
1350
1153
  }
@@ -1378,8 +1181,8 @@ IceSSL::findCertificates(const string& prop, const string& storeSpec, const stri
1378
1181
  {
1379
1182
  PCCERT_CONTEXT next = 0;
1380
1183
  do
1381
- {
1382
- if((next = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, 0,
1184
+ {
1185
+ if((next = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, 0,
1383
1186
  next)))
1384
1187
  {
1385
1188
  certs.push_back(next);
@@ -1393,31 +1196,35 @@ IceSSL::findCertificates(const string& prop, const string& storeSpec, const stri
1393
1196
  #endif
1394
1197
 
1395
1198
  bool
1396
- IceSSL::checkPath(string& path, const string& defaultDir, bool dir)
1199
+ IceSSL::checkPath(const string& path, const string& defaultDir, bool dir, string& resolved)
1397
1200
  {
1398
- //
1399
- // Check if file exists. If not, try prepending the default
1400
- // directory and check again. If the path exists, the string
1401
- // argument is modified and true is returned. Otherwise
1402
- // false is returned.
1403
- //
1404
- IceUtilInternal::structstat st;
1405
- int err = IceUtilInternal::stat(path, &st);
1406
- if(err == 0)
1201
+ if(IceUtilInternal::isAbsolutePath(path))
1407
1202
  {
1408
- return dir ? S_ISDIR(st.st_mode) != 0 : S_ISREG(st.st_mode) != 0;
1203
+ if((dir && IceUtilInternal::directoryExists(path)) || (!dir && IceUtilInternal::fileExists(path)))
1204
+ {
1205
+ resolved = path;
1206
+ return true;
1207
+ }
1208
+ return false;
1409
1209
  }
1410
1210
 
1211
+ //
1212
+ // If a default directory is provided, the given path is relative to the default directory.
1213
+ //
1214
+ string tmp;
1411
1215
  if(!defaultDir.empty())
1412
1216
  {
1413
- string s = defaultDir + IceUtilInternal::separator + path;
1414
- err = ::IceUtilInternal::stat(s.c_str(), &st);
1415
- if(err == 0 && ((!dir && S_ISREG(st.st_mode)) || (dir && S_ISDIR(st.st_mode))))
1416
- {
1417
- path = s;
1418
- return true;
1419
- }
1217
+ tmp = defaultDir + IceUtilInternal::separator + path;
1218
+ }
1219
+ else
1220
+ {
1221
+ tmp = path;
1420
1222
  }
1421
1223
 
1224
+ if((dir && IceUtilInternal::directoryExists(tmp)) || (!dir && IceUtilInternal::fileExists(tmp)))
1225
+ {
1226
+ resolved = tmp;
1227
+ return true;
1228
+ }
1422
1229
  return false;
1423
1230
  }