zeroc-ice 3.6b1 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (679) hide show
  1. checksums.yaml +4 -4
  2. data/{ext/ice/BZIP_LICENSE → BZIP2_LICENSE} +0 -0
  3. data/ICE_LICENSE +8 -14
  4. data/LICENSE +2 -1
  5. data/{ext/ice/MCPP_LICENSE → MCPP_LICENSE} +2 -9
  6. data/bin/slice2rb +1 -1
  7. data/ext/Communicator.cpp +1 -1
  8. data/ext/Communicator.h +1 -1
  9. data/ext/Config.h +1 -22
  10. data/ext/Connection.cpp +125 -13
  11. data/ext/Connection.h +1 -1
  12. data/ext/Endpoint.cpp +62 -3
  13. data/ext/Endpoint.h +1 -1
  14. data/ext/ImplicitContext.cpp +1 -1
  15. data/ext/ImplicitContext.h +1 -1
  16. data/ext/Init.cpp +8 -1
  17. data/ext/Logger.cpp +1 -1
  18. data/ext/Logger.h +1 -1
  19. data/ext/ObjectFactory.cpp +1 -1
  20. data/ext/ObjectFactory.h +1 -1
  21. data/ext/Operation.cpp +1 -1
  22. data/ext/Operation.h +1 -1
  23. data/ext/Properties.cpp +1 -1
  24. data/ext/Properties.h +1 -1
  25. data/ext/Proxy.cpp +1 -1
  26. data/ext/Proxy.h +1 -1
  27. data/ext/Slice.cpp +1 -1
  28. data/ext/Slice.h +1 -1
  29. data/ext/Types.cpp +65 -17
  30. data/ext/Types.h +4 -1
  31. data/ext/Util.cpp +49 -58
  32. data/ext/Util.h +1 -1
  33. data/ext/extconf.rb +17 -15
  34. data/ext/ice/cpp/include/Ice/ACMF.h +1 -1
  35. data/ext/ice/cpp/include/Ice/Application.h +1 -1
  36. data/ext/ice/cpp/include/Ice/AsyncResult.h +1 -1
  37. data/ext/ice/cpp/include/Ice/AsyncResultF.h +1 -1
  38. data/ext/ice/cpp/include/Ice/BasicStream.h +1 -1
  39. data/ext/ice/cpp/include/Ice/BatchRequestInterceptor.h +52 -0
  40. data/ext/ice/cpp/include/Ice/BatchRequestQueueF.h +25 -0
  41. data/ext/ice/cpp/include/Ice/Buffer.h +1 -1
  42. data/ext/ice/cpp/include/Ice/BuiltinSequences.h +12 -4
  43. data/ext/ice/cpp/include/Ice/Communicator.h +12 -4
  44. data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +1 -1
  45. data/ext/ice/cpp/include/Ice/CommunicatorF.h +12 -4
  46. data/ext/ice/cpp/include/Ice/Config.h +13 -8
  47. data/ext/ice/cpp/include/Ice/Connection.h +41 -16
  48. data/ext/ice/cpp/include/Ice/ConnectionAsync.h +1 -1
  49. data/ext/ice/cpp/include/Ice/ConnectionF.h +12 -4
  50. data/ext/ice/cpp/include/Ice/ConnectionFactoryF.h +1 -1
  51. data/ext/ice/cpp/include/Ice/ConnectionIF.h +1 -1
  52. data/ext/ice/cpp/include/Ice/Current.h +12 -4
  53. data/ext/ice/cpp/include/Ice/DefaultObjectFactory.h +1 -1
  54. data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +1 -1
  55. data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +1 -1
  56. data/ext/ice/cpp/include/Ice/Dispatcher.h +1 -1
  57. data/ext/ice/cpp/include/Ice/DynamicLibrary.h +1 -1
  58. data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +1 -1
  59. data/ext/ice/cpp/include/Ice/Endpoint.h +16 -6
  60. data/ext/ice/cpp/include/Ice/EndpointF.h +12 -4
  61. data/ext/ice/cpp/include/Ice/EndpointTypes.h +12 -4
  62. data/ext/ice/cpp/include/Ice/Exception.h +3 -3
  63. data/ext/ice/cpp/include/Ice/FacetMap.h +12 -4
  64. data/ext/ice/cpp/include/Ice/FactoryTable.h +1 -1
  65. data/ext/ice/cpp/include/Ice/FactoryTableInit.h +1 -1
  66. data/ext/ice/cpp/include/Ice/Format.h +1 -1
  67. data/ext/ice/cpp/include/Ice/Functional.h +1 -1
  68. data/ext/ice/cpp/include/Ice/GCObject.h +5 -1
  69. data/ext/ice/cpp/include/Ice/Handle.h +1 -1
  70. data/ext/ice/cpp/include/Ice/Ice.h +4 -3
  71. data/ext/ice/cpp/include/Ice/Identity.h +13 -5
  72. data/ext/ice/cpp/include/Ice/ImplicitContext.h +12 -4
  73. data/ext/ice/cpp/include/Ice/ImplicitContextF.h +12 -4
  74. data/ext/ice/cpp/include/Ice/Incoming.h +1 -1
  75. data/ext/ice/cpp/include/Ice/IncomingAsync.h +1 -1
  76. data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +1 -1
  77. data/ext/ice/cpp/include/Ice/Initialize.h +4 -2
  78. data/ext/ice/cpp/include/Ice/InstanceF.h +1 -1
  79. data/ext/ice/cpp/include/Ice/Instrumentation.h +12 -4
  80. data/ext/ice/cpp/include/Ice/InstrumentationF.h +12 -4
  81. data/ext/ice/cpp/include/Ice/LocalException.h +12 -4
  82. data/ext/ice/cpp/include/Ice/LocalObject.h +1 -1
  83. data/ext/ice/cpp/include/Ice/LocalObjectF.h +1 -1
  84. data/ext/ice/cpp/include/Ice/Locator.h +137 -129
  85. data/ext/ice/cpp/include/Ice/LocatorF.h +12 -4
  86. data/ext/ice/cpp/include/Ice/Logger.h +12 -4
  87. data/ext/ice/cpp/include/Ice/LoggerF.h +12 -4
  88. data/ext/ice/cpp/include/Ice/LoggerUtil.h +1 -1
  89. data/ext/ice/cpp/include/Ice/Metrics.h +144 -136
  90. data/ext/ice/cpp/include/Ice/MetricsAdminI.h +1 -1
  91. data/ext/ice/cpp/include/Ice/MetricsFunctional.h +1 -1
  92. data/ext/ice/cpp/include/Ice/MetricsObserverI.h +35 -26
  93. data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +1 -1
  94. data/ext/ice/cpp/include/Ice/Object.h +1 -1
  95. data/ext/ice/cpp/include/Ice/ObjectAdapter.h +12 -4
  96. data/ext/ice/cpp/include/Ice/ObjectAdapterF.h +12 -4
  97. data/ext/ice/cpp/include/Ice/ObjectAdapterFactoryF.h +1 -1
  98. data/ext/ice/cpp/include/Ice/ObjectF.h +1 -1
  99. data/ext/ice/cpp/include/Ice/ObjectFactory.h +12 -4
  100. data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +12 -4
  101. data/ext/ice/cpp/include/Ice/ObjectFactoryManagerF.h +1 -1
  102. data/ext/ice/cpp/include/Ice/ObserverHelper.h +1 -1
  103. data/ext/ice/cpp/include/Ice/Outgoing.h +67 -39
  104. data/ext/ice/cpp/include/Ice/OutgoingAsync.h +31 -34
  105. data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +4 -4
  106. data/ext/ice/cpp/include/Ice/Plugin.h +12 -4
  107. data/ext/ice/cpp/include/Ice/PluginF.h +12 -4
  108. data/ext/ice/cpp/include/Ice/Process.h +36 -28
  109. data/ext/ice/cpp/include/Ice/ProcessF.h +12 -4
  110. data/ext/ice/cpp/include/Ice/Properties.h +12 -4
  111. data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +86 -78
  112. data/ext/ice/cpp/include/Ice/PropertiesF.h +12 -4
  113. data/ext/ice/cpp/include/Ice/Protocol.h +1 -1
  114. data/ext/ice/cpp/include/Ice/Proxy.h +6 -2
  115. data/ext/ice/cpp/include/Ice/ProxyF.h +1 -1
  116. data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +1 -1
  117. data/ext/ice/cpp/include/Ice/ProxyHandle.h +1 -1
  118. data/ext/ice/cpp/include/Ice/ReferenceF.h +1 -1
  119. data/ext/ice/cpp/include/Ice/RemoteLogger.h +137 -129
  120. data/ext/ice/cpp/include/Ice/RequestHandlerF.h +1 -1
  121. data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +1 -1
  122. data/ext/ice/cpp/include/Ice/Router.h +37 -29
  123. data/ext/ice/cpp/include/Ice/RouterF.h +12 -4
  124. data/ext/ice/cpp/include/Ice/ServantLocator.h +12 -4
  125. data/ext/ice/cpp/include/Ice/ServantLocatorF.h +12 -4
  126. data/ext/ice/cpp/include/Ice/ServantManagerF.h +1 -1
  127. data/ext/ice/cpp/include/Ice/Service.h +1 -1
  128. data/ext/ice/cpp/include/Ice/SliceChecksumDict.h +12 -4
  129. data/ext/ice/cpp/include/Ice/SliceChecksums.h +1 -1
  130. data/ext/ice/cpp/include/Ice/SlicedData.h +1 -6
  131. data/ext/ice/cpp/include/Ice/SlicedDataF.h +1 -1
  132. data/ext/ice/cpp/include/Ice/Stream.h +3 -5
  133. data/ext/ice/cpp/include/Ice/StreamF.h +1 -1
  134. data/ext/ice/cpp/include/Ice/StreamHelpers.h +1 -1
  135. data/ext/ice/cpp/include/Ice/ThreadPoolF.h +1 -1
  136. data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +1 -1
  137. data/ext/ice/cpp/include/Ice/Version.h +14 -6
  138. data/ext/ice/cpp/include/IceSSL/Config.h +19 -1
  139. data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +61 -7
  140. data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +52 -5
  141. data/ext/ice/cpp/include/IceSSL/IceSSL.h +2 -2
  142. data/ext/ice/cpp/include/IceSSL/Plugin.h +32 -26
  143. data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +1 -1
  144. data/ext/ice/cpp/include/IceUtil/Atomic.h +186 -0
  145. data/ext/ice/cpp/include/IceUtil/Cache.h +1 -1
  146. data/ext/ice/cpp/include/IceUtil/Cond.h +1 -1
  147. data/ext/ice/cpp/include/IceUtil/Config.h +31 -20
  148. data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +1 -1
  149. data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +1 -1
  150. data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +9 -2
  151. data/ext/ice/cpp/include/IceUtil/Exception.h +4 -3
  152. data/ext/ice/cpp/include/IceUtil/Functional.h +1 -1
  153. data/ext/ice/cpp/include/IceUtil/Handle.h +1 -1
  154. data/ext/ice/cpp/include/IceUtil/IceUtil.h +2 -2
  155. data/ext/ice/cpp/include/IceUtil/IconvStringConverter.h +1 -1
  156. data/ext/ice/cpp/include/IceUtil/InputUtil.h +1 -1
  157. data/ext/ice/cpp/include/IceUtil/Iterator.h +1 -1
  158. data/ext/ice/cpp/include/IceUtil/Lock.h +1 -1
  159. data/ext/ice/cpp/include/IceUtil/Monitor.h +1 -1
  160. data/ext/ice/cpp/include/IceUtil/Mutex.h +1 -1
  161. data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +1 -1
  162. data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +1 -1
  163. data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +1 -1
  164. data/ext/ice/cpp/include/IceUtil/Optional.h +1 -1
  165. data/ext/ice/cpp/include/IceUtil/Options.h +1 -1
  166. data/ext/ice/cpp/include/IceUtil/OutputUtil.h +8 -11
  167. data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +1 -1
  168. data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +5 -1
  169. data/ext/ice/cpp/include/IceUtil/Random.h +1 -1
  170. data/ext/ice/cpp/include/IceUtil/RecMutex.h +1 -1
  171. data/ext/ice/cpp/include/IceUtil/SHA1.h +8 -26
  172. data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +5 -5
  173. data/ext/ice/cpp/include/IceUtil/ScopedArray.h +1 -1
  174. data/ext/ice/cpp/include/IceUtil/Shared.h +3 -37
  175. data/ext/ice/cpp/include/IceUtil/StringUtil.h +1 -1
  176. data/ext/ice/cpp/include/IceUtil/Thread.h +1 -1
  177. data/ext/ice/cpp/include/IceUtil/ThreadException.h +1 -1
  178. data/ext/ice/cpp/include/IceUtil/Time.h +1 -1
  179. data/ext/ice/cpp/include/IceUtil/Timer.h +1 -1
  180. data/ext/ice/cpp/include/IceUtil/UUID.h +1 -1
  181. data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +1 -1
  182. data/ext/ice/cpp/include/IceUtil/UniquePtr.h +1 -1
  183. data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +7 -6
  184. data/ext/ice/cpp/include/Slice/Checksum.h +1 -1
  185. data/ext/ice/cpp/include/Slice/CsUtil.h +1 -1
  186. data/ext/ice/cpp/include/Slice/DotNetNames.h +1 -1
  187. data/ext/ice/cpp/include/Slice/FileTracker.h +1 -1
  188. data/ext/ice/cpp/include/Slice/JavaUtil.h +3 -1
  189. data/ext/ice/cpp/include/Slice/ObjCUtil.h +127 -0
  190. data/ext/ice/cpp/include/Slice/PHPUtil.h +1 -1
  191. data/ext/ice/cpp/include/Slice/Parser.h +18 -12
  192. data/ext/ice/cpp/include/Slice/Preprocessor.h +6 -4
  193. data/ext/ice/cpp/include/Slice/PythonUtil.h +1 -1
  194. data/ext/ice/cpp/include/Slice/RubyUtil.h +1 -1
  195. data/ext/ice/cpp/include/Slice/Util.h +20 -2
  196. data/ext/ice/cpp/src/Ice/ACM.cpp +1 -1
  197. data/ext/ice/cpp/src/Ice/ACM.h +1 -1
  198. data/ext/ice/cpp/src/Ice/Acceptor.cpp +1 -1
  199. data/ext/ice/cpp/src/Ice/Acceptor.h +1 -1
  200. data/ext/ice/cpp/src/Ice/AcceptorF.h +1 -1
  201. data/ext/ice/cpp/src/Ice/AsyncResult.cpp +1 -1
  202. data/ext/ice/cpp/src/Ice/Base64.cpp +1 -1
  203. data/ext/ice/cpp/src/Ice/Base64.h +1 -1
  204. data/ext/ice/cpp/src/Ice/BasicStream.cpp +7 -5
  205. data/ext/ice/cpp/src/Ice/BatchRequestQueue.cpp +227 -0
  206. data/ext/ice/cpp/src/Ice/BatchRequestQueue.h +59 -0
  207. data/ext/ice/cpp/src/Ice/Buffer.cpp +3 -3
  208. data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +10 -4
  209. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +82 -282
  210. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +8 -21
  211. data/ext/ice/cpp/src/Ice/Communicator.cpp +11 -5
  212. data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +10 -4
  213. data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +6 -6
  214. data/ext/ice/cpp/src/Ice/CommunicatorI.h +1 -1
  215. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +42 -180
  216. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +10 -19
  217. data/ext/ice/cpp/src/Ice/ConnectRequestHandlerF.h +25 -0
  218. data/ext/ice/cpp/src/Ice/Connection.cpp +17 -11
  219. data/ext/ice/cpp/src/Ice/ConnectionF.cpp +10 -4
  220. data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +137 -51
  221. data/ext/ice/cpp/src/Ice/ConnectionFactory.h +18 -8
  222. data/ext/ice/cpp/src/Ice/ConnectionI.cpp +105 -391
  223. data/ext/ice/cpp/src/Ice/ConnectionI.h +25 -23
  224. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +5 -29
  225. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +3 -8
  226. data/ext/ice/cpp/src/Ice/Connector.cpp +1 -1
  227. data/ext/ice/cpp/src/Ice/Connector.h +1 -1
  228. data/ext/ice/cpp/src/Ice/ConnectorF.h +1 -1
  229. data/ext/ice/cpp/src/Ice/Current.cpp +10 -4
  230. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +1 -1
  231. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +1 -1
  232. data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +1 -1
  233. data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +1 -1
  234. data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +1 -1
  235. data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +1 -1
  236. data/ext/ice/cpp/src/Ice/Endpoint.cpp +17 -11
  237. data/ext/ice/cpp/src/Ice/EndpointF.cpp +10 -4
  238. data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +19 -1
  239. data/ext/ice/cpp/src/Ice/EndpointFactory.h +13 -1
  240. data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +1 -1
  241. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +1 -1
  242. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +1 -1
  243. data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +1 -1
  244. data/ext/ice/cpp/src/Ice/EndpointI.cpp +1 -1
  245. data/ext/ice/cpp/src/Ice/EndpointI.h +33 -1
  246. data/ext/ice/cpp/src/Ice/EndpointIF.h +1 -1
  247. data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +10 -4
  248. data/ext/ice/cpp/src/Ice/EventHandler.cpp +1 -1
  249. data/ext/ice/cpp/src/Ice/EventHandler.h +4 -1
  250. data/ext/ice/cpp/src/Ice/EventHandlerF.h +1 -1
  251. data/ext/ice/cpp/src/Ice/Exception.cpp +20 -11
  252. data/ext/ice/cpp/src/Ice/FacetMap.cpp +10 -4
  253. data/ext/ice/cpp/src/Ice/FactoryTable.cpp +1 -1
  254. data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +2 -2
  255. data/ext/ice/cpp/src/Ice/GCObject.cpp +1 -1
  256. data/ext/ice/cpp/src/Ice/HashUtil.h +1 -1
  257. data/ext/ice/cpp/src/Ice/HttpParser.cpp +27 -15
  258. data/ext/ice/cpp/src/Ice/HttpParser.h +4 -6
  259. data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +7 -1
  260. data/ext/ice/cpp/src/Ice/IPEndpointI.h +2 -1
  261. data/ext/ice/cpp/src/Ice/IPEndpointIF.h +1 -1
  262. data/ext/ice/cpp/src/Ice/Identity.cpp +11 -5
  263. data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +11 -5
  264. data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +10 -4
  265. data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +1 -1
  266. data/ext/ice/cpp/src/Ice/ImplicitContextI.h +1 -1
  267. data/ext/ice/cpp/src/Ice/Incoming.cpp +22 -20
  268. data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +1 -1
  269. data/ext/ice/cpp/src/Ice/IncomingRequest.h +1 -1
  270. data/ext/ice/cpp/src/Ice/Initialize.cpp +31 -5
  271. data/ext/ice/cpp/src/Ice/Instance.cpp +102 -59
  272. data/ext/ice/cpp/src/Ice/Instance.h +28 -2
  273. data/ext/ice/cpp/src/Ice/Instrumentation.cpp +20 -14
  274. data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +10 -4
  275. data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +1 -1
  276. data/ext/ice/cpp/src/Ice/InstrumentationI.h +1 -1
  277. data/ext/ice/cpp/src/Ice/LocalException.cpp +10 -4
  278. data/ext/ice/cpp/src/Ice/LocalObject.cpp +1 -1
  279. data/ext/ice/cpp/src/Ice/Locator.cpp +83 -77
  280. data/ext/ice/cpp/src/Ice/LocatorF.cpp +10 -4
  281. data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +77 -69
  282. data/ext/ice/cpp/src/Ice/LocatorInfo.h +1 -1
  283. data/ext/ice/cpp/src/Ice/LocatorInfoF.h +1 -1
  284. data/ext/ice/cpp/src/Ice/Logger.cpp +11 -5
  285. data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +1 -1
  286. data/ext/ice/cpp/src/Ice/LoggerAdminI.h +1 -1
  287. data/ext/ice/cpp/src/Ice/LoggerF.cpp +10 -4
  288. data/ext/ice/cpp/src/Ice/LoggerI.cpp +10 -8
  289. data/ext/ice/cpp/src/Ice/LoggerI.h +1 -1
  290. data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +2 -2
  291. data/ext/ice/cpp/src/Ice/Metrics.cpp +122 -116
  292. data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +1 -1
  293. data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +1 -1
  294. data/ext/ice/cpp/src/Ice/Network.cpp +63 -19
  295. data/ext/ice/cpp/src/Ice/Network.h +10 -3
  296. data/ext/ice/cpp/src/Ice/NetworkF.h +1 -1
  297. data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +1 -1
  298. data/ext/ice/cpp/src/Ice/NetworkProxy.h +1 -1
  299. data/ext/ice/cpp/src/Ice/NetworkProxyF.h +1 -1
  300. data/ext/ice/cpp/src/Ice/Object.cpp +1 -1
  301. data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +11 -5
  302. data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +10 -4
  303. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +9 -9
  304. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +2 -2
  305. data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +3 -3
  306. data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +5 -5
  307. data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +11 -5
  308. data/ext/ice/cpp/src/Ice/ObjectFactoryF.cpp +10 -4
  309. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +9 -10
  310. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +1 -1
  311. data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +1 -1
  312. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +6 -5
  313. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +1 -1
  314. data/ext/ice/cpp/src/Ice/Outgoing.cpp +209 -254
  315. data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +120 -106
  316. data/ext/ice/cpp/src/Ice/Plugin.cpp +12 -6
  317. data/ext/ice/cpp/src/Ice/PluginF.cpp +10 -4
  318. data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +21 -2
  319. data/ext/ice/cpp/src/Ice/Process.cpp +25 -19
  320. data/ext/ice/cpp/src/Ice/ProcessF.cpp +10 -4
  321. data/ext/ice/cpp/src/Ice/Properties.cpp +11 -5
  322. data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +39 -33
  323. data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +1 -1
  324. data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +1 -1
  325. data/ext/ice/cpp/src/Ice/PropertiesF.cpp +10 -4
  326. data/ext/ice/cpp/src/Ice/PropertiesI.cpp +1 -1
  327. data/ext/ice/cpp/src/Ice/PropertiesI.h +1 -1
  328. data/ext/ice/cpp/src/Ice/PropertyNames.cpp +12 -8
  329. data/ext/ice/cpp/src/Ice/PropertyNames.h +2 -2
  330. data/ext/ice/cpp/src/Ice/Protocol.cpp +7 -7
  331. data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +9 -6
  332. data/ext/ice/cpp/src/Ice/ProtocolInstance.h +25 -7
  333. data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +1 -1
  334. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +1 -1
  335. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +1 -1
  336. data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +1 -1
  337. data/ext/ice/cpp/src/Ice/Proxy.cpp +32 -13
  338. data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +1 -1
  339. data/ext/ice/cpp/src/Ice/ProxyFactory.h +1 -1
  340. data/ext/ice/cpp/src/Ice/Reference.cpp +101 -86
  341. data/ext/ice/cpp/src/Ice/Reference.h +16 -9
  342. data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +1 -1
  343. data/ext/ice/cpp/src/Ice/ReferenceFactory.h +1 -1
  344. data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +1 -1
  345. data/ext/ice/cpp/src/Ice/RegisterPlugins.cpp +28 -0
  346. data/ext/ice/cpp/src/Ice/RegisterPlugins.h +25 -0
  347. data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +92 -86
  348. data/ext/ice/cpp/src/Ice/ReplyStatus.h +1 -1
  349. data/ext/ice/cpp/src/Ice/RequestHandler.cpp +1 -1
  350. data/ext/ice/cpp/src/Ice/RequestHandler.h +4 -8
  351. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +24 -16
  352. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +5 -4
  353. data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +1 -1
  354. data/ext/ice/cpp/src/Ice/ResponseHandler.h +3 -3
  355. data/ext/ice/cpp/src/Ice/RetryQueue.cpp +16 -5
  356. data/ext/ice/cpp/src/Ice/RetryQueue.h +3 -2
  357. data/ext/ice/cpp/src/Ice/RetryQueueF.h +1 -1
  358. data/ext/ice/cpp/src/Ice/Router.cpp +27 -21
  359. data/ext/ice/cpp/src/Ice/RouterF.cpp +10 -4
  360. data/ext/ice/cpp/src/Ice/RouterInfo.cpp +1 -1
  361. data/ext/ice/cpp/src/Ice/RouterInfo.h +1 -1
  362. data/ext/ice/cpp/src/Ice/RouterInfoF.h +1 -1
  363. data/ext/ice/cpp/src/Ice/Selector.cpp +480 -1
  364. data/ext/ice/cpp/src/Ice/Selector.h +130 -1
  365. data/ext/ice/cpp/src/Ice/ServantLocator.cpp +11 -5
  366. data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +10 -4
  367. data/ext/ice/cpp/src/Ice/ServantManager.cpp +29 -23
  368. data/ext/ice/cpp/src/Ice/ServantManager.h +1 -1
  369. data/ext/ice/cpp/src/Ice/SharedContext.h +1 -1
  370. data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +10 -4
  371. data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +1 -1
  372. data/ext/ice/cpp/src/Ice/SlicedData.cpp +1 -1
  373. data/ext/ice/cpp/src/Ice/Stream.cpp +1 -1
  374. data/ext/ice/cpp/src/Ice/StreamI.cpp +1 -1
  375. data/ext/ice/cpp/src/Ice/StreamI.h +1 -1
  376. data/ext/ice/cpp/src/Ice/StreamSocket.cpp +30 -22
  377. data/ext/ice/cpp/src/Ice/StreamSocket.h +7 -4
  378. data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +1 -1
  379. data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +1 -1
  380. data/ext/ice/cpp/src/Ice/SysLoggerI.h +1 -1
  381. data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +8 -8
  382. data/ext/ice/cpp/src/Ice/TcpAcceptor.h +1 -1
  383. data/ext/ice/cpp/src/Ice/TcpConnector.cpp +1 -1
  384. data/ext/ice/cpp/src/Ice/TcpConnector.h +1 -1
  385. data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +21 -38
  386. data/ext/ice/cpp/src/Ice/TcpEndpointI.h +5 -6
  387. data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +29 -4
  388. data/ext/ice/cpp/src/Ice/TcpTransceiver.h +7 -2
  389. data/ext/ice/cpp/src/Ice/ThreadPool.cpp +2 -2
  390. data/ext/ice/cpp/src/Ice/ThreadPool.h +1 -1
  391. data/ext/ice/cpp/src/Ice/TraceLevels.cpp +2 -2
  392. data/ext/ice/cpp/src/Ice/TraceLevels.h +1 -1
  393. data/ext/ice/cpp/src/Ice/TraceLevelsF.h +1 -1
  394. data/ext/ice/cpp/src/Ice/TraceUtil.cpp +16 -7
  395. data/ext/ice/cpp/src/Ice/TraceUtil.h +1 -1
  396. data/ext/ice/cpp/src/Ice/Transceiver.cpp +1 -1
  397. data/ext/ice/cpp/src/Ice/Transceiver.h +2 -1
  398. data/ext/ice/cpp/src/Ice/TransceiverF.h +1 -1
  399. data/ext/ice/cpp/src/Ice/UdpConnector.cpp +1 -1
  400. data/ext/ice/cpp/src/Ice/UdpConnector.h +1 -1
  401. data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +13 -39
  402. data/ext/ice/cpp/src/Ice/UdpEndpointI.h +2 -5
  403. data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +46 -10
  404. data/ext/ice/cpp/src/Ice/UdpTransceiver.h +3 -2
  405. data/ext/ice/cpp/src/Ice/Version.cpp +12 -6
  406. data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +1 -1
  407. data/ext/ice/cpp/src/Ice/WSAcceptor.h +1 -1
  408. data/ext/ice/cpp/src/Ice/WSConnector.cpp +1 -1
  409. data/ext/ice/cpp/src/Ice/WSConnector.h +1 -1
  410. data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +6 -38
  411. data/ext/ice/cpp/src/Ice/WSEndpoint.h +12 -1
  412. data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +31 -35
  413. data/ext/ice/cpp/src/Ice/WSTransceiver.h +13 -1
  414. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +66 -60
  415. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +106 -100
  416. data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +1 -1
  417. data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +1 -1
  418. data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +76 -36
  419. data/ext/ice/cpp/src/IceDiscovery/LookupI.h +1 -1
  420. data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +19 -6
  421. data/ext/ice/cpp/src/IceDiscovery/PluginI.h +1 -1
  422. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.cpp +452 -0
  423. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.h +732 -0
  424. data/ext/ice/cpp/src/IceLocatorDiscovery/PluginI.cpp +520 -0
  425. data/ext/ice/cpp/src/IceLocatorDiscovery/PluginI.h +36 -0
  426. data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +8 -8
  427. data/ext/ice/cpp/src/IceSSL/AcceptorI.h +1 -1
  428. data/ext/ice/cpp/src/IceSSL/Certificate.cpp +49 -47
  429. data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +13 -5
  430. data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +1 -1
  431. data/ext/ice/cpp/src/IceSSL/ConnectorI.h +1 -1
  432. data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +10 -38
  433. data/ext/ice/cpp/src/IceSSL/EndpointI.h +4 -3
  434. data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +13 -5
  435. data/ext/ice/cpp/src/IceSSL/Instance.cpp +2 -2
  436. data/ext/ice/cpp/src/IceSSL/Instance.h +1 -1
  437. data/ext/ice/cpp/src/IceSSL/InstanceF.h +1 -1
  438. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +107 -111
  439. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +130 -47
  440. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +11 -3
  441. data/ext/ice/cpp/src/IceSSL/PluginI.cpp +8 -14
  442. data/ext/ice/cpp/src/IceSSL/PluginI.h +1 -1
  443. data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +1 -1
  444. data/ext/ice/cpp/src/IceSSL/RFC2253.h +1 -1
  445. data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +238 -156
  446. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +93 -66
  447. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +7 -3
  448. data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +2 -2
  449. data/ext/ice/cpp/src/IceSSL/SSLEngine.h +32 -35
  450. data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +1 -1
  451. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +244 -360
  452. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +59 -29
  453. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +8 -4
  454. data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +1 -1
  455. data/ext/ice/cpp/src/IceSSL/TrustManager.h +1 -1
  456. data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +1 -1
  457. data/ext/ice/cpp/src/IceSSL/Util.cpp +427 -620
  458. data/ext/ice/cpp/src/IceSSL/Util.h +72 -15
  459. data/ext/ice/cpp/src/IceUtil/ArgVector.cpp +1 -1
  460. data/ext/ice/cpp/src/IceUtil/ArgVector.h +1 -1
  461. data/ext/ice/cpp/src/IceUtil/Cond.cpp +1 -1
  462. data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +1 -1
  463. data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +1 -1
  464. data/ext/ice/cpp/src/IceUtil/CountDownLatch.cpp +1 -1
  465. data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +1 -1
  466. data/ext/ice/cpp/src/IceUtil/Exception.cpp +105 -96
  467. data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +2 -1
  468. data/ext/ice/cpp/src/IceUtil/FileUtil.h +9 -1
  469. data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +1 -1
  470. data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +1 -1
  471. data/ext/ice/cpp/src/IceUtil/Options.cpp +1 -1
  472. data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +12 -25
  473. data/ext/ice/cpp/src/IceUtil/Random.cpp +1 -1
  474. data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +1 -1
  475. data/ext/ice/cpp/src/IceUtil/SHA1.cpp +72 -10
  476. data/ext/ice/cpp/src/IceUtil/Shared.cpp +3 -132
  477. data/ext/ice/cpp/src/IceUtil/StopWatch.h +1 -1
  478. data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +1 -1
  479. data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +1 -1
  480. data/ext/ice/cpp/src/IceUtil/Thread.cpp +16 -1
  481. data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +1 -1
  482. data/ext/ice/cpp/src/IceUtil/Time.cpp +1 -1
  483. data/ext/ice/cpp/src/IceUtil/Timer.cpp +1 -1
  484. data/ext/ice/cpp/src/IceUtil/UUID.cpp +1 -1
  485. data/ext/ice/cpp/src/IceUtil/Unicode.cpp +1 -1
  486. data/ext/ice/cpp/src/IceUtil/Unicode.h +1 -1
  487. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +62 -55
  488. data/ext/ice/cpp/src/Slice/Checksum.cpp +1 -1
  489. data/ext/ice/cpp/src/Slice/CsUtil.cpp +8 -29
  490. data/ext/ice/cpp/src/Slice/DotNetNames.cpp +1 -1
  491. data/ext/ice/cpp/src/Slice/FileTracker.cpp +1 -1
  492. data/ext/ice/cpp/src/Slice/Grammar.cpp +1 -1
  493. data/ext/ice/cpp/src/Slice/GrammarUtil.h +1 -1
  494. data/ext/ice/cpp/src/Slice/JavaUtil.cpp +145 -172
  495. data/ext/ice/cpp/src/Slice/MD5.cpp +1 -1
  496. data/ext/ice/cpp/src/Slice/MD5.h +1 -1
  497. data/ext/ice/cpp/src/Slice/ObjCUtil.cpp +1310 -0
  498. data/ext/ice/cpp/src/Slice/PHPUtil.cpp +1 -1
  499. data/ext/ice/cpp/src/Slice/Parser.cpp +65 -187
  500. data/ext/ice/cpp/src/Slice/Preprocessor.cpp +61 -9
  501. data/ext/ice/cpp/src/Slice/Python.cpp +36 -3
  502. data/ext/ice/cpp/src/Slice/PythonUtil.cpp +10 -10
  503. data/ext/ice/cpp/src/Slice/Ruby.cpp +34 -3
  504. data/ext/ice/cpp/src/Slice/RubyUtil.cpp +8 -7
  505. data/ext/ice/cpp/src/Slice/Scanner.cpp +1 -1
  506. data/ext/ice/cpp/src/Slice/Util.cpp +137 -30
  507. data/ext/ice/mcpp/LICENSE +29 -0
  508. data/ext/ice/mcpp/Makefile +60 -0
  509. data/ext/ice/mcpp/Makefile.mak +46 -0
  510. data/ext/ice/mcpp/README.md +30 -0
  511. data/ext/ice/mcpp/config.h +89 -0
  512. data/ext/ice/mcpp/configed.H +1 -146
  513. data/ext/ice/mcpp/directive.c +115 -410
  514. data/ext/ice/mcpp/eval.c +38 -377
  515. data/ext/ice/mcpp/expand.c +155 -852
  516. data/ext/ice/mcpp/internal.H +10 -44
  517. data/ext/ice/mcpp/main.c +6 -345
  518. data/ext/ice/mcpp/mbchar.c +17 -654
  519. data/ext/ice/mcpp/mcpp.gyp +62 -0
  520. data/ext/ice/mcpp/support.c +116 -943
  521. data/ext/ice/mcpp/system.H +0 -23
  522. data/ext/ice/mcpp/system.c +81 -2321
  523. data/ice.gemspec +3 -4
  524. data/lib/Glacier2.rb +1 -1
  525. data/lib/Glacier2/Metrics.rb +2 -2
  526. data/lib/Glacier2/PermissionsVerifier.rb +2 -2
  527. data/lib/Glacier2/PermissionsVerifierF.rb +2 -2
  528. data/lib/Glacier2/Router.rb +2 -2
  529. data/lib/Glacier2/RouterF.rb +2 -2
  530. data/lib/Glacier2/SSLInfo.rb +2 -2
  531. data/lib/Glacier2/Session.rb +2 -2
  532. data/lib/Ice.rb +1 -1
  533. data/lib/Ice/BuiltinSequences.rb +2 -2
  534. data/lib/Ice/Communicator.rb +2 -2
  535. data/lib/Ice/CommunicatorF.rb +2 -2
  536. data/lib/Ice/Connection.rb +26 -14
  537. data/lib/Ice/ConnectionF.rb +2 -2
  538. data/lib/Ice/Current.rb +2 -2
  539. data/lib/Ice/Endpoint.rb +4 -2
  540. data/lib/Ice/EndpointF.rb +2 -2
  541. data/lib/Ice/EndpointTypes.rb +2 -2
  542. data/lib/Ice/FacetMap.rb +2 -2
  543. data/lib/Ice/Identity.rb +2 -2
  544. data/lib/Ice/ImplicitContext.rb +2 -2
  545. data/lib/Ice/ImplicitContextF.rb +2 -2
  546. data/lib/Ice/Instrumentation.rb +2 -2
  547. data/lib/Ice/InstrumentationF.rb +2 -2
  548. data/lib/Ice/LocalException.rb +2 -2
  549. data/lib/Ice/Locator.rb +2 -2
  550. data/lib/Ice/LocatorF.rb +2 -2
  551. data/lib/Ice/Logger.rb +2 -2
  552. data/lib/Ice/LoggerF.rb +2 -2
  553. data/lib/Ice/Metrics.rb +2 -2
  554. data/lib/Ice/ObjectAdapterF.rb +2 -2
  555. data/lib/Ice/ObjectFactory.rb +2 -2
  556. data/lib/Ice/ObjectFactoryF.rb +2 -2
  557. data/lib/Ice/Plugin.rb +2 -2
  558. data/lib/Ice/PluginF.rb +2 -2
  559. data/lib/Ice/Process.rb +2 -2
  560. data/lib/Ice/ProcessF.rb +2 -2
  561. data/lib/Ice/Properties.rb +2 -2
  562. data/lib/Ice/PropertiesAdmin.rb +2 -2
  563. data/lib/Ice/PropertiesF.rb +2 -2
  564. data/lib/Ice/Router.rb +2 -2
  565. data/lib/Ice/RouterF.rb +2 -2
  566. data/lib/Ice/SliceChecksumDict.rb +2 -2
  567. data/lib/Ice/Version.rb +2 -2
  568. data/lib/IceBox.rb +1 -1
  569. data/lib/IceBox/IceBox.rb +2 -2
  570. data/lib/IceGrid.rb +1 -1
  571. data/lib/IceGrid/Admin.rb +2 -2
  572. data/lib/IceGrid/Descriptor.rb +2 -2
  573. data/lib/IceGrid/Exception.rb +2 -2
  574. data/lib/IceGrid/FileParser.rb +2 -2
  575. data/lib/IceGrid/Locator.rb +2 -2
  576. data/lib/IceGrid/Observer.rb +2 -2
  577. data/lib/IceGrid/Query.rb +2 -2
  578. data/lib/IceGrid/Registry.rb +2 -2
  579. data/lib/IceGrid/Session.rb +2 -2
  580. data/lib/IceGrid/UserAccountMapper.rb +2 -2
  581. data/lib/IcePatch2.rb +1 -1
  582. data/lib/IcePatch2/FileInfo.rb +52 -2
  583. data/lib/IcePatch2/FileServer.rb +33 -4
  584. data/lib/IceStorm.rb +1 -1
  585. data/lib/IceStorm/IceStorm.rb +2 -2
  586. data/lib/IceStorm/Metrics.rb +2 -2
  587. data/slice/Freeze/BackgroundSaveEvictor.ice +2 -2
  588. data/slice/Freeze/CatalogData.ice +2 -2
  589. data/slice/Freeze/Connection.ice +2 -2
  590. data/slice/Freeze/ConnectionF.ice +2 -2
  591. data/slice/Freeze/DB.ice +2 -2
  592. data/slice/Freeze/Evictor.ice +2 -2
  593. data/slice/Freeze/EvictorF.ice +2 -2
  594. data/slice/Freeze/EvictorStorage.ice +2 -2
  595. data/slice/Freeze/Exception.ice +2 -2
  596. data/slice/Freeze/Transaction.ice +2 -2
  597. data/slice/Freeze/TransactionalEvictor.ice +2 -2
  598. data/slice/Glacier2/Metrics.ice +7 -6
  599. data/slice/Glacier2/PermissionsVerifier.ice +4 -3
  600. data/slice/Glacier2/PermissionsVerifierF.ice +3 -2
  601. data/slice/Glacier2/Router.ice +4 -3
  602. data/slice/Glacier2/RouterF.ice +3 -2
  603. data/slice/Glacier2/SSLInfo.ice +3 -2
  604. data/slice/Glacier2/Session.ice +12 -11
  605. data/slice/Ice/BuiltinSequences.ice +4 -3
  606. data/slice/Ice/Communicator.ice +22 -25
  607. data/slice/Ice/CommunicatorF.ice +3 -2
  608. data/slice/Ice/Connection.ice +39 -11
  609. data/slice/Ice/ConnectionF.ice +3 -2
  610. data/slice/Ice/Current.ice +4 -3
  611. data/slice/Ice/Endpoint.ice +11 -3
  612. data/slice/Ice/EndpointF.ice +3 -2
  613. data/slice/Ice/EndpointTypes.ice +3 -2
  614. data/slice/Ice/FacetMap.ice +3 -2
  615. data/slice/Ice/Identity.ice +3 -2
  616. data/slice/Ice/ImplicitContext.ice +3 -2
  617. data/slice/Ice/ImplicitContextF.ice +3 -2
  618. data/slice/Ice/Instrumentation.ice +4 -2
  619. data/slice/Ice/InstrumentationF.ice +4 -2
  620. data/slice/Ice/LocalException.ice +29 -10
  621. data/slice/Ice/Locator.ice +5 -3
  622. data/slice/Ice/LocatorF.ice +3 -2
  623. data/slice/Ice/Logger.ice +3 -2
  624. data/slice/Ice/LoggerF.ice +3 -2
  625. data/slice/Ice/Metrics.ice +15 -14
  626. data/slice/Ice/ObjectAdapter.ice +5 -4
  627. data/slice/Ice/ObjectAdapterF.ice +3 -2
  628. data/slice/Ice/ObjectFactory.ice +3 -2
  629. data/slice/Ice/ObjectFactoryF.ice +3 -2
  630. data/slice/Ice/Plugin.ice +3 -2
  631. data/slice/Ice/PluginF.ice +3 -2
  632. data/slice/Ice/Process.ice +3 -2
  633. data/slice/Ice/ProcessF.ice +3 -2
  634. data/slice/Ice/Properties.ice +3 -2
  635. data/slice/Ice/PropertiesAdmin.ice +3 -2
  636. data/slice/Ice/PropertiesF.ice +3 -2
  637. data/slice/Ice/RemoteLogger.ice +3 -2
  638. data/slice/Ice/Router.ice +3 -2
  639. data/slice/Ice/RouterF.ice +3 -2
  640. data/slice/Ice/ServantLocator.ice +3 -2
  641. data/slice/Ice/ServantLocatorF.ice +3 -2
  642. data/slice/Ice/SliceChecksumDict.ice +3 -2
  643. data/slice/Ice/Version.ice +3 -2
  644. data/slice/IceBox/IceBox.ice +2 -2
  645. data/slice/IceDiscovery/IceDiscovery.ice +2 -2
  646. data/slice/IceGrid/Admin.ice +49 -48
  647. data/slice/IceGrid/Descriptor.ice +3 -2
  648. data/slice/IceGrid/Exception.ice +6 -5
  649. data/slice/IceGrid/FileParser.ice +4 -3
  650. data/slice/IceGrid/Locator.ice +4 -3
  651. data/slice/IceGrid/Observer.ice +28 -27
  652. data/slice/IceGrid/PluginFacade.ice +3 -2
  653. data/slice/IceGrid/Query.ice +3 -2
  654. data/slice/IceGrid/Registry.ice +4 -3
  655. data/slice/IceGrid/Session.ice +9 -8
  656. data/slice/IceGrid/UserAccountMapper.ice +4 -3
  657. data/slice/{IceGrid/Discovery.ice → IceLocatorDiscovery/IceLocatorDiscovery.ice} +12 -14
  658. data/slice/IcePatch2/FileInfo.ice +31 -2
  659. data/slice/IcePatch2/FileServer.ice +63 -5
  660. data/slice/IceSSL/ConnectionInfo.ice +17 -2
  661. data/slice/IceSSL/EndpointInfo.ice +21 -3
  662. data/slice/IceStorm/IceStorm.ice +3 -2
  663. data/slice/IceStorm/Metrics.ice +4 -3
  664. metadata +27 -23
  665. data/ext/ice/cpp/include/Ice/Makefile +0 -26
  666. data/ext/ice/cpp/include/IceSSL/Makefile +0 -26
  667. data/ext/ice/cpp/include/IceUtil/Makefile +0 -26
  668. data/ext/ice/cpp/include/Slice/Makefile +0 -26
  669. data/ext/ice/cpp/src/Ice/Application.cpp +0 -760
  670. data/ext/ice/cpp/src/Ice/EventLoggerMsg.h +0 -53
  671. data/ext/ice/cpp/src/Ice/Makefile +0 -190
  672. data/ext/ice/cpp/src/Ice/Service.cpp +0 -1897
  673. data/ext/ice/cpp/src/IceDiscovery/Makefile +0 -61
  674. data/ext/ice/cpp/src/IceSSL/Makefile +0 -82
  675. data/ext/ice/cpp/src/IceUtil/Makefile +0 -68
  676. data/ext/ice/cpp/src/Slice/Makefile +0 -65
  677. data/ext/ice/mcpp/config.h.Darwin +0 -227
  678. data/ext/ice/mcpp/config.h.Linux +0 -227
  679. data/ext/ice/mcpp/config.h.MINGW +0 -7
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -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
  }