void ClientStub::createFilterSequence( std::vector<FilterPtr> & filters) { filters.clear(); // Setup compression if configured. if (mEnableCompression) { #if RCF_FEATURE_ZLIB==1 FilterPtr filterPtr( new ZlibStatefulCompressionFilter() ); filters.push_back(filterPtr); #else RCF_ASSERT(0); #endif } FilterPtr filterPtr; if (mTransportProtocol != Tp_Clear && mTransportProtocol != Tp_Unspecified) { switch (mTransportProtocol) { #if RCF_FEATURE_SSPI==1 case Tp_Ntlm: filterPtr.reset( new NtlmFilter(this) ); break; case Tp_Kerberos: filterPtr.reset( new KerberosFilter(this) ); break; case Tp_Negotiate: filterPtr.reset( new NegotiateFilter(this) ); break; #endif #if RCF_FEATURE_OPENSSL==1 && RCF_FEATURE_SSPI==1 case Tp_Ssl: if (mSslImplementation == Si_Schannel) { filterPtr.reset( new SchannelFilter(this) ); } else { RCF_ASSERT(mSslImplementation == Si_OpenSsl); filterPtr.reset( new OpenSslEncryptionFilter(this) ); } break; #elif RCF_FEATURE_OPENSSL==1 case Tp_Ssl: filterPtr.reset( new OpenSslEncryptionFilter(this) ); break; #elif RCF_FEATURE_SSPI==1 case Tp_Ssl: filterPtr.reset( new SchannelFilter(this) ); break; #else // Single case just to keep the compiler warnings quiet. case Tp_Ssl: #endif default: RCF_THROW( Exception( _RcfError_TransportProtocolNotSupported( getTransportProtocolName(mTransportProtocol)) ) ); } } if (filterPtr) { filters.push_back(filterPtr); } }
// remotely accessible boost::int32_t FilterService::RequestTransportFilters(const std::vector<boost::int32_t> &filterIds) { RCF_LOG_3()(filterIds) << "FilterService::RequestTransportFilters() - entry"; ReadLock readLock(mFilterFactoryMapMutex); for (unsigned int i=0; i<filterIds.size(); ++i) { int filterId = filterIds[i]; if (mFilterFactoryMap.find(filterId) == mFilterFactoryMap.end()) { RCF_LOG_3()(filterId) << "FilterService::RequestTransportFilters() - unknown filter."; return RcfError_UnknownFilter; } } boost::shared_ptr< std::vector<FilterPtr> > filters( new std::vector<FilterPtr>()); for (unsigned int i=0; i<filterIds.size(); ++i) { int filterId = filterIds[i]; FilterFactoryPtr filterFactoryPtr = mFilterFactoryMap[filterId]; FilterPtr filterPtr( filterFactoryPtr->createFilter() ); filters->push_back(filterPtr); } RcfSession & session = getCurrentRcfSession(); if (session.transportFiltersLocked()) { RCF_LOG_3() << "FilterService::RequestTransportFilters() - filter sequence already locked."; return RcfError_FiltersLocked; } else { session.addOnWriteCompletedCallback( boost::bind( &FilterService::setTransportFilters, this, _1, filters) ); } RCF_LOG_3() << "FilterService::RequestTransportFilters() - exit"; return RcfError_Ok; }
// remotely accessible boost::int32_t FilterService::RequestTransportFilters(const std::vector<boost::int32_t> &filterIds) { RCF_LOG_3()(filterIds) << "FilterService::RequestTransportFilters() - entry"; RcfSession & session = getCurrentRcfSession(); RcfServer & server = session.getRcfServer(); boost::shared_ptr< std::vector<FilterPtr> > filters( new std::vector<FilterPtr>()); ReadLock readLock(mFilterFactoryMapMutex); for (unsigned int i=0; i<filterIds.size(); ++i) { int filterId = filterIds[i]; if (filterId == RcfFilter_SspiSchannel || filterId == RcfFilter_OpenSsl) { if (server.getSslImplementation() == RCF::Si_Schannel) { filterId = RcfFilter_SspiSchannel; } else { filterId = RcfFilter_OpenSsl; } } if (mFilterFactoryMap.find(filterId) == mFilterFactoryMap.end()) { RCF_LOG_3()(filterId) << "FilterService::RequestTransportFilters() - filter not supported."; return RcfError_UnknownFilter; } FilterFactoryPtr filterFactoryPtr = mFilterFactoryMap[filterId]; FilterPtr filterPtr( filterFactoryPtr->createFilter(server) ); filters->push_back(filterPtr); } // Determine which protocol, if any, the filter sequence represents. session.mEnableCompression = false; FilterPtr filterPtr; if (filters->size() > 0) { if ( (*filters)[0]->getFilterId() == RcfFilter_ZlibCompressionStateful ) { session.mEnableCompression = true; if (filters->size() > 1) { filterPtr = (*filters)[1]; } } else { if (filters->size() > 0) { filterPtr = (*filters)[0]; } } } TransportProtocol protocol = Tp_Unspecified; if (!filterPtr) { protocol = Tp_Clear; } else { int filterId = filterPtr->getFilterId(); switch (filterId) { case RcfFilter_SspiNtlm: protocol = Tp_Ntlm; break; case RcfFilter_SspiKerberos: protocol = Tp_Kerberos; break; case RcfFilter_SspiNegotiate: protocol = Tp_Negotiate; break; case RcfFilter_SspiSchannel: protocol = Tp_Ssl; break; case RcfFilter_OpenSsl: protocol = Tp_Ssl; break; default: protocol = Tp_Unspecified; break; } } // Check that the filter sequence is allowed. const std::vector<TransportProtocol> & protocols = server.getSupportedTransportProtocols(); if (protocols.size() > 0) { if (std::find(protocols.begin(), protocols.end(), protocol) == protocols.end()) { RCF_THROW( Exception(_RcfError_ProtocolNotSupported()) ); } } if (protocol != Tp_Unspecified) { session.mTransportProtocol = protocol; } if (session.transportFiltersLocked()) { RCF_LOG_3() << "FilterService::RequestTransportFilters() - filter sequence already locked."; return RcfError_FiltersLocked; } else { session.addOnWriteCompletedCallback( boost::bind( &FilterService::setTransportFilters, this, _1, filters) ); } RCF_LOG_3() << "FilterService::RequestTransportFilters() - exit"; return RcfError_Ok; }