OpenDDS::Security::AccessControlBuiltInImpl Class Reference

Implements the DDS built-in version of the Access Control plugin for the DDS Security Specification. More...

#include <AccessControlBuiltInImpl.h>

Inheritance diagram for OpenDDS::Security::AccessControlBuiltInImpl:
Inheritance graph
[legend]
Collaboration diagram for OpenDDS::Security::AccessControlBuiltInImpl:
Collaboration graph
[legend]

List of all members.

Classes

struct  AccessData
class  RevokePermissionsTimer

Public Member Functions

 AccessControlBuiltInImpl ()
virtual ~AccessControlBuiltInImpl ()
virtual
::DDS::Security::PermissionsHandle 
validate_local_permissions (::DDS::Security::Authentication_ptr auth_plugin,::DDS::Security::IdentityHandle identity,::DDS::Security::DomainId_t domain_id, const ::DDS::DomainParticipantQos &participant_qos,::DDS::Security::SecurityException &ex)
virtual
::DDS::Security::PermissionsHandle 
validate_remote_permissions (::DDS::Security::Authentication_ptr auth_plugin,::DDS::Security::IdentityHandle local_identity_handle,::DDS::Security::IdentityHandle remote_identity_handle, const ::DDS::Security::PermissionsToken &remote_permissions_token, const ::DDS::Security::AuthenticatedPeerCredentialToken &remote_credential_token,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_create_participant (::DDS::Security::PermissionsHandle permissions_handle,::DDS::Security::DomainId_t domain_id, const ::DDS::DomainParticipantQos &qos,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_create_datawriter (::DDS::Security::PermissionsHandle permissions_handle,::DDS::Security::DomainId_t domain_id, const char *topic_name, const ::DDS::DataWriterQos &qos, const ::DDS::PartitionQosPolicy &partition, const ::DDS::Security::DataTags &data_tag,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_create_datareader (::DDS::Security::PermissionsHandle permissions_handle,::DDS::Security::DomainId_t domain_id, const char *topic_name, const ::DDS::DataReaderQos &qos, const ::DDS::PartitionQosPolicy &partition, const ::DDS::Security::DataTags &data_tag,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_create_topic (::DDS::Security::PermissionsHandle permissions_handle,::DDS::Security::DomainId_t domain_id, const char *topic_name, const ::DDS::TopicQos &qos,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_local_datawriter_register_instance (::DDS::Security::PermissionsHandle permissions_handle,::DDS::DataWriter_ptr writer,::DDS::Security::DynamicData_ptr key,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_local_datawriter_dispose_instance (::DDS::Security::PermissionsHandle permissions_handle,::DDS::DataWriter_ptr writer,::DDS::Security::DynamicData_ptr key,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_remote_participant (::DDS::Security::PermissionsHandle permissions_handle,::DDS::Security::DomainId_t domain_id, const ::DDS::Security::ParticipantBuiltinTopicDataSecure &participant_data,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_remote_datawriter (::DDS::Security::PermissionsHandle permissions_handle,::DDS::Security::DomainId_t domain_id, const ::DDS::Security::PublicationBuiltinTopicDataSecure &publication_data,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_remote_datareader (::DDS::Security::PermissionsHandle permissions_handle,::DDS::Security::DomainId_t domain_id, const ::DDS::Security::SubscriptionBuiltinTopicDataSecure &subscription_data,::CORBA::Boolean &relay_only,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_remote_topic (::DDS::Security::PermissionsHandle permissions_handle,::DDS::Security::DomainId_t domain_id, const ::DDS::TopicBuiltinTopicData &topic_data,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_local_datawriter_match (::DDS::Security::PermissionsHandle writer_permissions_handle,::DDS::Security::PermissionsHandle reader_permissions_handle, const ::DDS::Security::PublicationBuiltinTopicDataSecure &publication_data, const ::DDS::Security::SubscriptionBuiltinTopicDataSecure &subscription_data,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_local_datareader_match (::DDS::Security::PermissionsHandle reader_permissions_handle,::DDS::Security::PermissionsHandle writer_permissions_handle, const ::DDS::Security::SubscriptionBuiltinTopicDataSecure &subscription_data, const ::DDS::Security::PublicationBuiltinTopicDataSecure &publication_data,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_remote_datawriter_register_instance (::DDS::Security::PermissionsHandle permissions_handle,::DDS::DataReader_ptr reader,::DDS::InstanceHandle_t publication_handle,::DDS::Security::DynamicData_ptr key,::DDS::InstanceHandle_t instance_handle,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean check_remote_datawriter_dispose_instance (::DDS::Security::PermissionsHandle permissions_handle,::DDS::DataReader_ptr reader,::DDS::InstanceHandle_t publication_handle,::DDS::Security::DynamicData_ptr key,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean get_permissions_token (::DDS::Security::PermissionsToken &permissions_token,::DDS::Security::PermissionsHandle handle,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean get_permissions_credential_token (::DDS::Security::PermissionsCredentialToken &permissions_credential_token,::DDS::Security::PermissionsHandle handle,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean set_listener (::DDS::Security::AccessControlListener_ptr listener,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean return_permissions_token (const ::DDS::Security::PermissionsToken &token,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean return_permissions_credential_token (const ::DDS::Security::PermissionsCredentialToken &permissions_credential_token,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean get_participant_sec_attributes (::DDS::Security::PermissionsHandle permissions_handle,::DDS::Security::ParticipantSecurityAttributes &attributes,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean get_topic_sec_attributes (::DDS::Security::PermissionsHandle permissions_handle, const char *topic_name,::DDS::Security::TopicSecurityAttributes &attributes,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean get_datawriter_sec_attributes (::DDS::Security::PermissionsHandle permissions_handle, const char *topic_name, const ::DDS::PartitionQosPolicy &partition, const ::DDS::Security::DataTagQosPolicy &data_tag,::DDS::Security::EndpointSecurityAttributes &attributes,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean get_datareader_sec_attributes (::DDS::Security::PermissionsHandle permissions_handle, const char *topic_name, const ::DDS::PartitionQosPolicy &partition, const ::DDS::Security::DataTagQosPolicy &data_tag,::DDS::Security::EndpointSecurityAttributes &attributes,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean return_participant_sec_attributes (const ::DDS::Security::ParticipantSecurityAttributes &attributes,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean return_datawriter_sec_attributes (const ::DDS::Security::EndpointSecurityAttributes &attributes,::DDS::Security::SecurityException &ex)
virtual ::CORBA::Boolean return_datareader_sec_attributes (const ::DDS::Security::EndpointSecurityAttributes &attributes,::DDS::Security::SecurityException &ex)

Private Types

typedef std::map
< DDS::Security::PermissionsHandle,
AccessData
ACPermsMap
typedef std::map
< DDS::Security::IdentityHandle,
DDS::Security::PermissionsHandle
ACIdentityMap

Private Member Functions

 AccessControlBuiltInImpl (const AccessControlBuiltInImpl &right)
AccessControlBuiltInImploperator= (const AccessControlBuiltInImpl &right)
::CORBA::Long generate_handle ()
time_t convert_permissions_time (std::string timeString)
::CORBA::Boolean validate_date_time (const ACPermsMap::iterator ac_iter, time_t &delta_time,::DDS::Security::SecurityException &ex)
CORBA::Boolean get_sec_attributes (::DDS::Security::PermissionsHandle permissions_handle, const char *topic_name, const ::DDS::PartitionQosPolicy &partition, const ::DDS::Security::DataTagQosPolicy &data_tag,::DDS::Security::EndpointSecurityAttributes &attributes,::DDS::Security::SecurityException &ex)
CORBA::Boolean search_local_permissions (const char *topic_name, const ::DDS::Security::DomainId_t domain_id, const ::DDS::PartitionQosPolicy &partition, const Permissions::PublishSubscribe_t pub_or_sub, const ACPermsMap::iterator ac_iter,::DDS::Security::SecurityException &ex)
CORBA::Boolean search_remote_permissions (const char *topic_name, const ::DDS::Security::DomainId_t domain_id, const ACPermsMap::iterator ac_iter, const Permissions::PublishSubscribe_t pub_or_sub,::DDS::Security::SecurityException &ex)
void parse_class_id (const std::string class_id, std::string &plugin_class_name, int &major_version, int &minor_version)

Private Attributes

ACPermsMap local_ac_perms_
ACIdentityMap local_identity_map_
RevokePermissionsTimer local_rp_timer_
RevokePermissionsTimer remote_rp_timer_
ACE_Thread_Mutex handle_mutex_
ACE_Thread_Mutex gen_handle_mutex_
::CORBA::Long next_handle_
::DDS::Security::AccessControlListener_ptr listener_ptr_

Detailed Description

Implements the DDS built-in version of the Access Control plugin for the DDS Security Specification.

See the DDS security specification, OMG formal/17-09-20, for a description of the interface this class is implementing.

Definition at line 53 of file AccessControlBuiltInImpl.h.


Member Typedef Documentation

Definition at line 249 of file AccessControlBuiltInImpl.h.

Definition at line 246 of file AccessControlBuiltInImpl.h.


Constructor & Destructor Documentation

OpenDDS::Security::AccessControlBuiltInImpl::AccessControlBuiltInImpl (  ) 

Definition at line 53 of file AccessControlBuiltInImpl.cpp.

00054   : local_rp_timer_(*this)
00055   , remote_rp_timer_(*this)
00056   , handle_mutex_()
00057   , gen_handle_mutex_()
00058   , next_handle_(1)
00059   , listener_ptr_(NULL)
00060 {  }

OpenDDS::Security::AccessControlBuiltInImpl::~AccessControlBuiltInImpl (  )  [virtual]

Definition at line 62 of file AccessControlBuiltInImpl.cpp.

00063 {
00064 }

OpenDDS::Security::AccessControlBuiltInImpl::AccessControlBuiltInImpl ( const AccessControlBuiltInImpl right  )  [private]

Member Function Documentation

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_create_datareader ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::Security::DomainId_t  domain_id,
const char *  topic_name,
const ::DDS::DataReaderQos qos,
const ::DDS::PartitionQosPolicy partition,
const ::DDS::Security::DataTags data_tag,
::DDS::Security::SecurityException ex 
)

Definition at line 441 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, DDS::HANDLE_NIL, OpenDDS::Security::AccessControlBuiltInImpl::RevokePermissionsTimer::is_scheduled(), local_ac_perms_, local_rp_timer_, search_local_permissions(), OpenDDS::Security::CommonUtilities::set_security_error(), OpenDDS::Security::AccessControlBuiltInImpl::RevokePermissionsTimer::start_timer(), OpenDDS::Security::Permissions::SUBSCRIBE, validate_date_time(), and ACE::wild_match().

00449 {
00450   if (DDS::HANDLE_NIL == permissions_handle) {
00451     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datareader: Invalid permissions handle");
00452     return false;
00453   }
00454 
00455   if (0 == topic_name) {
00456     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datareader: Invalid Topic Name");
00457     return false;
00458   }
00459 
00460   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
00461 
00462   ACPermsMap::iterator ac_iter = local_ac_perms_.find(permissions_handle);
00463 
00464   if (ac_iter == local_ac_perms_.end()) {
00465     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datareader: No matching permissions handle present");
00466     return false;
00467   }
00468 
00469   gov_iter begin = ac_iter->second.gov->access_rules().begin();
00470   gov_iter end = ac_iter->second.gov->access_rules().end();
00471 
00472   for (gov_iter giter = begin; giter != end; ++giter) {
00473     size_t d = giter->domain_list.count(domain_id);
00474 
00475     if (d > 0) {
00476       Governance::TopicAccessRules::iterator tr_iter;
00477 
00478       for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
00479         if ( ::ACE::wild_match(topic_name, tr_iter->topic_expression.c_str(), true, false)) {
00480           if (tr_iter->topic_attrs.is_read_protected == false ) {
00481             return true;
00482           }
00483         }
00484 
00485       }
00486 
00487     }
00488   }
00489 
00490   // Check the Permissions file
00491   time_t delta_time;
00492 
00493   if (!validate_date_time(ac_iter, delta_time, ex)) {
00494     return false;
00495   }
00496 
00497   Permissions::PublishSubscribe_t subscribe = Permissions::SUBSCRIBE;
00498   CORBA::Boolean successful = search_local_permissions(topic_name, domain_id, partition, subscribe, ac_iter, ex);
00499 
00500   if (!successful) {
00501     return false;
00502   }
00503 
00504   if (!local_rp_timer_.is_scheduled()) {
00505     ACE_Time_Value timer_length(delta_time);
00506 
00507     if (!local_rp_timer_.start_timer(timer_length, permissions_handle)) {
00508       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datareader: Permissions timer could not be created.");
00509       return false;
00510     }
00511   }
00512 
00513   return true;
00514 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_create_datawriter ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::Security::DomainId_t  domain_id,
const char *  topic_name,
const ::DDS::DataWriterQos qos,
const ::DDS::PartitionQosPolicy partition,
const ::DDS::Security::DataTags data_tag,
::DDS::Security::SecurityException ex 
)

Definition at line 368 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, DDS::HANDLE_NIL, OpenDDS::Security::AccessControlBuiltInImpl::RevokePermissionsTimer::is_scheduled(), local_ac_perms_, local_rp_timer_, OpenDDS::Security::Permissions::PUBLISH, search_local_permissions(), OpenDDS::Security::CommonUtilities::set_security_error(), OpenDDS::Security::AccessControlBuiltInImpl::RevokePermissionsTimer::start_timer(), validate_date_time(), and ACE::wild_match().

00376 {
00377   if (DDS::HANDLE_NIL == permissions_handle) {
00378     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datawriter: Invalid permissions handle");
00379     return false;
00380   }
00381   if (0 == topic_name) {
00382     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datawriter: Invalid Topic Name");
00383     return false;
00384   }
00385 
00386   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
00387 
00388   ACPermsMap::iterator ac_iter = local_ac_perms_.find(permissions_handle);
00389 
00390   if (ac_iter == local_ac_perms_.end()) {
00391     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datawriter: No matching permissions handle present");
00392     return false;
00393   }
00394 
00395   gov_iter begin = ac_iter->second.gov->access_rules().begin();
00396   gov_iter end = ac_iter->second.gov->access_rules().end();
00397 
00398   for (gov_iter giter = begin; giter != end; ++giter) {
00399     size_t d = giter->domain_list.count(domain_id);
00400 
00401     if (d > 0) {
00402       Governance::TopicAccessRules::iterator tr_iter;
00403 
00404       for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
00405         if ( ::ACE::wild_match(topic_name, tr_iter->topic_expression.c_str(), true,false)) {
00406           if (tr_iter->topic_attrs.is_write_protected == false ) {
00407             return true;
00408           }
00409         }
00410       }
00411     }
00412   }
00413 
00414   // Check the Permissions file
00415   time_t delta_time;
00416 
00417   if (!validate_date_time(ac_iter, delta_time, ex)) {
00418     return false;
00419   }
00420 
00421   Permissions::PublishSubscribe_t publish = Permissions::PUBLISH;
00422   CORBA::Boolean successful = search_local_permissions(topic_name, domain_id, partition, publish, ac_iter, ex);
00423 
00424   if (!successful) {
00425     return false;
00426   }
00427 
00428   if (!local_rp_timer_.is_scheduled()) {
00429     // Start timer
00430     ACE_Time_Value timer_length(delta_time);
00431 
00432     if (!local_rp_timer_.start_timer(timer_length, permissions_handle)) {
00433       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datawriter: Permissions timer could not be created.");
00434       return false;
00435     }
00436   }
00437 
00438   return true;
00439 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_create_participant ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::Security::DomainId_t  domain_id,
const ::DDS::DomainParticipantQos qos,
::DDS::Security::SecurityException ex 
)

Definition at line 305 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, DDS::HANDLE_NIL, local_ac_perms_, and OpenDDS::Security::CommonUtilities::set_security_error().

00310 {
00311   if (DDS::HANDLE_NIL == permissions_handle) {
00312     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_participant: Invalid permissions handle");
00313     return false;
00314   }
00315 
00316 /*
00317  *  The rules of this method need to be evaluated in this order, however, we need to check
00318  *  to make sure the permission handle exists in our store prior to assessing these rules
00319 */
00320   /* From Table 63 of the spec.
00321      This operation shall use the permissions_handle to retrieve
00322      the cached Permissions and Governance information.
00323              If the Governance specifies any topics on the
00324      DomainParticipant domain_id with
00325      enable_read_access_control set to FALSE or with
00326      enable_write_access_control set to FALSE, then the
00327      operation shall succeed and return TRUE.
00328              If the ParticipantSecurityAttributes has
00329      is_access_protected set to FALSE, then the operation shall
00330      succeed and return TRUE.
00331              Otherwise the operation shall return FALSE.
00332  */
00333 
00334   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
00335 
00336   ACPermsMap::iterator piter = local_ac_perms_.find(permissions_handle);
00337 
00338   if (piter == local_ac_perms_.end()) {
00339     CommonUtilities::set_security_error(ex,-1, 0, "AccessControlBuiltInImpl::check_create_participant: No matching permissions handle present");
00340     return false;
00341   }
00342 
00343   ::DDS::Security::DomainId_t domain_to_find = piter->second.perm->data().domain_id;
00344 
00345   gov_iter begin = piter->second.gov->access_rules().begin();
00346   gov_iter end = piter->second.gov->access_rules().end();
00347 
00348   for (gov_iter giter = begin; giter != end; ++giter) {
00349     size_t d = giter->domain_list.count(domain_to_find);
00350 
00351     if (d > 0) {
00352       Governance::TopicAccessRules::iterator tr_iter;
00353 
00354       for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
00355         if (tr_iter->topic_attrs.is_read_protected == false ||
00356             tr_iter->topic_attrs.is_write_protected == false ) {
00357           return true;
00358         }
00359       }
00360 
00361       if (giter->domain_attrs.is_access_protected == false) return true;
00362     }
00363   }
00364 
00365   return false;
00366 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_create_topic ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::Security::DomainId_t  domain_id,
const char *  topic_name,
const ::DDS::TopicQos qos,
::DDS::Security::SecurityException ex 
)

Definition at line 516 of file AccessControlBuiltInImpl.cpp.

References OpenDDS::Security::Permissions::ALLOW, handle_mutex_, DDS::HANDLE_NIL, local_ac_perms_, OpenDDS::Security::CommonUtilities::set_security_error(), strcmp(), validate_date_time(), and ACE::wild_match().

00522 {
00523   if (DDS::HANDLE_NIL == permissions_handle) {
00524     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_topic: Invalid permissions handle");
00525     return false;
00526   }
00527   if (0 == topic_name) {
00528     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_topic: Invalid Topic Name");
00529     return false;
00530   }
00531 
00532   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
00533 
00534   ACPermsMap::iterator ac_iter = local_ac_perms_.find(permissions_handle);
00535 
00536   if (ac_iter == local_ac_perms_.end()) {
00537     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_topic: No matching permissions handle present");
00538     return false;
00539   }
00540 
00541   // Check the Governance file for allowable topic attributes
00542 
00543   ::DDS::Security::DomainId_t domain_to_find = ac_iter->second.perm->data().domain_id;
00544 
00545   gov_iter begin = ac_iter->second.gov->access_rules().begin();
00546   gov_iter end = ac_iter->second.gov->access_rules().end();
00547 
00548   for (gov_iter giter = begin; giter != end; ++giter) {
00549     size_t d = giter->domain_list.count(domain_to_find);
00550 
00551     if (d) {
00552       Governance::TopicAccessRules::iterator tr_iter;
00553 
00554       for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
00555         if (::ACE::wild_match(topic_name, tr_iter->topic_expression.c_str(), true, false)) {
00556           if (tr_iter->topic_attrs.is_read_protected == false ||
00557               tr_iter->topic_attrs.is_write_protected == false) {
00558             return true;
00559           }
00560         }
00561       }
00562     }
00563   }
00564 
00565   // Check the Permissions file for grants
00566   time_t delta_time;
00567 
00568   if (!validate_date_time(ac_iter, delta_time, ex)) {
00569     return false;
00570   }
00571 
00572   Permissions::PermissionGrantRules::iterator pm_iter;
00573 
00574   for (pm_iter = ac_iter->second.perm->data().perm_rules.begin(); pm_iter != ac_iter->second.perm->data().perm_rules.end(); ++pm_iter) {
00575     perm_topic_rules_iter ptr_iter; // allow/deny rules
00576 
00577     for (ptr_iter = pm_iter->PermissionTopicRules.begin(); ptr_iter != pm_iter->PermissionTopicRules.end(); ++ptr_iter) {
00578       size_t  d = ptr_iter->domain_list.count(domain_to_find);
00579 
00580       if ((d > 0) && (ptr_iter->ad_type == Permissions::ALLOW)) {
00581         perm_topic_ps_rules_iter tpsr_iter;
00582 
00583         for (tpsr_iter = ptr_iter->topic_ps_rules.begin(); tpsr_iter != ptr_iter->topic_ps_rules.end(); ++tpsr_iter) {
00584           std::vector<std::string>::iterator tl_iter; // topic list
00585 
00586           for (tl_iter = tpsr_iter->topic_list.begin(); tl_iter != tpsr_iter->topic_list.end(); ++tl_iter) {
00587             if (::ACE::wild_match(topic_name, (*tl_iter).c_str(), true, false))
00588               return true;
00589           }
00590         }
00591       }
00592     }
00593 
00594     // There is no matching rule for topic_name so use the value in default_permission
00595     if (strcmp(pm_iter->default_permission.c_str(), "ALLOW") == 0) {
00596       return true;
00597     }
00598     else {
00599       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_topic: No matching rule for topic, default permission is DENY.");
00600       return false;
00601     }
00602   }
00603 
00604   //TODO: QoS rules are not implemented
00605 
00606   return false;
00607 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_local_datareader_match ( ::DDS::Security::PermissionsHandle  reader_permissions_handle,
::DDS::Security::PermissionsHandle  writer_permissions_handle,
const ::DDS::Security::SubscriptionBuiltinTopicDataSecure subscription_data,
const ::DDS::Security::PublicationBuiltinTopicDataSecure publication_data,
::DDS::Security::SecurityException ex 
)

Definition at line 1054 of file AccessControlBuiltInImpl.cpp.

References DDS::HANDLE_NIL, and OpenDDS::Security::CommonUtilities::set_security_error().

01060 {
01061   if (DDS::HANDLE_NIL == writer_permissions_handle) {
01062     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datareader_match: Invalid writer permissions handle");
01063     return false;
01064   }
01065   if (DDS::HANDLE_NIL == reader_permissions_handle) {
01066     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datareader_match: Invalid reader permissions handle");
01067     return false;
01068   }
01069 
01070   return true;
01071 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_local_datawriter_dispose_instance ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::DataWriter_ptr  writer,
::DDS::Security::DynamicData_ptr  key,
::DDS::Security::SecurityException ex 
)

Definition at line 631 of file AccessControlBuiltInImpl.cpp.

References DDS::HANDLE_NIL, and OpenDDS::Security::CommonUtilities::set_security_error().

00636 {
00637   if (DDS::HANDLE_NIL == permissions_handle) {
00638     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datawriter_dispose_instance: Invalid permissions handle");
00639     return false;
00640   }
00641   if (0 == writer) {
00642     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datawriter_dispose_instance: Invalid Writer");
00643     return false;
00644   }
00645   if (0 == key) {
00646     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datawriter_dispose_instance: Invalid Topic Key");
00647     return false;
00648   }
00649 
00650   return true;
00651 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_local_datawriter_match ( ::DDS::Security::PermissionsHandle  writer_permissions_handle,
::DDS::Security::PermissionsHandle  reader_permissions_handle,
const ::DDS::Security::PublicationBuiltinTopicDataSecure publication_data,
const ::DDS::Security::SubscriptionBuiltinTopicDataSecure subscription_data,
::DDS::Security::SecurityException ex 
)

Definition at line 1035 of file AccessControlBuiltInImpl.cpp.

References DDS::HANDLE_NIL, and OpenDDS::Security::CommonUtilities::set_security_error().

01041 {
01042   if (DDS::HANDLE_NIL == writer_permissions_handle) {
01043     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datawriter_match: Invalid writer permissions handle");
01044     return false;
01045   }
01046   if (DDS::HANDLE_NIL == reader_permissions_handle) {
01047     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datawriter_match: Invalid reader permissions handle");
01048     return false;
01049   }
01050 
01051   return true;
01052 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_local_datawriter_register_instance ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::DataWriter_ptr  writer,
::DDS::Security::DynamicData_ptr  key,
::DDS::Security::SecurityException ex 
)

Definition at line 609 of file AccessControlBuiltInImpl.cpp.

References DDS::HANDLE_NIL, and OpenDDS::Security::CommonUtilities::set_security_error().

00614 {
00615   if (DDS::HANDLE_NIL == permissions_handle) {
00616     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datawriter_register_instance: Invalid permissions handle");
00617     return false;
00618   }
00619   if (0 == writer) {
00620     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datawriter_register_instance: Invalid Writer");
00621     return false;
00622   }
00623   if (0 == key) {
00624     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_local_datawriter_register_instance: Invalid Topic Key");
00625     return false;
00626   }
00627 
00628   return true;
00629 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_remote_datareader ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::Security::DomainId_t  domain_id,
const ::DDS::Security::SubscriptionBuiltinTopicDataSecure subscription_data,
::CORBA::Boolean relay_only,
::DDS::Security::SecurityException ex 
)

Definition at line 823 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, DDS::HANDLE_NIL, OpenDDS::Security::AccessControlBuiltInImpl::RevokePermissionsTimer::is_scheduled(), local_ac_perms_, remote_rp_timer_, search_remote_permissions(), OpenDDS::Security::CommonUtilities::set_security_error(), OpenDDS::Security::AccessControlBuiltInImpl::RevokePermissionsTimer::start_timer(), OpenDDS::Security::Permissions::SUBSCRIBE, validate_date_time(), and ACE::wild_match().

00829 {
00830   if (DDS::HANDLE_NIL == permissions_handle) {
00831     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datareader: Invalid permissions handle");
00832     return false;
00833   }
00834 
00835   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
00836 
00837   ACPermsMap::iterator ac_iter = local_ac_perms_.find(permissions_handle);
00838 
00839   if (ac_iter == local_ac_perms_.end()) {
00840     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datareader: No matching permissions handle present");
00841     return false;
00842   }
00843 
00844   // Default this to false for now
00845   relay_only = false;
00846 
00847   gov_iter begin = ac_iter->second.gov->access_rules().begin();
00848   gov_iter end = ac_iter->second.gov->access_rules().end();
00849 
00850   for (gov_iter giter = begin; giter != end; ++giter) {
00851     size_t d = giter->domain_list.count(domain_id);
00852 
00853     if (d > 0) {
00854       Governance::TopicAccessRules::iterator tr_iter;
00855 
00856       for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
00857         if (::ACE::wild_match(subscription_data.base.base.topic_name, tr_iter->topic_expression.c_str(), true, false)) {
00858           if (tr_iter->topic_attrs.is_read_protected == false) {
00859             return true;
00860           }
00861         }
00862       }
00863 
00864     }
00865   }
00866 
00867   time_t delta_time;
00868 
00869   if (!validate_date_time(ac_iter, delta_time, ex)) {
00870     return false;
00871   }
00872 
00873   Permissions::PublishSubscribe_t subscribe = Permissions::SUBSCRIBE;
00874 
00875   CORBA::Boolean successful = search_remote_permissions(subscription_data.base.base.topic_name, domain_id, ac_iter, subscribe, ex);
00876 
00877   if (!successful) {
00878     return false;
00879   }
00880 
00881   if (!remote_rp_timer_.is_scheduled()) {
00882     ACE_Time_Value timer_length(delta_time);
00883 
00884     if (!remote_rp_timer_.start_timer(timer_length, permissions_handle)) {
00885       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datareader: Permissions timer could not be created.");
00886       return false;
00887     }
00888   }
00889 
00890   return true;
00891 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_remote_datawriter ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::Security::DomainId_t  domain_id,
const ::DDS::Security::PublicationBuiltinTopicDataSecure publication_data,
::DDS::Security::SecurityException ex 
)

Definition at line 753 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, DDS::HANDLE_NIL, OpenDDS::Security::AccessControlBuiltInImpl::RevokePermissionsTimer::is_scheduled(), local_ac_perms_, OpenDDS::Security::Permissions::PUBLISH, remote_rp_timer_, search_remote_permissions(), OpenDDS::Security::CommonUtilities::set_security_error(), OpenDDS::Security::AccessControlBuiltInImpl::RevokePermissionsTimer::start_timer(), validate_date_time(), and ACE::wild_match().

00758 {
00759   if (DDS::HANDLE_NIL == permissions_handle) {
00760     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter: Invalid permissions handle");
00761     return false;
00762   }
00763 
00764   if (publication_data.base.base.topic_name == "") {
00765     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter: Invalid topic name");
00766     return false;
00767   }
00768 
00769   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
00770 
00771   ACPermsMap::iterator ac_iter = local_ac_perms_.find(permissions_handle);
00772 
00773   if (ac_iter == local_ac_perms_.end()) {
00774     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter: No matching permissions handle present");
00775     return false;
00776   }
00777 
00778   gov_iter begin = ac_iter->second.gov->access_rules().begin();
00779   gov_iter end = ac_iter->second.gov->access_rules().end();
00780 
00781   for (gov_iter giter = begin; giter != end; ++giter) {
00782     size_t d = giter->domain_list.count(domain_id);
00783 
00784     if (d > 0) {
00785       Governance::TopicAccessRules::iterator tr_iter;
00786 
00787       for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
00788         if (::ACE::wild_match(publication_data.base.base.topic_name, tr_iter->topic_expression.c_str(), true, false)) {
00789           if (tr_iter->topic_attrs.is_write_protected == false) {
00790             return true;
00791           }
00792         }
00793       }
00794     }
00795   }
00796 
00797   time_t delta_time;
00798 
00799   if (!validate_date_time(ac_iter, delta_time, ex)) {
00800     return false;
00801   }
00802 
00803   Permissions::PublishSubscribe_t publish = Permissions::PUBLISH;
00804 
00805   CORBA::Boolean successful = search_remote_permissions(publication_data.base.base.topic_name, domain_id, ac_iter, publish, ex);
00806 
00807   if (!successful) {
00808     return false;
00809   }
00810 
00811   if (!remote_rp_timer_.is_scheduled()) {
00812     ACE_Time_Value timer_length(delta_time);
00813 
00814     if (!remote_rp_timer_.start_timer(timer_length, permissions_handle)) {
00815       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datareader: Permissions timer could not be created.");
00816       return false;
00817     }
00818   }
00819 
00820   return true;
00821 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_remote_datawriter_dispose_instance ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::DataReader_ptr  reader,
::DDS::InstanceHandle_t  publication_handle,
::DDS::Security::DynamicData_ptr  key,
::DDS::Security::SecurityException ex 
)

Definition at line 1099 of file AccessControlBuiltInImpl.cpp.

References DDS::HANDLE_NIL, and OpenDDS::Security::CommonUtilities::set_security_error().

01105 {
01106   if (DDS::HANDLE_NIL == permissions_handle ||
01107       DDS::HANDLE_NIL == publication_handle) {
01108     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter_dispose_instance: Invalid handle");
01109     return false;
01110   }
01111   if (0 == reader) {
01112     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter_dispose_instance: Invalid Reader pointer");
01113     return false;
01114   }
01115   if (0 == key) {
01116     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter_dispose_instance: Invalid Topic Key");
01117     return false;
01118   }
01119   return true;
01120 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_remote_datawriter_register_instance ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::DataReader_ptr  reader,
::DDS::InstanceHandle_t  publication_handle,
::DDS::Security::DynamicData_ptr  key,
::DDS::InstanceHandle_t  instance_handle,
::DDS::Security::SecurityException ex 
)

Definition at line 1073 of file AccessControlBuiltInImpl.cpp.

References DDS::HANDLE_NIL, and OpenDDS::Security::CommonUtilities::set_security_error().

01080 {
01081   if (DDS::HANDLE_NIL == permissions_handle ||
01082       DDS::HANDLE_NIL == publication_handle ||
01083       DDS::HANDLE_NIL == instance_handle) {
01084     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter_register_instance: Invalid handle");
01085     return false;
01086   }
01087   if (0 == reader) {
01088     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter_register_instance: Invalid Reader pointer");
01089     return false;
01090   }
01091   if (0 == key) {
01092     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter_register_instance: Invalid Topic Key");
01093     return false;
01094   }
01095 
01096   return true;
01097 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_remote_participant ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::Security::DomainId_t  domain_id,
const ::DDS::Security::ParticipantBuiltinTopicDataSecure participant_data,
::DDS::Security::SecurityException ex 
)

Definition at line 653 of file AccessControlBuiltInImpl.cpp.

References OpenDDS::Security::Permissions::ALLOW, handle_mutex_, DDS::HANDLE_NIL, local_ac_perms_, parse_class_id(), OpenDDS::Security::CommonUtilities::set_security_error(), and strcmp().

00658 {
00659   if (DDS::HANDLE_NIL == permissions_handle) {
00660     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_participant: Invalid permissions handle");
00661     return false;
00662   }
00663 
00664   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
00665 
00666   ACPermsMap::iterator ac_iter = local_ac_perms_.find(permissions_handle);
00667 
00668   if (ac_iter == local_ac_perms_.end()) {
00669     CommonUtilities::set_security_error(ex,-1, 0, "AccessControlBuiltInImpl::check_remote_participant: No matching permissions handle present");
00670     return false;
00671   }
00672 
00673   gov_iter begin = ac_iter->second.gov->access_rules().begin();
00674   gov_iter end = ac_iter->second.gov->access_rules().end();
00675 
00676   for (gov_iter giter = begin; giter != end; ++giter) {
00677     size_t d = giter->domain_list.count(domain_id);
00678 
00679     if (d > 0) {
00680       if (giter->domain_attrs.is_access_protected == false) return true;
00681     }
00682   }
00683 
00684   // Check the PluginClassName and MajorVersion of the local permmissions vs. remote  See Table 63 of spec
00685   const std::string remote_class_id = participant_data.base.permissions_token.class_id.in();
00686 
00687   std::string local_plugin_class_name,
00688               remote_plugin_class_name;
00689   int local_major_ver,
00690       local_minor_ver,
00691       remote_major_ver,
00692       remote_minor_ver;
00693 
00694   if (remote_class_id.length() > 0) {
00695     parse_class_id(remote_class_id, remote_plugin_class_name, remote_major_ver, remote_minor_ver);
00696   }
00697   else {
00698     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_participant: Invalid remote class ID");
00699     return false;
00700   }
00701 
00702   for (ACPermsMap::iterator local_iter = local_ac_perms_.begin(); local_iter != local_ac_perms_.end(); ++local_iter) {
00703     if (local_iter->second.perm->data().domain_id == domain_id) {
00704       if (local_iter->first != permissions_handle) {
00705         std::string local_class_id = local_iter->second.perm->data().perm_token.class_id.in();
00706 
00707         if (local_class_id.length() > 0) {
00708           parse_class_id(local_class_id, local_plugin_class_name, local_major_ver, local_minor_ver);
00709         }
00710         else {
00711           CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_participant: Invalid local class ID");
00712           return false;
00713         }
00714 
00715         break;
00716       }
00717     }
00718   }
00719 
00720   if (strcmp(local_plugin_class_name.c_str(), remote_plugin_class_name.c_str()) == 0) {
00721     if (local_major_ver != remote_major_ver) {
00722       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_participant: Class ID major versions do not match");
00723       return false;
00724     }
00725   }
00726   else {
00727     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_participant: Class ID plugin class name do not match");
00728     return false;
00729   }
00730 
00731   // Check permissions topic grants
00732 
00733   Permissions::PermissionGrantRules::iterator pgr_iter;
00734 
00735   // Check topic rules for the given domain id.
00736 
00737   for (pgr_iter = ac_iter->second.perm->data().perm_rules.begin(); pgr_iter != ac_iter->second.perm->data().perm_rules.end(); ++pgr_iter) {
00738     // Cycle through topic rules to find an allow
00739     perm_topic_rules_iter ptr_iter;
00740 
00741     for (ptr_iter = pgr_iter->PermissionTopicRules.begin(); ptr_iter != pgr_iter->PermissionTopicRules.end(); ++ptr_iter) {
00742       size_t z = (ptr_iter->domain_list.count(domain_id));
00743 
00744       if ((z > 0) && (ptr_iter->ad_type == Permissions::ALLOW)) {
00745         return true;
00746       }
00747     }
00748   }
00749 
00750   return false;
00751 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::check_remote_topic ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::Security::DomainId_t  domain_id,
const ::DDS::TopicBuiltinTopicData topic_data,
::DDS::Security::SecurityException ex 
)

Definition at line 893 of file AccessControlBuiltInImpl.cpp.

References OpenDDS::Security::Permissions::ALLOW, handle_mutex_, DDS::HANDLE_NIL, local_ac_perms_, parse_class_id(), OpenDDS::Security::Permissions::PUBLISH, OpenDDS::Security::CommonUtilities::set_security_error(), strcmp(), OpenDDS::Security::Permissions::SUBSCRIBE, validate_date_time(), and ACE::wild_match().

00898 {
00899   // NOTE: permissions_handle is for the remote DomainParticipant.
00900   if (DDS::HANDLE_NIL == permissions_handle) {
00901     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_topic: Invalid permissions handle");
00902     return false;
00903   }
00904 
00905   if (topic_data.name == "") {
00906     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_topic: Invalid topic data");
00907     return false;
00908   }
00909 
00910   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
00911 
00912   ACPermsMap::iterator ac_iter = local_ac_perms_.find(permissions_handle);
00913 
00914   if (ac_iter == local_ac_perms_.end()) {
00915     CommonUtilities::set_security_error(ex,-1, 0, "AccessControlBuiltInImpl::check_remote_topic: No matching permissions handle present");
00916     return false;
00917   }
00918 
00919   // Compare the PluginClassName and MajorVersion of the local permissions_token
00920   // with those in the remote_permissions_token.
00921   const std::string remote_class_id = ac_iter->second.perm->data().perm_token.class_id.in();
00922 
00923   std::string local_plugin_class_name,
00924               remote_plugin_class_name;
00925   int local_major_ver,
00926       local_minor_ver,
00927       remote_major_ver,
00928       remote_minor_ver;
00929 
00930   if (remote_class_id.length() > 0) {
00931     parse_class_id(remote_class_id, remote_plugin_class_name, remote_major_ver, remote_minor_ver);
00932   }
00933   else {
00934     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_topic: Invalid remote class ID");
00935     return false;
00936   }
00937 
00938   for (ACPermsMap::iterator local_iter = local_ac_perms_.begin(); local_iter != local_ac_perms_.end(); ++local_iter) {
00939     if (local_iter->second.perm->data().domain_id == domain_id) {
00940       if (local_iter->first != permissions_handle) {
00941         std::string local_class_id = local_iter->second.perm->data().perm_token.class_id.in();
00942 
00943         if (local_class_id.length() > 0) {
00944           parse_class_id(local_class_id, local_plugin_class_name, local_major_ver, local_minor_ver);
00945         }
00946         else {
00947           CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_topic: Invalid local class ID");
00948           return false;
00949         }
00950 
00951         break;
00952       }
00953     }
00954   }
00955 
00956   if (strcmp(local_plugin_class_name.c_str(), remote_plugin_class_name.c_str()) == 0) {
00957     if (local_major_ver != remote_major_ver) {
00958       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_topic: Class ID major versions do not match");
00959       return false;
00960     }
00961   }
00962   else {
00963     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_topic: Class ID plugin class name do not match");
00964     return false;
00965   }
00966 
00967   // Check the Governance file for allowable topic attributes
00968 
00969   gov_iter begin = ac_iter->second.gov->access_rules().begin();
00970   gov_iter end = ac_iter->second.gov->access_rules().end();
00971 
00972   for (gov_iter giter = begin; giter != end; ++giter) {
00973     size_t d = giter->domain_list.count(domain_id);
00974 
00975     if (d) {
00976       Governance::TopicAccessRules::iterator tr_iter;
00977 
00978       for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
00979         if (::ACE::wild_match(topic_data.name, tr_iter->topic_expression.c_str(), true, false)) {
00980           if (tr_iter->topic_attrs.is_read_protected == false ||
00981               tr_iter->topic_attrs.is_write_protected == false) {
00982             return true;
00983           }
00984         }
00985       }
00986     }
00987   }
00988 
00989   // Check the Permissions file for grants
00990   time_t delta_time;
00991 
00992   if (!validate_date_time(ac_iter, delta_time, ex)) {
00993     return false;
00994   }
00995 
00996   Permissions::PermissionGrantRules::iterator pm_iter;
00997 
00998   for (pm_iter = ac_iter->second.perm->data().perm_rules.begin(); pm_iter != ac_iter->second.perm->data().perm_rules.end(); ++pm_iter) {
00999     perm_topic_rules_iter ptr_iter; // allow/deny rules
01000 
01001     for (ptr_iter = pm_iter->PermissionTopicRules.begin(); ptr_iter != pm_iter->PermissionTopicRules.end(); ++ptr_iter) {
01002       size_t  d = ptr_iter->domain_list.count(domain_id);
01003 
01004       if ((d > 0) && (ptr_iter->ad_type == Permissions::ALLOW)) {
01005         perm_topic_ps_rules_iter tpsr_iter;
01006 
01007         for (tpsr_iter = ptr_iter->topic_ps_rules.begin(); tpsr_iter != ptr_iter->topic_ps_rules.end(); ++tpsr_iter) {
01008           if (tpsr_iter->ps_type == Permissions::PUBLISH || tpsr_iter->ps_type == Permissions::SUBSCRIBE) {
01009             std::vector<std::string>::iterator tl_iter; // topic list
01010 
01011             for (tl_iter = tpsr_iter->topic_list.begin(); tl_iter != tpsr_iter->topic_list.end(); ++tl_iter) {
01012               if (::ACE::wild_match(topic_data.name, (*tl_iter).c_str(), true, false))
01013                 return true;
01014             }
01015           }
01016         }
01017       }
01018     }
01019 
01020     // There is no matching rule for topic_name so use the value in default_permission
01021     if (strcmp(pm_iter->default_permission.c_str(), "ALLOW") == 0) {
01022       return true;
01023     }
01024     else {
01025       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_topic: No matching rule for topic, default permission is DENY.");
01026       return false;
01027     }
01028   }
01029 
01030   //TODO: QoS rules are not implemented
01031 
01032   return false;
01033 }

Here is the call graph for this function:

time_t OpenDDS::Security::AccessControlBuiltInImpl::convert_permissions_time ( std::string  timeString  )  [private]

Definition at line 1383 of file AccessControlBuiltInImpl.cpp.

References atoi(), memset(), mktime(), strcmp(), tm::tm_hour, tm::tm_isdst, tm::tm_mday, tm::tm_min, tm::tm_mon, tm::tm_sec, and tm::tm_year.

Referenced by validate_date_time().

01384 {
01385   // Check for a valid length time string, which is 19 characters (up through seconds)
01386   if (timeString.length() < 19) {
01387     return 0;
01388   }
01389 
01390   //time_t permission_time_t;
01391   tm permission_tm;
01392   std::string temp_str;
01393 
01394   memset(&permission_tm, 0, sizeof(tm));
01395   // Year
01396   temp_str = timeString.substr(0, 4);
01397   permission_tm.tm_year = (atoi(temp_str.c_str()) - 1900);
01398   temp_str.clear();
01399   // Month
01400   temp_str = timeString.substr(5, 2);
01401   permission_tm.tm_mon = (atoi(temp_str.c_str()) - 1);
01402   temp_str.clear();
01403   // Day
01404   temp_str = timeString.substr(8, 2);
01405   permission_tm.tm_mday = atoi(temp_str.c_str());
01406   temp_str.clear();
01407   // Hour
01408   temp_str = timeString.substr(11, 2);
01409   permission_tm.tm_hour = atoi(temp_str.c_str());
01410   temp_str.clear();
01411   // Minutes
01412   temp_str = timeString.substr(14, 2);
01413   permission_tm.tm_min = atoi(temp_str.c_str());
01414   temp_str.clear();
01415   // Seconds
01416   temp_str = timeString.substr(17, 2);
01417   permission_tm.tm_sec = atoi(temp_str.c_str());
01418 
01419   // Check if there is time zone information in the string, Z is in the 20th character
01420   if (timeString.length() > 20) {
01421     temp_str.clear();
01422     temp_str = timeString.substr(19, 1);
01423 
01424     // The only adjustments that need to be made are if the character
01425     // is a '+' or '-'
01426     if (strcmp(temp_str.c_str(), "Z") == 0) {
01427       //int hours_adj = 0;
01428       //int mins_adj = 0;
01429 
01430       temp_str.clear();
01431       temp_str = timeString.substr(20, 1);
01432 
01433       if (strcmp(temp_str.c_str(), "+") == 0) {
01434         temp_str.clear();
01435         temp_str = timeString.substr(21, 2);
01436         //hours_adj = atoi(temp_str.c_str());
01437         permission_tm.tm_hour -= atoi(temp_str.c_str());
01438         temp_str.clear();
01439         temp_str = timeString.substr(24, 2);
01440         //mins_adj = atoi(temp_str.c_str());
01441         permission_tm.tm_min -= atoi(temp_str.c_str());
01442         //permission_time_t -= (hours_adj + mins_adj);
01443       }
01444       else if (strcmp(temp_str.c_str(), "-") == 0) {
01445         temp_str.clear();
01446         temp_str = timeString.substr(21, 2);
01447         //hours_adj = atoi(temp_str.c_str());
01448         permission_tm.tm_hour += atoi(temp_str.c_str());
01449         temp_str.clear();
01450         temp_str = timeString.substr(24, 2);
01451         //mins_adj = atoi(temp_str.c_str());
01452         permission_tm.tm_min += atoi(temp_str.c_str());
01453         //permission_time_t += (hours_adj + mins_adj);
01454       }
01455     }
01456 
01457   }
01458 
01459   permission_tm.tm_isdst = -1;
01460 
01461   //return permission_time_t;
01462   return mktime(&permission_tm);
01463 }

Here is the call graph for this function:

Here is the caller graph for this function:

CORBA::Long OpenDDS::Security::AccessControlBuiltInImpl::generate_handle (  )  [private]

Definition at line 1374 of file AccessControlBuiltInImpl.cpp.

References gen_handle_mutex_, OpenDDS::Security::CommonUtilities::increment_handle(), and next_handle_.

Referenced by validate_local_permissions(), and validate_remote_permissions().

Here is the call graph for this function:

Here is the caller graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::get_datareader_sec_attributes ( ::DDS::Security::PermissionsHandle  permissions_handle,
const char *  topic_name,
const ::DDS::PartitionQosPolicy partition,
const ::DDS::Security::DataTagQosPolicy data_tag,
::DDS::Security::EndpointSecurityAttributes attributes,
::DDS::Security::SecurityException ex 
)

Definition at line 1319 of file AccessControlBuiltInImpl.cpp.

References get_sec_attributes(), DDS::HANDLE_NIL, and OpenDDS::Security::CommonUtilities::set_security_error().

01326 {
01327   if (DDS::HANDLE_NIL == permissions_handle) {
01328     CommonUtilities::set_security_error(ex, -1, 0, "Invalid permissions handle");
01329     return false;
01330   }
01331 
01332   if (0 == topic_name) {
01333     CommonUtilities::set_security_error(ex, -1, 0, "Invalid topic name");
01334     return false;
01335   }
01336 
01337   if (!get_sec_attributes(permissions_handle, topic_name, partition, data_tag, attributes, ex)) {
01338     return false;
01339   }
01340 
01341   return true;
01342 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::get_datawriter_sec_attributes ( ::DDS::Security::PermissionsHandle  permissions_handle,
const char *  topic_name,
const ::DDS::PartitionQosPolicy partition,
const ::DDS::Security::DataTagQosPolicy data_tag,
::DDS::Security::EndpointSecurityAttributes attributes,
::DDS::Security::SecurityException ex 
)

Definition at line 1291 of file AccessControlBuiltInImpl.cpp.

References get_sec_attributes(), DDS::HANDLE_NIL, and OpenDDS::Security::CommonUtilities::set_security_error().

01298 {
01299   // The spec claims there is supposed to be a topic name parameter
01300   // to this function which is not in the IDL at this time
01301 
01302   if (DDS::HANDLE_NIL == permissions_handle) {
01303     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_datawriter_sec_attributes: Invalid permissions handle");
01304     return false;
01305   }
01306 
01307   if (0 == topic_name) {
01308     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_datawriter_sec_attributes: Invalid topic name");
01309     return false;
01310   }
01311 
01312   if (!get_sec_attributes(permissions_handle, topic_name, partition, data_tag, attributes, ex)) {
01313     return false;
01314   }
01315 
01316   return true;
01317 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::get_participant_sec_attributes ( ::DDS::Security::PermissionsHandle  permissions_handle,
::DDS::Security::ParticipantSecurityAttributes attributes,
::DDS::Security::SecurityException ex 
)

Definition at line 1205 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, DDS::HANDLE_NIL, local_ac_perms_, and OpenDDS::Security::CommonUtilities::set_security_error().

01209 {
01210   if (DDS::HANDLE_NIL == permissions_handle) {
01211     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_participant_sec_attributes: Invalid permissions handle");
01212     return false;
01213   }
01214 
01215   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
01216 
01217   ACPermsMap::iterator ac_iter = local_ac_perms_.find(permissions_handle);
01218 
01219   if (ac_iter == local_ac_perms_.end()) {
01220     CommonUtilities::set_security_error(ex,-1, 0, "AccessControlBuiltInImpl::get_participant_sec_attributes: No matching permissions handle present");
01221     return false;
01222   }
01223 
01224   // Check the Governance file for allowable topic attributes
01225   ::DDS::Security::DomainId_t domain_to_find = ac_iter->second.perm->data().domain_id;
01226 
01227   gov_iter begin = ac_iter->second.gov->access_rules().begin();
01228   gov_iter end = ac_iter->second.gov->access_rules().end();
01229 
01230   for (gov_iter giter = begin; giter != end; ++giter) {
01231     size_t d = giter->domain_list.count(domain_to_find);
01232 
01233     if (d > 0) {
01234       attributes = giter->domain_attrs;
01235       return true;
01236     }
01237   }
01238 
01239   return false;
01240 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::get_permissions_credential_token ( ::DDS::Security::PermissionsCredentialToken permissions_credential_token,
::DDS::Security::PermissionsHandle  handle,
::DDS::Security::SecurityException ex 
)

Definition at line 1145 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, DDS::HANDLE_NIL, local_ac_perms_, and OpenDDS::Security::CommonUtilities::set_security_error().

01149 {
01150   if (DDS::HANDLE_NIL == handle) {
01151     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_permissions_credential_token: Invalid permissions handle");
01152     return false;
01153   }
01154 
01155   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
01156 
01157   ACPermsMap::iterator iter = local_ac_perms_.find(handle);
01158 
01159   if (iter != local_ac_perms_.end()) {
01160     permissions_credential_token = iter->second.perm->data().perm_cred_token;
01161     return true;
01162   } else {
01163     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_permissions_credential_token: No PermissionToken found");
01164     return false;
01165   }
01166 
01167   return true;
01168 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::get_permissions_token ( ::DDS::Security::PermissionsToken permissions_token,
::DDS::Security::PermissionsHandle  handle,
::DDS::Security::SecurityException ex 
)

Definition at line 1122 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, DDS::HANDLE_NIL, local_ac_perms_, and OpenDDS::Security::CommonUtilities::set_security_error().

01126 {
01127   if (DDS::HANDLE_NIL == handle) {
01128     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_permissions_token: Invalid permissions handle");
01129     return false;
01130   }
01131 
01132   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
01133 
01134   ACPermsMap::iterator iter = local_ac_perms_.find(handle);
01135 
01136   if (iter != local_ac_perms_.end()) {
01137     permissions_token = iter->second.perm->data().perm_token;
01138     return true;
01139   } else {
01140     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_permissions_token: No PermissionToken found");
01141     return false;
01142   }
01143 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::get_sec_attributes ( ::DDS::Security::PermissionsHandle  permissions_handle,
const char *  topic_name,
const ::DDS::PartitionQosPolicy partition,
const ::DDS::Security::DataTagQosPolicy data_tag,
::DDS::Security::EndpointSecurityAttributes attributes,
::DDS::Security::SecurityException ex 
) [private]

Definition at line 1512 of file AccessControlBuiltInImpl.cpp.

References DDS::Security::EndpointSecurityAttributes::base, handle_mutex_, DDS::Security::EndpointSecurityAttributes::is_key_protected, DDS::Security::EndpointSecurityAttributes::is_payload_protected, DDS::Security::EndpointSecurityAttributes::is_submessage_protected, local_ac_perms_, DDS::Security::EndpointSecurityAttributes::plugin_endpoint_attributes, DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_PAYLOAD_ENCRYPTED, DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ENCRYPTED, DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ORIGIN_AUTHENTICATED, DDS::Security::PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_BUILTIN_IS_DISCOVERY_ENCRYPTED, DDS::Security::PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_ORIGIN_AUTHENTICATED, DDS::Security::PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_ENCRYPTED, DDS::Security::PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_ORIGIN_AUTHENTICATED, OpenDDS::Security::CommonUtilities::set_security_error(), and ACE::wild_match().

Referenced by get_datareader_sec_attributes(), and get_datawriter_sec_attributes().

01518 {
01519   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, 1);
01520 
01521   ACPermsMap::iterator ac_iter = local_ac_perms_.find(permissions_handle);
01522 
01523   if (ac_iter == local_ac_perms_.end()) {
01524     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_datawriter_sec_attributes: No matching permissions handle present");
01525     return false;
01526   }
01527 
01528   ::DDS::Security::DomainId_t domain_to_find = ac_iter->second.perm->data().domain_id;
01529 
01530   gov_iter begin = ac_iter->second.gov->access_rules().begin();
01531   gov_iter end = ac_iter->second.gov->access_rules().end();
01532 
01533   for (gov_iter giter = begin; giter != end; ++giter) {
01534     size_t d = giter->domain_list.count(domain_to_find);
01535 
01536     if (d > 0) {
01537       if (std::strcmp(topic_name, "DCPSParticipantVolatileMessageSecure") == 0) {
01538         attributes.base.is_write_protected = false;
01539         attributes.base.is_read_protected = false;
01540         attributes.base.is_liveliness_protected = false;
01541         attributes.base.is_discovery_protected = false;
01542         attributes.is_submessage_protected = true;
01543         attributes.is_payload_protected = false;
01544         attributes.is_key_protected = false;
01545         return true;
01546       }
01547 
01548       if (std::strcmp(topic_name, "DCPSParticipantStatelessMessage") == 0) {
01549         attributes.base.is_write_protected = false;
01550         attributes.base.is_read_protected = false;
01551         attributes.base.is_liveliness_protected = false;
01552         attributes.base.is_discovery_protected = false;
01553         attributes.is_submessage_protected = false;
01554         attributes.is_payload_protected = false;
01555         attributes.is_key_protected = false;
01556         return true;
01557       }
01558 
01559       if (std::strcmp(topic_name, "DCPSParticipantMessageSecure") == 0) {
01560         attributes.base.is_write_protected = false;
01561         attributes.base.is_read_protected = false;
01562         attributes.base.is_liveliness_protected = false;
01563         attributes.base.is_discovery_protected = false;
01564         attributes.is_submessage_protected = giter->domain_attrs.is_liveliness_protected;
01565         attributes.is_payload_protected = false;
01566         attributes.is_key_protected = false;
01567 
01568         if (giter->domain_attrs.plugin_participant_attributes & ::DDS::Security::PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_ENCRYPTED) {
01569           attributes.plugin_endpoint_attributes |= ::DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ENCRYPTED;
01570         }
01571 
01572         if (giter->domain_attrs.plugin_participant_attributes & ::DDS::Security::PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_ORIGIN_AUTHENTICATED) {
01573           attributes.plugin_endpoint_attributes |= ::DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ORIGIN_AUTHENTICATED;
01574         }
01575 
01576         return true;
01577       }
01578 
01579       if (std::strcmp(topic_name, "DCPSParticipantSecure") == 0 ||
01580           std::strcmp(topic_name, "DCPSPublicationsSecure") == 0 ||
01581           std::strcmp(topic_name, "DCPSSubscriptionsSecure") == 0) {
01582         attributes.base.is_write_protected = false;
01583         attributes.base.is_read_protected = false;
01584         attributes.base.is_liveliness_protected = false;
01585         attributes.base.is_discovery_protected = false;
01586         attributes.is_submessage_protected = giter->domain_attrs.is_discovery_protected;
01587         attributes.is_payload_protected = false;
01588         attributes.is_key_protected = false;
01589 
01590         if (giter->domain_attrs.plugin_participant_attributes & ::DDS::Security::PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_BUILTIN_IS_DISCOVERY_ENCRYPTED) {
01591           attributes.plugin_endpoint_attributes |= ::DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ENCRYPTED;
01592         }
01593 
01594         if (giter->domain_attrs.plugin_participant_attributes & ::DDS::Security::PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_ORIGIN_AUTHENTICATED) {
01595           attributes.plugin_endpoint_attributes |= ::DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ORIGIN_AUTHENTICATED;
01596         }
01597 
01598         return true;
01599       }
01600 
01601       Governance::TopicAccessRules::iterator tr_iter;
01602 
01603       for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
01604         if (::ACE::wild_match(topic_name, tr_iter->topic_expression.c_str(), true, false)) {
01605 
01606           // Process the TopicSecurityAttributes base
01607           attributes.base.is_write_protected = tr_iter->topic_attrs.is_write_protected;
01608           attributes.base.is_read_protected = tr_iter->topic_attrs.is_read_protected;
01609           attributes.base.is_liveliness_protected = tr_iter->topic_attrs.is_liveliness_protected;
01610           attributes.base.is_discovery_protected = tr_iter->topic_attrs.is_discovery_protected;
01611 
01612           // Process metadata protection attributes
01613           if (tr_iter->metadata_protection_kind == "NONE") {
01614             attributes.is_submessage_protected = false;
01615           }
01616           else {
01617             attributes.is_submessage_protected = true;
01618 
01619             if (tr_iter->metadata_protection_kind == "ENCRYPT" ||
01620               tr_iter->metadata_protection_kind == "ENCRYPT_WITH_ORIGIN_AUTHENTICATION") {
01621               attributes.plugin_endpoint_attributes |= ::DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ENCRYPTED;
01622             }
01623 
01624             if (tr_iter->metadata_protection_kind == "SIGN_WITH_ORIGIN_AUTHENTICATION" ||
01625               tr_iter->metadata_protection_kind == "ENCRYPT_WITH_ORIGIN_AUTHENTICATION") {
01626               attributes.plugin_endpoint_attributes |= ::DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ORIGIN_AUTHENTICATED;
01627             }
01628           }
01629 
01630           // Process data protection attributes
01631 
01632           if (tr_iter->data_protection_kind == "NONE") {
01633             attributes.is_payload_protected = false;
01634             attributes.is_key_protected = false;
01635           }
01636           else if (tr_iter->data_protection_kind == "SIGN") {
01637             attributes.is_payload_protected = true;
01638             attributes.is_key_protected = false;
01639           }
01640           else if (tr_iter->data_protection_kind == "ENCRYPT") {
01641             attributes.is_payload_protected = true;
01642             attributes.is_key_protected = true;
01643             attributes.plugin_endpoint_attributes |= ::DDS::Security::PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_PAYLOAD_ENCRYPTED;
01644           }
01645 
01646           return true;
01647         }
01648       }
01649     }
01650   }
01651 
01652   CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_datawriter_sec_attributes: Invalid topic name");
01653   return false;
01654 }

Here is the call graph for this function:

Here is the caller graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::get_topic_sec_attributes ( ::DDS::Security::PermissionsHandle  permissions_handle,
const char *  topic_name,
::DDS::Security::TopicSecurityAttributes attributes,
::DDS::Security::SecurityException ex 
)

Definition at line 1242 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, DDS::HANDLE_NIL, local_ac_perms_, OpenDDS::Security::CommonUtilities::set_security_error(), and ACE::wild_match().

01247 {
01248   if (DDS::HANDLE_NIL == permissions_handle) {
01249     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_topic_sec_attributes: Invalid permissions handle");
01250     return false;
01251   }
01252   if (0 == topic_name) {
01253     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::get_topic_sec_attributes: Invalid topic name");
01254     return false;
01255   }
01256 
01257   // Extract Governance and the permissions data for the requested handle
01258 
01259   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, false);
01260 
01261   ACPermsMap::iterator piter = local_ac_perms_.find(permissions_handle);
01262 
01263   if (piter == local_ac_perms_.end()) {
01264     CommonUtilities::set_security_error(ex,-1, 0, "AccessControlBuiltInImpl::get_topic_sec_attributes: No matching permissions handle present");
01265     return false;
01266   }
01267 
01268   ::DDS::Security::DomainId_t domain_to_find = piter->second.perm->data().domain_id;
01269 
01270   gov_iter begin = piter->second.gov->access_rules().begin();
01271   gov_iter end = piter->second.gov->access_rules().end();
01272 
01273   for (gov_iter giter = begin; giter != end; ++giter) {
01274     size_t d = giter->domain_list.count(domain_to_find);
01275 
01276     if (d > 0) {
01277       Governance::TopicAccessRules::iterator tr_iter;
01278 
01279       for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
01280         if (::ACE::wild_match(topic_name,tr_iter->topic_expression.c_str(), true, false)) {
01281           attributes = tr_iter->topic_attrs;
01282           return true;
01283         }
01284       }
01285     }
01286   }
01287 
01288   return false;
01289 }

Here is the call graph for this function:

AccessControlBuiltInImpl& OpenDDS::Security::AccessControlBuiltInImpl::operator= ( const AccessControlBuiltInImpl right  )  [private]
void OpenDDS::Security::AccessControlBuiltInImpl::parse_class_id ( const std::string  class_id,
std::string &  plugin_class_name,
int &  major_version,
int &  minor_version 
) [private]

Definition at line 1882 of file AccessControlBuiltInImpl.cpp.

References atoi().

Referenced by check_remote_participant(), and check_remote_topic().

01887 {
01888   const std::string delimiter = ":";
01889 
01890   major_version = 1;
01891   minor_version = 0;
01892 
01893   size_t pos = class_id.find_last_of(delimiter);
01894 
01895   if ((pos > 0UL) && (pos != class_id.length() - 1)) {
01896     plugin_class_name = class_id.substr(0, (pos - 1));
01897 
01898     const std::string period = ".";
01899 
01900     size_t period_pos = class_id.find_last_of(period);
01901 
01902     if (period_pos > 0UL) {
01903       std::string mv_string = class_id.substr((pos + 1), (period_pos - 1));
01904 
01905       major_version = atoi(mv_string.c_str());
01906 
01907       if (period_pos != class_id.length() - 1) {
01908         mv_string = class_id.substr((period_pos + 1), (class_id.length() - 1));
01909         minor_version = atoi(mv_string.c_str());
01910       }
01911     }
01912   }
01913   else {
01914     plugin_class_name.clear();
01915   }
01916 
01917 }

Here is the call graph for this function:

Here is the caller graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::return_datareader_sec_attributes ( const ::DDS::Security::EndpointSecurityAttributes attributes,
::DDS::Security::SecurityException ex 
)

Definition at line 1364 of file AccessControlBuiltInImpl.cpp.

01367 {
01368   ACE_UNUSED_ARG(attributes);
01369   ACE_UNUSED_ARG(ex);
01370 
01371   return true;
01372 }

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::return_datawriter_sec_attributes ( const ::DDS::Security::EndpointSecurityAttributes attributes,
::DDS::Security::SecurityException ex 
)

Definition at line 1354 of file AccessControlBuiltInImpl.cpp.

01357 {
01358   ACE_UNUSED_ARG(attributes);
01359   ACE_UNUSED_ARG(ex);
01360 
01361   return true;
01362 }

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::return_participant_sec_attributes ( const ::DDS::Security::ParticipantSecurityAttributes attributes,
::DDS::Security::SecurityException ex 
)

Definition at line 1344 of file AccessControlBuiltInImpl.cpp.

01347 {
01348   ACE_UNUSED_ARG(attributes);
01349   ACE_UNUSED_ARG(ex);
01350 
01351   return true;
01352 }

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::return_permissions_credential_token ( const ::DDS::Security::PermissionsCredentialToken permissions_credential_token,
::DDS::Security::SecurityException ex 
)

Definition at line 1195 of file AccessControlBuiltInImpl.cpp.

01198 {
01199   ACE_UNUSED_ARG(permissions_credential_token);
01200   ACE_UNUSED_ARG(ex);
01201 
01202   return true;
01203 }

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::return_permissions_token ( const ::DDS::Security::PermissionsToken token,
::DDS::Security::SecurityException ex 
)

Definition at line 1185 of file AccessControlBuiltInImpl.cpp.

01188 {
01189   ACE_UNUSED_ARG(token);
01190   ACE_UNUSED_ARG(ex);
01191 
01192   return true;
01193 }

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::search_local_permissions ( const char *  topic_name,
const ::DDS::Security::DomainId_t  domain_id,
const ::DDS::PartitionQosPolicy partition,
const Permissions::PublishSubscribe_t  pub_or_sub,
const ACPermsMap::iterator  ac_iter,
::DDS::Security::SecurityException ex 
) [private]

Definition at line 1656 of file AccessControlBuiltInImpl.cpp.

References OpenDDS::Security::Permissions::ALLOW, OpenDDS::Security::Permissions::DENY, OpenDDS::Security::CommonUtilities::set_security_error(), strcmp(), and ACE::wild_match().

Referenced by check_create_datareader(), and check_create_datawriter().

01663 {
01664   std::string default_value;
01665 
01666   perm_grant_iter pbegin = ac_iter->second.perm->data().perm_rules.begin();
01667   perm_grant_iter pend = ac_iter->second.perm->data().perm_rules.end();
01668 
01669   for (perm_grant_iter pm_iter = pbegin; pm_iter != pend; ++pm_iter) {
01670     perm_grant_iter pbegin = ac_iter->second.perm->data().perm_rules.begin();
01671     perm_grant_iter pend = ac_iter->second.perm->data().perm_rules.end();
01672 
01673     for (perm_grant_iter pm_iter = pbegin; pm_iter != pend; ++pm_iter) {
01674       default_value = pm_iter->default_permission;
01675 
01676       perm_topic_rules_iter ptr_iter; // allow/deny rules
01677       perm_partitions_iter pp_iter;
01678       int matched_allow_partitions = 0;
01679       int matched_deny_partitions = 0;
01680       CORBA::ULong num_param_partitions = 0;
01681 
01682       for (ptr_iter = pm_iter->PermissionTopicRules.begin(); ptr_iter != pm_iter->PermissionTopicRules.end(); ++ptr_iter) {
01683         size_t  d = ptr_iter->domain_list.count(domain_id);
01684 
01685         if ((d > 0) && (ptr_iter->ad_type == Permissions::ALLOW)) {
01686           perm_topic_ps_rules_iter tpsr_iter;
01687 
01688           for (tpsr_iter = ptr_iter->topic_ps_rules.begin(); tpsr_iter != ptr_iter->topic_ps_rules.end(); ++tpsr_iter) {
01689 //            if (tpsr_iter->ps_type == Permissions::PUBLISH) {
01690             if (tpsr_iter->ps_type == pub_or_sub) {
01691               std::vector<std::string>::iterator tl_iter; // topic list
01692 
01693               for (tl_iter = tpsr_iter->topic_list.begin(); tl_iter != tpsr_iter->topic_list.end(); ++tl_iter) {
01694                 if (::ACE::wild_match(topic_name, (*tl_iter).c_str(), true, false)) {
01695                   // Topic matches now check that the partitions match
01696                   if (partition.name.length() > 0) {
01697                     // First look for the ad_type & ps_type in the partitions
01698                     for (pp_iter = pm_iter->PermissionPartitions.begin(); pp_iter != pm_iter->PermissionPartitions.end(); pp_iter++) {
01699                       size_t pd = pp_iter->domain_list.count(domain_id);
01700 
01701                       if ((pd > 0) && (pp_iter->ad_type == Permissions::ALLOW)) {
01702                         perm_partition_ps_iter pps_iter;
01703 
01704                         for (pps_iter = pp_iter->partition_ps.begin(); pps_iter != pp_iter->partition_ps.end(); ++pps_iter) {
01705 //                          if (pps_iter->ps_type == Permissions::PUBLISH) {
01706                           if (pps_iter->ps_type == pub_or_sub) {
01707                             std::vector<std::string>::iterator pl_iter; // partition list
01708                             num_param_partitions = pps_iter->partition_list.size();
01709 
01710                             for (pl_iter = pps_iter->partition_list.begin(); pl_iter != pps_iter->partition_list.end(); ++pl_iter) {
01711                               // Check the pl_iter value against the list of partitions in the partition parameter
01712                               for (CORBA::ULong i = 0; i < partition.name.length(); ++i) {
01713                                 if (::ACE::wild_match(partition.name[i], (*pl_iter).c_str(), true, false)) {
01714                                   matched_allow_partitions++;
01715                                   break;
01716                                 }
01717                               }
01718                             }
01719                           }
01720                         }
01721                       }
01722                     }
01723                   }
01724                   else { // No partitions to match
01725                     return true;
01726                   }
01727 
01728                 }
01729               }
01730             }
01731           }
01732         }
01733         else if ((d > 0) && (ptr_iter->ad_type == Permissions::DENY)) {
01734           perm_topic_ps_rules_iter tpsr_iter;
01735 
01736           for (tpsr_iter = ptr_iter->topic_ps_rules.begin(); tpsr_iter != ptr_iter->topic_ps_rules.end(); ++tpsr_iter) {
01737 //            if (tpsr_iter->ps_type == Permissions::PUBLISH) {
01738             if (tpsr_iter->ps_type == pub_or_sub) {
01739               std::vector<std::string>::iterator tl_iter; // topic list
01740 
01741               for (tl_iter = tpsr_iter->topic_list.begin(); tl_iter != tpsr_iter->topic_list.end(); ++tl_iter) {
01742                 if (::ACE::wild_match(topic_name, (*tl_iter).c_str(), true, false)) {
01743                   // Topic matches now check that the partitions match
01744                   if (partition.name.length() > 0) {
01745                     // First look for the ad_type & ps_type in the partitions
01746                     for (pp_iter = pm_iter->PermissionPartitions.begin(); pp_iter != pm_iter->PermissionPartitions.end(); pp_iter++) {
01747                       size_t pd = pp_iter->domain_list.count(domain_id);
01748 
01749                       if ((pd > 0) && (pp_iter->ad_type == Permissions::DENY)) {
01750                         perm_partition_ps_iter pps_iter;
01751 
01752                         for (pps_iter = pp_iter->partition_ps.begin(); pps_iter != pp_iter->partition_ps.end(); ++pps_iter) {
01753 //                          if (pps_iter->ps_type == Permissions::PUBLISH) {
01754                           if (pps_iter->ps_type == pub_or_sub) {
01755                             std::vector<std::string>::iterator pl_iter; // partition list
01756 
01757                             for (pl_iter = pps_iter->partition_list.begin(); pl_iter != pps_iter->partition_list.end(); ++pl_iter) {
01758                               // Check the pl_iter value against the list of partitions in the partition parameter
01759                               for (CORBA::ULong i = 0; i < partition.name.length(); ++i) {
01760                                 if (::ACE::wild_match(partition.name[i], (*pl_iter).c_str(), true, false)) {
01761                                   matched_deny_partitions++;
01762                                   break;
01763                                 }
01764                               }
01765                             }
01766                           }
01767                         }
01768                       }
01769                     }
01770                   }
01771                   else {
01772                     return false;
01773                   }
01774                 }
01775               }
01776             }
01777           }
01778 
01779         } // end of DENY
01780       }
01781 
01782       // If a topic and partition match were found, return the appropriate value.
01783       if ((matched_allow_partitions > 0) && (matched_deny_partitions > 0)) {
01784         CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl: Topic is in both allow and deny.");
01785         return false;
01786       }
01787       else {
01788         if (matched_allow_partitions > 0) {
01789           if (num_param_partitions > partition.name.length()) {
01790             CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl: Requested more partitions than available in permissions file.");
01791             return false;
01792           }
01793           else {
01794             return true;
01795           }
01796         }
01797         else if (matched_deny_partitions > 0) {
01798           return false;
01799         }
01800 
01801       }
01802 
01803     }
01804   }
01805 
01806   // If this point in the code is reached it means that either there are no PermissionTopicRules
01807   // or the topic_name does not exist in the topic_list so return the value of default_permission
01808   if (strcmp(default_value.c_str(), "ALLOW") == 0) {
01809     return true;
01810   }
01811   else {
01812     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl: No matching rule for topic, default permission is DENY.");
01813     return false;
01814   }
01815 }

Here is the call graph for this function:

Here is the caller graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::search_remote_permissions ( const char *  topic_name,
const ::DDS::Security::DomainId_t  domain_id,
const ACPermsMap::iterator  ac_iter,
const Permissions::PublishSubscribe_t  pub_or_sub,
::DDS::Security::SecurityException ex 
) [private]
Returns:
0 if the search is successful.

Definition at line 1817 of file AccessControlBuiltInImpl.cpp.

References OpenDDS::Security::Permissions::ALLOW, OpenDDS::Security::Permissions::DENY, OpenDDS::Security::CommonUtilities::set_security_error(), strcmp(), and ACE::wild_match().

Referenced by check_remote_datareader(), and check_remote_datawriter().

01823 {
01824   perm_grant_iter pm_iter;
01825   std::string default_value;
01826 
01827   for (pm_iter = ac_iter->second.perm->data().perm_rules.begin(); pm_iter != ac_iter->second.perm->data().perm_rules.end(); ++pm_iter) {
01828     default_value = pm_iter->default_permission;
01829 
01830     perm_topic_rules_iter ptr_iter; // allow/deny rules
01831 
01832     for (ptr_iter = pm_iter->PermissionTopicRules.begin(); ptr_iter != pm_iter->PermissionTopicRules.end(); ++ptr_iter) {
01833       size_t  d = ptr_iter->domain_list.count(domain_id);
01834 
01835       if ((d > 0) && (ptr_iter->ad_type == Permissions::ALLOW)) {
01836         perm_topic_ps_rules_iter tpsr_iter;
01837 
01838         for (tpsr_iter = ptr_iter->topic_ps_rules.begin(); tpsr_iter != ptr_iter->topic_ps_rules.end(); ++tpsr_iter) {
01839           if (tpsr_iter->ps_type == pub_or_sub) {
01840             std::vector<std::string>::iterator tl_iter; // topic list
01841 
01842             for (tl_iter = tpsr_iter->topic_list.begin(); tl_iter != tpsr_iter->topic_list.end(); ++tl_iter) {
01843               if (::ACE::wild_match(topic_name, (*tl_iter).c_str(), true, false)) {
01844                 return true;
01845               }
01846             }
01847           }  // end if (tpsr_iter->ps_type)
01848         } // end for
01849       }
01850       else if ((d > 0) && (ptr_iter->ad_type == Permissions::DENY)) {
01851         perm_topic_ps_rules_iter tpsr_iter;
01852 
01853         for (tpsr_iter = ptr_iter->topic_ps_rules.begin(); tpsr_iter != ptr_iter->topic_ps_rules.end(); ++tpsr_iter) {
01854           if (tpsr_iter->ps_type == pub_or_sub) {
01855             std::vector<std::string>::iterator tl_iter; // topic list
01856 
01857             for (tl_iter = tpsr_iter->topic_list.begin(); tl_iter != tpsr_iter->topic_list.end(); ++tl_iter) {
01858               if (::ACE::wild_match(topic_name, (*tl_iter).c_str(), true, false)) {
01859                 CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter: Permissions is DENY");
01860                 return false;
01861               }
01862             }
01863           }
01864         }
01865 
01866       } // end of DENY
01867     }
01868 
01869   }
01870 
01871   // If this point in the code is reached it means that either there are no PermissionTopicRules
01872   // or the topic_name does not exist in the topic_list so return the value of default_permission
01873   if (strcmp(default_value.c_str(), "ALLOW") == 0) {
01874     return true;
01875   }
01876   else {
01877     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_remote_datawriter: Topic not in Permissions, default is DENY");
01878     return false;
01879   }
01880 }

Here is the call graph for this function:

Here is the caller graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::set_listener ( ::DDS::Security::AccessControlListener_ptr  listener,
::DDS::Security::SecurityException ex 
)

Definition at line 1170 of file AccessControlBuiltInImpl.cpp.

References handle_mutex_, listener_ptr_, and OpenDDS::Security::CommonUtilities::set_security_error().

01173 {
01174   if (0 == listener) {
01175     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::set_listener: Invalid Listener pointer");
01176     return false;
01177   }
01178 
01179   ACE_Guard<ACE_Thread_Mutex> guard(handle_mutex_);
01180 
01181   listener_ptr_ = listener;
01182   return true;
01183 }

Here is the call graph for this function:

CORBA::Boolean OpenDDS::Security::AccessControlBuiltInImpl::validate_date_time ( const ACPermsMap::iterator  ac_iter,
time_t &  delta_time,
::DDS::Security::SecurityException ex 
) [private]

Definition at line 1465 of file AccessControlBuiltInImpl.cpp.

References convert_permissions_time(), gmtime(), mktime(), OpenDDS::Security::CommonUtilities::set_security_error(), and time().

Referenced by check_create_datareader(), check_create_datawriter(), check_create_topic(), check_remote_datareader(), check_remote_datawriter(), and check_remote_topic().

01468 {
01469   time_t after_time,
01470          before_time,
01471          cur_utc_time;
01472   time_t current_date_time = time(0);
01473 
01474   perm_grant_iter pbegin = ac_iter->second.perm->data().perm_rules.begin();
01475   perm_grant_iter pend = ac_iter->second.perm->data().perm_rules.end();
01476 
01477   for (perm_grant_iter pm_iter = pbegin; pm_iter != pend; ++pm_iter) {
01478     before_time = convert_permissions_time(pm_iter->validity.not_before);
01479 
01480     if (before_time == 0) {
01481       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datawriter: Permissions not_before time is invalid.");
01482       return false;
01483     }
01484 
01485     // Adjust the current time to UTC/GMT
01486     tm *current_time_tm = gmtime(&current_date_time);
01487     cur_utc_time = mktime(current_time_tm);
01488 
01489     if (cur_utc_time < before_time) {
01490       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datawriter: Permissions grant hasn't started yet.");
01491       return false;
01492     }
01493 
01494     after_time = convert_permissions_time(pm_iter->validity.not_after);
01495 
01496     if (after_time == 0) {
01497       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datawriter: Permissions not_after time is invalid.");
01498       return false;
01499     }
01500 
01501     if (cur_utc_time > after_time) {
01502       CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::check_create_datawriter: Permissions grant has expired.");
01503       return false;
01504     }
01505 
01506   }
01507 
01508   delta_time = after_time - cur_utc_time;
01509   return true;
01510 }

Here is the call graph for this function:

Here is the caller graph for this function:

DDS::Security::PermissionsHandle OpenDDS::Security::AccessControlBuiltInImpl::validate_local_permissions ( ::DDS::Security::Authentication_ptr  auth_plugin,
::DDS::Security::IdentityHandle  identity,
::DDS::Security::DomainId_t  domain_id,
const ::DDS::DomainParticipantQos participant_qos,
::DDS::Security::SecurityException ex 
)

Definition at line 66 of file AccessControlBuiltInImpl.cpp.

References ACE_TEXT(), OpenDDS::Security::TokenWriter::add_property(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::Security::Permissions::AcPerms::domain_id, generate_handle(), OpenDDS::Security::SSL::SignedDocument::get_original(), OpenDDS::Security::TokenReader::get_property_value(), OpenDDS::Security::AccessControlBuiltInImpl::AccessData::gov, handle_mutex_, DDS::HANDLE_NIL, LM_DEBUG, local_ac_perms_, OpenDDS::Security::AccessControlBuiltInImpl::AccessData::local_access_credential_data, local_identity_map_, OpenDDS::Security::SSL::SubjectName::parse(), OpenDDS::Security::AccessControlBuiltInImpl::AccessData::perm, OpenDDS::Security::Permissions::AcPerms::perm_cred_token, OpenDDS::Security::Permissions::AcPerms::perm_token, OpenDDS::Security::PermissionsCredentialTokenClassId(), OpenDDS::Security::PermissionsTokenClassId(), OpenDDS::Security::CommonUtilities::set_security_error(), and OpenDDS::Security::SSL::SignedDocument::verify_signature().

00072 {
00073   if (0 == auth_plugin) {
00074     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_local_permissions: Null Authentication plugin");
00075     return DDS::HANDLE_NIL;
00076   }
00077 
00078   if (DDS::HANDLE_NIL == identity) {
00079     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_local_permissions: Invalid identity");
00080     return DDS::HANDLE_NIL;
00081   }
00082 
00083   DDS::Security::IdentityToken id_token;
00084 
00085   if (auth_plugin->get_identity_token(id_token, identity, ex) == false) {
00086     return DDS::HANDLE_NIL;
00087   }
00088 
00089   LocalAccessCredentialData::shared_ptr local_access_credential_data = DCPS::make_rch<LocalAccessCredentialData>();
00090 
00091   if (! local_access_credential_data->load(participant_qos.property.value, ex)) {
00092     return DDS::HANDLE_NIL;
00093   }
00094 
00095   const SSL::Certificate& local_ca = local_access_credential_data->get_ca_cert();
00096   const SSL::SignedDocument& local_gov = local_access_credential_data->get_governance_doc();
00097 
00098   int err = local_gov.verify_signature(local_ca);
00099   if (err) {
00100     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_local_permissions: Governance signature not verified");
00101     return DDS::HANDLE_NIL;
00102   }
00103 
00104   Governance::shared_ptr governance = DCPS::make_rch<Governance>();
00105 
00106   err = governance->load(local_gov);
00107   if (err) {
00108     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_local_permissions: Invalid governance file");
00109     return DDS::HANDLE_NIL;
00110   }
00111 
00112   const SSL::SignedDocument& local_perm = local_access_credential_data->get_permissions_doc();
00113   Permissions::shared_ptr permissions = DCPS::make_rch<Permissions>();
00114 
00115   err = permissions->load(local_perm);
00116   if (err) {
00117     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_local_permissions: Invalid permission file");
00118     return DDS::HANDLE_NIL;
00119   }
00120 
00121   // Compare the subject name for validation
00122 
00123   TokenReader tr(id_token);
00124   const char* id_sn = tr.get_property_value("dds.cert.sn");
00125 
00126   OpenDDS::Security::SSL::SubjectName sn_id;
00127   OpenDDS::Security::SSL::SubjectName sn_perm;
00128 
00129   const std::string& perm_sn = permissions->subject_name();
00130 
00131   if (id_sn == NULL || perm_sn.empty() ||
00132       sn_id.parse(id_sn) != 0 ||
00133       sn_perm.parse(perm_sn, true) != 0 ||
00134       sn_id != sn_perm) {
00135     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_local_permissions: Permissions subject name does not match identity subject name");
00136     return DDS::HANDLE_NIL;
00137   }
00138 
00139   // Verify signature of permissions file
00140   err = local_perm.verify_signature(local_ca);
00141   if (err) {
00142     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_local_permissions: Permissions signature not verified");
00143     return DDS::HANDLE_NIL;
00144   } else {
00145     if (OpenDDS::DCPS::DCPS_debug_level > 0) {
00146       ACE_DEBUG((LM_DEBUG, ACE_TEXT(
00147         "(%P|%t) AccessControlBuiltInImpl::validate_local_permissions: Permissions document verified.\n")));
00148     }
00149   }
00150 
00151   // Set and store the permissions credential token while we have the raw content
00152   DDS::Security::PermissionsCredentialToken permissions_cred_token;
00153   TokenWriter pctWriter(permissions_cred_token, PermissionsCredentialTokenClassId);
00154 
00155   pctWriter.add_property("dds.perm.cert", local_perm.get_original());
00156 
00157   // Set and store the permissions token
00158   DDS::Security::PermissionsToken permissions_token;
00159   TokenWriter writer(permissions_token, PermissionsTokenClassId);
00160 
00161   // If all checks are successful load the content into cache
00162   Permissions::AcPerms& perm_data = permissions->data();
00163   perm_data.domain_id = domain_id;
00164   perm_data.perm_token = permissions_token;
00165   perm_data.perm_cred_token = permissions_cred_token;
00166 
00167   ::CORBA::Long perm_handle = generate_handle();
00168 
00169   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, 0);
00170 
00171   AccessData cache_this;
00172   cache_this.perm = permissions;
00173   cache_this.gov = governance;
00174   cache_this.local_access_credential_data = local_access_credential_data;
00175 
00176   local_ac_perms_.insert(std::make_pair(perm_handle, cache_this));
00177   local_identity_map_.insert(std::make_pair(identity, perm_handle));
00178 
00179   return perm_handle;
00180 }

Here is the call graph for this function:

DDS::Security::PermissionsHandle OpenDDS::Security::AccessControlBuiltInImpl::validate_remote_permissions ( ::DDS::Security::Authentication_ptr  auth_plugin,
::DDS::Security::IdentityHandle  local_identity_handle,
::DDS::Security::IdentityHandle  remote_identity_handle,
const ::DDS::Security::PermissionsToken remote_permissions_token,
const ::DDS::Security::AuthenticatedPeerCredentialToken remote_credential_token,
::DDS::Security::SecurityException ex 
)

Definition at line 182 of file AccessControlBuiltInImpl.cpp.

References ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::Security::SSL::SignedDocument::deserialize(), OpenDDS::Security::Permissions::AcPerms::domain_id, generate_handle(), OpenDDS::Security::TokenReader::get_bin_property_value(), OpenDDS::Security::AccessControlBuiltInImpl::AccessData::gov, handle_mutex_, DDS::HANDLE_NIL, LM_DEBUG, local_ac_perms_, OpenDDS::Security::AccessControlBuiltInImpl::AccessData::local_access_credential_data, local_identity_map_, OpenDDS::Security::SSL::SubjectName::parse(), OpenDDS::Security::AccessControlBuiltInImpl::AccessData::perm, OpenDDS::Security::Permissions::AcPerms::perm_cred_token, OpenDDS::Security::Permissions::AcPerms::perm_token, OpenDDS::Security::CommonUtilities::set_security_error(), OpenDDS::Security::SSL::Certificate::subject_name_to_str(), and OpenDDS::Security::SSL::SignedDocument::verify_signature().

00189 {
00190   if (0 == auth_plugin) {
00191     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_remote_permissions: Null Authentication plugin");
00192     return DDS::HANDLE_NIL;
00193   }
00194 
00195   if (DDS::HANDLE_NIL == local_identity_handle) {
00196     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_remote_permissions: Invalid Local Identity");
00197     return DDS::HANDLE_NIL;
00198   }
00199 
00200   ACIdentityMap::iterator iter = local_identity_map_.find(local_identity_handle);
00201 
00202   if (iter == local_identity_map_.end()) {
00203     CommonUtilities::set_security_error(ex,-1, 0, "AccessControlBuiltInImpl::validate_remote_permissions: No matching local identity handle present");
00204     return DDS::HANDLE_NIL;
00205   }
00206 
00207   // Extract Governance and domain id data for new permissions entry
00208   ::DDS::Security::PermissionsHandle local_ph = iter->second;
00209 
00210   ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, handle_mutex_, 0);
00211 
00212   ACPermsMap::iterator piter = local_ac_perms_.find(local_ph);
00213 
00214   if (piter == local_ac_perms_.end()) {
00215     CommonUtilities::set_security_error(ex,-1, 0, "AccessControlBuiltInImpl::validate_remote_permissions: No matching local permissions handle present");
00216     return DDS::HANDLE_NIL;
00217   }
00218 
00219   // permissions file
00220   OpenDDS::Security::TokenReader remote_perm_wrapper(remote_credential_token);
00221   SSL::SignedDocument remote_perm_doc;
00222 
00223   int err = remote_perm_doc.deserialize(remote_perm_wrapper.get_bin_property_value("c.perm"));
00224   if (err)
00225   {
00226     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_remote_permissions: Failed to deserialize c.perm into signed-document");
00227     return DDS::HANDLE_NIL;
00228   }
00229 
00230   Permissions::shared_ptr permissions = DCPS::make_rch<Permissions>();
00231 
00232   err = permissions->load(remote_perm_doc);
00233   if (err)
00234   {
00235     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_remote_permissions: Invalid permission file");
00236     return DDS::HANDLE_NIL;
00237   }
00238 
00239   const LocalAccessCredentialData::shared_ptr& local_access_credential_data = piter->second.local_access_credential_data;
00240 
00241   // Validate the signature of the remote permissions
00242   const SSL::Certificate& local_ca = local_access_credential_data->get_ca_cert();
00243   std::string ca_subject;
00244 
00245   local_ca.subject_name_to_str(ca_subject);
00246 
00247   err = remote_perm_doc.verify_signature(local_ca);
00248   if (err) {
00249     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_remote_permissions: Remote permissions signature not verified");
00250     return DDS::HANDLE_NIL;
00251   }
00252 
00253   // The remote permissions signature is verified
00254   if (OpenDDS::DCPS::DCPS_debug_level > 0) {
00255     ACE_DEBUG((LM_DEBUG, ACE_TEXT(
00256       "(%P|%t) AccessControlBuiltInImpl::validate_remote_permissions: Remote permissions document verified.\n")));
00257   }
00258 
00259   //Extract and compare the remote subject name for validation
00260   TokenReader remote_credential_tr(remote_credential_token);
00261   const DDS::OctetSeq& cid = remote_credential_tr.get_bin_property_value("c.id");
00262 
00263   if (cid.length() == 0) {
00264     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_remote_permissions: Invalid remote credential identity");
00265     return DDS::HANDLE_NIL;
00266   }
00267 
00268   SSL::Certificate::unique_ptr remote_cert(new SSL::Certificate);
00269   remote_cert->deserialize(cid);
00270 
00271   std::string remote_identity_sn;
00272   remote_cert->subject_name_to_str(remote_identity_sn);
00273 
00274   OpenDDS::Security::SSL::SubjectName sn_id_remote;
00275   OpenDDS::Security::SSL::SubjectName sn_perm_remote;
00276 
00277   const std::string& remote_perm_sn = permissions->subject_name();
00278   if (remote_identity_sn.empty() || remote_perm_sn.empty() ||
00279       sn_id_remote.parse(remote_identity_sn) != 0 ||
00280       sn_perm_remote.parse(remote_perm_sn, true) != 0 ||
00281       sn_id_remote != sn_perm_remote) {
00282     CommonUtilities::set_security_error(ex, -1, 0, "AccessControlBuiltInImpl::validate_remote_permissions: "
00283                                         "Remote permissions subject name does not match remote identity subject name");
00284     return DDS::HANDLE_NIL;
00285   }
00286 
00287   // Set and store the permissions credential token while we have the raw content
00288 
00289   Permissions::AcPerms& perm_data = permissions->data();
00290   perm_data.domain_id = piter->second.perm->data().domain_id;
00291   perm_data.perm_token = remote_permissions_token;
00292   perm_data.perm_cred_token = remote_credential_token;
00293 
00294   ::CORBA::Long perm_handle = generate_handle();
00295 
00296   AccessData cache_this;
00297   cache_this.perm = permissions;
00298   cache_this.gov = piter->second.gov;
00299   cache_this.local_access_credential_data = local_access_credential_data;
00300 
00301   local_ac_perms_.insert(std::make_pair(perm_handle, cache_this));
00302   return perm_handle;
00303 }

Here is the call graph for this function:


Member Data Documentation

Definition at line 279 of file AccessControlBuiltInImpl.h.

Referenced by generate_handle().

::DDS::Security::AccessControlListener_ptr OpenDDS::Security::AccessControlBuiltInImpl::listener_ptr_ [private]

Definition at line 273 of file AccessControlBuiltInImpl.h.

Referenced by check_create_datareader(), and check_create_datawriter().

Definition at line 281 of file AccessControlBuiltInImpl.h.

Referenced by generate_handle().

Definition at line 274 of file AccessControlBuiltInImpl.h.

Referenced by check_remote_datareader(), and check_remote_datawriter().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on 10 Aug 2018 for OpenDDS by  doxygen 1.6.1