summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2009-10-14 16:43:16 +0200
committerBenoit Foucher <benoit@zeroc.com>2009-10-14 16:43:16 +0200
commit578eb177a948360e4ad692996ddb1608d8728d94 (patch)
tree73f3d325ccc4572727c2637dceb45b316265c77d /cpp/src
parentFixed Windows build issues (diff)
downloadice-578eb177a948360e4ad692996ddb1608d8728d94.tar.bz2
ice-578eb177a948360e4ad692996ddb1608d8728d94.tar.xz
ice-578eb177a948360e4ad692996ddb1608d8728d94.zip
Fixed bug 4228 - add connection information to context
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Glacier2/Blobject.cpp16
-rw-r--r--cpp/src/Glacier2/Blobject.h2
-rw-r--r--cpp/src/Glacier2/RouterI.cpp10
-rw-r--r--cpp/src/Glacier2/RouterI.h2
-rw-r--r--cpp/src/Glacier2/SessionRouterI.cpp153
-rw-r--r--cpp/src/Glacier2/SessionRouterI.h4
-rw-r--r--cpp/src/Ice/PropertyNames.cpp5
-rw-r--r--cpp/src/Ice/PropertyNames.h2
8 files changed, 134 insertions, 60 deletions
diff --git a/cpp/src/Glacier2/Blobject.cpp b/cpp/src/Glacier2/Blobject.cpp
index a7473a64251..efc168ead11 100644
--- a/cpp/src/Glacier2/Blobject.cpp
+++ b/cpp/src/Glacier2/Blobject.cpp
@@ -137,7 +137,7 @@ private:
}
Glacier2::Blobject::Blobject(const InstancePtr& instance, const ConnectionPtr& reverseConnection,
- const Ice::Context& sslContext) :
+ const Ice::Context& context) :
_instance(instance),
_reverseConnection(reverseConnection),
_forwardContext(_reverseConnection ?
@@ -152,7 +152,7 @@ Glacier2::Blobject::Blobject(const InstancePtr& instance, const ConnectionPtr& r
_overrideTraceLevel(reverseConnection ?
_instance->properties()->getPropertyAsInt(serverTraceOverride) :
_instance->properties()->getPropertyAsInt(clientTraceOverride)),
- _sslContext(sslContext)
+ _context(context)
{
RequestQueueThreadPtr t = _reverseConnection ? _instance->serverRequestQueueThread() :
_instance->clientRequestQueueThread();
@@ -337,7 +337,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Object_ice_invokePtr& amd
bool override;
try
{
- override = _requestQueue->addRequest(new Request(proxy, inParams, current, _forwardContext, _sslContext,
+ override = _requestQueue->addRequest(new Request(proxy, inParams, current, _forwardContext, _context,
amdCB));
}
catch(const ObjectNotExistException& ex)
@@ -402,11 +402,11 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Object_ice_invokePtr& amd
bool sent;
if(_forwardContext)
{
- if(_sslContext.size() > 0)
+ if(_context.size() > 0)
{
Ice::Context ctx = current.ctx;
- ctx.insert(_sslContext.begin(), _sslContext.end());
- sent = proxy->ice_invoke_async(amiCB, current.operation, current.mode, inParams);
+ ctx.insert(_context.begin(), _context.end());
+ sent = proxy->ice_invoke_async(amiCB, current.operation, current.mode, inParams, ctx);
}
else
{
@@ -415,9 +415,9 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Object_ice_invokePtr& amd
}
else
{
- if(_sslContext.size() > 0)
+ if(_context.size() > 0)
{
- sent = proxy->ice_invoke_async(amiCB, current.operation, current.mode, inParams, _sslContext);
+ sent = proxy->ice_invoke_async(amiCB, current.operation, current.mode, inParams, _context);
}
else
{
diff --git a/cpp/src/Glacier2/Blobject.h b/cpp/src/Glacier2/Blobject.h
index 96e90087d59..8f17938898f 100644
--- a/cpp/src/Glacier2/Blobject.h
+++ b/cpp/src/Glacier2/Blobject.h
@@ -39,7 +39,7 @@ private:
const int _requestTraceLevel;
const int _overrideTraceLevel;
const RequestQueuePtr _requestQueue;
- const Ice::Context _sslContext;
+ const Ice::Context _context;
};
}
diff --git a/cpp/src/Glacier2/RouterI.cpp b/cpp/src/Glacier2/RouterI.cpp
index 09dada8a956..cb71e8b39f2 100644
--- a/cpp/src/Glacier2/RouterI.cpp
+++ b/cpp/src/Glacier2/RouterI.cpp
@@ -20,14 +20,14 @@ using namespace Glacier2;
Glacier2::RouterI::RouterI(const InstancePtr& instance, const ConnectionPtr& connection, const string& userId,
const SessionPrx& session, const Identity& controlId, const FilterManagerPtr& filters,
- const Ice::Context& sslContext) :
+ const Ice::Context& context) :
_instance(instance),
- _clientBlobject(new ClientBlobject(_instance, filters, sslContext)),
+ _clientBlobject(new ClientBlobject(_instance, filters, context)),
_connection(connection),
_userId(userId),
_session(session),
_controlId(controlId),
- _sslContext(sslContext),
+ _context(context),
_timestamp(IceUtil::Time::now(IceUtil::Time::Monotonic))
{
//
@@ -91,9 +91,9 @@ Glacier2::RouterI::destroy(const AMI_Session_destroyPtr& amiCB)
}
}
- if(_sslContext.size() > 0)
+ if(_context.size() > 0)
{
- _session->destroy_async(amiCB, _sslContext);
+ _session->destroy_async(amiCB, _context);
}
else
{
diff --git a/cpp/src/Glacier2/RouterI.h b/cpp/src/Glacier2/RouterI.h
index e92781a3a9b..f3710b3b950 100644
--- a/cpp/src/Glacier2/RouterI.h
+++ b/cpp/src/Glacier2/RouterI.h
@@ -69,7 +69,7 @@ private:
const std::string _userId;
const SessionPrx _session;
const Ice::Identity _controlId;
- const Ice::Context _sslContext;
+ const Ice::Context _context;
const IceUtil::Mutex _timestampMutex;
mutable IceUtil::Time _timestamp;
};
diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp
index 3db5b4bf209..1bf1f925b5d 100644
--- a/cpp/src/Glacier2/SessionRouterI.cpp
+++ b/cpp/src/Glacier2/SessionRouterI.cpp
@@ -16,6 +16,7 @@
#include <IceUtil/UUID.h>
#include <IceSSL/IceSSL.h>
+#include <Ice/Connection.h>
#include <Ice/Network.h>
using namespace std;
@@ -140,7 +141,7 @@ public:
UserPasswordCreateSession(const AMD_Router_createSessionPtr& amdCB, const string& user, const string& password,
const Ice::Current& current, const SessionRouterIPtr& sessionRouter) :
- CreateSession(sessionRouter, user, current, Ice::Context()),
+ CreateSession(sessionRouter, user, current),
_amdCB(amdCB),
_password(password)
{
@@ -193,8 +194,10 @@ public:
{
assert(_sessionRouter->_verifier);
+ Ice::Context ctx = _current.ctx;
+ ctx.insert(_context.begin(), _context.end());
AMI_PermissionsVerifier_checkPermissionsPtr cb = new CheckPermissionsCB(this, _sessionRouter->_sessionManager);
- _sessionRouter->_verifier->checkPermissions_async(cb, _user, _password, _current.ctx);
+ _sessionRouter->_verifier->checkPermissions_async(cb, _user, _password, ctx);
}
virtual void
@@ -203,7 +206,9 @@ public:
try
{
string reason;
- if(_sessionRouter->_verifier->checkPermissions(_user, _password, reason, _current.ctx))
+ Ice::Context ctx = _current.ctx;
+ ctx.insert(_context.begin(), _context.end());
+ if(_sessionRouter->_verifier->checkPermissions(_user, _password, reason, ctx))
{
authorized(_sessionRouter->_sessionManager);
}
@@ -263,7 +268,9 @@ public:
virtual void
createSession()
{
- _sessionRouter->_sessionManager->create_async(new CreateCB(this), _user, _control, _current.ctx);
+ Ice::Context ctx = _current.ctx;
+ ctx.insert(_context.begin(), _context.end());
+ _sessionRouter->_sessionManager->create_async(new CreateCB(this), _user, _control, ctx);
}
virtual void
@@ -289,9 +296,8 @@ class SSLCreateSession : public CreateSession
public:
SSLCreateSession(const AMD_Router_createSessionFromSecureConnectionPtr& amdCB, const string& user,
- const SSLInfo& sslInfo, const Ice::Current& current, const SessionRouterIPtr& sessionRouter,
- const Ice::Context& sslContext) :
- CreateSession(sessionRouter, user, current, sslContext),
+ const SSLInfo& sslInfo, const Ice::Current& current, const SessionRouterIPtr& sessionRouter) :
+ CreateSession(sessionRouter, user, current),
_amdCB(amdCB),
_sslInfo(sslInfo)
{
@@ -345,8 +351,11 @@ public:
{
assert(_sessionRouter->_sslVerifier);
+ Ice::Context ctx = _current.ctx;
+ ctx.insert(_context.begin(), _context.end());
+
AMI_SSLPermissionsVerifier_authorizePtr cb = new AuthorizeCB(this, _sessionRouter->_sslSessionManager);
- _sessionRouter->_sslVerifier->authorize_async(cb, _sslInfo, _current.ctx);
+ _sessionRouter->_sslVerifier->authorize_async(cb, _sslInfo, ctx);
}
virtual void
@@ -355,7 +364,9 @@ public:
try
{
string reason;
- if(_sessionRouter->_sslVerifier->authorize(_sslInfo, reason, _current.ctx))
+ Ice::Context ctx = _current.ctx;
+ ctx.insert(_context.begin(), _context.end());
+ if(_sessionRouter->_sslVerifier->authorize(_sslInfo, reason, ctx))
{
authorized(_sessionRouter->_sslSessionManager);
}
@@ -415,7 +426,9 @@ public:
virtual void
createSession()
{
- _sessionRouter->_sslSessionManager->create_async(new CreateCB(this), _sslInfo, _control, _current.ctx);
+ Ice::Context ctx = _current.ctx;
+ ctx.insert(_context.begin(), _context.end());
+ _sessionRouter->_sslSessionManager->create_async(new CreateCB(this), _sslInfo, _control, ctx);
}
virtual void
@@ -470,16 +483,55 @@ private:
}
+namespace
+{
+
+template<class T> void populateContext(const IceInternal::Handle<T>& info, Ice::Context& context)
+{
+ ostringstream os;
+ os << info->remotePort;
+ context["_con.remotePort"] = os.str();
+ context["_con.remoteAddress"] = info->remoteAddress;
+ os.str("");
+ os << info->localPort;
+ context["_con.localPort"] = os.str();
+ context["_con.localAddress"] = info->localAddress;
+}
+
+}
+
using namespace Glacier2;
Glacier2::CreateSession::CreateSession(const SessionRouterIPtr& sessionRouter, const string& user,
- const Ice::Current& current, const Ice::Context& sslContext) :
+ const Ice::Current& current) :
_instance(sessionRouter->_instance),
_sessionRouter(sessionRouter),
_user(user),
- _current(current),
- _sslContext(sslContext)
+ _current(current)
{
+ if(_instance->properties()->getPropertyAsInt("Glacier2.AddConnectionContext") > 0)
+ {
+ _context["_con.type"] = current.con->type();
+ {
+ Ice::TcpConnectionInfoPtr info = Ice::TcpConnectionInfoPtr::dynamicCast(current.con->getInfo());
+ if(info)
+ {
+ populateContext(info, _context);
+ }
+ }
+ {
+ IceSSL::SSLConnectionInfoPtr info = IceSSL::SSLConnectionInfoPtr::dynamicCast(current.con->getInfo());
+ if(info)
+ {
+ populateContext(info, _context);
+ _context["_con.cipher"] = info->cipher;
+ if(info->certs.size() > 0)
+ {
+ _context["_con.peerCert"] = info->certs[0];
+ }
+ }
+ }
+ }
}
void
@@ -556,7 +608,38 @@ Glacier2::CreateSession::sessionCreated(const SessionPrx& session)
{
ident = _control->ice_getIdentity();
}
- router = new RouterI(_instance, _current.con, _user, session, ident, _filterManager, _sslContext);
+
+ if(_instance->properties()->getPropertyAsInt("Glacier2.AddConnectionContext") == 1 ||
+ _instance->properties()->getPropertyAsInt("Glacier2.AddSSLContext") > 0)
+ {
+ //
+ // DEPRECATED: Glacier2.AddSSLContext.
+ //
+ IceSSL::SSLConnectionInfoPtr info = IceSSL::SSLConnectionInfoPtr::dynamicCast(_current.con->getInfo());
+ if(info && _instance->properties()->getPropertyAsInt("Glacier2.AddSSLContext") > 0)
+ {
+ _context["SSL.Active"] = "1";
+ _context["SSL.Cipher"] = info->cipher;
+ ostringstream os;
+ os << info->remotePort;
+ _context["SSL.Remote.Port"] = os.str();
+ _context["SSL.Remote.Host"] = info->remoteAddress;
+ os.str("");
+ os << info->localPort;
+ _context["SSL.Local.Port"] = os.str();
+ _context["SSL.Local.Host"] = info->localAddress;
+ if(info->certs.size() > 0)
+ {
+ _context["SSL.PeerCert"] = info->certs[0];
+ }
+ }
+
+ router = new RouterI(_instance, _current.con, _user, session, ident, _filterManager, _context);
+ }
+ else
+ {
+ router = new RouterI(_instance, _current.con, _user, session, ident, _filterManager, Ice::Context());
+ }
}
catch(const Ice::Exception& ex)
{
@@ -601,8 +684,14 @@ Glacier2::CreateSession::unexpectedCreateSessionException(const Ice::Exception&
void
Glacier2::CreateSession::exception(const Ice::Exception& ex)
{
- _sessionRouter->finishCreateSession(_current.con, 0);
-
+ try
+ {
+ _sessionRouter->finishCreateSession(_current.con, 0);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ }
+
finished(ex);
if(_control)
@@ -812,7 +901,6 @@ Glacier2::SessionRouterI::createSessionFromSecureConnection_async(
string userDN;
SSLInfo sslinfo;
- Ice::Context sslCtx;
//
// Populate the SSL context information.
@@ -835,24 +923,6 @@ Glacier2::SessionRouterI::createSessionFromSecureConnection_async(
{
userDN = IceSSL::Certificate::decode(info->certs[0])->getSubjectDN();
}
-
- if(_instance->properties()->getPropertyAsInt("Glacier2.AddSSLContext") > 0)
- {
- sslCtx["_SSL.Active"] = "1";
- sslCtx["_SSL.Cipher"] = sslinfo.cipher;
- ostringstream os;
- os << sslinfo.remotePort;
- sslCtx["_SSL.Remote.Port"] = os.str();
- sslCtx["_SSL.Remote.Host"] = sslinfo.remoteHost;
- os.str("");
- os << sslinfo.localPort;
- sslCtx["_SSL.Local.Port"] = os.str();
- sslCtx["_SSL.Local.Host"] = sslinfo.localHost;
- if(info->certs.size() > 0)
- {
- sslCtx["_SSL.PeerCert"] = info->certs[0];
- }
- }
}
catch(const IceSSL::CertificateEncodingException&)
{
@@ -865,7 +935,7 @@ Glacier2::SessionRouterI::createSessionFromSecureConnection_async(
return;
}
- CreateSessionPtr session = new SSLCreateSession(amdCB, userDN, sslinfo, current, this, sslCtx);
+ CreateSessionPtr session = new SSLCreateSession(amdCB, userDN, sslinfo, current, this);
session->create();
}
@@ -1084,8 +1154,9 @@ Glacier2::SessionRouterI::startCreateSession(const CreateSessionPtr& cb, const C
if(_destroy)
{
- connection->close(true);
- throw ObjectNotExistException(__FILE__, __LINE__);
+ CannotCreateSessionException exc;
+ exc.reason = "router is shutting down";
+ throw exc;
}
//
@@ -1153,8 +1224,10 @@ Glacier2::SessionRouterI::finishCreateSession(const ConnectionPtr& connection, c
if(_destroy)
{
router->destroy(new DestroyCB(0, 0));
- connection->close(true);
- throw ObjectNotExistException(__FILE__, __LINE__);
+
+ CannotCreateSessionException exc;
+ exc.reason = "router is shutting down";
+ throw exc;
}
_routersByConnectionHint = _routersByConnection.insert(
diff --git a/cpp/src/Glacier2/SessionRouterI.h b/cpp/src/Glacier2/SessionRouterI.h
index 77a25eac071..7f9aa5626de 100644
--- a/cpp/src/Glacier2/SessionRouterI.h
+++ b/cpp/src/Glacier2/SessionRouterI.h
@@ -40,7 +40,7 @@ class CreateSession : public IceUtil::Shared
{
public:
- CreateSession(const SessionRouterIPtr&, const std::string&, const Ice::Current&, const Ice::Context&);
+ CreateSession(const SessionRouterIPtr&, const std::string&, const Ice::Current&);
void create();
void addPendingCallback(const CreateSessionPtr&);
@@ -65,7 +65,7 @@ protected:
const SessionRouterIPtr _sessionRouter;
const std::string _user;
const Ice::Current _current;
- Ice::Context _sslContext;
+ Ice::Context _context;
std::vector<CreateSessionPtr> _pendingCallbacks;
SessionControlPrx _control;
FilterManagerPtr _filterManager;
diff --git a/cpp/src/Ice/PropertyNames.cpp b/cpp/src/Ice/PropertyNames.cpp
index e0b3f489e07..e6e2c812d87 100644
--- a/cpp/src/Ice/PropertyNames.cpp
+++ b/cpp/src/Ice/PropertyNames.cpp
@@ -8,7 +8,7 @@
// **********************************************************************
//
-// Generated by makeprops.py from file ../config/PropertyNames.xml, Mon Oct 12 16:01:09 2009
+// Generated by makeprops.py from file ../config/PropertyNames.xml, Wed Oct 14 16:41:32 2009
// IMPORTANT: Do not edit this file -- any edits made here will be lost!
@@ -482,7 +482,8 @@ const IceInternal::PropertyArray
const IceInternal::Property Glacier2PropsData[] =
{
- IceInternal::Property("Glacier2.AddSSLContext", false, 0),
+ IceInternal::Property("Glacier2.AddSSLContext", true, 0),
+ IceInternal::Property("Glacier2.AddConnectionContext", false, 0),
IceInternal::Property("Glacier2.Admin.AdapterId", true, 0),
IceInternal::Property("Glacier2.Admin.Endpoints", true, 0),
IceInternal::Property("Glacier2.Admin.Locator", true, 0),
diff --git a/cpp/src/Ice/PropertyNames.h b/cpp/src/Ice/PropertyNames.h
index 1cd38a5c35e..6138b7cff24 100644
--- a/cpp/src/Ice/PropertyNames.h
+++ b/cpp/src/Ice/PropertyNames.h
@@ -8,7 +8,7 @@
// **********************************************************************
//
-// Generated by makeprops.py from file ../config/PropertyNames.xml, Mon Oct 12 16:01:09 2009
+// Generated by makeprops.py from file ../config/PropertyNames.xml, Wed Oct 14 16:41:32 2009
// IMPORTANT: Do not edit this file -- any edits made here will be lost!