#include <SSLIOP_Profile.h>
Inheritance diagram for TAO_SSLIOP_Profile:
Public Member Functions | |
TAO_SSLIOP_Profile (const ACE_INET_Addr &addr, const TAO::ObjectKey &object_key, const TAO_GIOP_Message_Version &version, TAO_ORB_Core *orb_core, const::SSLIOP::SSL *ssl_component) | |
TAO_SSLIOP_Profile (const char *host, CORBA::UShort port, const TAO::ObjectKey &object_key, const ACE_INET_Addr &addr, const TAO_GIOP_Message_Version &version, TAO_ORB_Core *orb_core, const::SSLIOP::SSL *ssl_component) | |
TAO_SSLIOP_Profile (TAO_ORB_Core *orb_core, const::SSLIOP::SSL *ssl_component) | |
Create profile with the given SSLIOP tagged component. | |
TAO_SSLIOP_Profile (TAO_ORB_Core *orb_core, int ssl_only=0) | |
virtual int | decode (TAO_InputCDR &cdr) |
virtual int | encode_endpoints (void) |
virtual TAO_Endpoint * | endpoint (void) |
virtual void | parse_string (const char *string) |
void | add_endpoint (TAO_SSLIOP_Endpoint *endp) |
void | remove_endpoint (TAO_SSLIOP_Endpoint *endp) |
void | remove_generic_endpoint (TAO_Endpoint *ep) |
Protected Member Functions | |
~TAO_SSLIOP_Profile (void) | |
Destructor. | |
virtual CORBA::Boolean | do_is_equivalent (const TAO_Profile *other_profile) |
Profile equivalence template method. | |
Private Member Functions | |
int | decode_tagged_endpoints (void) |
Private Attributes | |
TAO_SSLIOP_Endpoint | ssl_endpoint_ |
int | ssl_only_ |
|
Profile constructor, same as above except the object_key has already been marshaled. Definition at line 13 of file SSLIOP_Profile.cpp. References TAO_SSLIOP_Endpoint::iiop_endpoint(), and ssl_endpoint_.
00018 : TAO_IIOP_Profile (addr, 00019 object_key, 00020 version, 00021 orb_core), 00022 ssl_endpoint_ (ssl_component, 0), 00023 ssl_only_ (0) 00024 { 00025 this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true); 00026 } |
|
Profile constructor, this is the most efficient since it doesn't require any address resolution processing. Definition at line 28 of file SSLIOP_Profile.cpp. References TAO_SSLIOP_Endpoint::iiop_endpoint(), and ssl_endpoint_.
00035 : TAO_IIOP_Profile (host, 00036 port, 00037 object_key, 00038 addr, 00039 version, 00040 orb_core), 00041 ssl_endpoint_ (ssl_component, 0), 00042 ssl_only_ (0) 00043 { 00044 this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true); 00045 } |
|
Create profile with the given SSLIOP tagged component.
Definition at line 47 of file SSLIOP_Profile.cpp. References TAO_SSLIOP_Endpoint::iiop_endpoint(), and ssl_endpoint_.
00049 : TAO_IIOP_Profile (orb_core), 00050 ssl_endpoint_ (ssl_component, 0), 00051 ssl_only_ (0) 00052 { 00053 this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true); 00054 } |
|
Profile constructor. ssl_only != 0 will force secure connections, pnly. Definition at line 56 of file SSLIOP_Profile.cpp. References TAO_SSLIOP_Endpoint::iiop_endpoint(), and ssl_endpoint_.
00057 : TAO_IIOP_Profile (orb_core), 00058 ssl_endpoint_ (0, 0), 00059 ssl_only_ (ssl_only) 00060 { 00061 this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true); 00062 } |
|
Destructor. Protected destructor to enforce proper memory management through the reference counting mechanism. Definition at line 64 of file SSLIOP_Profile.cpp. References TAO_Endpoint::next(), TAO_SSLIOP_Endpoint::next(), and ssl_endpoint_.
00065 { 00066 // Clean up the list of endpoints since we own it. 00067 // Skip the head, since it is not dynamically allocated. 00068 TAO_Endpoint *tmp = 0; 00069 00070 for (TAO_Endpoint *next = this->ssl_endpoint_.next (); 00071 next != 0; 00072 next = tmp) 00073 { 00074 tmp = next->next (); 00075 delete next; 00076 } 00077 } |
|
Add endp to this profile's list of endpoints (it is inserted next to the head of the list). This profiles takes ownership of endp. If endp's Definition at line 204 of file SSLIOP_Profile.cpp. References TAO_IIOP_Profile::add_endpoint(), TAO_SSLIOP_Endpoint::iiop_endpoint(), TAO_SSLIOP_Endpoint::next_, and ssl_endpoint_. Referenced by TAO::SSLIOP::Acceptor::create_shared_profile(), decode(), and decode_tagged_endpoints().
00205 { 00206 endp->next_ = this->ssl_endpoint_.next_; 00207 this->ssl_endpoint_.next_ = endp; 00208 00209 // We do not want to add our IIOP endpoint counterpart when we are 00210 // decoding a profile, and IIOP endpoints have been added before we 00211 // even get to SSLIOP-specific decoding. 00212 if (endp->iiop_endpoint () != 0) 00213 this->TAO_IIOP_Profile::add_endpoint (endp->iiop_endpoint ()); 00214 } |
|
Reimplemented from TAO_Profile. Definition at line 84 of file SSLIOP_Profile.cpp. References ACE_NEW_RETURN, add_endpoint(), IOP::TaggedComponent::component_data, TAO_Profile::decode(), decode_tagged_endpoints(), TAO_Tagged_Components::get_component(), TAO_SSLIOP_Endpoint::iiop_endpoint(), TAO_IIOP_Endpoint::next_, TAO_SSLIOP_Endpoint::next_, TAO_Endpoint::priority(), ACE_InputCDR::reset_byte_order(), TAO_SSLIOP_Endpoint::ssl_component_, ssl_endpoint_, IOP::TaggedComponent::tag, and TAO_Profile::tagged_components().
00085 { 00086 int r = this->TAO_IIOP_Profile::decode (cdr); 00087 if (r != 1) 00088 return r; 00089 00090 // Attempt to decode SSLIOP::SSL tagged component. It may not be 00091 // there if we are dealing with pure IIOP profile. 00092 int ssl_component_found = 0; 00093 IOP::TaggedComponent component; 00094 component.tag = ::SSLIOP::TAG_SSL_SEC_TRANS; 00095 00096 if (this->tagged_components ().get_component (component)) 00097 { 00098 TAO_InputCDR cdr (reinterpret_cast<const char*> ( 00099 component.component_data.get_buffer ()), 00100 component.component_data.length ()); 00101 CORBA::Boolean byte_order; 00102 if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0) 00103 return -1; 00104 cdr.reset_byte_order (static_cast<int> (byte_order)); 00105 00106 if (cdr >> this->ssl_endpoint_.ssl_component_) 00107 ssl_component_found = 1; 00108 else 00109 return -1; 00110 } 00111 00112 // Since IIOP portion of the profile has already been decoded, we 00113 // know how many endpoints it should contain and can finish 00114 // initialization accordingly. 00115 if (this->count_ < 2) 00116 { 00117 // This profile contains only one endpoint. Finish initializing 00118 // it. 00119 this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true); 00120 this->ssl_endpoint_.priority (this->endpoint_.priority ()); 00121 return 1; 00122 } 00123 else 00124 { 00125 // This profile contains more than one endpoint. 00126 if (ssl_component_found) 00127 { 00128 // It is true ssl profile, i.e., not just IIOP, so must have 00129 // ssl endpoints encoded. 00130 00131 if (this->decode_tagged_endpoints () == -1) 00132 return -1; 00133 00134 return 1; 00135 } 00136 else 00137 { 00138 // IIOP profile - doesn't have ssl endpoints encoded. We 00139 // must create 'dummy' ssl endpoint list anyways, in order to 00140 // make iiop endpoints accessable and usable. Since we've 00141 // already got one ssliop endpoint, only add the extra 00142 // endpoints (count_ - 1). 00143 for (size_t i = 0; 00144 i < this->count_ -1; 00145 ++i) 00146 { 00147 TAO_SSLIOP_Endpoint *endpoint = 0; 00148 ACE_NEW_RETURN (endpoint, 00149 TAO_SSLIOP_Endpoint (0, 0), 00150 -1); 00151 this->add_endpoint (endpoint); 00152 } 00153 00154 // Now that we have a complete list of ssl endpoins, we can 00155 // connect them with their iiop counterparts. 00156 TAO_IIOP_Endpoint *iiop_endp = &this->endpoint_; 00157 00158 for (TAO_SSLIOP_Endpoint * ssl_endp = &this->ssl_endpoint_; 00159 ssl_endp != 0; 00160 ssl_endp = ssl_endp->next_) 00161 { 00162 ssl_endp->iiop_endpoint (iiop_endp, true); 00163 ssl_endp->priority (iiop_endp->priority ()); 00164 iiop_endp = iiop_endp->next_; 00165 } 00166 00167 return 1; 00168 } 00169 } 00170 } |
|
Helper for
Definition at line 274 of file SSLIOP_Profile.cpp. References ACE_NEW_RETURN, add_endpoint(), IOP::TaggedComponent::component_data, TAO_Tagged_Components::get_component(), TAO_SSLIOP_Endpoint::iiop_endpoint(), TAO_IIOP_Endpoint::next_, TAO_SSLIOP_Endpoint::next_, TAO_Endpoint::priority(), ACE_InputCDR::reset_byte_order(), TAO_SSLIOP_Endpoint::ssl_component_, ssl_endpoint_, IOP::TaggedComponent::tag, and TAO_SSLEndpointSequence. Referenced by decode().
00275 { 00276 IOP::TaggedComponent tagged_component; 00277 tagged_component.tag = TAO::TAG_SSL_ENDPOINTS; 00278 00279 if (this->tagged_components_.get_component (tagged_component)) 00280 { 00281 const CORBA::Octet *buf = 00282 tagged_component.component_data.get_buffer (); 00283 00284 TAO_InputCDR in_cdr (reinterpret_cast<const char* > (buf), 00285 tagged_component.component_data.length ()); 00286 00287 // Extract the Byte Order. 00288 CORBA::Boolean byte_order; 00289 if ((in_cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0) 00290 return -1; 00291 in_cdr.reset_byte_order (static_cast<int> (byte_order)); 00292 00293 // Extract endpoints sequence. 00294 TAO_SSLEndpointSequence endpoints; 00295 if ((in_cdr >> endpoints) == 0) 00296 return -1; 00297 00298 // Use information extracted from the tagged component to 00299 // populate the profile. Begin from the end of the sequence to 00300 // preserve endpoint order, since <add_endpoint> method reverses 00301 // the order of endpoints in the list. 00302 for (CORBA::ULong i = endpoints.length () - 1; 00303 (i + 1) != 0; 00304 --i) 00305 { 00306 TAO_SSLIOP_Endpoint *endpoint = 0; 00307 ACE_NEW_RETURN (endpoint, 00308 TAO_SSLIOP_Endpoint (0, 0), 00309 -1); 00310 endpoint->ssl_component_ = endpoints[i]; 00311 this->add_endpoint (endpoint); 00312 } 00313 00314 // Now that we have a complete list of ssl endpoins, we can 00315 // connect them with their iiop counterparts, which have been 00316 // extracted/chained during the IIOP profile decoding. 00317 TAO_IIOP_Endpoint *iiop_endp = &this->endpoint_; 00318 00319 for (TAO_SSLIOP_Endpoint * ssl_endp = &this->ssl_endpoint_; 00320 ssl_endp != 0; 00321 ssl_endp = ssl_endp->next_) 00322 { 00323 ssl_endp->iiop_endpoint (iiop_endp, true); 00324 ssl_endp->priority (iiop_endp->priority ()); 00325 iiop_endp = iiop_endp->next_; 00326 } 00327 00328 return 0; 00329 } 00330 00331 // Since this method is only called if we are expecting 00332 // TAO_TAG_SSL_ENDPOINTS component, failure to find it is an error. 00333 return -1; 00334 } |
|
Profile equivalence template method.
Reimplemented from TAO_IIOP_Profile. Definition at line 173 of file SSLIOP_Profile.cpp. References TAO_SSLIOP_Endpoint::is_equivalent(), TAO_SSLIOP_Endpoint::next_, and ssl_endpoint_.
00174 { 00175 const TAO_SSLIOP_Profile *op = 00176 dynamic_cast<const TAO_SSLIOP_Profile *> (other_profile); 00177 00178 // Make sure we have a TAO_SSLIOP_Profile. 00179 if (op == 0) 00180 return 0; 00181 00182 // Now verify TAO_SSLIOP_Endpoint equivalence. 00183 const TAO_SSLIOP_Endpoint *other_endp = &op->ssl_endpoint_; 00184 for (TAO_SSLIOP_Endpoint *endp = &this->ssl_endpoint_; 00185 endp != 0; 00186 endp = endp->next_) 00187 { 00188 if (endp->is_equivalent (other_endp)) 00189 other_endp = other_endp->next_; 00190 else 00191 return 0; 00192 } 00193 00194 return 1; 00195 } |
|
Reimplemented from TAO_IIOP_Profile. Definition at line 217 of file SSLIOP_Profile.cpp. References ACE_OutputCDR::begin(), IOP::TaggedComponent::component_data, ACE_Message_Block::cont(), TAO_IIOP_Profile::encode_endpoints(), ACE_Message_Block::length(), ACE_OS::memcpy(), TAO_SSLIOP_Endpoint::next_, ACE_Message_Block::rd_ptr(), TAO_Tagged_Components::set_component(), TAO_SSLIOP_Endpoint::ssl_component(), ssl_endpoint_, IOP::TaggedComponent::tag, TAO_ENCAP_BYTE_ORDER, TAO_SSLEndpointSequence, and ACE_OutputCDR::total_length().
00218 { 00219 // If we have more than one endpoint, we encode info about others 00220 // into a tagged component for wire transfer. 00221 if (this->count_ > 1) 00222 { 00223 // Encode all endpoints except the first one, since it is always 00224 // transferred through standard profile component. 00225 00226 // Create a data structure and fill it with endpoint info for wire 00227 // transfer. 00228 TAO_SSLEndpointSequence endpoints; 00229 endpoints.length (this->count_ - 1); 00230 00231 const TAO_SSLIOP_Endpoint *endpoint = this->ssl_endpoint_.next_; 00232 for (size_t i = 0; 00233 i < this->count_ - 1; 00234 ++i) 00235 { 00236 endpoints[i] = endpoint->ssl_component (); 00237 endpoint = endpoint->next_; 00238 } 00239 00240 // Encode the data structure. 00241 TAO_OutputCDR out_cdr; 00242 if ((out_cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER) 00243 == 0) 00244 || (out_cdr << endpoints) == 0) 00245 return -1; 00246 00247 const CORBA::ULong length = out_cdr.total_length (); 00248 00249 IOP::TaggedComponent tagged_component; 00250 tagged_component.tag = TAO::TAG_SSL_ENDPOINTS; 00251 tagged_component.component_data.length (length); 00252 CORBA::Octet *buf = 00253 tagged_component.component_data.get_buffer (); 00254 00255 for (const ACE_Message_Block *iterator = out_cdr.begin (); 00256 iterator != 0; 00257 iterator = iterator->cont ()) 00258 { 00259 CORBA::ULong i_length = iterator->length (); 00260 ACE_OS::memcpy (buf, iterator->rd_ptr (), i_length); 00261 00262 buf += i_length; 00263 } 00264 00265 // Add component with encoded endpoint data to this profile's 00266 // TaggedComponents. 00267 tagged_components_.set_component (tagged_component); 00268 } 00269 00270 return this->TAO_IIOP_Profile::encode_endpoints (); 00271 } |
|
Reimplemented from TAO_IIOP_Profile. Definition at line 198 of file SSLIOP_Profile.cpp. References ssl_endpoint_. Referenced by TAO::SSLIOP::Acceptor::create_new_profile(), and TAO::SSLIOP::Acceptor::create_shared_profile().
00199 { 00200 return &this->ssl_endpoint_; 00201 } |
|
Override parse_string() from the base class to update the SSL endpoint's iiop endpoint once the base class has completed parsing the string.
Reimplemented from TAO_Profile. Definition at line 337 of file SSLIOP_Profile.cpp. References ACE_CLR_BITS, TAO_SSLIOP_Endpoint::iiop_endpoint(), TAO_Profile::parse_string(), SSLIOP::SSL::port, TAO_IIOP_Endpoint::port_, TAO_SSLIOP_Endpoint::ssl_component_, ssl_endpoint_, and ssl_only_.
00338 { 00339 TAO_IIOP_Profile::parse_string (ior); 00340 00341 this->ssl_endpoint_.iiop_endpoint (&this->endpoint_, true); 00342 00343 if( ssl_only_) 00344 { 00345 this->ssl_endpoint_.ssl_component_.port = this->endpoint_.port_; 00346 00347 // Note that the Security::NoProtection bit is cleared since we 00348 // are sure the server supports SSL (we're told so) 00349 ACE_CLR_BITS (this->ssl_endpoint_.ssl_component_.target_supports, 00350 Security::NoProtection); 00351 } 00352 } |
|
Remove endp from this profile's list of endpoints. Definition at line 356 of file SSLIOP_Profile.cpp. References TAO_SSLIOP_Endpoint::iiop_endpoint(), TAO_IIOP_Endpoint::next_, TAO_SSLIOP_Endpoint::next_, and ssl_endpoint_. Referenced by remove_generic_endpoint().
00357 { 00358 if (endp == 0) 00359 return; 00360 00361 // special handling for the target matching the base endpoint 00362 if (endp == &this->ssl_endpoint_) 00363 { 00364 if (--this->count_ > 0) 00365 { 00366 TAO_SSLIOP_Endpoint* ssl_n = this->ssl_endpoint_.next_; 00367 this->ssl_endpoint_ = *ssl_n; 00368 // since the assignment operator does not copy the next_ 00369 // pointer, we must do it by hand 00370 this->ssl_endpoint_.next_ = ssl_n->next_; 00371 delete ssl_n; 00372 TAO_IIOP_Endpoint *n = this->endpoint_.next_; 00373 this->endpoint_ = *n; 00374 this->endpoint_.next_ = n->next_; 00375 delete n; 00376 } 00377 return; 00378 } 00379 00380 TAO_SSLIOP_Endpoint* last = &this->ssl_endpoint_; 00381 TAO_SSLIOP_Endpoint* cur = this->ssl_endpoint_.next_; 00382 00383 while (cur != 0) 00384 { 00385 if (cur == endp) 00386 break; 00387 last = cur; 00388 cur = cur->next_; 00389 } 00390 00391 if (cur != 0) 00392 { 00393 TAO_IIOP_Endpoint *base = cur->iiop_endpoint(); 00394 last->iiop_endpoint(base->next_, true); 00395 last->next_ = cur->next_; 00396 cur->next_ = 0; 00397 --this->count_; 00398 delete cur; 00399 } 00400 } |
|
Reimplemented from TAO_IIOP_Profile. Definition at line 403 of file SSLIOP_Profile.cpp. References remove_endpoint().
00404 { 00405 this->remove_endpoint(dynamic_cast<TAO_SSLIOP_Endpoint *>(ep)); 00406 } |
|
Head of this profile's list of endpoints. This endpoint is not dynamically allocated because a profile always contains at least one endpoint.
Definition at line 166 of file SSLIOP_Profile.h. Referenced by add_endpoint(), decode(), decode_tagged_endpoints(), do_is_equivalent(), encode_endpoints(), endpoint(), parse_string(), remove_endpoint(), TAO_SSLIOP_Profile(), and ~TAO_SSLIOP_Profile(). |
|
Allways treat this endpoint as secure, even if the constructor did not explicitely specify a tagged component for SSL.
Definition at line 175 of file SSLIOP_Profile.h. Referenced by parse_string(). |