diff options
author | Benoit Foucher <benoit@zeroc.com> | 2009-10-14 16:43:16 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2009-10-14 16:43:16 +0200 |
commit | 578eb177a948360e4ad692996ddb1608d8728d94 (patch) | |
tree | 73f3d325ccc4572727c2637dceb45b316265c77d /cpp/src | |
parent | Fixed Windows build issues (diff) | |
download | ice-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.cpp | 16 | ||||
-rw-r--r-- | cpp/src/Glacier2/Blobject.h | 2 | ||||
-rw-r--r-- | cpp/src/Glacier2/RouterI.cpp | 10 | ||||
-rw-r--r-- | cpp/src/Glacier2/RouterI.h | 2 | ||||
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.cpp | 153 | ||||
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.h | 4 | ||||
-rw-r--r-- | cpp/src/Ice/PropertyNames.cpp | 5 | ||||
-rw-r--r-- | cpp/src/Ice/PropertyNames.h | 2 |
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! |