zeroc-ice 3.6.5 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (752) hide show
  1. checksums.yaml +4 -4
  2. data/BZIP2_LICENSE +42 -0
  3. data/ICE_LICENSE +17 -17
  4. data/LICENSE +12 -12
  5. data/bin/slice2rb +1 -1
  6. data/ext/Communicator.cpp +150 -53
  7. data/ext/Communicator.h +1 -1
  8. data/ext/Config.h +2 -12
  9. data/ext/Connection.cpp +89 -68
  10. data/ext/Connection.h +1 -1
  11. data/ext/Endpoint.cpp +16 -45
  12. data/ext/Endpoint.h +1 -1
  13. data/ext/ImplicitContext.cpp +1 -5
  14. data/ext/ImplicitContext.h +1 -1
  15. data/ext/Init.cpp +4 -1
  16. data/ext/Logger.cpp +1 -1
  17. data/ext/Logger.h +1 -1
  18. data/ext/Operation.cpp +33 -44
  19. data/ext/Operation.h +1 -1
  20. data/ext/Properties.cpp +1 -1
  21. data/ext/Properties.h +1 -1
  22. data/ext/Proxy.cpp +22 -57
  23. data/ext/Proxy.h +1 -1
  24. data/ext/Slice.cpp +5 -5
  25. data/ext/Slice.h +1 -1
  26. data/ext/Types.cpp +244 -171
  27. data/ext/Types.h +118 -66
  28. data/ext/Util.cpp +13 -9
  29. data/ext/Util.h +10 -10
  30. data/ext/ValueFactoryManager.cpp +445 -0
  31. data/ext/ValueFactoryManager.h +100 -0
  32. data/ext/extconf.rb +47 -45
  33. data/ext/ice/bzip2/blocksort.c +1094 -0
  34. data/ext/ice/bzip2/bzlib.c +1572 -0
  35. data/ext/ice/bzip2/bzlib.h +282 -0
  36. data/ext/ice/bzip2/bzlib_private.h +509 -0
  37. data/ext/ice/bzip2/compress.c +672 -0
  38. data/ext/ice/bzip2/crctable.c +104 -0
  39. data/ext/ice/bzip2/decompress.c +646 -0
  40. data/ext/ice/bzip2/huffman.c +205 -0
  41. data/ext/ice/bzip2/randtable.c +84 -0
  42. data/ext/ice/cpp/include/Ice/Application.h +77 -60
  43. data/ext/ice/cpp/include/Ice/AsyncResult.h +34 -318
  44. data/ext/ice/cpp/include/Ice/AsyncResultF.h +4 -2
  45. data/ext/ice/cpp/include/Ice/BatchRequestInterceptor.h +5 -10
  46. data/ext/ice/cpp/include/Ice/BatchRequestQueueF.h +1 -1
  47. data/ext/ice/cpp/include/Ice/Buffer.h +10 -10
  48. data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +14 -12
  49. data/ext/ice/cpp/include/Ice/Comparable.h +130 -0
  50. data/ext/ice/cpp/include/Ice/Config.h +7 -36
  51. data/ext/ice/cpp/include/Ice/ConnectionAsync.h +107 -11
  52. data/ext/ice/cpp/include/Ice/ConnectionIF.h +5 -1
  53. data/ext/ice/cpp/include/Ice/ConsoleUtil.h +28 -0
  54. data/ext/ice/cpp/include/Ice/{DefaultObjectFactory.h → DefaultValueFactory.h} +28 -14
  55. data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +4 -6
  56. data/ext/ice/cpp/include/Ice/Dispatcher.h +14 -13
  57. data/ext/ice/cpp/include/Ice/DynamicLibrary.h +7 -5
  58. data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +1 -1
  59. data/ext/ice/cpp/include/Ice/Exception.h +66 -56
  60. data/ext/ice/cpp/include/Ice/ExceptionHelpers.h +69 -0
  61. data/ext/ice/cpp/include/Ice/FactoryTable.h +11 -12
  62. data/ext/ice/cpp/include/Ice/FactoryTableInit.h +27 -25
  63. data/ext/ice/cpp/include/Ice/Format.h +6 -1
  64. data/ext/ice/cpp/include/Ice/Functional.h +33 -33
  65. data/ext/ice/cpp/include/Ice/GCObject.h +9 -5
  66. data/ext/ice/cpp/include/Ice/Handle.h +6 -11
  67. data/ext/ice/cpp/include/Ice/Ice.h +9 -5
  68. data/ext/ice/cpp/include/{IceUtil → Ice}/IconvStringConverter.h +108 -62
  69. data/ext/ice/cpp/include/Ice/Incoming.h +109 -33
  70. data/ext/ice/cpp/include/Ice/IncomingAsync.h +63 -23
  71. data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +7 -1
  72. data/ext/ice/cpp/include/Ice/Initialize.h +178 -38
  73. data/ext/ice/cpp/include/Ice/InputStream.h +994 -0
  74. data/ext/ice/cpp/include/Ice/InstanceF.h +1 -2
  75. data/ext/ice/cpp/include/Ice/InterfaceByValue.h +46 -0
  76. data/ext/ice/cpp/include/Ice/LocalObject.h +9 -9
  77. data/ext/ice/cpp/include/Ice/LocalObjectF.h +1 -1
  78. data/ext/ice/cpp/include/Ice/LoggerUtil.h +20 -14
  79. data/ext/ice/cpp/include/Ice/MetricsAdminI.h +114 -65
  80. data/ext/ice/cpp/include/Ice/MetricsFunctional.h +23 -5
  81. data/ext/ice/cpp/include/Ice/MetricsObserverI.h +99 -26
  82. data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +17 -4
  83. data/ext/ice/cpp/include/Ice/Object.h +105 -56
  84. data/ext/ice/cpp/include/Ice/ObjectF.h +8 -3
  85. data/ext/ice/cpp/include/Ice/ObserverHelper.h +18 -8
  86. data/ext/ice/cpp/include/Ice/Optional.h +1084 -0
  87. data/ext/ice/cpp/include/Ice/OutgoingAsync.h +655 -84
  88. data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +12 -6
  89. data/ext/ice/cpp/include/Ice/OutputStream.h +753 -0
  90. data/ext/ice/cpp/include/Ice/Protocol.h +19 -12
  91. data/ext/ice/cpp/include/Ice/Proxy.h +1329 -717
  92. data/ext/ice/cpp/include/Ice/ProxyF.h +11 -33
  93. data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +1 -1
  94. data/ext/ice/cpp/include/Ice/ProxyHandle.h +34 -50
  95. data/ext/ice/cpp/include/Ice/ReferenceF.h +1 -1
  96. data/ext/ice/cpp/include/Ice/RegisterPlugins.h +22 -3
  97. data/ext/ice/cpp/include/Ice/RequestHandlerF.h +10 -4
  98. data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +6 -1
  99. data/ext/ice/cpp/include/{IceUtil → Ice}/SHA1.h +16 -16
  100. data/ext/ice/cpp/include/Ice/ServantManagerF.h +1 -1
  101. data/ext/ice/cpp/include/Ice/Service.h +13 -18
  102. data/ext/ice/cpp/include/Ice/SliceChecksums.h +1 -1
  103. data/ext/ice/cpp/include/Ice/SlicedData.h +46 -20
  104. data/ext/ice/cpp/include/Ice/SlicedDataF.h +14 -6
  105. data/ext/ice/cpp/include/Ice/StreamHelpers.h +159 -49
  106. data/ext/ice/cpp/include/Ice/StringConverter.h +52 -0
  107. data/ext/ice/cpp/include/Ice/ThreadPoolF.h +1 -1
  108. data/{slice/Ice/ObjectFactoryF.ice → ext/ice/cpp/include/Ice/UUID.h} +9 -7
  109. data/ext/ice/cpp/include/{IceUtil → Ice}/UniquePtr.h +21 -22
  110. data/ext/ice/cpp/include/Ice/UniqueRef.h +98 -0
  111. data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +40 -8
  112. data/ext/ice/cpp/include/Ice/Value.h +104 -0
  113. data/{slice/Freeze/ConnectionF.ice → ext/ice/cpp/include/Ice/ValueF.h} +11 -7
  114. data/ext/ice/cpp/include/IceSSL/Config.h +8 -23
  115. data/ext/ice/cpp/include/IceSSL/IceSSL.h +17 -6
  116. data/ext/ice/cpp/include/IceSSL/OpenSSL.h +130 -0
  117. data/ext/ice/cpp/include/IceSSL/Plugin.h +172 -259
  118. data/ext/ice/cpp/include/IceSSL/SChannel.h +66 -0
  119. data/ext/ice/cpp/include/IceSSL/SecureTransport.h +66 -0
  120. data/ext/ice/cpp/include/IceSSL/UWP.h +58 -0
  121. data/ext/ice/cpp/include/IceUtil/Atomic.h +8 -10
  122. data/ext/ice/cpp/include/IceUtil/Cond.h +17 -18
  123. data/ext/ice/cpp/include/IceUtil/Config.h +138 -39
  124. data/ext/ice/cpp/include/IceUtil/ConsoleUtil.h +97 -0
  125. data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +5 -5
  126. data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +23 -17
  127. data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +1 -3
  128. data/ext/ice/cpp/include/IceUtil/Exception.h +157 -67
  129. data/ext/ice/cpp/include/IceUtil/FileUtil.h +148 -0
  130. data/ext/ice/cpp/include/IceUtil/Functional.h +1 -2
  131. data/ext/ice/cpp/include/IceUtil/Handle.h +11 -11
  132. data/ext/ice/cpp/include/IceUtil/IceUtil.h +4 -10
  133. data/ext/ice/cpp/include/IceUtil/InputUtil.h +3 -3
  134. data/ext/ice/cpp/include/IceUtil/Iterator.h +2 -2
  135. data/ext/ice/cpp/include/IceUtil/Lock.h +8 -10
  136. data/ext/ice/cpp/include/IceUtil/Monitor.h +1 -2
  137. data/ext/ice/cpp/include/IceUtil/Mutex.h +17 -11
  138. data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +2 -2
  139. data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +4 -4
  140. data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +4 -4
  141. data/ext/ice/cpp/include/IceUtil/Optional.h +32 -18
  142. data/ext/ice/cpp/include/IceUtil/Options.h +17 -18
  143. data/ext/ice/cpp/include/IceUtil/OutputUtil.h +55 -29
  144. data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +6 -6
  145. data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +11 -10
  146. data/ext/ice/cpp/include/IceUtil/Random.h +3 -3
  147. data/ext/ice/cpp/include/IceUtil/RecMutex.h +7 -8
  148. data/ext/ice/cpp/include/IceUtil/ResourceConfig.h +58 -0
  149. data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +1 -9
  150. data/ext/ice/cpp/include/IceUtil/ScopedArray.h +8 -2
  151. data/ext/ice/cpp/include/IceUtil/Shared.h +5 -7
  152. data/ext/ice/cpp/{src → include}/IceUtil/StopWatch.h +2 -2
  153. data/ext/ice/cpp/include/IceUtil/StringConverter.h +77 -72
  154. data/ext/ice/cpp/include/IceUtil/StringUtil.h +32 -21
  155. data/ext/ice/cpp/include/IceUtil/Thread.h +10 -12
  156. data/ext/ice/cpp/include/IceUtil/ThreadException.h +33 -42
  157. data/ext/ice/cpp/include/IceUtil/Time.h +3 -3
  158. data/ext/ice/cpp/include/IceUtil/Timer.h +14 -13
  159. data/ext/ice/cpp/include/IceUtil/UUID.h +2 -2
  160. data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +1 -1
  161. data/ext/ice/cpp/include/{Ice → generated/Ice}/BuiltinSequences.h +41 -8
  162. data/ext/ice/cpp/include/generated/Ice/Communicator.h +364 -0
  163. data/ext/ice/cpp/include/{Ice → generated/Ice}/CommunicatorF.h +40 -8
  164. data/ext/ice/cpp/include/generated/Ice/Connection.h +872 -0
  165. data/ext/ice/cpp/include/{Ice → generated/Ice}/ConnectionF.h +46 -8
  166. data/ext/ice/cpp/include/{Ice → generated/Ice}/Current.h +71 -8
  167. data/ext/ice/cpp/include/generated/Ice/Endpoint.h +582 -0
  168. data/ext/ice/cpp/include/{Ice → generated/Ice}/EndpointF.h +62 -8
  169. data/ext/ice/cpp/include/{Ice → generated/Ice}/EndpointTypes.h +31 -16
  170. data/ext/ice/cpp/include/{Ice → generated/Ice}/FacetMap.h +23 -8
  171. data/ext/ice/cpp/include/generated/Ice/Identity.h +221 -0
  172. data/ext/ice/cpp/include/{Ice → generated/Ice}/ImplicitContext.h +72 -13
  173. data/ext/ice/cpp/include/{Ice → generated/Ice}/ImplicitContextF.h +40 -8
  174. data/ext/ice/cpp/include/generated/Ice/Instrumentation.h +602 -0
  175. data/ext/ice/cpp/include/{Ice → generated/Ice}/InstrumentationF.h +54 -8
  176. data/ext/ice/cpp/include/generated/Ice/LocalException.h +2802 -0
  177. data/ext/ice/cpp/include/generated/Ice/Locator.h +2036 -0
  178. data/ext/ice/cpp/include/{Ice → generated/Ice}/LocatorF.h +53 -12
  179. data/ext/ice/cpp/include/{Ice → generated/Ice}/Logger.h +71 -13
  180. data/ext/ice/cpp/include/{Ice → generated/Ice}/LoggerF.h +40 -8
  181. data/ext/ice/cpp/include/generated/Ice/Metrics.h +2649 -0
  182. data/ext/ice/cpp/include/generated/Ice/ObjectAdapter.h +302 -0
  183. data/ext/ice/cpp/include/{Ice → generated/Ice}/ObjectAdapterF.h +40 -8
  184. data/ext/ice/cpp/include/generated/Ice/ObjectFactory.h +142 -0
  185. data/ext/ice/cpp/include/generated/Ice/Plugin.h +197 -0
  186. data/ext/ice/cpp/include/{Ice → generated/Ice}/PluginF.h +43 -8
  187. data/ext/ice/cpp/include/generated/Ice/Process.h +536 -0
  188. data/ext/ice/cpp/include/{Ice → generated/Ice}/ProcessF.h +45 -10
  189. data/ext/ice/cpp/include/{Ice → generated/Ice}/Properties.h +88 -21
  190. data/ext/ice/cpp/include/generated/Ice/PropertiesAdmin.h +749 -0
  191. data/ext/ice/cpp/include/{Ice → generated/Ice}/PropertiesF.h +48 -10
  192. data/ext/ice/cpp/include/generated/Ice/RemoteLogger.h +1449 -0
  193. data/ext/ice/cpp/include/generated/Ice/Router.h +1032 -0
  194. data/ext/ice/cpp/include/{Ice → generated/Ice}/RouterF.h +45 -10
  195. data/ext/ice/cpp/include/{Ice → generated/Ice}/ServantLocator.h +65 -13
  196. data/ext/ice/cpp/include/{Ice → generated/Ice}/ServantLocatorF.h +40 -8
  197. data/ext/ice/cpp/include/{Ice → generated/Ice}/SliceChecksumDict.h +23 -8
  198. data/ext/ice/cpp/include/generated/Ice/ValueFactory.h +169 -0
  199. data/ext/ice/cpp/include/generated/Ice/Version.h +334 -0
  200. data/ext/ice/cpp/include/generated/IceSSL/ConnectionInfo.h +172 -0
  201. data/ext/ice/cpp/include/generated/IceSSL/ConnectionInfoF.h +98 -0
  202. data/ext/ice/cpp/include/generated/IceSSL/EndpointInfo.h +156 -0
  203. data/ext/ice/cpp/src/Ice/ACM.cpp +18 -14
  204. data/ext/ice/cpp/src/Ice/ACM.h +9 -2
  205. data/ext/ice/cpp/{include → src}/Ice/ACMF.h +10 -5
  206. data/ext/ice/cpp/src/Ice/Acceptor.cpp +6 -1
  207. data/ext/ice/cpp/src/Ice/Acceptor.h +4 -3
  208. data/ext/ice/cpp/src/Ice/AcceptorF.h +1 -1
  209. data/ext/ice/cpp/src/{IceUtil → Ice}/ArgVector.cpp +9 -9
  210. data/ext/ice/cpp/src/{IceUtil → Ice}/ArgVector.h +7 -7
  211. data/ext/ice/cpp/src/Ice/AsyncResult.cpp +15 -538
  212. data/ext/ice/cpp/src/Ice/Base64.cpp +11 -11
  213. data/ext/ice/cpp/src/Ice/Base64.h +1 -1
  214. data/ext/ice/cpp/src/Ice/BatchRequestQueue.cpp +40 -12
  215. data/ext/ice/cpp/src/Ice/BatchRequestQueue.h +15 -10
  216. data/ext/ice/cpp/src/Ice/Buffer.cpp +74 -12
  217. data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +20 -6
  218. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +85 -190
  219. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +17 -18
  220. data/ext/ice/cpp/src/Ice/Communicator.cpp +39 -8
  221. data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +27 -5
  222. data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +271 -104
  223. data/ext/ice/cpp/src/Ice/CommunicatorI.h +84 -28
  224. data/ext/ice/cpp/src/{IceUtil → Ice}/Cond.cpp +3 -3
  225. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +58 -125
  226. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +11 -22
  227. data/ext/ice/cpp/src/Ice/ConnectRequestHandlerF.h +6 -2
  228. data/ext/ice/cpp/src/Ice/Connection.cpp +88 -8
  229. data/ext/ice/cpp/src/Ice/ConnectionF.cpp +27 -5
  230. data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +158 -80
  231. data/ext/ice/cpp/src/Ice/ConnectionFactory.h +41 -23
  232. data/ext/ice/cpp/{include → src}/Ice/ConnectionFactoryF.h +8 -3
  233. data/ext/ice/cpp/src/Ice/ConnectionI.cpp +707 -653
  234. data/ext/ice/cpp/src/Ice/ConnectionI.h +97 -69
  235. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +2 -15
  236. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +4 -3
  237. data/ext/ice/cpp/src/Ice/Connector.cpp +6 -1
  238. data/ext/ice/cpp/src/Ice/Connector.h +4 -3
  239. data/ext/ice/cpp/src/Ice/ConnectorF.h +1 -1
  240. data/ext/ice/cpp/src/{IceUtil → Ice}/CountDownLatch.cpp +4 -4
  241. data/ext/ice/cpp/src/Ice/Current.cpp +29 -6
  242. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +6 -5
  243. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +1 -1
  244. data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +1 -1
  245. data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +5 -25
  246. data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +29 -19
  247. data/ext/ice/cpp/src/Ice/Endpoint.cpp +85 -6
  248. data/ext/ice/cpp/src/Ice/EndpointF.cpp +27 -5
  249. data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +152 -1
  250. data/ext/ice/cpp/src/Ice/EndpointFactory.h +72 -6
  251. data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +1 -1
  252. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +35 -19
  253. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +10 -4
  254. data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +1 -1
  255. data/ext/ice/cpp/src/Ice/EndpointI.cpp +17 -1
  256. data/ext/ice/cpp/src/Ice/EndpointI.h +35 -9
  257. data/ext/ice/cpp/src/Ice/EndpointIF.h +18 -5
  258. data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +18 -6
  259. data/ext/ice/cpp/src/Ice/EventHandler.cpp +6 -4
  260. data/ext/ice/cpp/src/Ice/EventHandler.h +13 -8
  261. data/ext/ice/cpp/src/Ice/EventHandlerF.h +5 -2
  262. data/ext/ice/cpp/src/Ice/Exception.cpp +95 -86
  263. data/ext/ice/cpp/src/Ice/FacetMap.cpp +20 -6
  264. data/ext/ice/cpp/src/Ice/FactoryTable.cpp +37 -28
  265. data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +2 -4
  266. data/ext/ice/cpp/src/Ice/GCObject.cpp +28 -25
  267. data/ext/ice/cpp/src/Ice/HashUtil.h +2 -3
  268. data/ext/ice/cpp/src/Ice/HttpParser.cpp +1 -2
  269. data/ext/ice/cpp/src/Ice/HttpParser.h +1 -1
  270. data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +92 -53
  271. data/ext/ice/cpp/src/Ice/IPEndpointI.h +19 -10
  272. data/ext/ice/cpp/src/Ice/IPEndpointIF.h +6 -2
  273. data/ext/ice/cpp/src/Ice/IconvStringConverter.cpp +56 -0
  274. data/ext/ice/cpp/src/Ice/Identity.cpp +24 -10
  275. data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +37 -6
  276. data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +27 -5
  277. data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +14 -14
  278. data/ext/ice/cpp/src/Ice/ImplicitContextI.h +7 -5
  279. data/ext/ice/cpp/src/Ice/Incoming.cpp +276 -245
  280. data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +104 -209
  281. data/ext/ice/cpp/src/Ice/IncomingRequest.h +5 -4
  282. data/ext/ice/cpp/src/Ice/Initialize.cpp +299 -172
  283. data/ext/ice/cpp/src/Ice/InputStream.cpp +2773 -0
  284. data/ext/ice/cpp/src/Ice/Instance.cpp +191 -231
  285. data/ext/ice/cpp/src/Ice/Instance.h +30 -18
  286. data/ext/ice/cpp/src/Ice/Instrumentation.cpp +106 -7
  287. data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +27 -5
  288. data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +117 -99
  289. data/ext/ice/cpp/src/Ice/InstrumentationI.h +30 -31
  290. data/ext/ice/cpp/src/Ice/LocalException.cpp +1190 -416
  291. data/ext/ice/cpp/src/Ice/LocalObject.cpp +1 -2
  292. data/ext/ice/cpp/src/Ice/Locator.cpp +1167 -1215
  293. data/ext/ice/cpp/src/Ice/LocatorF.cpp +29 -6
  294. data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +129 -163
  295. data/ext/ice/cpp/src/Ice/LocatorInfo.h +29 -29
  296. data/ext/ice/cpp/src/Ice/LocatorInfoF.h +1 -1
  297. data/ext/ice/cpp/src/Ice/Logger.cpp +35 -5
  298. data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +178 -73
  299. data/ext/ice/cpp/src/Ice/LoggerAdminI.h +4 -4
  300. data/ext/ice/cpp/src/Ice/LoggerF.cpp +27 -5
  301. data/ext/ice/cpp/src/Ice/LoggerI.cpp +14 -44
  302. data/ext/ice/cpp/src/Ice/LoggerI.h +7 -13
  303. data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +10 -12
  304. data/ext/ice/cpp/src/Ice/Metrics.cpp +1059 -1069
  305. data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +49 -19
  306. data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +1 -2
  307. data/ext/ice/cpp/src/Ice/Network.cpp +534 -170
  308. data/ext/ice/cpp/src/Ice/Network.h +100 -23
  309. data/ext/ice/cpp/src/Ice/NetworkF.h +2 -2
  310. data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +21 -14
  311. data/ext/ice/cpp/src/Ice/NetworkProxy.h +5 -2
  312. data/ext/ice/cpp/src/Ice/NetworkProxyF.h +1 -1
  313. data/ext/ice/cpp/src/Ice/Object.cpp +217 -221
  314. data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -6
  315. data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +27 -5
  316. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +35 -14
  317. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +13 -7
  318. data/ext/ice/cpp/{include → src}/Ice/ObjectAdapterFactoryF.h +5 -1
  319. data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +184 -58
  320. data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +32 -26
  321. data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +37 -6
  322. data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +9 -32
  323. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +40 -18
  324. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +14 -5
  325. data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +803 -365
  326. data/ext/ice/cpp/src/Ice/OutputStream.cpp +1399 -0
  327. data/ext/ice/cpp/src/Ice/Plugin.cpp +45 -6
  328. data/ext/ice/cpp/src/Ice/PluginF.cpp +27 -5
  329. data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +13 -13
  330. data/ext/ice/cpp/src/Ice/PluginManagerI.h +5 -6
  331. data/ext/ice/cpp/src/Ice/Process.cpp +256 -114
  332. data/ext/ice/cpp/src/Ice/ProcessF.cpp +29 -6
  333. data/ext/ice/cpp/src/Ice/Properties.cpp +38 -8
  334. data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +340 -328
  335. data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +81 -17
  336. data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +29 -5
  337. data/ext/ice/cpp/src/Ice/PropertiesF.cpp +29 -6
  338. data/ext/ice/cpp/src/Ice/PropertiesI.cpp +25 -26
  339. data/ext/ice/cpp/src/Ice/PropertiesI.h +8 -11
  340. data/ext/ice/cpp/src/Ice/PropertyNames.cpp +107 -50
  341. data/ext/ice/cpp/src/Ice/PropertyNames.h +4 -2
  342. data/ext/ice/cpp/src/Ice/Protocol.cpp +2 -2
  343. data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +37 -2
  344. data/ext/ice/cpp/src/Ice/ProtocolInstance.h +9 -20
  345. data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +1 -1
  346. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +6 -1
  347. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +3 -1
  348. data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +1 -1
  349. data/ext/ice/cpp/src/Ice/Proxy.cpp +690 -964
  350. data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +23 -32
  351. data/ext/ice/cpp/src/Ice/ProxyFactory.h +16 -11
  352. data/ext/ice/cpp/src/Ice/Reference.cpp +75 -69
  353. data/ext/ice/cpp/src/Ice/Reference.h +27 -22
  354. data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +18 -21
  355. data/ext/ice/cpp/src/Ice/ReferenceFactory.h +12 -12
  356. data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +1 -1
  357. data/ext/ice/cpp/src/Ice/RegisterPluginsInit.cpp +18 -4
  358. data/ext/ice/cpp/src/Ice/RegisterPluginsInit.h +1 -1
  359. data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +672 -552
  360. data/ext/ice/cpp/src/Ice/ReplyStatus.h +1 -1
  361. data/ext/ice/cpp/src/Ice/RequestHandler.cpp +5 -3
  362. data/ext/ice/cpp/src/Ice/RequestHandler.h +10 -13
  363. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +10 -6
  364. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +2 -2
  365. data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +3 -6
  366. data/ext/ice/cpp/src/Ice/ResponseHandler.h +16 -7
  367. data/ext/ice/cpp/src/Ice/RetryQueue.cpp +6 -12
  368. data/ext/ice/cpp/src/Ice/RetryQueue.h +7 -6
  369. data/ext/ice/cpp/src/Ice/RetryQueueF.h +1 -1
  370. data/ext/ice/cpp/src/Ice/Router.cpp +523 -474
  371. data/ext/ice/cpp/src/Ice/RouterF.cpp +29 -6
  372. data/ext/ice/cpp/src/Ice/RouterInfo.cpp +91 -70
  373. data/ext/ice/cpp/src/Ice/RouterInfo.h +43 -32
  374. data/ext/ice/cpp/src/Ice/RouterInfoF.h +1 -1
  375. data/ext/ice/cpp/src/{IceUtil → Ice}/SHA1.cpp +21 -21
  376. data/ext/ice/cpp/src/Ice/Selector.cpp +989 -923
  377. data/ext/ice/cpp/src/Ice/Selector.h +100 -147
  378. data/ext/ice/cpp/src/Ice/ServantLocator.cpp +37 -6
  379. data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +27 -5
  380. data/ext/ice/cpp/src/Ice/ServantManager.cpp +9 -9
  381. data/ext/ice/cpp/src/Ice/ServantManager.h +1 -1
  382. data/ext/ice/cpp/src/Ice/SharedContext.h +2 -2
  383. data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +20 -6
  384. data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +2 -2
  385. data/ext/ice/cpp/src/Ice/SlicedData.cpp +72 -20
  386. data/ext/ice/cpp/src/Ice/StreamSocket.cpp +173 -18
  387. data/ext/ice/cpp/src/Ice/StreamSocket.h +13 -4
  388. data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +48 -17
  389. data/ext/ice/cpp/src/Ice/StringUtil.h +35 -0
  390. data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +8 -4
  391. data/ext/ice/cpp/src/Ice/SysLoggerI.h +2 -3
  392. data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +158 -32
  393. data/ext/ice/cpp/src/Ice/TcpAcceptor.h +12 -5
  394. data/ext/ice/cpp/src/Ice/TcpConnector.cpp +1 -7
  395. data/ext/ice/cpp/src/Ice/TcpConnector.h +1 -2
  396. data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +40 -32
  397. data/ext/ice/cpp/src/Ice/TcpEndpointI.h +11 -8
  398. data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +12 -27
  399. data/ext/ice/cpp/src/Ice/TcpTransceiver.h +7 -10
  400. data/ext/ice/cpp/src/{IceUtil → Ice}/Thread.cpp +24 -41
  401. data/ext/ice/cpp/src/Ice/ThreadPool.cpp +175 -267
  402. data/ext/ice/cpp/src/Ice/ThreadPool.h +38 -43
  403. data/ext/ice/cpp/src/{IceUtil → Ice}/Timer.cpp +28 -21
  404. data/ext/ice/cpp/src/Ice/TraceLevels.cpp +2 -2
  405. data/ext/ice/cpp/src/Ice/TraceLevels.h +1 -1
  406. data/ext/ice/cpp/src/Ice/TraceLevelsF.h +2 -2
  407. data/ext/ice/cpp/src/Ice/TraceUtil.cpp +53 -31
  408. data/ext/ice/cpp/src/Ice/TraceUtil.h +13 -6
  409. data/ext/ice/cpp/src/Ice/Transceiver.cpp +1 -2
  410. data/ext/ice/cpp/src/Ice/Transceiver.h +8 -7
  411. data/ext/ice/cpp/src/Ice/TransceiverF.h +1 -1
  412. data/ext/ice/cpp/src/Ice/UdpConnector.cpp +2 -8
  413. data/ext/ice/cpp/src/Ice/UdpConnector.h +1 -2
  414. data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +92 -31
  415. data/ext/ice/cpp/src/Ice/UdpEndpointI.h +12 -4
  416. data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +150 -179
  417. data/ext/ice/cpp/src/Ice/UdpTransceiver.h +15 -17
  418. data/ext/ice/cpp/src/Ice/Value.cpp +81 -0
  419. data/ext/ice/cpp/src/Ice/ValueFactory.cpp +84 -0
  420. data/ext/ice/cpp/src/Ice/ValueFactoryManagerI.cpp +70 -0
  421. data/ext/ice/cpp/src/Ice/ValueFactoryManagerI.h +42 -0
  422. data/ext/ice/cpp/src/Ice/Version.cpp +24 -14
  423. data/ext/ice/cpp/src/Ice/VirtualShared.h +43 -0
  424. data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +3 -9
  425. data/ext/ice/cpp/src/Ice/WSAcceptor.h +3 -7
  426. data/ext/ice/cpp/src/Ice/WSConnector.cpp +5 -11
  427. data/ext/ice/cpp/src/Ice/WSConnector.h +3 -6
  428. data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +185 -80
  429. data/ext/ice/cpp/src/Ice/WSEndpoint.h +21 -31
  430. data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +41 -37
  431. data/ext/ice/cpp/src/Ice/WSTransceiver.h +7 -21
  432. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +526 -264
  433. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +341 -455
  434. data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +86 -26
  435. data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +59 -23
  436. data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +315 -61
  437. data/ext/ice/cpp/src/IceDiscovery/LookupI.h +83 -36
  438. data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +57 -59
  439. data/ext/ice/cpp/src/IceDiscovery/PluginI.h +3 -3
  440. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.cpp +396 -159
  441. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.h +251 -355
  442. data/ext/ice/cpp/src/IceLocatorDiscovery/Plugin.h +52 -0
  443. data/ext/ice/cpp/src/IceLocatorDiscovery/PluginI.cpp +526 -131
  444. data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +19 -165
  445. data/ext/ice/cpp/src/IceSSL/AcceptorI.h +8 -17
  446. data/ext/ice/cpp/src/IceSSL/CertificateI.cpp +284 -0
  447. data/ext/ice/cpp/src/IceSSL/CertificateI.h +69 -0
  448. data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +39 -11
  449. data/ext/ice/cpp/src/{Ice/ObjectFactoryF.cpp → IceSSL/ConnectionInfoF.cpp} +31 -9
  450. data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +14 -56
  451. data/ext/ice/cpp/src/IceSSL/ConnectorI.h +6 -13
  452. data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +205 -197
  453. data/ext/ice/cpp/src/IceSSL/EndpointI.h +41 -33
  454. data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +39 -10
  455. data/ext/ice/cpp/src/IceSSL/Instance.cpp +1 -6
  456. data/ext/ice/cpp/src/IceSSL/Instance.h +7 -7
  457. data/ext/ice/cpp/src/IceSSL/InstanceF.h +11 -7
  458. data/ext/ice/cpp/src/IceSSL/OpenSSLCertificateI.cpp +588 -0
  459. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +117 -152
  460. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.h +64 -0
  461. data/ext/ice/cpp/src/IceSSL/OpenSSLEngineF.h +32 -0
  462. data/ext/ice/cpp/src/IceSSL/OpenSSLPluginI.cpp +132 -0
  463. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +400 -89
  464. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +36 -21
  465. data/ext/ice/cpp/src/IceSSL/OpenSSLUtil.cpp +291 -0
  466. data/ext/ice/cpp/src/IceSSL/OpenSSLUtil.h +63 -0
  467. data/ext/ice/cpp/src/IceSSL/PluginI.cpp +71 -41
  468. data/ext/ice/cpp/src/IceSSL/PluginI.h +13 -18
  469. data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +9 -54
  470. data/ext/ice/cpp/src/IceSSL/RFC2253.h +7 -7
  471. data/ext/ice/cpp/src/IceSSL/SChannelCertificateI.cpp +585 -0
  472. data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +491 -75
  473. data/ext/ice/cpp/src/IceSSL/SChannelEngine.h +126 -0
  474. data/ext/ice/cpp/src/IceSSL/SChannelEngineF.h +32 -0
  475. data/ext/ice/cpp/src/IceSSL/SChannelPluginI.cpp +78 -0
  476. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +126 -169
  477. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +19 -22
  478. data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +79 -74
  479. data/ext/ice/cpp/src/IceSSL/SSLEngine.h +24 -187
  480. data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +4 -19
  481. data/ext/ice/cpp/src/IceSSL/SecureTransportCertificateI.cpp +862 -0
  482. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +56 -214
  483. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.h +60 -0
  484. data/ext/ice/cpp/src/IceSSL/SecureTransportEngineF.h +31 -0
  485. data/ext/ice/cpp/src/IceSSL/SecureTransportPluginI.cpp +80 -0
  486. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +137 -144
  487. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +25 -28
  488. data/ext/ice/cpp/src/IceSSL/SecureTransportUtil.cpp +857 -0
  489. data/ext/ice/cpp/src/IceSSL/SecureTransportUtil.h +46 -0
  490. data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +9 -13
  491. data/ext/ice/cpp/src/IceSSL/TrustManager.h +4 -4
  492. data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +3 -3
  493. data/ext/ice/cpp/src/IceSSL/UWPCertificateI.cpp +271 -0
  494. data/ext/ice/cpp/src/IceSSL/UWPEngine.cpp +343 -0
  495. data/ext/ice/cpp/src/IceSSL/UWPEngine.h +46 -0
  496. data/ext/ice/cpp/{include/Ice/ObjectFactoryManagerF.h → src/IceSSL/UWPEngineF.h} +13 -8
  497. data/ext/ice/cpp/src/IceSSL/UWPPluginI.cpp +94 -0
  498. data/ext/ice/cpp/src/IceSSL/UWPTransceiverI.cpp +388 -0
  499. data/ext/ice/cpp/src/IceSSL/UWPTransceiverI.h +76 -0
  500. data/ext/ice/cpp/src/IceSSL/Util.cpp +66 -1256
  501. data/ext/ice/cpp/src/IceSSL/Util.h +48 -137
  502. data/ext/ice/cpp/src/IceUtil/ConsoleUtil.cpp +162 -0
  503. data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +22 -22
  504. data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +34 -26
  505. data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +20 -31
  506. data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +25 -116
  507. data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +1 -1
  508. data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +1 -1
  509. data/ext/ice/cpp/src/IceUtil/Options.cpp +23 -46
  510. data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +7 -6
  511. data/ext/ice/cpp/src/IceUtil/Random.cpp +13 -13
  512. data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +3 -9
  513. data/ext/ice/cpp/src/IceUtil/Shared.cpp +8 -3
  514. data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +501 -264
  515. data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +540 -235
  516. data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +37 -74
  517. data/ext/ice/cpp/src/IceUtil/Time.cpp +1 -1
  518. data/ext/ice/cpp/src/IceUtil/UUID.cpp +10 -10
  519. data/ext/ice/cpp/src/IceUtil/Unicode.cpp +98 -97
  520. data/ext/ice/cpp/src/IceUtil/Unicode.h +21 -35
  521. data/ext/ice/cpp/src/IceUtil/UtilException.cpp +838 -0
  522. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +815 -163
  523. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.h +76 -0
  524. data/ext/ice/cpp/src/Slice/Checksum.cpp +2 -2
  525. data/ext/ice/cpp/{include → src}/Slice/Checksum.h +2 -2
  526. data/ext/ice/cpp/src/Slice/FileTracker.cpp +25 -78
  527. data/ext/ice/cpp/{include → src}/Slice/FileTracker.h +9 -9
  528. data/ext/ice/cpp/src/Slice/Grammar.cpp +1994 -1943
  529. data/ext/ice/cpp/src/Slice/Grammar.h +44 -24
  530. data/ext/ice/cpp/src/Slice/GrammarUtil.h +14 -14
  531. data/ext/ice/cpp/src/Slice/JavaUtil.cpp +2658 -1927
  532. data/ext/ice/cpp/{include → src}/Slice/JavaUtil.h +178 -59
  533. data/ext/ice/cpp/src/Slice/MD5.cpp +1 -1
  534. data/ext/ice/cpp/src/Slice/MD5.h +1 -1
  535. data/ext/ice/cpp/src/Slice/MD5I.cpp +0 -1
  536. data/ext/ice/cpp/src/Slice/MD5I.h +1 -1
  537. data/ext/ice/cpp/src/Slice/PHPUtil.cpp +12 -15
  538. data/ext/ice/cpp/{include → src}/Slice/PHPUtil.h +6 -15
  539. data/ext/ice/cpp/src/Slice/Parser.cpp +802 -307
  540. data/ext/ice/cpp/{include → src}/Slice/Parser.h +76 -84
  541. data/ext/ice/cpp/src/Slice/Preprocessor.cpp +43 -21
  542. data/ext/ice/cpp/{include → src}/Slice/Preprocessor.h +7 -12
  543. data/ext/ice/cpp/src/Slice/Python.cpp +207 -86
  544. data/ext/ice/cpp/src/Slice/PythonUtil.cpp +683 -679
  545. data/ext/ice/cpp/{include → src}/Slice/PythonUtil.h +19 -8
  546. data/ext/ice/cpp/src/Slice/Ruby.cpp +38 -34
  547. data/ext/ice/cpp/src/Slice/RubyUtil.cpp +177 -445
  548. data/ext/ice/cpp/{include → src}/Slice/RubyUtil.h +6 -6
  549. data/ext/ice/cpp/src/Slice/Scanner.cpp +218 -306
  550. data/ext/ice/cpp/src/Slice/{Util.cpp → SliceUtil.cpp} +37 -64
  551. data/ext/ice/cpp/src/Slice/StringLiteralUtil.cpp +374 -0
  552. data/ext/ice/cpp/src/Slice/Util.h +54 -0
  553. data/ext/ice/mcpp/Makefile +5 -2
  554. data/ice.gemspec +2 -7
  555. data/lib/Glacier2.rb +1 -1
  556. data/lib/Glacier2/Metrics.rb +7 -46
  557. data/lib/Glacier2/PermissionsVerifier.rb +24 -95
  558. data/lib/Glacier2/PermissionsVerifierF.rb +3 -3
  559. data/lib/Glacier2/Router.rb +32 -74
  560. data/lib/Glacier2/RouterF.rb +3 -3
  561. data/lib/Glacier2/SSLInfo.rb +4 -7
  562. data/lib/Glacier2/Session.rb +88 -307
  563. data/lib/Ice.rb +83 -52
  564. data/lib/Ice/BuiltinSequences.rb +4 -4
  565. data/lib/Ice/Communicator.rb +56 -58
  566. data/lib/Ice/CommunicatorF.rb +3 -3
  567. data/lib/Ice/Connection.rb +153 -162
  568. data/lib/Ice/ConnectionF.rb +3 -3
  569. data/lib/Ice/Current.rb +4 -11
  570. data/lib/Ice/Endpoint.rb +57 -133
  571. data/lib/Ice/EndpointF.rb +3 -3
  572. data/lib/Ice/EndpointTypes.rb +3 -7
  573. data/lib/Ice/FacetMap.rb +4 -4
  574. data/lib/Ice/Identity.rb +5 -8
  575. data/lib/Ice/ImplicitContext.rb +5 -34
  576. data/lib/Ice/ImplicitContextF.rb +3 -3
  577. data/lib/Ice/Instrumentation.rb +23 -275
  578. data/lib/Ice/InstrumentationF.rb +3 -3
  579. data/lib/Ice/LocalException.rb +95 -141
  580. data/lib/Ice/Locator.rb +51 -165
  581. data/lib/Ice/LocatorF.rb +3 -3
  582. data/lib/Ice/Logger.rb +5 -34
  583. data/lib/Ice/LoggerF.rb +3 -3
  584. data/lib/Ice/Metrics.rb +61 -416
  585. data/lib/Ice/ObjectAdapter.rb +34 -0
  586. data/lib/Ice/ObjectAdapterF.rb +3 -3
  587. data/lib/Ice/ObjectFactory.rb +5 -30
  588. data/lib/Ice/Plugin.rb +7 -60
  589. data/lib/Ice/PluginF.rb +3 -3
  590. data/lib/Ice/Process.rb +16 -52
  591. data/lib/Ice/ProcessF.rb +3 -3
  592. data/lib/Ice/Properties.rb +5 -41
  593. data/lib/Ice/PropertiesAdmin.rb +19 -56
  594. data/lib/Ice/PropertiesF.rb +3 -3
  595. data/lib/Ice/RemoteLogger.rb +34 -115
  596. data/lib/Ice/Router.rb +29 -101
  597. data/lib/Ice/RouterF.rb +3 -3
  598. data/lib/Ice/ServantLocator.rb +31 -0
  599. data/lib/Ice/{ObjectFactoryF.rb → ServantLocatorF.rb} +6 -6
  600. data/lib/Ice/SliceChecksumDict.rb +3 -3
  601. data/lib/Ice/ValueFactory.rb +33 -0
  602. data/lib/Ice/Version.rb +5 -11
  603. data/lib/IceBox.rb +1 -1
  604. data/lib/IceBox/IceBox.rb +44 -148
  605. data/lib/IceGrid.rb +1 -4
  606. data/lib/IceGrid/Admin.rb +551 -427
  607. data/lib/IceGrid/Descriptor.rb +62 -529
  608. data/lib/IceGrid/Exception.rb +24 -45
  609. data/lib/IceGrid/FileParser.rb +14 -50
  610. data/lib/IceGrid/PluginFacade.rb +40 -0
  611. data/lib/IceGrid/Registry.rb +151 -58
  612. data/lib/IceGrid/Session.rb +25 -64
  613. data/lib/IceGrid/UserAccountMapper.rb +14 -50
  614. data/lib/IcePatch2.rb +1 -1
  615. data/lib/IcePatch2/FileInfo.rb +5 -11
  616. data/lib/IcePatch2/FileServer.rb +33 -76
  617. data/lib/IceStorm.rb +1 -1
  618. data/lib/IceStorm/IceStorm.rb +79 -206
  619. data/lib/IceStorm/Metrics.rb +11 -89
  620. data/slice/Glacier2/Metrics.ice +8 -4
  621. data/slice/Glacier2/PermissionsVerifier.ice +10 -7
  622. data/slice/Glacier2/PermissionsVerifierF.ice +7 -4
  623. data/slice/Glacier2/Router.ice +10 -8
  624. data/slice/Glacier2/RouterF.ice +7 -4
  625. data/slice/Glacier2/SSLInfo.ice +8 -5
  626. data/slice/Glacier2/Session.ice +15 -13
  627. data/slice/Ice/BuiltinSequences.ice +7 -4
  628. data/slice/Ice/Communicator.ice +141 -66
  629. data/slice/Ice/CommunicatorF.ice +7 -4
  630. data/slice/Ice/Connection.ice +183 -86
  631. data/slice/Ice/ConnectionF.ice +7 -4
  632. data/slice/Ice/Current.ice +13 -9
  633. data/slice/Ice/Endpoint.ice +63 -14
  634. data/slice/Ice/EndpointF.ice +7 -4
  635. data/slice/Ice/EndpointTypes.ice +8 -6
  636. data/slice/Ice/FacetMap.ice +7 -4
  637. data/slice/Ice/Identity.ice +13 -5
  638. data/slice/Ice/ImplicitContext.ice +20 -18
  639. data/slice/Ice/ImplicitContextF.ice +7 -4
  640. data/slice/Ice/Instrumentation.ice +20 -19
  641. data/slice/Ice/InstrumentationF.ice +8 -5
  642. data/slice/Ice/LocalException.ice +87 -87
  643. data/slice/Ice/Locator.ice +19 -18
  644. data/slice/Ice/LocatorF.ice +7 -4
  645. data/slice/Ice/Logger.ice +9 -7
  646. data/slice/Ice/LoggerF.ice +7 -4
  647. data/slice/Ice/Metrics.ice +18 -14
  648. data/slice/Ice/ObjectAdapter.ice +30 -13
  649. data/slice/Ice/ObjectAdapterF.ice +7 -4
  650. data/slice/Ice/ObjectFactory.ice +15 -12
  651. data/slice/Ice/Plugin.ice +9 -6
  652. data/slice/Ice/PluginF.ice +8 -5
  653. data/slice/Ice/Process.ice +9 -6
  654. data/slice/Ice/ProcessF.ice +7 -4
  655. data/slice/Ice/Properties.ice +15 -12
  656. data/slice/Ice/PropertiesAdmin.ice +9 -5
  657. data/slice/Ice/PropertiesF.ice +7 -4
  658. data/slice/Ice/RemoteLogger.ice +33 -24
  659. data/slice/Ice/Router.ice +16 -7
  660. data/slice/Ice/RouterF.ice +7 -4
  661. data/slice/Ice/ServantLocator.ice +13 -10
  662. data/slice/Ice/ServantLocatorF.ice +7 -4
  663. data/slice/Ice/SliceChecksumDict.ice +7 -4
  664. data/slice/Ice/ValueFactory.ice +127 -0
  665. data/slice/Ice/Version.ice +9 -5
  666. data/slice/IceBT/ConnectionInfo.ice +53 -0
  667. data/slice/IceBT/EndpointInfo.ice +51 -0
  668. data/slice/IceBT/Types.ice +39 -0
  669. data/slice/IceBox/IceBox.ice +20 -21
  670. data/slice/IceDiscovery/IceDiscovery.ice +9 -5
  671. data/slice/IceGrid/Admin.ice +390 -30
  672. data/slice/IceGrid/Descriptor.ice +37 -29
  673. data/slice/IceGrid/Exception.ice +33 -27
  674. data/slice/IceGrid/FileParser.ice +9 -6
  675. data/slice/IceGrid/PluginFacade.ice +11 -9
  676. data/slice/IceGrid/Registry.ice +139 -16
  677. data/slice/IceGrid/Session.ice +10 -8
  678. data/slice/IceGrid/UserAccountMapper.ice +9 -6
  679. data/slice/IceIAP/ConnectionInfo.ice +70 -0
  680. data/slice/IceIAP/EndpointInfo.ice +64 -0
  681. data/slice/IceLocatorDiscovery/IceLocatorDiscovery.ice +9 -7
  682. data/slice/IcePatch2/FileInfo.ice +9 -8
  683. data/slice/IcePatch2/FileServer.ice +17 -13
  684. data/slice/IceSSL/ConnectionInfo.ice +14 -17
  685. data/slice/IceSSL/ConnectionInfoF.ice +24 -0
  686. data/slice/IceSSL/EndpointInfo.ice +9 -30
  687. data/slice/IceStorm/IceStorm.ice +22 -18
  688. data/slice/IceStorm/Metrics.ice +9 -5
  689. metadata +154 -120
  690. data/ext/ObjectFactory.cpp +0 -140
  691. data/ext/ObjectFactory.h +0 -50
  692. data/ext/ice/cpp/include/Ice/BasicStream.h +0 -1335
  693. data/ext/ice/cpp/include/Ice/Communicator.h +0 -200
  694. data/ext/ice/cpp/include/Ice/Connection.h +0 -497
  695. data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +0 -62
  696. data/ext/ice/cpp/include/Ice/Endpoint.h +0 -341
  697. data/ext/ice/cpp/include/Ice/Identity.h +0 -168
  698. data/ext/ice/cpp/include/Ice/Instrumentation.h +0 -365
  699. data/ext/ice/cpp/include/Ice/LocalException.h +0 -1030
  700. data/ext/ice/cpp/include/Ice/Locator.h +0 -2193
  701. data/ext/ice/cpp/include/Ice/Metrics.h +0 -2974
  702. data/ext/ice/cpp/include/Ice/ObjectAdapter.h +0 -168
  703. data/ext/ice/cpp/include/Ice/ObjectFactory.h +0 -92
  704. data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +0 -66
  705. data/ext/ice/cpp/include/Ice/Outgoing.h +0 -225
  706. data/ext/ice/cpp/include/Ice/Plugin.h +0 -125
  707. data/ext/ice/cpp/include/Ice/Process.h +0 -574
  708. data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +0 -830
  709. data/ext/ice/cpp/include/Ice/RemoteLogger.h +0 -1500
  710. data/ext/ice/cpp/include/Ice/Router.h +0 -1159
  711. data/ext/ice/cpp/include/Ice/Stream.h +0 -447
  712. data/ext/ice/cpp/include/Ice/StreamF.h +0 -30
  713. data/ext/ice/cpp/include/Ice/Version.h +0 -262
  714. data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +0 -158
  715. data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +0 -142
  716. data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +0 -119
  717. data/ext/ice/cpp/include/IceUtil/Cache.h +0 -362
  718. data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +0 -65
  719. data/ext/ice/cpp/include/Slice/CsUtil.h +0 -92
  720. data/ext/ice/cpp/include/Slice/DotNetNames.h +0 -34
  721. data/ext/ice/cpp/include/Slice/ObjCUtil.h +0 -127
  722. data/ext/ice/cpp/include/Slice/Util.h +0 -56
  723. data/ext/ice/cpp/src/Ice/BasicStream.cpp +0 -3428
  724. data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +0 -62
  725. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +0 -139
  726. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +0 -43
  727. data/ext/ice/cpp/src/Ice/Outgoing.cpp +0 -694
  728. data/ext/ice/cpp/src/Ice/Stream.cpp +0 -53
  729. data/ext/ice/cpp/src/Ice/StreamI.cpp +0 -832
  730. data/ext/ice/cpp/src/Ice/StreamI.h +0 -198
  731. data/ext/ice/cpp/src/IceSSL/Certificate.cpp +0 -1336
  732. data/ext/ice/cpp/src/IceUtil/Exception.cpp +0 -792
  733. data/ext/ice/cpp/src/IceUtil/FileUtil.h +0 -185
  734. data/ext/ice/cpp/src/Slice/CsUtil.cpp +0 -2660
  735. data/ext/ice/cpp/src/Slice/DotNetNames.cpp +0 -146
  736. data/ext/ice/cpp/src/Slice/ObjCUtil.cpp +0 -1310
  737. data/lib/IceGrid/Locator.rb +0 -106
  738. data/lib/IceGrid/Observer.rb +0 -572
  739. data/lib/IceGrid/Query.rb +0 -169
  740. data/slice/Freeze/BackgroundSaveEvictor.ice +0 -111
  741. data/slice/Freeze/CatalogData.ice +0 -49
  742. data/slice/Freeze/Connection.ice +0 -121
  743. data/slice/Freeze/DB.ice +0 -37
  744. data/slice/Freeze/Evictor.ice +0 -346
  745. data/slice/Freeze/EvictorF.ice +0 -22
  746. data/slice/Freeze/EvictorStorage.ice +0 -72
  747. data/slice/Freeze/Exception.ice +0 -100
  748. data/slice/Freeze/Transaction.ice +0 -58
  749. data/slice/Freeze/TransactionalEvictor.ice +0 -50
  750. data/slice/IceGrid/Locator.ice +0 -57
  751. data/slice/IceGrid/Observer.ice +0 -395
  752. data/slice/IceGrid/Query.ice +0 -131
