void ReplicaController::send_reply ( PortableInterceptor::ServerRequestInfo_ptr ri) { FT::FTRequestServiceContext_var ftr ( extract_context (ri)); ACE_DEBUG ((LM_DEBUG, "(%P|%t) Sending reply for %s with rid %i\n", ftr->client_id.in (), ftr->retention_id)); // Prepare reply for logging. CORBA::Any_var result = ri->result (); TAO_OutputCDR cdr; result->impl ()->marshal_value (cdr); Dynamic::ParameterList_var pl = ri->arguments (); CORBA::ULong len = pl->length (); for (CORBA::ULong index = 0; index != len ; ++index) { //@@ No chance for PARAM_OUT if ((*pl)[index].mode == CORBA::PARAM_INOUT) { (*pl)[index].argument.impl ()->marshal_value (cdr); } } CORBA::OctetSeq_var reply; ACE_NEW (reply.out (), CORBA::OctetSeq (cdr.total_length ())); reply->length (cdr.total_length ()); CORBA::Octet* buf = reply->get_buffer (); // @@ What if this throws an exception?? We don't have any way to // check whether this succeeded for (ACE_Message_Block const* mb = cdr.begin (); mb != 0; mb = mb->cont ()) { ACE_OS::memcpy (buf, mb->rd_ptr (), mb->length ()); buf += mb->length (); } // Logging the reply and state update. // // First send message to members. // { // Extract state update. CORBA::OctetSeq_var oid = ri->object_id (); PortableInterceptor::AdapterName_var an = ri->adapter_name (); CORBA::Any_var state = ri->get_slot (state_slot_id ()); CORBA::TypeCode_var tc = state->type (); if (tc->kind () == CORBA::tk_null) { ACE_DEBUG ((LM_DEBUG, "Slot update is void\n")); PortableServer::POA_var poa = resolve_poa (an.in ()); PortableServer::ServantBase_var servant = poa->id_to_servant (oid.in ()); Checkpointable* target = dynamic_cast<Checkpointable*> (servant.in ()); if (target) { CORBA::Any_var tmp = target->get_state (); if (tmp.ptr () != 0) state = tmp._retn (); } } TAO_OutputCDR cdr; cdr << oid.in (); cdr << an.in (); cdr << ftr->client_id.in (); cdr << ftr->retention_id; cdr << reply.in (); cdr << state.in (); size_t size = cdr.total_length (); CORBA::OctetSeq_var msg; ACE_NEW (msg.out (), CORBA::OctetSeq (size)); msg->length (size); { CORBA::Octet* buf = msg->get_buffer (); for (ACE_Message_Block const* mb = cdr.begin (); mb != 0; mb = mb->cont ()) { ACE_OS::memcpy (buf, mb->rd_ptr (), mb->length ()); buf += mb->length (); } } CORBA::Octet* buf = msg->get_buffer (); // Crash point 1. // if (crash_point == 1 && ftr->retention_id > 2) ACE_OS::exit (1); try { while (true) { try { group_->send (buf, size); ACE_DEBUG ((LM_DEBUG, "Sent log record of length %i\n", size)); break; } catch (ACE_TMCast::Group::Aborted const&) { ACE_DEBUG ((LM_DEBUG, "Retrying to send log record.\n")); } } } catch (ACE_TMCast::Group::Failed const&) { ACE_DEBUG ((LM_DEBUG, "Group failure. Perhaps, I am alone in the group.\n")); } } // Now perform local logging. // RecordId rid (ftr->client_id.in (), ftr->retention_id); // This is slow but eh-safe ;-). // log_.insert (rid, reply); // Crash point 2. // if (crash_point == 2 && ftr->retention_id > 2) ACE_OS::exit (1); }
void TAO::SSLIOP::Server_Invocation_Interceptor::receive_request ( PortableInterceptor::ServerRequestInfo_ptr ri ) { SecurityLevel2::AccessDecision_var ad_tmp = this->sec2manager_->access_decision (); TAO::SL2::AccessDecision_var ad = TAO::SL2::AccessDecision::_narrow (ad_tmp.in ()); CORBA::Boolean const no_ssl = this->ssliop_current_->no_context (); if (TAO_debug_level >= 3) ORBSVCS_DEBUG ((LM_DEBUG, "SSLIOP (%P|%t) Interceptor (context), ssl=%d\n", !(no_ssl))); // if // (1) no SSL session state is available (which means that the // invocation is received across a non-SSL transport) // AND // (2) the required Quality of Protection is something other // than SecQOPNoProtection (set via -SSLNoProtection) if (no_ssl && this->qop_ != ::Security::SecQOPNoProtection) { /* * Set up all the arguments needed by the call * to AccessDecision::access_allowed() */ /* Get the credentials from SSLIOP */ SecurityLevel2::CredentialsList cred_list; // initial empty? #if 0 try { SecurityLevel2::ReceivedCredentials_var rcvd_creds = this->sec2_current_->received_credentials (); // this gets the credentials received from the other side. We // should be able to put this into a CredentialsList with no // problem. // // Do I really need to implement a sec2_current, or can I hack // the conversion at this level? I probably ought to do it as // a real sec2_current with the conversion from sec3->sec2 // happening at a lower level. cred_list.length(1); cred_list[0] = rcvd_creds.in (); /* So, in looking for how we can do this, I find that the SL3_SecurityCurrent::client_credentials() delegates to SL3_SecurityCurrent_Impl::client_credentials(), which is pure virtual. */ } catch (...) { } #endif /* Gather the elements that uniquely identify the target object */ CORBA::ORBid_var orb_id = ri->orb_id (); CORBA::OctetSeq_var adapter_id = ri->adapter_id (); CORBA::OctetSeq_var object_id = ri->object_id (); CORBA::String_var operation_name = ri->operation (); CORBA::Boolean it_should_happen = false; it_should_happen = ad->access_allowed_ex (orb_id.in (), adapter_id.in (), object_id.in (), cred_list, operation_name.in()); if (TAO_debug_level >= 3) { ORBSVCS_DEBUG ((LM_DEBUG, "TAO (%P|%t) SL2::access_allowed_ex returned %s\n", it_should_happen ? "true" : "false")); } if (! it_should_happen) throw CORBA::NO_PERMISSION (); } }
void ServerInterceptorDispatcher::receive_request(PortableInterceptor::ServerRequestInfo_ptr info) throw(PortableInterceptor::ForwardRequest, CORBA::SystemException) { DEBUG_OUT ("ServerInterceptorDispatcher: receive_request"); // call for regsitered COPI const Components::ConfigValues* temp_config=0; //call for all interceptors // determine the id // all containers Qedo::ContainerList* temp_container_list = component_server_ -> get_all_containers(); std::list <ContainerInterfaceImpl*>::iterator container_iter; //identify the id const char* id = 0; for (container_iter = temp_container_list->begin(); container_iter != temp_container_list->end(); container_iter++) { for (unsigned int i = 0; i < (*container_iter) -> installed_homes_.size(); i++) { for (unsigned int j = 0; j < (((*container_iter) -> installed_homes_)[i].home_servant_->component_instances_.size()); j++) { // search for the oid if (Qedo::compare_OctetSeqs((*info->object_id()),((*container_iter) -> installed_homes_)[i].home_servant_->component_instances_[j].object_id_)) { temp_config = ((*container_iter)->installed_homes_)[i].home_servant_->component_instances_[j].config_; if (temp_config != 0) { // std::cout << temp_config->length() << std::endl; Components::ConfigValue* value; for (CORBA::ULong k = 0; k < temp_config->length(); k++) { value = (*temp_config)[k]; if (! strcmp ((*temp_config)[k]->name(), "id")) { (*temp_config)[k]->value() >>= id; break; } } } } // current call could be the call on a facet // search for facets for (unsigned int k = 0; k < ((*container_iter)->installed_homes_)[i].home_servant_->component_instances_[j].ccm_object_executor_->facets_.size(); k++) { if (Qedo::compare_OctetSeqs((*info->object_id()),*((*container_iter) -> installed_homes_)[i].home_servant_->reference_to_oid(((*container_iter) -> installed_homes_)[i].home_servant_->component_instances_[j].ccm_object_executor_->facets_[k].facet_ref()))) { temp_config = ((*container_iter)->installed_homes_)[i].home_servant_->component_instances_[j].config_; if (temp_config != 0) { // std::cout << temp_config->length() << std::endl; Components::ConfigValue* value; for (CORBA::ULong k = 0; k < temp_config->length(); k++) { value = (*temp_config)[k]; if (! strcmp ((*temp_config)[k]->name(), "id")) { (*temp_config)[k]->value() >>= id; break; } } }