zeroc-ice 3.7.5 → 3.7.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/Config.h +13 -0
- data/ext/Util.cpp +0 -4
- data/ext/ice/cpp/include/Ice/Exception.h +3 -3
- data/ext/ice/cpp/include/Ice/Functional.h +3 -1
- data/ext/ice/cpp/include/Ice/IconvStringConverter.h +1 -1
- data/ext/ice/cpp/include/Ice/Object.h +7 -0
- data/ext/ice/cpp/include/Ice/Proxy.h +25 -16
- data/ext/ice/cpp/include/Ice/Service.h +1 -1
- data/ext/ice/cpp/include/IceSSL/Plugin.h +142 -0
- data/ext/ice/cpp/include/IceUtil/Config.h +3 -2
- data/ext/ice/cpp/include/IceUtil/Functional.h +3 -1
- data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +4 -4
- data/ext/ice/cpp/include/IceUtil/ResourceConfig.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/BuiltinSequences.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Communicator.h +8 -2
- data/ext/ice/cpp/include/generated/Ice/CommunicatorF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Connection.h +45 -2
- data/ext/ice/cpp/include/generated/Ice/ConnectionF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Current.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Endpoint.h +38 -2
- data/ext/ice/cpp/include/generated/Ice/EndpointF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/EndpointTypes.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/FacetMap.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Identity.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/ImplicitContext.h +8 -2
- data/ext/ice/cpp/include/generated/Ice/ImplicitContextF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Instrumentation.h +62 -2
- data/ext/ice/cpp/include/generated/Ice/InstrumentationF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/LocalException.h +464 -68
- data/ext/ice/cpp/include/generated/Ice/Locator.h +55 -7
- data/ext/ice/cpp/include/generated/Ice/LocatorF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Logger.h +8 -2
- data/ext/ice/cpp/include/generated/Ice/LoggerF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Metrics.h +63 -11
- data/ext/ice/cpp/include/generated/Ice/ObjectAdapter.h +8 -2
- data/ext/ice/cpp/include/generated/Ice/ObjectAdapterF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/ObjectFactory.h +8 -2
- data/ext/ice/cpp/include/generated/Ice/Plugin.h +14 -2
- data/ext/ice/cpp/include/generated/Ice/PluginF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Process.h +8 -2
- data/ext/ice/cpp/include/generated/Ice/ProcessF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/Properties.h +8 -2
- data/ext/ice/cpp/include/generated/Ice/PropertiesAdmin.h +8 -2
- data/ext/ice/cpp/include/generated/Ice/PropertiesF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/RemoteLogger.h +21 -3
- data/ext/ice/cpp/include/generated/Ice/Router.h +14 -2
- data/ext/ice/cpp/include/generated/Ice/RouterF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/ServantLocator.h +8 -2
- data/ext/ice/cpp/include/generated/Ice/ServantLocatorF.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/SliceChecksumDict.h +2 -2
- data/ext/ice/cpp/include/generated/Ice/ValueFactory.h +14 -2
- data/ext/ice/cpp/include/generated/Ice/Version.h +2 -2
- data/ext/ice/cpp/include/generated/IceSSL/ConnectionInfo.h +7 -2
- data/ext/ice/cpp/include/generated/IceSSL/ConnectionInfoF.h +2 -2
- data/ext/ice/cpp/include/generated/IceSSL/EndpointInfo.h +7 -2
- data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Communicator.cpp +2 -2
- data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Connection.cpp +2 -2
- data/ext/ice/cpp/src/Ice/ConnectionF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +3 -3
- data/ext/ice/cpp/src/Ice/Current.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Endpoint.cpp +2 -2
- data/ext/ice/cpp/src/Ice/EndpointF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +2 -2
- data/ext/ice/cpp/src/Ice/FacetMap.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Identity.cpp +2 -2
- data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +2 -2
- data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/InputStream.cpp +10 -10
- data/ext/ice/cpp/src/Ice/Instrumentation.cpp +2 -2
- data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/LocalException.cpp +398 -2
- data/ext/ice/cpp/src/Ice/Locator.cpp +32 -2
- data/ext/ice/cpp/src/Ice/LocatorF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +3 -3
- data/ext/ice/cpp/src/Ice/Logger.cpp +2 -2
- data/ext/ice/cpp/src/Ice/LoggerF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Metrics.cpp +8 -2
- data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +2 -2
- data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +4 -4
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +8 -8
- data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Plugin.cpp +2 -2
- data/ext/ice/cpp/src/Ice/PluginF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Process.cpp +2 -2
- data/ext/ice/cpp/src/Ice/ProcessF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Properties.cpp +2 -2
- data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +2 -2
- data/ext/ice/cpp/src/Ice/PropertiesF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/PropertyNames.cpp +5 -3
- data/ext/ice/cpp/src/Ice/PropertyNames.h +1 -1
- data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +8 -2
- data/ext/ice/cpp/src/Ice/Router.cpp +2 -2
- data/ext/ice/cpp/src/Ice/RouterF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/RouterInfo.cpp +6 -2
- data/ext/ice/cpp/src/Ice/SHA1.cpp +2 -0
- data/ext/ice/cpp/src/Ice/ServantLocator.cpp +2 -2
- data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +2 -2
- data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Thread.cpp +2 -2
- data/ext/ice/cpp/src/Ice/ThreadPool.cpp +5 -1
- data/ext/ice/cpp/src/Ice/ValueFactory.cpp +2 -2
- data/ext/ice/cpp/src/Ice/Version.cpp +2 -2
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +2 -2
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +14 -2
- data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.cpp +2 -2
- data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.h +14 -2
- data/ext/ice/cpp/src/IceSSL/CertificateI.cpp +23 -1
- data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +2 -2
- data/ext/ice/cpp/src/IceSSL/ConnectionInfoF.cpp +2 -2
- data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +2 -2
- data/ext/ice/cpp/src/IceSSL/OpenSSLCertificateI.cpp +114 -6
- data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +60 -1
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +132 -7
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +1 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLUtil.cpp +2 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.cpp +114 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.h +21 -0
- data/ext/ice/cpp/src/IceSSL/SChannelCertificateI.cpp +142 -1
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +117 -3
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +1 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +20 -1
- data/ext/ice/cpp/src/IceSSL/SSLEngine.h +4 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportCertificateI.cpp +133 -2
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +150 -88
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +1 -0
- data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +7 -2
- data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +6 -0
- data/ext/ice/cpp/src/IceUtil/Time.cpp +2 -2
- data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +9 -5
- data/ext/ice/cpp/src/Slice/JavaUtil.cpp +8 -0
- data/ext/ice/cpp/src/Slice/MD5I.cpp +2 -1
- data/ext/ice/cpp/src/Slice/PHPUtil.cpp +4 -0
- data/ext/ice/cpp/src/Slice/Parser.cpp +4 -0
- data/ext/ice/cpp/src/Slice/Parser.h +2 -2
- data/ext/ice/cpp/src/Slice/PythonUtil.cpp +40 -3
- data/ext/ice/cpp/src/Slice/Scanner.cpp +620 -368
- data/ext/ice/mcpp/CMakeLists.txt +80 -0
- data/ext/ice/mcpp/expand.c +6 -6
- data/ice.gemspec +1 -1
- data/lib/Glacier2/Metrics.rb +1 -1
- data/lib/Glacier2/PermissionsVerifier.rb +1 -1
- data/lib/Glacier2/PermissionsVerifierF.rb +1 -1
- data/lib/Glacier2/Router.rb +1 -1
- data/lib/Glacier2/RouterF.rb +1 -1
- data/lib/Glacier2/SSLInfo.rb +1 -1
- data/lib/Glacier2/Session.rb +1 -1
- data/lib/Ice/BuiltinSequences.rb +1 -1
- data/lib/Ice/Communicator.rb +1 -1
- data/lib/Ice/CommunicatorF.rb +1 -1
- data/lib/Ice/Connection.rb +1 -1
- data/lib/Ice/ConnectionF.rb +1 -1
- data/lib/Ice/Current.rb +1 -1
- data/lib/Ice/Endpoint.rb +1 -1
- data/lib/Ice/EndpointF.rb +1 -1
- data/lib/Ice/EndpointTypes.rb +1 -1
- data/lib/Ice/FacetMap.rb +1 -1
- data/lib/Ice/Identity.rb +1 -1
- data/lib/Ice/ImplicitContext.rb +1 -1
- data/lib/Ice/ImplicitContextF.rb +1 -1
- data/lib/Ice/Instrumentation.rb +1 -1
- data/lib/Ice/InstrumentationF.rb +1 -1
- data/lib/Ice/LocalException.rb +1 -1
- data/lib/Ice/Locator.rb +1 -1
- data/lib/Ice/LocatorF.rb +1 -1
- data/lib/Ice/Logger.rb +1 -1
- data/lib/Ice/LoggerF.rb +1 -1
- data/lib/Ice/Metrics.rb +1 -1
- data/lib/Ice/ObjectAdapter.rb +1 -1
- data/lib/Ice/ObjectAdapterF.rb +1 -1
- data/lib/Ice/ObjectFactory.rb +1 -1
- data/lib/Ice/Plugin.rb +1 -1
- data/lib/Ice/PluginF.rb +1 -1
- data/lib/Ice/Process.rb +1 -1
- data/lib/Ice/ProcessF.rb +1 -1
- data/lib/Ice/Properties.rb +1 -1
- data/lib/Ice/PropertiesAdmin.rb +1 -1
- data/lib/Ice/PropertiesF.rb +1 -1
- data/lib/Ice/RemoteLogger.rb +1 -1
- data/lib/Ice/Router.rb +1 -1
- data/lib/Ice/RouterF.rb +1 -1
- data/lib/Ice/ServantLocator.rb +1 -1
- data/lib/Ice/ServantLocatorF.rb +1 -1
- data/lib/Ice/SliceChecksumDict.rb +1 -1
- data/lib/Ice/ValueFactory.rb +1 -1
- data/lib/Ice/Version.rb +1 -1
- data/lib/IceBox/IceBox.rb +1 -1
- data/lib/IceGrid/Admin.rb +1 -1
- data/lib/IceGrid/Descriptor.rb +1 -1
- data/lib/IceGrid/Exception.rb +1 -1
- data/lib/IceGrid/FileParser.rb +1 -1
- data/lib/IceGrid/PluginFacade.rb +1 -1
- data/lib/IceGrid/Registry.rb +1 -1
- data/lib/IceGrid/Session.rb +1 -1
- data/lib/IceGrid/UserAccountMapper.rb +1 -1
- data/lib/IcePatch2/FileInfo.rb +1 -1
- data/lib/IcePatch2/FileServer.rb +1 -1
- data/lib/IceStorm/IceStorm.rb +1 -1
- data/lib/IceStorm/Metrics.rb +1 -1
- data/slice/Glacier2/PermissionsVerifier.ice +1 -0
- data/slice/Glacier2/PermissionsVerifierF.ice +1 -0
- data/slice/Glacier2/Router.ice +1 -0
- data/slice/Glacier2/RouterF.ice +1 -0
- data/slice/Glacier2/SSLInfo.ice +1 -0
- data/slice/Glacier2/Session.ice +1 -0
- data/slice/Ice/BuiltinSequences.ice +1 -0
- data/slice/Ice/Communicator.ice +1 -0
- data/slice/Ice/CommunicatorF.ice +1 -0
- data/slice/Ice/Connection.ice +1 -0
- data/slice/Ice/ConnectionF.ice +1 -0
- data/slice/Ice/Current.ice +1 -0
- data/slice/Ice/Endpoint.ice +1 -0
- data/slice/Ice/EndpointF.ice +1 -0
- data/slice/Ice/EndpointTypes.ice +1 -0
- data/slice/Ice/FacetMap.ice +1 -0
- data/slice/Ice/Identity.ice +1 -0
- data/slice/Ice/ImplicitContext.ice +1 -0
- data/slice/Ice/ImplicitContextF.ice +1 -0
- data/slice/Ice/Instrumentation.ice +1 -0
- data/slice/Ice/InstrumentationF.ice +1 -0
- data/slice/Ice/LocalException.ice +1 -0
- data/slice/Ice/Locator.ice +1 -0
- data/slice/Ice/LocatorF.ice +1 -0
- data/slice/Ice/Logger.ice +1 -0
- data/slice/Ice/LoggerF.ice +1 -0
- data/slice/Ice/Metrics.ice +1 -0
- data/slice/Ice/ObjectAdapter.ice +1 -0
- data/slice/Ice/ObjectAdapterF.ice +1 -0
- data/slice/Ice/ObjectFactory.ice +1 -0
- data/slice/Ice/Plugin.ice +1 -0
- data/slice/Ice/PluginF.ice +1 -0
- data/slice/Ice/Process.ice +1 -0
- data/slice/Ice/ProcessF.ice +1 -0
- data/slice/Ice/Properties.ice +1 -0
- data/slice/Ice/PropertiesAdmin.ice +1 -0
- data/slice/Ice/PropertiesF.ice +1 -0
- data/slice/Ice/RemoteLogger.ice +1 -0
- data/slice/Ice/Router.ice +1 -0
- data/slice/Ice/RouterF.ice +1 -0
- data/slice/Ice/ServantLocator.ice +1 -0
- data/slice/Ice/ServantLocatorF.ice +1 -0
- data/slice/Ice/SliceChecksumDict.ice +1 -0
- data/slice/Ice/ValueFactory.ice +1 -0
- data/slice/Ice/Version.ice +1 -0
- data/slice/IceBT/ConnectionInfo.ice +1 -0
- data/slice/IceBT/EndpointInfo.ice +1 -0
- data/slice/IceBT/Types.ice +1 -0
- data/slice/IceBox/IceBox.ice +1 -0
- data/slice/IceDiscovery/IceDiscovery.ice +1 -0
- data/slice/IceGrid/Admin.ice +1 -0
- data/slice/IceGrid/Descriptor.ice +1 -0
- data/slice/IceGrid/Exception.ice +1 -0
- data/slice/IceGrid/FileParser.ice +1 -0
- data/slice/IceGrid/PluginFacade.ice +1 -0
- data/slice/IceGrid/Registry.ice +1 -0
- data/slice/IceGrid/Session.ice +1 -0
- data/slice/IceGrid/UserAccountMapper.ice +1 -0
- data/slice/IceIAP/ConnectionInfo.ice +1 -0
- data/slice/IceIAP/EndpointInfo.ice +1 -0
- data/slice/IceLocatorDiscovery/IceLocatorDiscovery.ice +1 -0
- data/slice/IcePatch2/FileInfo.ice +1 -0
- data/slice/IcePatch2/FileServer.ice +1 -0
- data/slice/IceSSL/ConnectionInfo.ice +1 -0
- data/slice/IceSSL/ConnectionInfoF.ice +1 -0
- data/slice/IceSSL/EndpointInfo.ice +1 -0
- data/slice/IceStorm/IceStorm.ice +1 -0
- data/slice/IceStorm/Metrics.ice +4 -1
- metadata +4 -4
@@ -4,6 +4,7 @@
|
|
4
4
|
|
5
5
|
#include <IceSSL/SecureTransportTransceiverI.h>
|
6
6
|
#include <IceSSL/Instance.h>
|
7
|
+
#include <IceSSL/PluginI.h>
|
7
8
|
#include <IceSSL/SecureTransportEngine.h>
|
8
9
|
#include <IceSSL/SecureTransportUtil.h>
|
9
10
|
#include <IceSSL/ConnectionInfo.h>
|
@@ -20,36 +21,6 @@ using namespace IceSSL::SecureTransport;
|
|
20
21
|
namespace
|
21
22
|
{
|
22
23
|
|
23
|
-
string
|
24
|
-
trustResultDescription(SecTrustResultType result)
|
25
|
-
{
|
26
|
-
switch(result)
|
27
|
-
{
|
28
|
-
case kSecTrustResultInvalid:
|
29
|
-
{
|
30
|
-
return "Invalid setting or result";
|
31
|
-
}
|
32
|
-
case kSecTrustResultDeny:
|
33
|
-
{
|
34
|
-
return "The user specified that the certificate should not be trusted";
|
35
|
-
}
|
36
|
-
case kSecTrustResultRecoverableTrustFailure:
|
37
|
-
case kSecTrustResultFatalTrustFailure:
|
38
|
-
{
|
39
|
-
return "Trust denied";
|
40
|
-
}
|
41
|
-
case kSecTrustResultOtherError:
|
42
|
-
{
|
43
|
-
return "Other error internal error";
|
44
|
-
}
|
45
|
-
default:
|
46
|
-
{
|
47
|
-
assert(false);
|
48
|
-
return "";
|
49
|
-
}
|
50
|
-
}
|
51
|
-
}
|
52
|
-
|
53
24
|
string
|
54
25
|
protocolName(SSLProtocol protocol)
|
55
26
|
{
|
@@ -92,99 +63,187 @@ socketRead(SSLConnectionRef connection, void* data, size_t* length)
|
|
92
63
|
return transceiver->readRaw(reinterpret_cast<char*>(data), length);
|
93
64
|
}
|
94
65
|
|
95
|
-
|
66
|
+
TrustError errorToTrustError(CFErrorRef err)
|
67
|
+
{
|
68
|
+
long errorCode = CFErrorGetCode(err);
|
69
|
+
switch (errorCode)
|
70
|
+
{
|
71
|
+
case errSecPathLengthConstraintExceeded:
|
72
|
+
{
|
73
|
+
return IceSSL::ICE_ENUM(TrustError, ChainTooLong);
|
74
|
+
}
|
75
|
+
case errSecUnknownCRLExtension:
|
76
|
+
case errSecUnknownCriticalExtensionFlag:
|
77
|
+
{
|
78
|
+
return IceSSL::ICE_ENUM(TrustError, HasNonSupportedCriticalExtension);
|
79
|
+
}
|
80
|
+
case errSecHostNameMismatch:
|
81
|
+
{
|
82
|
+
return IceSSL::ICE_ENUM(TrustError, HostNameMismatch);
|
83
|
+
}
|
84
|
+
case errSecCodeSigningNoBasicConstraints:
|
85
|
+
case errSecNoBasicConstraints:
|
86
|
+
case errSecNoBasicConstraintsCA:
|
87
|
+
{
|
88
|
+
return IceSSL::ICE_ENUM(TrustError, InvalidBasicConstraints);
|
89
|
+
}
|
90
|
+
case errSecMissingRequiredExtension:
|
91
|
+
case errSecUnknownCertExtension:
|
92
|
+
{
|
93
|
+
return IceSSL::ICE_ENUM(TrustError, InvalidExtension);
|
94
|
+
}
|
95
|
+
case errSecCertificateNameNotAllowed:
|
96
|
+
case errSecInvalidName:
|
97
|
+
{
|
98
|
+
return IceSSL::ICE_ENUM(TrustError, InvalidNameConstraints);
|
99
|
+
}
|
100
|
+
case errSecCertificatePolicyNotAllowed:
|
101
|
+
case errSecInvalidPolicyIdentifiers:
|
102
|
+
case errSecInvalidCertificateRef:
|
103
|
+
case errSecInvalidDigestAlgorithm:
|
104
|
+
case errSecUnsupportedKeySize:
|
105
|
+
{
|
106
|
+
return IceSSL::ICE_ENUM(TrustError, InvalidPolicyConstraints);
|
107
|
+
}
|
108
|
+
case errSecInvalidExtendedKeyUsage:
|
109
|
+
case errSecInvalidKeyUsageForPolicy:
|
110
|
+
{
|
111
|
+
return IceSSL::ICE_ENUM(TrustError, InvalidPurpose);
|
112
|
+
}
|
113
|
+
case errSecInvalidSignature:
|
114
|
+
{
|
115
|
+
return IceSSL::ICE_ENUM(TrustError, InvalidSignature);
|
116
|
+
}
|
117
|
+
case errSecCertificateExpired:
|
118
|
+
case errSecCertificateNotValidYet:
|
119
|
+
case errSecCertificateValidityPeriodTooLong:
|
120
|
+
{
|
121
|
+
return IceSSL::ICE_ENUM(TrustError, InvalidTime);
|
122
|
+
}
|
123
|
+
case errSecCreateChainFailed:
|
124
|
+
{
|
125
|
+
return IceSSL::ICE_ENUM(TrustError, PartialChain);
|
126
|
+
}
|
127
|
+
case errSecCertificateRevoked:
|
128
|
+
{
|
129
|
+
return IceSSL::ICE_ENUM(TrustError, Revoked);
|
130
|
+
}
|
131
|
+
case errSecIncompleteCertRevocationCheck:
|
132
|
+
case errSecOCSPNotTrustedToAnchor:
|
133
|
+
{
|
134
|
+
return IceSSL::ICE_ENUM(TrustError, RevocationStatusUnknown);
|
135
|
+
}
|
136
|
+
case errSecNotTrusted:
|
137
|
+
case errSecVerifyActionFailed:
|
138
|
+
{
|
139
|
+
return IceSSL::ICE_ENUM(TrustError, UntrustedRoot);
|
140
|
+
}
|
141
|
+
default:
|
142
|
+
{
|
143
|
+
return IceSSL::ICE_ENUM(TrustError, UnknownTrustFailure);
|
144
|
+
}
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
TrustError
|
96
149
|
checkTrustResult(SecTrustRef trust,
|
97
150
|
const IceSSL::SecureTransport::SSLEnginePtr& engine,
|
98
151
|
const IceSSL::InstancePtr& instance,
|
99
152
|
const string& host)
|
100
153
|
{
|
101
154
|
OSStatus err = noErr;
|
102
|
-
|
155
|
+
UniqueRef<CFErrorRef> trustErr;
|
103
156
|
if(trust)
|
104
157
|
{
|
105
|
-
|
106
|
-
{
|
107
|
-
throw SecurityException(__FILE__, __LINE__, "IceSSL: handshake failure:\n" + sslErrorToString(err));
|
108
|
-
}
|
109
|
-
|
110
|
-
//
|
111
|
-
// Disable network fetch, we don't want this to block.
|
112
|
-
//
|
158
|
+
// Do not allow to fetch missing intermediate certificates from the network.
|
113
159
|
if((err = SecTrustSetNetworkFetchAllowed(trust, false)))
|
114
160
|
{
|
115
161
|
throw SecurityException(__FILE__, __LINE__, "IceSSL: handshake failure:\n" + sslErrorToString(err));
|
116
162
|
}
|
117
163
|
|
118
|
-
|
119
|
-
// Add SSL trust policy if we need to check the certificate name.
|
120
|
-
//
|
164
|
+
UniqueRef<CFMutableArrayRef> policies(CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
|
165
|
+
// Add SSL trust policy if we need to check the certificate name, otherwise use basic x509 policy.
|
121
166
|
if(engine->getCheckCertName() && !host.empty())
|
122
167
|
{
|
123
168
|
UniqueRef<CFStringRef> hostref(toCFString(host));
|
124
169
|
UniqueRef<SecPolicyRef> policy(SecPolicyCreateSSL(true, hostref.get()));
|
125
|
-
|
126
|
-
|
170
|
+
CFArrayAppendValue(policies.get(), policy.get());
|
171
|
+
}
|
172
|
+
else
|
173
|
+
{
|
174
|
+
UniqueRef<SecPolicyRef> policy(SecPolicyCreateBasicX509());
|
175
|
+
CFArrayAppendValue(policies.get(), policy.get());
|
176
|
+
}
|
177
|
+
|
178
|
+
int revocationCheck = engine->getRevocationCheck();
|
179
|
+
if(revocationCheck > 0)
|
180
|
+
{
|
181
|
+
CFOptionFlags revocationFlags = kSecRevocationUseAnyAvailableMethod | kSecRevocationRequirePositiveResponse;
|
182
|
+
if(engine->getRevocationCheckCacheOnly())
|
127
183
|
{
|
128
|
-
|
184
|
+
revocationFlags |= kSecRevocationNetworkAccessDisabled;
|
129
185
|
}
|
130
|
-
|
131
|
-
|
132
|
-
if(
|
186
|
+
|
187
|
+
UniqueRef<SecPolicyRef> revocationPolicy(SecPolicyCreateRevocation(revocationFlags));
|
188
|
+
if(!revocationPolicy)
|
133
189
|
{
|
134
|
-
throw SecurityException(__FILE__,
|
190
|
+
throw SecurityException(__FILE__,
|
191
|
+
__LINE__,
|
192
|
+
"IceSSL: handshake failure: error creating revocation policy");
|
135
193
|
}
|
194
|
+
CFArrayAppendValue(policies.get(), revocationPolicy.get());
|
136
195
|
}
|
137
196
|
|
138
|
-
|
139
|
-
// Evaluate the trust
|
140
|
-
//
|
141
|
-
if((err = SecTrustEvaluate(trust, &trustResult)))
|
197
|
+
if((err = SecTrustSetPolicies(trust, policies.get())))
|
142
198
|
{
|
143
199
|
throw SecurityException(__FILE__, __LINE__, "IceSSL: handshake failure:\n" + sslErrorToString(err));
|
144
200
|
}
|
145
|
-
}
|
146
201
|
|
147
|
-
|
148
|
-
|
149
|
-
case kSecTrustResultUnspecified:
|
150
|
-
case kSecTrustResultProceed:
|
151
|
-
{
|
152
|
-
//
|
153
|
-
// Trust verify success.
|
154
|
-
//
|
155
|
-
return true;
|
156
|
-
}
|
157
|
-
default:
|
158
|
-
// case kSecTrustResultInvalid:
|
159
|
-
// case kSecTrustResultConfirm: // Used in old macOS versions
|
160
|
-
// case kSecTrustResultDeny:
|
161
|
-
// case kSecTrustResultRecoverableTrustFailure:
|
162
|
-
// case kSecTrustResultFatalTrustFailure:
|
163
|
-
// case kSecTrustResultOtherError:
|
164
|
-
{
|
165
|
-
if(engine->getVerifyPeer() == 0)
|
202
|
+
CFArrayRef certificateAuthorities = engine->getCertificateAuthorities();
|
203
|
+
if(certificateAuthorities != 0)
|
166
204
|
{
|
167
|
-
if(
|
205
|
+
if((err = SecTrustSetAnchorCertificates(trust, certificateAuthorities)))
|
168
206
|
{
|
169
|
-
|
170
|
-
os << "IceSSL: ignoring certificate verification failure:\n" << trustResultDescription(trustResult);
|
171
|
-
instance->logger()->trace(instance->traceCategory(), os.str());
|
207
|
+
throw SecurityException(__FILE__, __LINE__, "IceSSL: handshake failure:\n" + sslErrorToString(err));
|
172
208
|
}
|
173
|
-
|
209
|
+
SecTrustSetAnchorCertificatesOnly(trust, true);
|
210
|
+
}
|
211
|
+
|
212
|
+
//
|
213
|
+
// Evaluate the trust
|
214
|
+
//
|
215
|
+
if(SecTrustEvaluateWithError(trust, &trustErr.get()))
|
216
|
+
{
|
217
|
+
return IceSSL::ICE_ENUM(TrustError, NoError);
|
174
218
|
}
|
175
219
|
else
|
176
220
|
{
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
221
|
+
TrustError trustError = errorToTrustError(trustErr.get());
|
222
|
+
if(engine->getVerifyPeer() == 0)
|
223
|
+
{
|
224
|
+
if(instance->traceLevel() >= 1)
|
225
|
+
{
|
226
|
+
ostringstream os;
|
227
|
+
os << "IceSSL: ignoring certificate verification failure:\n"
|
228
|
+
<< getTrustErrorDescription(trustError);
|
229
|
+
instance->logger()->trace(instance->traceCategory(), os.str());
|
230
|
+
}
|
231
|
+
return trustError;
|
232
|
+
}
|
233
|
+
else
|
181
234
|
{
|
182
|
-
|
235
|
+
ostringstream os;
|
236
|
+
os << "IceSSL: certificate verification failure:\n" << getTrustErrorDescription(trustError);
|
237
|
+
string msg = os.str();
|
238
|
+
if(instance->traceLevel() >= 1)
|
239
|
+
{
|
240
|
+
instance->logger()->trace(instance->traceCategory(), msg);
|
241
|
+
}
|
242
|
+
throw SecurityException(__FILE__, __LINE__, msg);
|
183
243
|
}
|
184
|
-
throw SecurityException(__FILE__, __LINE__, msg);
|
185
244
|
}
|
186
245
|
}
|
187
|
-
|
246
|
+
return IceSSL::ICE_ENUM(TrustError, UnknownTrustFailure);
|
188
247
|
}
|
189
248
|
}
|
190
249
|
|
@@ -288,7 +347,8 @@ IceSSL::SecureTransport::TransceiverI::initialize(IceInternal::Buffer& readBuffe
|
|
288
347
|
}
|
289
348
|
if(err == noErr)
|
290
349
|
{
|
291
|
-
|
350
|
+
_trustError = checkTrustResult(_trust.get(), _engine, _instance, _host);
|
351
|
+
_verified = _trustError == IceSSL::ICE_ENUM(TrustError, NoError);
|
292
352
|
continue; // Call SSLHandshake to resume the handsake.
|
293
353
|
}
|
294
354
|
// Let it fall through, this will raise a SecurityException with the SSLCopyPeerTrust error.
|
@@ -546,13 +606,15 @@ IceSSL::SecureTransport::TransceiverI::toDetailedString() const
|
|
546
606
|
Ice::ConnectionInfoPtr
|
547
607
|
IceSSL::SecureTransport::TransceiverI::getInfo() const
|
548
608
|
{
|
549
|
-
IceSSL::
|
609
|
+
IceSSL::ExtendedConnectionInfoPtr info = ICE_MAKE_SHARED(IceSSL::ExtendedConnectionInfo);
|
550
610
|
info->underlying = _delegate->getInfo();
|
551
611
|
info->incoming = _incoming;
|
552
612
|
info->adapterName = _adapterName;
|
553
613
|
info->cipher = _cipher;
|
554
614
|
info->certs = _certs;
|
555
615
|
info->verified = _verified;
|
616
|
+
info->errorCode = _trustError;
|
617
|
+
info->host = _incoming ? "" : _host;
|
556
618
|
return info;
|
557
619
|
}
|
558
620
|
|
@@ -34,10 +34,15 @@ IceUtilInternal::int64ToString(Int64 val)
|
|
34
34
|
|
35
35
|
#if defined(_WIN32)
|
36
36
|
sprintf_s(buf, sizeof(buf), "%I64d", val);
|
37
|
-
#elif defined(
|
38
|
-
|
37
|
+
#elif defined(__APPLE__)
|
38
|
+
// sprintf is deprecated with macOS Ventura
|
39
|
+
snprintf(buf, sizeof(buf), "%ld", val); // Avoids a format warning from GCC.
|
39
40
|
#else
|
41
|
+
# if defined(ICE_64)
|
42
|
+
sprintf(buf, "%ld", val); // Avoids a format warning from GCC.
|
43
|
+
# else
|
40
44
|
sprintf(buf, "%lld", val);
|
45
|
+
# endif
|
41
46
|
#endif
|
42
47
|
return string(buf);
|
43
48
|
}
|
@@ -2,6 +2,12 @@
|
|
2
2
|
// Copyright (c) ZeroC, Inc. All rights reserved.
|
3
3
|
//
|
4
4
|
|
5
|
+
#if defined(_MSC_VER) && (_MSVC_LANG >= 201703L)
|
6
|
+
// TODO codecvt was deprecated in C++17 and cause build failures with VC++ compiler
|
7
|
+
// we should replace this code with MultiByteToWideChar() and WideCharToMultiByte()
|
8
|
+
# define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
|
9
|
+
#endif
|
10
|
+
|
5
11
|
#include <IceUtil/StringConverter.h>
|
6
12
|
#include <IceUtil/MutexPtrLock.h>
|
7
13
|
#include <IceUtil/Mutex.h>
|
@@ -246,7 +246,7 @@ IceUtil::Time::toDateTime() const
|
|
246
246
|
os << toString("%x %H:%M:%S") << ".";
|
247
247
|
os.fill('0');
|
248
248
|
os.width(3);
|
249
|
-
os << static_cast<
|
249
|
+
os << static_cast<Int64>(_usec % 1000000 / 1000);
|
250
250
|
return os.str();
|
251
251
|
}
|
252
252
|
|
@@ -278,7 +278,7 @@ IceUtil::Time::toDuration() const
|
|
278
278
|
std::string
|
279
279
|
IceUtil::Time::toString(const std::string& format) const
|
280
280
|
{
|
281
|
-
time_t time = static_cast<
|
281
|
+
time_t time = static_cast<time_t>(_usec / 1000000);
|
282
282
|
|
283
283
|
struct tm tr;
|
284
284
|
#ifdef _MSC_VER
|
@@ -1191,13 +1191,13 @@ lookupKwd(const string& name)
|
|
1191
1191
|
//
|
1192
1192
|
static const string keywordList[] =
|
1193
1193
|
{
|
1194
|
-
"alignas", "alignof", "and", "and_eq", "asm", "auto", "
|
1195
|
-
"case", "catch", "char", "char16_t", "char32_t", "class", "compl", "const", "
|
1194
|
+
"alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break",
|
1195
|
+
"case", "catch", "char", "char16_t", "char32_t", "class", "compl", "const", "const_cast", "constexpr", "continue",
|
1196
1196
|
"decltype", "default", "delete", "do", "double", "dynamic_cast",
|
1197
1197
|
"else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend",
|
1198
|
-
"goto", "if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq",
|
1199
|
-
"operator", "or", "or_eq", "private", "protected", "public", "register", "reinterpret_cast", "
|
1200
|
-
"short", "signed", "sizeof", "static", "static_assert", "static_cast", "struct", "switch",
|
1198
|
+
"goto", "if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr",
|
1199
|
+
"operator", "or", "or_eq", "private", "protected", "public", "register", "reinterpret_cast", "requires",
|
1200
|
+
"return", "short", "signed", "sizeof", "static", "static_assert", "static_cast", "struct", "switch",
|
1201
1201
|
"template", "this", "thread_local", "throw", "true", "try", "typedef", "typeid", "typename",
|
1202
1202
|
"union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq"
|
1203
1203
|
};
|
@@ -1257,7 +1257,11 @@ Slice::fixKwd(const string& name)
|
|
1257
1257
|
return lookupKwd(name);
|
1258
1258
|
}
|
1259
1259
|
StringList ids = splitScopedName(name);
|
1260
|
+
#ifdef ICE_CPP11_COMPILER
|
1261
|
+
transform(ids.begin(), ids.end(), ids.begin(), [](const string& id) -> string { return lookupKwd(id); });
|
1262
|
+
#else
|
1260
1263
|
transform(ids.begin(), ids.end(), ids.begin(), ptr_fun(lookupKwd));
|
1264
|
+
#endif
|
1261
1265
|
stringstream result;
|
1262
1266
|
for(StringList::const_iterator i = ids.begin(); i != ids.end(); ++i)
|
1263
1267
|
{
|
@@ -868,7 +868,11 @@ Slice::JavaCompatGenerator::fixKwd(const string& name) const
|
|
868
868
|
return lookupKwd(name);
|
869
869
|
}
|
870
870
|
StringList ids = splitScopedName(name);
|
871
|
+
#ifdef ICE_CPP11_COMPILER
|
872
|
+
transform(ids.begin(), ids.end(), ids.begin(), [](const string& id) -> string { return lookupKwd(id); });
|
873
|
+
#else
|
871
874
|
transform(ids.begin(), ids.end(), ids.begin(), ptr_fun(lookupKwd));
|
875
|
+
#endif
|
872
876
|
stringstream result;
|
873
877
|
for(StringList::const_iterator i = ids.begin(); i != ids.end(); ++i)
|
874
878
|
{
|
@@ -3348,7 +3352,11 @@ Slice::JavaGenerator::fixKwd(const string& name) const
|
|
3348
3352
|
return lookupKwd(name);
|
3349
3353
|
}
|
3350
3354
|
StringList ids = splitScopedName(name);
|
3355
|
+
#ifdef ICE_CPP11_COMPILER
|
3356
|
+
transform(ids.begin(), ids.end(), ids.begin(), [](const string& id) -> string { return lookupKwd(id); });
|
3357
|
+
#else
|
3351
3358
|
transform(ids.begin(), ids.end(), ids.begin(), ptr_fun(lookupKwd));
|
3359
|
+
#endif
|
3352
3360
|
stringstream result;
|
3353
3361
|
for(StringList::const_iterator i = ids.begin(); i != ids.end(); ++i)
|
3354
3362
|
{
|
@@ -52,6 +52,7 @@
|
|
52
52
|
*/
|
53
53
|
|
54
54
|
#include <Slice/MD5I.h>
|
55
|
+
#include <stdint.h>
|
55
56
|
#include <string.h>
|
56
57
|
|
57
58
|
#ifdef __GNUC__
|
@@ -172,7 +173,7 @@ md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
|
|
172
173
|
* On little-endian machines, we can process properly aligned
|
173
174
|
* data without copying it.
|
174
175
|
*/
|
175
|
-
if (!((data
|
176
|
+
if (!((reinterpret_cast<uintptr_t>(data)) & 3)) {
|
176
177
|
/* data are properly aligned */
|
177
178
|
X = (const md5_word_t *)data;
|
178
179
|
} else {
|
@@ -128,7 +128,11 @@ Slice::PHP::fixIdent(const string& ident)
|
|
128
128
|
return lookupKwd(ident);
|
129
129
|
}
|
130
130
|
vector<string> ids = splitScopedName(ident);
|
131
|
+
#ifdef ICE_CPP11_COMPILER
|
132
|
+
transform(ids.begin(), ids.end(), ids.begin(), [](const string& id) -> string { return lookupKwd(id); });
|
133
|
+
#else
|
131
134
|
transform(ids.begin(), ids.end(), ids.begin(), ptr_fun(lookupKwd));
|
135
|
+
#endif
|
132
136
|
stringstream result;
|
133
137
|
for(vector<string>::const_iterator i = ids.begin(); i != ids.end(); ++i)
|
134
138
|
{
|
@@ -1107,7 +1107,11 @@ Slice::Contained::Contained(const ContainerPtr& container, const string& name) :
|
|
1107
1107
|
void
|
1108
1108
|
Slice::Container::destroy()
|
1109
1109
|
{
|
1110
|
+
#ifdef ICE_CPP11_COMPILER
|
1111
|
+
for_each(_contents.begin(), _contents.end(), [](const SyntaxTreeBasePtr& it) { it->destroy(); });
|
1112
|
+
#else
|
1110
1113
|
for_each(_contents.begin(), _contents.end(), ::IceUtil::voidMemFun(&SyntaxTreeBase::destroy));
|
1114
|
+
#endif
|
1111
1115
|
_contents.clear();
|
1112
1116
|
_introducedMap.clear();
|
1113
1117
|
SyntaxTreeBase::destroy();
|
@@ -181,7 +181,7 @@ struct OptionalDef
|
|
181
181
|
// CICompare -- function object to do case-insensitive string comparison.
|
182
182
|
// ----------------------------------------------------------------------
|
183
183
|
|
184
|
-
class CICompare
|
184
|
+
class CICompare
|
185
185
|
{
|
186
186
|
public:
|
187
187
|
|
@@ -197,7 +197,7 @@ bool cICompare(const std::string&, const std::string&);
|
|
197
197
|
// most-derived to least-derived order.
|
198
198
|
// ----------------------------------------------------------------------
|
199
199
|
|
200
|
-
class DerivedToBaseCompare
|
200
|
+
class DerivedToBaseCompare
|
201
201
|
{
|
202
202
|
public:
|
203
203
|
|
@@ -805,7 +805,20 @@ Slice::Python::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
|
|
805
805
|
TypePtr ret = (*oli)->returnType();
|
806
806
|
ParamDeclList paramList = (*oli)->parameters();
|
807
807
|
string inParams;
|
808
|
+
string inParamsDecl;
|
808
809
|
|
810
|
+
// Find the last required parameter, all optional parameters after the last required parameter will use
|
811
|
+
// Ice.Unset as the default.
|
812
|
+
ParamDeclPtr lastRequiredParameter;
|
813
|
+
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
|
814
|
+
{
|
815
|
+
if(!(*q)->isOutParam() && !(*q)->optional())
|
816
|
+
{
|
817
|
+
lastRequiredParameter = *q;
|
818
|
+
}
|
819
|
+
}
|
820
|
+
|
821
|
+
bool afterLastRequiredParameter = lastRequiredParameter == ICE_NULLPTR;
|
809
822
|
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
|
810
823
|
{
|
811
824
|
if(!(*q)->isOutParam())
|
@@ -813,17 +826,29 @@ Slice::Python::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
|
|
813
826
|
if(!inParams.empty())
|
814
827
|
{
|
815
828
|
inParams.append(", ");
|
829
|
+
inParamsDecl.append(", ");
|
830
|
+
}
|
831
|
+
string param = fixIdent((*q)->name());
|
832
|
+
inParams.append(param);
|
833
|
+
if(afterLastRequiredParameter)
|
834
|
+
{
|
835
|
+
param += "=Ice.Unset";
|
836
|
+
}
|
837
|
+
inParamsDecl.append(param);
|
838
|
+
|
839
|
+
if(*q == lastRequiredParameter)
|
840
|
+
{
|
841
|
+
afterLastRequiredParameter = true;
|
816
842
|
}
|
817
|
-
inParams.append(fixIdent((*q)->name()));
|
818
843
|
}
|
819
844
|
}
|
820
845
|
|
821
846
|
_out << sp;
|
822
847
|
writeDocstring(*oli, DocSync, false);
|
823
848
|
_out << nl << "def " << fixedOpName << "(self";
|
824
|
-
if(!
|
849
|
+
if(!inParamsDecl.empty())
|
825
850
|
{
|
826
|
-
_out << ", " <<
|
851
|
+
_out << ", " << inParamsDecl;
|
827
852
|
}
|
828
853
|
const string contextParamName = getEscapedParamName(*oli, "context");
|
829
854
|
_out << ", " << contextParamName << "=None):";
|
@@ -949,7 +974,15 @@ Slice::Python::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
|
|
949
974
|
//
|
950
975
|
ClassList allBases = p->allBases();
|
951
976
|
StringList ids;
|
977
|
+
#ifdef ICE_CPP11_COMPILER
|
978
|
+
transform(allBases.begin(), allBases.end(), back_inserter(ids),
|
979
|
+
[](const ContainedPtr& it)
|
980
|
+
{
|
981
|
+
return it->scoped();
|
982
|
+
});
|
983
|
+
#else
|
952
984
|
transform(allBases.begin(), allBases.end(), back_inserter(ids), IceUtil::constMemFun(&Contained::scoped));
|
985
|
+
#endif
|
953
986
|
StringList other;
|
954
987
|
other.push_back(scoped);
|
955
988
|
other.push_back("::Ice::Object");
|
@@ -2999,7 +3032,11 @@ Slice::Python::fixIdent(const string& ident)
|
|
2999
3032
|
return lookupKwd(ident);
|
3000
3033
|
}
|
3001
3034
|
vector<string> ids = splitScopedName(ident);
|
3035
|
+
#ifdef ICE_CPP11_COMPILER
|
3036
|
+
transform(ids.begin(), ids.end(), ids.begin(), [](const string& id) -> string { return lookupKwd(id); });
|
3037
|
+
#else
|
3002
3038
|
transform(ids.begin(), ids.end(), ids.begin(), ptr_fun(lookupKwd));
|
3039
|
+
#endif
|
3003
3040
|
stringstream result;
|
3004
3041
|
for(vector<string>::const_iterator i = ids.begin(); i != ids.end(); ++i)
|
3005
3042
|
{
|