@@ -1,53 +1,50 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2018 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2017 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.
7
7
  //
8
8
  // **********************************************************************
9
9
 
10
- #ifndef ICE_SSL_SECURE_TRANSPORT_TRANSCEIVER_I_H
11
- #define ICE_SSL_SECURE_TRANSPORT_TRANSCEIVER_I_H
10
+ #ifndef ICESSL_SECURE_TRANSPORT_TRANSCEIVER_I_H
11
+ #define ICESSL_SECURE_TRANSPORT_TRANSCEIVER_I_H
12
12
 
13
13
  #include <IceSSL/Config.h>
14
14
  #include <IceSSL/InstanceF.h>
15
- #include <IceSSL/SSLEngineF.h>
15
+ #include <IceSSL/SecureTransportEngineF.h>
16
16
  #include <IceSSL/Plugin.h>
17
17
 
18
18
  #include <Ice/Transceiver.h>
19
+ #include <Ice/UniqueRef.h>
19
20
  #include <Ice/Network.h>
20
- #include <Ice/StreamSocket.h>
21
- #include <Ice/WSTransceiver.h>
22
-
23
- #ifdef ICE_USE_SECURE_TRANSPORT
24
21
 
25
22
  #include <Security/Security.h>
23
+ #include <Security/SecureTransport.h>
26
24
  #include <CoreFoundation/CoreFoundation.h>
