summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2016-07-27 10:28:00 -0400
committerBernard Normier <bernard@zeroc.com>2016-07-27 10:28:00 -0400
commit9d8adf91dc5d99b236f0314a686a048e06e83510 (patch)
tree40675891ab3c1e4a912bf227f3a4c3e6e5278d3e /cpp/src
parentICE-7252 - Disable optimizer for VC140 x64 metrics test (diff)
downloadice-9d8adf91dc5d99b236f0314a686a048e06e83510.tar.bz2
ice-9d8adf91dc5d99b236f0314a686a048e06e83510.tar.xz
ice-9d8adf91dc5d99b236f0314a686a048e06e83510.zip
C++11 CertificateVerifier and PasswordPrompt
Diffstat (limited to 'cpp/src')
-rwxr-xr-xcpp/src/IceSSL/PluginI.cpp37
-rw-r--r--cpp/src/IceSSL/PluginI.h5
-rwxr-xr-xcpp/src/IceSSL/Util.cpp26
-rw-r--r--cpp/src/IceSSL/Util.h31
4 files changed, 97 insertions, 2 deletions
diff --git a/cpp/src/IceSSL/PluginI.cpp b/cpp/src/IceSSL/PluginI.cpp
index 2e3cbe10414..cb515311c5a 100755
--- a/cpp/src/IceSSL/PluginI.cpp
+++ b/cpp/src/IceSSL/PluginI.cpp
@@ -41,17 +41,20 @@ registerIceSSL(bool loadOnInitialize)
}
+#ifndef ICE_CPP11_MAPPING
IceSSL::CertificateVerifier::~CertificateVerifier()
{
// Out of line to avoid weak vtable
}
-IceSSL::NativeConnectionInfo::~NativeConnectionInfo()
+IceSSL::PasswordPrompt::~PasswordPrompt()
{
// Out of line to avoid weak vtable
}
+#endif
-IceSSL::PasswordPrompt::~PasswordPrompt()
+
+IceSSL::NativeConnectionInfo::~NativeConnectionInfo()
{
// Out of line to avoid weak vtable
}
@@ -130,17 +133,47 @@ IceSSL::PluginI::destroy()
_engine = 0;
}
+#ifdef ICE_CPP11_MAPPING
+void
+IceSSL::PluginI::setCertificateVerifier(std::function<bool(const std::shared_ptr<NativeConnectionInfo>&)> verifier)
+{
+ if(verifier)
+ {
+ _engine->setCertificateVerifier(make_shared<CertificateVerifier>(std::move(verifier)));
+ }
+ else
+ {
+ _engine->setCertificateVerifier(nullptr);
+ }
+}
+#else
void
IceSSL::PluginI::setCertificateVerifier(const CertificateVerifierPtr& verifier)
{
_engine->setCertificateVerifier(verifier);
}
+#endif
+#ifdef ICE_CPP11_MAPPING
+void
+IceSSL::PluginI::setPasswordPrompt(std::function<std::string()> prompt)
+{
+ if(prompt)
+ {
+ _engine->setPasswordPrompt(make_shared<PasswordPrompt>(std::move(prompt)));
+ }
+ else
+ {
+ _engine->setPasswordPrompt(nullptr);
+ }
+}
+#else
void
IceSSL::PluginI::setPasswordPrompt(const PasswordPromptPtr& prompt)
{
_engine->setPasswordPrompt(prompt);
}
+#endif
#ifdef ICE_USE_OPENSSL
void
diff --git a/cpp/src/IceSSL/PluginI.h b/cpp/src/IceSSL/PluginI.h
index ea0cf344ab4..b0f61028c21 100644
--- a/cpp/src/IceSSL/PluginI.h
+++ b/cpp/src/IceSSL/PluginI.h
@@ -32,8 +32,13 @@ public:
//
// From IceSSL::Plugin.
//
+#ifdef ICE_CPP11_MAPPING
+ virtual void setCertificateVerifier(std::function<bool(const std::shared_ptr<NativeConnectionInfo>&)>);
+ virtual void setPasswordPrompt(std::function<std::string()>);
+#else
virtual void setCertificateVerifier(const CertificateVerifierPtr&);
virtual void setPasswordPrompt(const PasswordPromptPtr&);
+#endif
#ifdef ICE_USE_OPENSSL
virtual void setContext(SSL_CTX*);
diff --git a/cpp/src/IceSSL/Util.cpp b/cpp/src/IceSSL/Util.cpp
index 6cb87ec31ec..5dc8bcf4b42 100755
--- a/cpp/src/IceSSL/Util.cpp
+++ b/cpp/src/IceSSL/Util.cpp
@@ -35,6 +35,32 @@ using namespace Ice;
using namespace IceUtil;
using namespace IceSSL;
+
+#ifdef ICE_CPP11_MAPPING
+IceSSL::CertificateVerifier::CertificateVerifier(std::function<bool(const std::shared_ptr<NativeConnectionInfo>&)> v) :
+ _verify(std::move(v))
+{
+}
+
+bool
+IceSSL::CertificateVerifier::verify(const NativeConnectionInfoPtr& info)
+{
+ return _verify(info);
+}
+
+IceSSL::PasswordPrompt::PasswordPrompt(std::function<std::string()> p) :
+ _prompt(std::move(p))
+{
+}
+
+std::string
+IceSSL::PasswordPrompt::getPassword()
+{
+ return _prompt();
+}
+#endif
+
+
#if !defined(ICE_USE_OPENSSL)
namespace
diff --git a/cpp/src/IceSSL/Util.h b/cpp/src/IceSSL/Util.h
index 3e98050ee35..1ff3b12aab5 100644
--- a/cpp/src/IceSSL/Util.h
+++ b/cpp/src/IceSSL/Util.h
@@ -29,6 +29,37 @@
namespace IceSSL
{
+#ifdef ICE_CPP11_MAPPING
+//
+// Adapts the C++11 functions to C++98-like callbacks
+//
+class CertificateVerifier
+{
+public:
+
+ CertificateVerifier(std::function<bool(const std::shared_ptr<NativeConnectionInfo>&)>);
+ bool verify(const NativeConnectionInfoPtr&);
+
+private:
+
+ std::function<bool(const std::shared_ptr<NativeConnectionInfo>&)> _verify;
+};
+using CertificateVerifierPtr = std::shared_ptr<CertificateVerifier>;
+
+class PasswordPrompt
+{
+public:
+
+ PasswordPrompt(std::function<std::string()>);
+ std::string getPassword();
+
+private:
+
+ std::function<std::string()> _prompt;
+};
+using PasswordPromptPtr = std::shared_ptr<PasswordPrompt>;
+#endif
+
//
// Constants for X509 certificate alt names (AltNameOther, AltNameORAddress, AltNameEDIPartyName and
// AltNameObjectIdentifier) are not supported.