27
25
 
28
26
  namespace IceSSL
29
27
  {
30
28
 
31
- class ConnectorI;
32
- class AcceptorI;
29
+ namespace SecureTransport
30
+ {
33
31
 
34
- class TransceiverI : public IceInternal::Transceiver, public IceInternal::WSTransceiverDelegate
32
+ class TransceiverI : public IceInternal::Transceiver
35
33
  {
36
34
  public:
37
35
 
38
36
  virtual IceInternal::NativeInfoPtr getNativeInfo();
39
37
 
40
- virtual IceInternal::SocketOperation initialize(IceInternal::Buffer&, IceInternal::Buffer&, bool&);
38
+ virtual IceInternal::SocketOperation initialize(IceInternal::Buffer&, IceInternal::Buffer&);
41
39
  virtual IceInternal::SocketOperation closing(bool, const Ice::LocalException&);
42
40
  virtual void close();
43
41
  virtual IceInternal::SocketOperation write(IceInternal::Buffer&);
44
- virtual IceInternal::SocketOperation read(IceInternal::Buffer&, bool&);
42
+ virtual IceInternal::SocketOperation read(IceInternal::Buffer&);
45
43
 
46
44
  virtual std::string protocol() const;
47
45
  virtual std::string toString() const;
48
46
  virtual std::string toDetailedString() const;
49
47
  virtual Ice::ConnectionInfoPtr getInfo() const;
50
- virtual Ice::ConnectionInfoPtr getWSInfo(const Ice::HeaderDict&) const;
51
48
  virtual void checkSendSize(const IceInternal::Buffer&);
52
49
  virtual void setBufferSize(int rcvSize, int sndSize);
53
50
 
@@ -56,26 +53,22 @@ public:
56
53
 
57
54
  private:
58
55
 
59
- TransceiverI(const InstancePtr&, const IceInternal::StreamSocketPtr&, const std::string&, bool);
56
+ TransceiverI(const InstancePtr&, const IceInternal::TransceiverPtr&, const std::string&, bool);
60
57
  virtual ~TransceiverI();
61
58
 
62
- void fillConnectionInfo(const ConnectionInfoPtr&, std::vector<CertificatePtr>&) const;
63
-
64
- friend class ConnectorI;
65
- friend class AcceptorI;
59
+ friend class IceSSL::SecureTransport::SSLEngine;
66
60
 
67
61
  const InstancePtr _instance;
68
- const SecureTransportEnginePtr _engine;
62
+ const SSLEnginePtr _engine;
69
63
  const std::string _host;
70
64
  const std::string _adapterName;
71
65
  const bool _incoming;
72
- const IceInternal::StreamSocketPtr _stream;
66
+ const IceInternal::TransceiverPtr _delegate;
67
+
68
+ IceInternal::UniqueRef<SSLContextRef> _ssl;
69
+ IceInternal::UniqueRef<SecTrustRef> _trust;
70
+ bool _connected;
73
71
 
74
- SSLContextRef _ssl;
75
- SecTrustRef _trust;
76
- bool _verified;
77
-
78
- size_t _buffered;
79
72
  enum SSLWantFlags
80
73
  {
81
74
  SSLWantRead = 0x1,
@@ -85,11 +78,15 @@ private:
85
78
  mutable Ice::Byte _flags;
86
79
  size_t _maxSendPacketSize;
87
80
  size_t _maxRecvPacketSize;
81
+ std::string _cipher;
82
+ std::vector<CertificatePtr> _certs;
83
+ bool _verified;
84
+ size_t _buffered;
88
85
  };
89
86
  typedef IceUtil::Handle<TransceiverI> TransceiverIPtr;
90
87
 
91
- }
88
+ } // SecureTransport namespace end
92
89
 
93
- #endif
90
+ } // IceSSL namespace end
94
91
 
95
92
  #endif
@@ -0,0 +1,857 @@
1
+ // **********************************************************************
2
+ //
3
+ // Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
4
+ //
5
+ // This copy of Ice is licensed to you under the terms described in the
6
+ // ICE_LICENSE file included in this distribution.
7
+ //
8
+ // **********************************************************************
9
+
10
+ #include <IceSSL/SecureTransportUtil.h>
11
+ #include <IceSSL/Plugin.h>
12
+
13
+ #include <Ice/Base64.h>
14
+ #include <Ice/UniqueRef.h>
15
+ #include <Ice/LocalException.h>
16
+
17
+ #include <IceUtil/FileUtil.h>
18
+ #include <IceUtil/StringUtil.h>
19
+
20
+ #include <fstream>
21
+
22
+ #include <Security/Security.h>
23
+ #include <CoreFoundation/CoreFoundation.h>
24
+
25
+ using namespace Ice;
26
+ using namespace IceInternal;
27
+ using namespace IceSSL;
28
+ using namespace IceSSL::SecureTransport;
29
+ using namespace std;
30
+
31
+ namespace
32
+ {
33
+
34
+ CFMutableDataRef
35
+ readCertFile(const string& file)
36
+ {
37
+ ifstream is(IceUtilInternal::streamFilename(file).c_str(), ios::in | ios::binary);
38
+ if(!is.good())
39
+ {
40
+ throw CertificateReadException(__FILE__, __LINE__, "error opening file " + file);
41
+ }
42
+
43
+ is.seekg(0, is.end);
44
+ size_t size = is.tellg();
45
+ is.seekg(0, is.beg);
46
+
47
+ UniqueRef<CFMutableDataRef> data(CFDataCreateMutable(kCFAllocatorDefault, size));
48
+ CFDataSetLength(data.get(), size);
49
+ is.read(reinterpret_cast<char*>(CFDataGetMutableBytePtr(data.get())), size);
50
+ if(!is.good())
51
+ {
52
+ throw CertificateReadException(__FILE__, __LINE__, "error reading file " + file);
53
+ }
54
+ return data.release();
55
+ }
56
+
57
+ }
58
+
59
+ string
60
+ IceSSL::SecureTransport::sslErrorToString(CFErrorRef err)
61
+ {
62
+ ostringstream os;
63
+ if(err)
64
+ {
65
+ UniqueRef<CFStringRef> s(CFErrorCopyDescription(err));
66
+ os << "(error: " << CFErrorGetCode(err) << " description: " << fromCFString(s.get()) << ")";
67
+ }
68
+ return os.str();
69
+ }
70
+
71
+ string
72
+ IceSSL::SecureTransport::sslErrorToString(OSStatus status)
73
+ {
74
+ ostringstream os;
75
+ os << "(error: " << status;
76
+ #if defined(ICE_USE_SECURE_TRANSPORT_MACOS)
77
+ UniqueRef<CFStringRef> s(SecCopyErrorMessageString(status, 0));
78
+ if(s)
79
+ {
80
+ os << " description: " << fromCFString(s.get());
81
+ }
82
+ #endif
83
+ os << ")";
84
+ return os.str();
85
+ }
86
+
87
+ #if defined(ICE_USE_SECURE_TRANSPORT_MACOS)
88
+ CFDictionaryRef
89
+ IceSSL::SecureTransport::getCertificateProperty(SecCertificateRef cert, CFTypeRef key)
90
+ {
91
+ UniqueRef<CFDictionaryRef> property;
92
+ UniqueRef<CFArrayRef> keys(CFArrayCreate(ICE_NULLPTR, &key , 1, &kCFTypeArrayCallBacks));
93
+ UniqueRef<CFErrorRef> err;
94
+ UniqueRef<CFDictionaryRef> values(SecCertificateCopyValues(cert, keys.get(), &err.get()));
95
+ if(err)
96
+ {
97
+ ostringstream os;
98
+ os << "IceSSL: error getting property for certificate:\n" << sslErrorToString(err);
99
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
100
+ }
101
+
102
+ assert(values);
103
+ property.retain(static_cast<CFDictionaryRef>(CFDictionaryGetValue(values.get(), key)));
104
+ return property.release();
105
+ }
106
+
107
+ namespace
108
+ {
109
+
110
+ //
111
+ // Check the certificate basic constraints to check if the certificate is marked as a CA.
112
+ //
113
+ bool
114
+ isCA(SecCertificateRef cert)
115
+ {
116
+ UniqueRef<CFDictionaryRef> property(getCertificateProperty(cert, kSecOIDBasicConstraints));
117
+ if(property)
118
+ {
119
+ CFArrayRef propertyValues = static_cast<CFArrayRef>(CFDictionaryGetValue(property.get(), kSecPropertyKeyValue));
120
+ for(int i = 0, size = CFArrayGetCount(propertyValues); i < size; ++i)
121
+ {
122
+ CFDictionaryRef dict = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(propertyValues, i));
123
+ CFStringRef label = static_cast<CFStringRef>(CFDictionaryGetValue(dict, kSecPropertyKeyLabel));
124
+ if(CFEqual(label, CFSTR("Certificate Authority")))
125
+ {
126
+ return CFEqual(static_cast<CFStringRef>(CFDictionaryGetValue(dict, kSecPropertyKeyValue)), CFSTR("Yes"));
127
+ }
128
+ }
129
+ }
130
+ return false;
131
+ }
132
+
133
+ //
134
+ // Load keychain items (Certificates or Private Keys) from a file. On return items param contain
135
+ // the list of items, the caller must release it.
136
+ //
137
+ CFArrayRef
138
+ loadKeychainItems(const string& file, SecExternalItemType type, SecKeychainRef keychain, const string& passphrase,
139
+ const PasswordPromptPtr& prompt, int retryMax)
140
+ {
141
+ UniqueRef<CFMutableDataRef> data(readCertFile(file));
142
+
143
+ SecItemImportExportKeyParameters params;
144
+ memset(&params, 0, sizeof(params));
145
+ params.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION;
146
+ params.flags |= kSecKeyNoAccessControl;
147
+ UniqueRef<CFStringRef> passphraseHolder;
148
+ if(!passphrase.empty())
149
+ {
150
+ passphraseHolder.reset(toCFString(passphrase));
151
+ params.passphrase = passphraseHolder.get();
152
+ }
153
+
154
+ UniqueRef<CFArrayRef> items;
155
+ SecExternalItemType importType = type;
156
+ SecExternalFormat format = type == kSecItemTypeUnknown ? kSecFormatPKCS12 : kSecFormatUnknown;
157
+ UniqueRef<CFStringRef> path(toCFString(file));
158
+ OSStatus err = SecItemImport(data.get(), path.get(), &format, &importType, 0, &params, keychain, &items.get());
159
+
160
+ //
161
+ // If passphrase failure and no password was configured, we obtain
162
+ // the password from the given prompt or configure the import to
163
+ // prompt the user with an alert dialog.
164
+ //
165
+ UniqueRef<CFStringRef> alertPromptHolder;
166
+ if(passphrase.empty() &&
167
+ (err == errSecPassphraseRequired || err == errSecInvalidData || err == errSecPkcs12VerifyFailure))
168
+ {
169
+ if(!prompt)
170
+ {
171
+ params.flags |= kSecKeySecurePassphrase;
172
+ ostringstream os;
173
+ os << "Enter the password for\n" << file;
174
+ alertPromptHolder.reset(toCFString(os.str()));
175
+ params.alertPrompt = alertPromptHolder.get();
176
+ }
177
+
178
+ int count = 0;
179
+ while((err == errSecPassphraseRequired || err == errSecInvalidData || err == errSecPkcs12VerifyFailure) &&
180
+ count < retryMax)
181
+ {
182
+ if(prompt)
183
+ {
184
+ passphraseHolder.reset(toCFString(prompt->getPassword()));
185
+ params.passphrase = passphraseHolder.get();
186
+ }
187
+ err = SecItemImport(data.get(), path.get(), &format, &importType, 0, &params, keychain, &items.get());
188
+ ++count;
189
+ }
190
+ }
191
+
192
+ if(err != noErr)
193
+ {
194
+ ostringstream os;
195
+ os << "IceSSL: error reading " << (type == kSecItemTypePrivateKey ? "private key" : "certificate");
196
+ os << " `" << file << "':\n" << sslErrorToString(err);
197
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
198
+ }
199
+
200
+ if(type != kSecItemTypeUnknown && importType != kSecItemTypeAggregate && importType != type)
201
+ {
202
+ ostringstream os;
203
+ os << "IceSSL: error reading " << (type == kSecItemTypePrivateKey ? "private key" : "certificate");
204
+ os << " `" << file << "' doesn't contain the expected item";
205
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
206
+ }
207
+
208
+ return items.release();
209
+ }
210
+
211
+ SecKeychainRef
212
+ openKeychain(const std::string& path, const std::string& keychainPassword)
213
+ {
214
+ string keychainPath = path;
215
+ UniqueRef<SecKeychainRef> keychain;
216
+ OSStatus err = 0;
217
+ if(keychainPath.empty())
218
+ {
219
+ if((err = SecKeychainCopyDefault(&keychain.get())))
220
+ {
221
+ throw PluginInitializationException(__FILE__, __LINE__,
222
+ "IceSSL: unable to retrieve default keychain:\n" + sslErrorToString(err));
223
+ }
224
+ }
225
+ else
226
+ {
227
+ //
228
+ // KeyChain path is relative to the current working directory.
229
+ //
230
+ if(!IceUtilInternal::isAbsolutePath(keychainPath))
231
+ {
232
+ string cwd;
233
+ if(IceUtilInternal::getcwd(cwd) == 0)
234
+ {
235
+ keychainPath = string(cwd) + '/' + keychainPath;
236
+ }
237
+ }
238
+
239
+ if((err = SecKeychainOpen(keychainPath.c_str(), &keychain.get())))
240
+ {
241
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: unable to open keychain: `" +
242
+ keychainPath + "'\n" + sslErrorToString(err));
243
+ }
244
+ }
245
+
246
+ SecKeychainStatus status;
247
+ err = SecKeychainGetStatus(keychain.get(), &status);
248
+ if(err == noErr)
249
+ {
250
+ const char* pass = keychainPassword.empty() ? 0 : keychainPassword.c_str();
251
+ if((err = SecKeychainUnlock(keychain.get(), keychainPassword.size(), pass, pass != 0)))
252
+ {
253
+ throw PluginInitializationException(__FILE__, __LINE__,
254
+ "IceSSL: unable to unlock keychain:\n" + sslErrorToString(err));
255
+ }
256
+ }
257
+ else if(err == errSecNoSuchKeychain)
258
+ {
259
+ const char* pass = keychainPassword.empty() ? 0 : keychainPassword.c_str();
260
+ keychain.reset(0);
261
+ if((err = SecKeychainCreate(keychainPath.c_str(), keychainPassword.size(), pass, pass == 0, 0, &keychain.get())))
262
+ {
263
+ throw PluginInitializationException(__FILE__, __LINE__,
264
+ "IceSSL: unable to create keychain:\n" + sslErrorToString(err));
265
+ }
266
+ }
267
+ else
268
+ {
269
+ throw PluginInitializationException(__FILE__, __LINE__,
270
+ "IceSSL: unable to open keychain:\n" + sslErrorToString(err));
271
+ }
272
+
273
+ //
274
+ // Set keychain settings to avoid keychain lock.
275
+ //
276
+ SecKeychainSettings settings;
277
+ settings.version = SEC_KEYCHAIN_SETTINGS_VERS1;
278
+ settings.lockOnSleep = FALSE;
279
+ settings.useLockInterval = FALSE;
280
+ settings.lockInterval = INT_MAX;
281
+ if((err = SecKeychainSetSettings(keychain.get(), &settings)))
282
+ {
283
+ throw PluginInitializationException(__FILE__, __LINE__,
284
+ "IceSSL: error setting keychain settings:\n" + sslErrorToString(err));
285
+ }
286
+
287
+ return keychain.release();
288
+ }
289
+
290
+ //
291
+ // Imports a certificate private key and optionally add it to a keychain.
292
+ //
293
+ SecIdentityRef
294
+ loadPrivateKey(const string& file, SecCertificateRef cert, SecKeychainRef keychain, const string& password,
295
+ const PasswordPromptPtr& prompt, int retryMax)
296
+ {
297
+ //
298
+ // Check if we already imported the certificate
299
+ //
300
+ UniqueRef<CFDataRef> hash;
301
+ UniqueRef<CFDictionaryRef> subjectKeyProperty(getCertificateProperty(cert, kSecOIDSubjectKeyIdentifier));
302
+ if(subjectKeyProperty)
303
+ {
304
+ CFArrayRef values = static_cast<CFArrayRef>(CFDictionaryGetValue(subjectKeyProperty.get(),
305
+ kSecPropertyKeyValue));
306
+ for(int i = 0; i < CFArrayGetCount(values); ++i)
307
+ {
308
+ CFDictionaryRef dict = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(values, i));
309
+ if(CFEqual(CFDictionaryGetValue(dict, kSecPropertyKeyLabel), CFSTR("Key Identifier")))
310
+ {
311
+ hash.retain(static_cast<CFDataRef>(CFDictionaryGetValue(dict, kSecPropertyKeyValue)));
312
+ break;
313
+ }
314
+ }
315
+ }
316
+
317
+ const void* values[] = { keychain };
318
+ UniqueRef<CFArrayRef> searchList(CFArrayCreate(kCFAllocatorDefault, values, 1, &kCFTypeArrayCallBacks));
319
+
320
+ UniqueRef<CFMutableDictionaryRef> query(CFDictionaryCreateMutable(0,
321
+ 0,
322
+ &kCFTypeDictionaryKeyCallBacks,
323
+ &kCFTypeDictionaryValueCallBacks));
324
+
325
+ CFDictionarySetValue(query.get(), kSecClass, kSecClassCertificate);
326
+ CFDictionarySetValue(query.get(), kSecMatchLimit, kSecMatchLimitOne);
327
+ CFDictionarySetValue(query.get(), kSecMatchSearchList, searchList.get());
328
+ CFDictionarySetValue(query.get(), kSecAttrSubjectKeyID, hash.get());
329
+ CFDictionarySetValue(query.get(), kSecReturnRef, kCFBooleanTrue);
330
+
331
+ UniqueRef<CFTypeRef> value(0);
332
+ OSStatus err = SecItemCopyMatching(query.get(), &value.get());
333
+ UniqueRef<SecCertificateRef> item(static_cast<SecCertificateRef>(const_cast<void*>(value.release())));
334
+ if(err == noErr)
335
+ {
336
+ //
337
+ // If the certificate has already been imported, create the
338
+ // identity. The key should also have been imported.
339
+ //
340
+ UniqueRef<SecIdentityRef> identity;
341
+ err = SecIdentityCreateWithCertificate(keychain, item.get(), &identity.get());
342
+ if(err != noErr)
343
+ {
344
+ ostringstream os;
345
+ os << "IceSSL: error creating certificate identity:\n" << sslErrorToString(err);
346
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
347
+ }
348
+ return identity.release();
349
+ }
350
+ else if(err != errSecItemNotFound)
351
+ {
352
+ ostringstream os;
353
+ os << "IceSSL: error searching for keychain items:\n" << sslErrorToString(err);
354
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
355
+ }
356
+
357
+ //
358
+ // If the certificate isn't already in the keychain, load the
359
+ // private key into the keychain and add the certificate.
360
+ //
361
+ UniqueRef<CFArrayRef> items(loadKeychainItems(file, kSecItemTypePrivateKey, keychain, password, prompt, retryMax));
362
+ int count = CFArrayGetCount(items.get());
363
+ UniqueRef<SecKeyRef> key;
364
+ for(int i = 0; i < count; ++i)
365
+ {
366
+ SecKeychainItemRef item =
367
+ static_cast<SecKeychainItemRef>(const_cast<void*>(CFArrayGetValueAtIndex(items.get(), 0)));
368
+ if(SecKeyGetTypeID() == CFGetTypeID(item))
369
+ {
370
+ key.retain(reinterpret_cast<SecKeyRef>(item));
371
+ break;
372
+ }
373
+ }
374
+ if(!key)
375
+ {
376
+ throw CertificateReadException(__FILE__, __LINE__, "IceSSL: no key in file `" + file + "'");
377
+ }
378
+
379
+ //
380
+ // Add the certificate to the keychain
381
+ //
382
+ query.reset(CFDictionaryCreateMutable(kCFAllocatorDefault,
383
+ 0,
384
+ &kCFTypeDictionaryKeyCallBacks,
385
+ &kCFTypeDictionaryValueCallBacks));
386
+
387
+ CFDictionarySetValue(query.get(), kSecUseKeychain, keychain);
388
+ CFDictionarySetValue(query.get(), kSecClass, kSecClassCertificate);
389
+ CFDictionarySetValue(query.get(), kSecValueRef, cert);
390
+ CFDictionarySetValue(query.get(), kSecReturnRef, kCFBooleanTrue);
391
+
392
+ value.reset(0);
393
+ err = SecItemAdd(query.get(), static_cast<CFTypeRef*>(&value.get()));
394
+ UniqueRef<CFArrayRef> added(static_cast<CFArrayRef>(value.release()));
395
+ if(err != noErr)
396
+ {
397
+ ostringstream os;
398
+ os << "IceSSL: failure adding certificate to keychain\n" << sslErrorToString(err);
399
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
400
+ }
401
+ item.retain(static_cast<SecCertificateRef>(const_cast<void*>(CFArrayGetValueAtIndex(added.get(), 0))));
402
+
403
+ //
404
+ // Create the association between the private key and the certificate,
405
+ // kSecKeyLabel attribute should match the subject key identifier.
406
+ //
407
+ vector<SecKeychainAttribute> attributes;
408
+ if(hash)
409
+ {
410
+ SecKeychainAttribute attr;
411
+ attr.tag = kSecKeyLabel;
412
+ attr.data = const_cast<UInt8*>(CFDataGetBytePtr(hash.get()));
413
+ attr.length = CFDataGetLength(hash.get());
414
+ attributes.push_back(attr);
415
+ }
416
+
417
+ //
418
+ // kSecKeyPrintName attribute correspond to the keychain display
419
+ // name.
420
+ //
421
+ string label;
422
+ UniqueRef<CFStringRef> commonName(0);
423
+ if(SecCertificateCopyCommonName(item.get(), &commonName.get()) == noErr)
424
+ {
425
+ label = fromCFString(commonName.get());
426
+ SecKeychainAttribute attr;
427
+ attr.tag = kSecKeyPrintName;
428
+ attr.data = const_cast<char*>(label.c_str());
429
+ attr.length = label.size();
430
+ attributes.push_back(attr);
431
+ }
432
+
433
+ SecKeychainAttributeList attrs;
434
+ attrs.attr = &attributes[0];
435
+ attrs.count = attributes.size();
436
+ SecKeychainItemModifyAttributesAndData(reinterpret_cast<SecKeychainItemRef>(key.get()), &attrs, 0, 0);
437
+
438
+ UniqueRef<SecIdentityRef> identity;
439
+ err = SecIdentityCreateWithCertificate(keychain, item.get(), &identity.get());
440
+ if(err != noErr)
441
+ {
442
+ ostringstream os;
443
+ os << "IceSSL: error creating certificate identity:\n" << sslErrorToString(err);
444
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
445
+ }
446
+ return identity.release();
447
+ }
448
+
449
+ } // anonymous namespace end
450
+
451
+ #else
452
+
453
+ namespace
454
+ {
455
+
456
+ CFArrayRef
457
+ loadCerts(const string& file)
458
+ {
459
+ UniqueRef<CFArrayRef> certs(CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
460
+ if(file.find(".pem") != string::npos)
461
+ {
462
+ vector<char> buffer;
463
+ readFile(file, buffer);
464
+ string strbuf(buffer.begin(), buffer.end());
465
+ string::size_type size, startpos, endpos = 0;
466
+ bool first = true;
467
+ while(true)
468
+ {
469
+ startpos = strbuf.find("-----BEGIN CERTIFICATE-----", endpos);
470
+ if(startpos != string::npos)
471
+ {
472
+ startpos += sizeof("-----BEGIN CERTIFICATE-----");
473
+ endpos = strbuf.find("-----END CERTIFICATE-----", startpos);
474
+ if(endpos == string::npos)
475
+ {
476
+ InitializationException ex(__FILE__, __LINE__);
477
+ ex.reason = "IceSSL: certificate " + file + " is not a valid PEM-encoded certificate";
478
+ throw ex;
479
+ }
480
+ size = endpos - startpos;
481
+ }
482
+ else if(first)
483
+ {
484
+ startpos = 0;
485
+ endpos = string::npos;
486
+ size = strbuf.size();
487
+ }
488
+ else
489
+ {
490
+ break;
491
+ }
492
+
493
+ vector<unsigned char> data(IceInternal::Base64::decode(string(&buffer[startpos], size)));
494
+ UniqueRef<CFDataRef> certdata(CFDataCreate(kCFAllocatorDefault, &data[0], data.size()));
495
+ UniqueRef<SecCertificateRef> cert(SecCertificateCreateWithData(0, certdata.get()));
496
+ if(!cert)
497
+ {
498
+ InitializationException ex(__FILE__, __LINE__);
499
+ ex.reason = "IceSSL: certificate " + file + " is not a valid PEM-encoded certificate";
500
+ throw ex;
501
+ }
502
+ CFArrayAppendValue(const_cast<CFMutableArrayRef>(certs.get()), cert.get());
503
+ first = false;
504
+ }
505
+ }
506
+ else
507
+ {
508
+ UniqueRef<CFDataRef> data(readCertFile(file));
509
+ UniqueRef<SecCertificateRef> cert(SecCertificateCreateWithData(0, data.get()));
510
+ if(!cert)
511
+ {
512
+ InitializationException ex(__FILE__, __LINE__);
513
+ ex.reason = "IceSSL: certificate " + file + " is not a valid DER-encoded certificate";
514
+ throw ex;
515
+ }
516
+ CFArrayAppendValue(const_cast<CFMutableArrayRef>(certs.get()), cert.get());
517
+ }
518
+ return certs.release();
519
+ }
520
+
521
+ }
522
+
523
+ #endif
524
+
525
+ //
526
+ // Imports a certificate (it might contain an identity or certificate depending on the format).
527
+ //
528
+ CFArrayRef
529
+ IceSSL::SecureTransport::loadCertificateChain(const string& file,
530
+ const string& keyFile,
531
+ const std::string& keychainPath,
532
+ const string& keychainPassword,
533
+ const string& password,
534
+ const PasswordPromptPtr& prompt,
535
+ int retryMax)
536
+ {
537
+ UniqueRef<CFArrayRef> chain;
538
+ #if defined(ICE_USE_SECURE_TRANSPORT_IOS)
539
+ UniqueRef<CFDataRef> cert(readCertFile(file));
540
+
541
+ UniqueRef<CFMutableDictionaryRef> settings(CFDictionaryCreateMutable(0,
542
+ 1,
543
+ &kCFTypeDictionaryKeyCallBacks,
544
+ &kCFTypeDictionaryValueCallBacks));
545
+ UniqueRef<CFArrayRef> items;
546
+ OSStatus err;
547
+ int count = 0;
548
+ do
549
+ {
550
+ items.reset();
551
+ UniqueRef<CFStringRef> pass(toCFString(password.empty() && prompt ? prompt->getPassword() : password));
552
+ CFDictionarySetValue(settings.get(), kSecImportExportPassphrase, pass.get());
553
+ err = SecPKCS12Import(cert.get(), settings.get(), &items.get());
554
+ ++count;
555
+ }
556
+ while(password.empty() && prompt && err == errSecAuthFailed && count < retryMax);
557
+
558
+ if(err != noErr)
559
+ {
560
+ ostringstream os;
561
+ os << "IceSSL: unable to import certificate from file " << file << " (error = " << err << ")";
562
+ throw InitializationException(__FILE__, __LINE__, os.str());
563
+ }
564
+
565
+ for(int i = 0; i < CFArrayGetCount(items.get()); ++i)
566
+ {
567
+ CFDictionaryRef dict = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(items.get(), i));
568
+ SecIdentityRef identity = static_cast<SecIdentityRef>(
569
+ const_cast<void*>(CFDictionaryGetValue(dict, kSecImportItemIdentity)));
570
+ if(identity)
571
+ {
572
+ CFArrayRef certs = static_cast<CFArrayRef>(CFDictionaryGetValue(dict, kSecImportItemCertChain));
573
+ chain.reset(CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, certs));
574
+ CFArraySetValueAtIndex(const_cast<CFMutableArrayRef>(chain.get()), 0, identity);
575
+ }
576
+ }
577
+
578
+ if(!chain)
579
+ {
580
+ ostringstream os;
581
+ os << "IceSSL: couldn't find identity in file " << file;
582
+ throw InitializationException(__FILE__, __LINE__, os.str());
583
+ }
584
+ #else
585
+ UniqueRef<SecKeychainRef> keychain(openKeychain(keychainPath, keychainPassword));
586
+ if(keyFile.empty())
587
+ {
588
+ chain.reset(loadKeychainItems(file, kSecItemTypeUnknown, keychain.get(), password, prompt, retryMax));
589
+ }
590
+ else
591
+ {
592
+ //
593
+ // Load the certificate, don't load into the keychain as it
594
+ // might already have been imported.
595
+ //
596
+ UniqueRef<CFArrayRef> items(loadKeychainItems(file, kSecItemTypeCertificate, 0, password, prompt, retryMax));
597
+ SecCertificateRef cert =
598
+ static_cast<SecCertificateRef>(const_cast<void*>(CFArrayGetValueAtIndex(items.get(), 0)));
599
+ if(SecCertificateGetTypeID() != CFGetTypeID(cert))
600
+ {
601
+ ostringstream os;
602
+ os << "IceSSL: couldn't find certificate in `" << file << "'";
603
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
604
+ }
605
+
606
+ //
607
+ // Load the private key for the given certificate. This will
608
+ // add the certificate/key to the keychain if they aren't
609
+ // already present in the keychain.
610
+ //
611
+ UniqueRef<SecIdentityRef> identity(loadPrivateKey(keyFile, cert, keychain.get(), password, prompt, retryMax));
612
+ chain.reset(CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, items.get()));
613
+ CFArraySetValueAtIndex(const_cast<CFMutableArrayRef>(chain.get()), 0, identity.get());
614
+ }
615
+ #endif
616
+ return chain.release();
617
+ }
618
+
619
+ SecCertificateRef
620
+ IceSSL::SecureTransport::loadCertificate(const string& file)
621
+ {
622
+ UniqueRef<SecCertificateRef> cert;
623
+ #if defined(ICE_USE_SECURE_TRANSPORT_IOS)
624
+ UniqueRef<CFArrayRef> certs(loadCerts(file));
625
+ assert(CFArrayGetCount(certs.get()) > 0);
626
+ cert.retain((SecCertificateRef)CFArrayGetValueAtIndex(certs.get(), 0));
627
+ #else
628
+ UniqueRef<CFArrayRef> items(loadKeychainItems(file, kSecItemTypeCertificate, 0, "", 0, 0));
629
+ cert.retain((SecCertificateRef)CFArrayGetValueAtIndex(items.get(), 0));
630
+ #endif
631
+ return cert.release();
632
+ }
633
+
634
+ CFArrayRef
635
+ IceSSL::SecureTransport::loadCACertificates(const string& file)
636
+ {
637
+ #if defined(ICE_USE_SECURE_TRANSPORT_IOS)
638
+ return loadCerts(file);
639
+ #else
640
+ UniqueRef<CFArrayRef> items(loadKeychainItems(file, kSecItemTypeCertificate, 0, "", 0, 0));
641
+ UniqueRef<CFArrayRef> certificateAuthorities(CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
642
+ int count = CFArrayGetCount(items.get());
643
+ for(CFIndex i = 0; i < count; ++i)
644
+ {
645
+ SecCertificateRef cert =
646
+ static_cast<SecCertificateRef>(const_cast<void*>(CFArrayGetValueAtIndex(items.get(), i)));
647
+ assert(SecCertificateGetTypeID() == CFGetTypeID(cert));
648
+ if(isCA(cert))
649
+ {
650
+ CFArrayAppendValue(const_cast<CFMutableArrayRef>(certificateAuthorities.get()), cert);
651
+ }
652
+ }
653
+ return certificateAuthorities.release();
654
+ #endif
655
+ }
656
+
657
+ CFArrayRef
658
+ IceSSL::SecureTransport::findCertificateChain(const std::string& keychainPath,
659
+ const std::string& keychainPassword,
660
+ const string& value)
661
+ {
662
+ //
663
+ // Search the keychain using key:value pairs. The following keys are supported:
664
+ //
665
+ // Label
666
+ // Serial
667
+ // Subject
668
+ // SubjectKeyId
669
+ //
670
+ // A value must be enclosed in single or double quotes if it contains whitespace.
671
+ //
672
+ UniqueRef<CFMutableDictionaryRef> query(CFDictionaryCreateMutable(0,
673
+ 0,
674
+ &kCFTypeDictionaryKeyCallBacks,
675
+ &kCFTypeDictionaryValueCallBacks));
676
+
677
+ #if defined(ICE_USE_SECURE_TRANSPORT_MACOS)
678
+ UniqueRef<SecKeychainRef> keychain(openKeychain(keychainPath, keychainPassword));
679
+ const void* values[] = { keychain.get() };
680
+ UniqueRef<CFArrayRef> searchList(CFArrayCreate(kCFAllocatorDefault, values, 1, &kCFTypeArrayCallBacks));
681
+ CFDictionarySetValue(query.get(), kSecMatchSearchList, searchList.get());
682
+ #endif
683
+ CFDictionarySetValue(query.get(), kSecMatchLimit, kSecMatchLimitOne);
684
+ CFDictionarySetValue(query.get(), kSecClass, kSecClassCertificate);
685
+ CFDictionarySetValue(query.get(), kSecReturnRef, kCFBooleanTrue);
686
+ CFDictionarySetValue(query.get(), kSecMatchCaseInsensitive, kCFBooleanTrue);
687
+
688
+ size_t start = 0;
689
+ size_t pos;
690
+ bool valid = false;
691
+ while((pos = value.find(':', start)) != string::npos)
692
+ {
693
+ string field = IceUtilInternal::toUpper(IceUtilInternal::trim(value.substr(start, pos - start)));
694
+ string arg;
695
+ if(field != "LABEL" && field != "SERIAL" && field != "SUBJECT" && field != "SUBJECTKEYID")
696
+ {
697
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: unknown key in `" + value + "'");
698
+ }
699
+
700
+ start = pos + 1;
701
+ while(start < value.size() && (value[start] == ' ' || value[start] == '\t'))
702
+ {
703
+ ++start;
704
+ }
705
+
706
+ if(start == value.size())
707
+ {
708
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: missing argument in `" + value + "'");
709
+ }
710
+
711
+ if(value[start] == '"' || value[start] == '\'')
712
+ {
713
+ size_t end = start;
714
+ ++end;
715
+ while(end < value.size())
716
+ {
717
+ if(value[end] == value[start] && value[end - 1] != '\\')
718
+ {
719
+ break;
720
+ }
721
+ ++end;
722
+ }
723
+ if(end == value.size() || value[end] != value[start])
724
+ {
725
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: unmatched quote in `" + value + "'");
726
+ }
727
+ ++start;
728
+ arg = value.substr(start, end - start);
729
+ start = end + 1;
730
+ }
731
+ else
732
+ {
733
+ size_t end = value.find_first_of(" \t", start);
734
+ if(end == string::npos)
735
+ {
736
+ arg = value.substr(start);
737
+ start = value.size();
738
+ }
739
+ else
740
+ {
741
+ arg = value.substr(start, end - start);
742
+ start = end + 1;
743
+ }
744
+ }
745
+
746
+ if(field == "SUBJECT" || field == "LABEL")
747
+ {
748
+ UniqueRef<CFStringRef> v(toCFString(arg));
749
+ CFDictionarySetValue(query.get(), field == "LABEL" ? kSecAttrLabel : kSecMatchSubjectContains, v.get());
750
+ valid = true;
751
+ }
752
+ else if(field == "SUBJECTKEYID" || field == "SERIAL")
753
+ {
754
+ vector<unsigned char> buffer;
755
+ if(!parseBytes(arg, buffer))
756
+ {
757
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: invalid value `" + value + "'");
758
+ }
759
+ UniqueRef<CFDataRef> v(CFDataCreate(kCFAllocatorDefault, &buffer[0], buffer.size()));
760
+ CFDictionarySetValue(query.get(), field == "SUBJECTKEYID" ? kSecAttrSubjectKeyID : kSecAttrSerialNumber,
761
+ v.get());
762
+ valid = true;
763
+ }
764
+ }
765
+
766
+ if(!valid)
767
+ {
768
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: invalid value `" + value + "'");
769
+ }
770
+
771
+ UniqueRef<SecCertificateRef> cert;
772
+ OSStatus err = SecItemCopyMatching(query.get(), (CFTypeRef*)&cert.get());
773
+ if(err != noErr)
774
+ {
775
+ throw PluginInitializationException(__FILE__, __LINE__,
776
+ "IceSSL: find certificate `" + value + "' failed:\n" + sslErrorToString(err));
777
+ }
778
+
779
+ //
780
+ // Retrieve the certificate chain
781
+ //
782
+ UniqueRef<SecPolicyRef> policy(SecPolicyCreateSSL(true, 0));
783
+ UniqueRef<SecTrustRef> trust;
784
+ err = SecTrustCreateWithCertificates(reinterpret_cast<CFArrayRef>(cert.get()), policy.get(), &trust.get());
785
+ if(err || !trust)
786
+ {
787
+ throw PluginInitializationException(__FILE__, __LINE__,
788
+ "IceSSL: error creating trust object" +
789
+ (err ? ":\n" + sslErrorToString(err) : ""));
790
+ }
791
+
792
+ SecTrustResultType trustResult;
793
+ if((err = SecTrustEvaluate(trust.get(), &trustResult)))
794
+ {
795
+ throw PluginInitializationException(__FILE__, __LINE__,
796
+ "IceSSL: error evaluating trust:\n" + sslErrorToString(err));
797
+ }
798
+
799
+ int chainLength = SecTrustGetCertificateCount(trust.get());
800
+ UniqueRef<CFArrayRef> items(CFArrayCreateMutable(kCFAllocatorDefault, chainLength, &kCFTypeArrayCallBacks));
801
+ for(int i = 0; i < chainLength; ++i)
802
+ {
803
+ CFArrayAppendValue(const_cast<CFMutableArrayRef>(items.get()), SecTrustGetCertificateAtIndex(trust.get(), i));
804
+ }
805
+
806
+ //
807
+ // Replace the first certificate in the chain with the
808
+ // identity.
809
+ //
810
+ UniqueRef<SecIdentityRef> identity;
811
+ #if defined(ICE_USE_SECURE_TRANSPORT_IOS)
812
+
813
+ //
814
+ // SecIdentityCreateWithCertificate isn't supported on iOS so we lookup the identity
815
+ // using the certicate label. If the user added the identity with SecItemAdd the
816
+ // identity has the same label as the certificate.
817
+ //
818
+ query.reset(CFDictionaryCreateMutable(0, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
819
+ CFDictionarySetValue(query.get(), kSecClass, kSecClassCertificate);
820
+ CFDictionarySetValue(query.get(), kSecValueRef, cert.get());
821
+ CFDictionarySetValue(query.get(), kSecReturnAttributes, kCFBooleanTrue);
822
+ UniqueRef<CFDictionaryRef> attributes;
823
+ err = SecItemCopyMatching(query.get(), reinterpret_cast<CFTypeRef*>(&attributes.get()));
824
+ if(err != noErr)
825
+ {
826
+ ostringstream os;
827
+ os << "IceSSL: couldn't create identity for certificate found in the keychain:\n" << sslErrorToString(err);
828
+ throw PluginInitializationException(__FILE__, __LINE__, os.str());
829
+ }
830
+
831
+ // Now lookup the identity with the label
832
+ query.reset(CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
833
+ CFDictionarySetValue(query.get(), kSecMatchLimit, kSecMatchLimitOne);
834
+ CFDictionarySetValue(query.get(), kSecClass, kSecClassIdentity);
835
+ CFDictionarySetValue(query.get(), kSecAttrLabel, (CFDataRef)CFDictionaryGetValue(attributes.get(), kSecAttrLabel));
836
+ CFDictionarySetValue(query.get(), kSecReturnRef, kCFBooleanTrue);
837
+ err = SecItemCopyMatching(query.get(), (CFTypeRef*)&identity.get());
838
+ if(err == noErr)
839
+ {
840
+ UniqueRef<SecCertificateRef> cert2;
841
+ if((err = SecIdentityCopyCertificate(identity.get(), &cert2.get())) == noErr)
842
+ {
843
+ err = CFEqual(cert2.get(), cert.get()) ? noErr : errSecItemNotFound;
844
+ }
845
+ }
846
+ #else
847
+ err = SecIdentityCreateWithCertificate(keychain.get(), cert.get(), &identity.get());
848
+ #endif
849
+ if(err != noErr)
850
+ {
851
+ ostringstream os;
852
+ os << "IceSSL: couldn't create identity for certificate found in the keychain:\n" << sslErrorToString(err);
853
+ throw PluginInitializationException(__FILE__, __LINE__, os.str());
854
+ }
855
+ CFArraySetValueAtIndex(const_cast<CFMutableArrayRef>(items.get()), 0, identity.get());
856
+ return items.release();
857
+ }