15 #include <dds/DdsDcpsInfrastructureC.h> 18 #include <ace/config-macros.h> 36 using DCPS::TimeDuration;
38 typedef Governance::GovernanceAccessRules::iterator
gov_iter;
66 ACE_TEXT(
"AccessControlBuiltInImpl::~AccessControlBuiltInImpl local_ac_perms_ %B local_identity_map_ %B\n"),
73 ::DDS::Security::Authentication_ptr auth_plugin,
76 const ::DDS::DomainParticipantQos & participant_qos,
79 if (0 == auth_plugin) {
91 if (!auth_plugin->get_identity_token(id_token, identity, ex)) {
97 if (! local_access_credential_data->load(participant_qos.property.value, ex)) {
101 if (!local_access_credential_data->verify(ex)) {
108 if (governance->load(local_gov)) {
113 const SSL::SignedDocument& local_perm = local_access_credential_data->get_permissions_doc();
116 if (permissions->load(local_perm)) {
126 if (!id_sn || sn_id.
parse(id_sn) != 0 || !permissions->has_grant(sn_id)) {
142 permissions->perm_token_ = permissions_token;
143 permissions->perm_cred_token_ = permissions_cred_token;
153 cache_this.
perm = permissions;
154 cache_this.
gov = governance;
160 ACE_TEXT(
"AccessControlBuiltInImpl::validate_local_permissions local_ac_perms_ (total %B)\n"),
166 ACE_TEXT(
"AccessControlBuiltInImpl::validate_local_permissions local_identity_map_ (total %B)\n"),
174 ::DDS::Security::Authentication_ptr auth_plugin,
181 if (0 == auth_plugin) {
208 TokenReader remote_perm_wrapper(remote_credential_token);
214 const SSL::Certificate& local_ca = local_access_credential_data->get_ca_cert();
215 std::string ca_subject;
219 if (!remote_perm_doc.verify(local_ca)) {
227 "(%P|%t) AccessControlBuiltInImpl::validate_remote_permissions: Remote permissions document verified.\n")));
231 if (remote_permissions->load(remote_perm_doc)) {
237 TokenReader remote_credential_tr(remote_credential_token);
240 if (cid.length() == 0) {
246 remote_cert->deserialize(cid);
248 std::string remote_identity_sn;
249 remote_cert->subject_name_to_str(remote_identity_sn);
253 if (remote_identity_sn.empty() || sn_id_remote.
parse(remote_identity_sn) != 0 || !remote_permissions->has_grant(sn_id_remote)) {
255 "Remote identity subject name does not match any subject name in remote permissions grants");
260 remote_permissions->perm_token_ = remote_permissions_token;
261 remote_permissions->perm_cred_token_ = remote_credential_token;
265 cache_this.
identity = remote_identity_handle;
266 cache_this.
subject = sn_id_remote;
267 cache_this.
domain_id = piter->second.domain_id;
268 cache_this.
perm = remote_permissions;
269 cache_this.
gov = piter->second.gov;
276 ACE_TEXT(
"AccessControlBuiltInImpl::validate_remote_permissions local_ac_perms_ (total %B)\n"),
285 const ::DDS::DomainParticipantQos & ,
316 "AccessControlBuiltInImpl::check_create_participant: " 317 "No matching permissions handle present");
320 if (domain_id != piter->second.domain_id) {
322 "AccessControlBuiltInImpl::check_create_participant: " 323 "Domain does not match validated permissions handle");
326 gov_iter begin = piter->second.gov->access_rules().begin();
327 gov_iter end = piter->second.gov->access_rules().end();
329 for (gov_iter giter = begin; giter != end; ++giter) {
331 if (giter->domains.has(domain_id)) {
332 Governance::TopicAccessRules::iterator tr_iter;
334 for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
335 if (!tr_iter->topic_attrs.is_read_protected || !tr_iter->topic_attrs.is_write_protected) {
340 if (!giter->domain_attrs.is_access_protected) {
347 "AccessControlBuiltInImpl::check_create_participant: " 348 "No governance exists for this domain");
354 const char * topic_name,
356 const ::DDS::PartitionQosPolicy & partition,
357 const ::DDS::Security::DataTags & ,
363 if (0 == topic_name) {
369 ACPermsMap::iterator ac_iter =
local_ac_perms_.find(permissions_handle);
375 gov_iter begin = ac_iter->second.gov->access_rules().begin();
376 gov_iter end = ac_iter->second.gov->access_rules().end();
378 for (gov_iter giter = begin; giter != end; ++giter) {
380 if (giter->domains.has(domain_id)) {
381 Governance::TopicAccessRules::iterator tr_iter;
383 for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
384 if (
pattern_match(topic_name, tr_iter->topic_expression.c_str())) {
385 if (!tr_iter->topic_attrs.is_write_protected) {
416 const char * topic_name,
418 const ::DDS::PartitionQosPolicy & partition,
419 const ::DDS::Security::DataTags & ,
426 if (0 == topic_name) {
432 ACPermsMap::iterator ac_iter =
local_ac_perms_.find(permissions_handle);
438 gov_iter begin = ac_iter->second.gov->access_rules().begin();
439 gov_iter end = ac_iter->second.gov->access_rules().end();
441 for (gov_iter giter = begin; giter != end; ++giter) {
443 if (giter->domains.has(domain_id)) {
444 Governance::TopicAccessRules::iterator tr_iter;
446 for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
447 if (
pattern_match(topic_name, tr_iter->topic_expression.c_str())) {
448 if (!tr_iter->topic_attrs.is_read_protected) {
479 const char * topic_name,
486 if (0 == topic_name) {
492 ACPermsMap::iterator ac_iter =
local_ac_perms_.find(permissions_handle);
500 if (domain_id != ac_iter->second.domain_id) {
506 gov_iter begin = ac_iter->second.gov->access_rules().begin();
507 gov_iter end = ac_iter->second.gov->access_rules().end();
509 for (gov_iter giter = begin; giter != end; ++giter) {
511 if (giter->domains.has(domain_to_find)) {
512 Governance::TopicAccessRules::iterator tr_iter;
514 for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
515 if (
pattern_match(topic_name, tr_iter->topic_expression.c_str())) {
516 if (!tr_iter->topic_attrs.is_read_protected || !tr_iter->topic_attrs.is_write_protected) {
534 bool found_deny =
false;
536 for (perm_topic_rules_iter ptr_iter = grant->rules.begin(); ptr_iter != grant->rules.end(); ++ptr_iter) {
538 if (ptr_iter->domains.has(domain_to_find)) {
540 perm_topic_actions_iter tpsr_iter;
541 for (tpsr_iter = ptr_iter->actions.begin(); tpsr_iter != ptr_iter->actions.end(); ++tpsr_iter) {
543 std::vector<std::string>::iterator tl_iter;
544 for (tl_iter = tpsr_iter->topics.begin(); tl_iter != tpsr_iter->topics.end(); ++tl_iter) {
550 if (found_deny && denied_type != tpsr_iter->ps_type) {
552 }
else if (!found_deny) {
554 denied_type = tpsr_iter->ps_type;
572 ::DDS::DataWriter_ptr writer,
573 ::DDS::DynamicData_ptr
key,
591 ::DDS::DataWriter_ptr writer,
592 ::DDS::DynamicData_ptr
key,
611 const ::DDS::Security::ParticipantBuiltinTopicDataSecure & participant_data,
620 ACPermsMap::iterator ac_iter =
local_ac_perms_.find(permissions_handle);
626 gov_iter begin = ac_iter->second.gov->access_rules().begin();
627 gov_iter end = ac_iter->second.gov->access_rules().end();
629 for (gov_iter giter = begin; giter != end; ++giter) {
630 if (giter->domains.has(domain_id) && !giter->domain_attrs.is_access_protected) {
636 const std::string remote_class_id = participant_data.base.permissions_token.class_id.in();
638 std::string local_plugin_class_name,
639 remote_plugin_class_name;
640 int local_major_ver = 0,
645 if (remote_class_id.length() > 0) {
646 parse_class_id(remote_class_id, remote_plugin_class_name, remote_major_ver, remote_minor_ver);
652 if (local_iter->second.domain_id == domain_id && local_iter->first != permissions_handle) {
653 const std::string local_class_id = local_iter->second.perm->perm_token_.class_id.in();
655 if (local_class_id.length() > 0) {
656 parse_class_id(local_class_id, local_plugin_class_name, local_major_ver, local_minor_ver);
664 if (
strcmp(local_plugin_class_name.c_str(), remote_plugin_class_name.c_str())) {
668 if (local_major_ver != remote_major_ver) {
677 for (perm_topic_rules_iter ptr_iter = grant->rules.begin(); ptr_iter != grant->rules.end(); ++ptr_iter) {
693 const ::DDS::Security::PublicationBuiltinTopicDataSecure & publication_data,
700 if (publication_data.base.base.topic_name[0] == 0) {
706 ACPermsMap::iterator ac_iter =
local_ac_perms_.find(permissions_handle);
712 gov_iter begin = ac_iter->second.gov->access_rules().begin();
713 gov_iter end = ac_iter->second.gov->access_rules().end();
715 for (gov_iter giter = begin; giter != end; ++giter) {
717 if (giter->domains.has(domain_id)) {
718 Governance::TopicAccessRules::iterator tr_iter;
720 for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
721 if (
pattern_match(publication_data.base.base.topic_name, tr_iter->topic_expression.c_str())) {
722 if (!tr_iter->topic_attrs.is_write_protected) {
753 const ::DDS::Security::SubscriptionBuiltinTopicDataSecure & subscription_data,
763 ACPermsMap::iterator ac_iter =
local_ac_perms_.find(permissions_handle);
772 gov_iter begin = ac_iter->second.gov->access_rules().begin();
773 gov_iter end = ac_iter->second.gov->access_rules().end();
775 for (gov_iter giter = begin; giter != end; ++giter) {
777 if (giter->domains.has(domain_id)) {
778 Governance::TopicAccessRules::iterator tr_iter;
780 for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
781 if (
pattern_match(subscription_data.base.base.topic_name, tr_iter->topic_expression.c_str())) {
782 if (!tr_iter->topic_attrs.is_read_protected) {
813 const ::DDS::TopicBuiltinTopicData & topic_data,
821 if (topic_data.name[0] == 0) {
827 ACPermsMap::iterator ac_iter =
local_ac_perms_.find(permissions_handle);
835 const std::string remote_class_id = ac_iter->second.perm->perm_token_.class_id.in();
837 std::string local_plugin_class_name,
838 remote_plugin_class_name;
839 int local_major_ver = 0,
844 if (remote_class_id.length() > 0) {
845 parse_class_id(remote_class_id, remote_plugin_class_name, remote_major_ver, remote_minor_ver);
851 if (local_iter->second.domain_id == domain_id && local_iter->first != permissions_handle) {
852 const std::string local_class_id = local_iter->second.perm->perm_token_.class_id.in();
854 if (local_class_id.length() > 0) {
855 parse_class_id(local_class_id, local_plugin_class_name, local_major_ver, local_minor_ver);
863 if (
strcmp(local_plugin_class_name.c_str(), remote_plugin_class_name.c_str())) {
867 if (local_major_ver != remote_major_ver) {
873 gov_iter begin = ac_iter->second.gov->access_rules().begin();
874 gov_iter end = ac_iter->second.gov->access_rules().end();
876 for (gov_iter giter = begin; giter != end; ++giter) {
878 if (giter->domains.has(domain_id)) {
879 Governance::TopicAccessRules::iterator tr_iter;
881 for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
882 if (
pattern_match(topic_data.name, tr_iter->topic_expression.c_str())) {
883 if (!tr_iter->topic_attrs.is_read_protected || !tr_iter->topic_attrs.is_write_protected) {
901 bool found_deny =
false;
902 for (perm_topic_rules_iter ptr_iter = grant->rules.begin(); ptr_iter != grant->rules.end(); ++ptr_iter) {
904 if (ptr_iter->domains.has(domain_id)) {
907 perm_topic_actions_iter tpsr_iter;
908 for (tpsr_iter = ptr_iter->actions.begin(); tpsr_iter != ptr_iter->actions.end(); ++tpsr_iter) {
914 std::vector<std::string>::iterator tl_iter;
915 for (tl_iter = tpsr_iter->topics.begin(); tl_iter != tpsr_iter->topics.end(); ++tl_iter) {
921 if (found_deny && denied_type != tpsr_iter->ps_type) {
923 }
else if (!found_deny) {
925 denied_type = tpsr_iter->ps_type;
945 const ::DDS::Security::PublicationBuiltinTopicDataSecure & ,
946 const ::DDS::Security::SubscriptionBuiltinTopicDataSecure & ,
962 const ::DDS::Security::SubscriptionBuiltinTopicDataSecure & ,
963 const ::DDS::Security::PublicationBuiltinTopicDataSecure & ,
978 ::DDS::DataReader_ptr reader,
980 ::DDS::DynamicData_ptr
key,
997 ::DDS::DataReader_ptr reader,
999 ::DDS::DynamicData_ptr
key,
1010 ACE_UNUSED_ARG(key);
1029 permissions_token = iter->second.perm->perm_token_;
1052 permissions_credential_token = iter->second.perm->perm_cred_token_;
1061 ::DDS::Security::AccessControlListener_ptr listener,
1064 if (0 == listener) {
1094 ACE_TEXT(
"AccessControlBuiltInImpl::return_permissions_handle local_ac_perms_ (total %B)\n"),
1107 ACE_UNUSED_ARG(token);
1117 ACE_UNUSED_ARG(permissions_credential_token);
1135 ACPermsMap::iterator ac_iter =
local_ac_perms_.find(permissions_handle);
1142 gov_iter begin = ac_iter->second.gov->access_rules().begin();
1143 gov_iter end = ac_iter->second.gov->access_rules().end();
1145 for (gov_iter giter = begin; giter != end; ++giter) {
1147 if (giter->domains.has(ac_iter->second.domain_id)) {
1148 attributes = giter->domain_attrs;
1159 const char * topic_name,
1167 if (0 == topic_name) {
1176 ACPermsMap::iterator piter =
local_ac_perms_.find(permissions_handle);
1183 gov_iter begin = piter->second.gov->access_rules().begin();
1184 gov_iter end = piter->second.gov->access_rules().end();
1186 for (gov_iter giter = begin; giter != end; ++giter) {
1188 if (giter->domains.has(piter->second.domain_id)) {
1189 Governance::TopicAccessRules::iterator tr_iter;
1191 for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
1192 if (
pattern_match(topic_name, tr_iter->topic_expression.c_str())) {
1193 attributes = tr_iter->topic_attrs;
1206 const char * topic_name,
1207 const ::DDS::PartitionQosPolicy & partition,
1220 if (0 == topic_name) {
1225 if (!
get_sec_attributes(permissions_handle, topic_name, partition, data_tag, attributes, ex)) {
1234 const char * topic_name,
1235 const ::DDS::PartitionQosPolicy & partition,
1245 if (0 == topic_name) {
1250 if (!
get_sec_attributes(permissions_handle, topic_name, partition, data_tag, attributes, ex)) {
1258 const ::DDS::Security::ParticipantSecurityAttributes & attributes,
1261 ACE_UNUSED_ARG(attributes);
1268 const ::DDS::Security::EndpointSecurityAttributes & attributes,
1271 ACE_UNUSED_ARG(attributes);
1278 const ::DDS::Security::EndpointSecurityAttributes & attributes,
1281 ACE_UNUSED_ARG(attributes);
1308 "AccessControlBuiltInImpl::validate_date_time: Permissions not_before time is invalid.");
1314 "AccessControlBuiltInImpl::validate_date_time: Permissions not_after time is invalid.");
1319 const time_t now = std::time(0);
1320 std::tm*
const now_utc_tm = std::gmtime(&now);
1321 const time_t now_utc = std::mktime(now_utc_tm);
1325 "AccessControlBuiltInImpl::validate_date_time: Permissions grant hasn't started yet.");
1331 "AccessControlBuiltInImpl::validate_date_time: Permissions grant has expired.");
1339 const char * topic_name,
1340 const::DDS::PartitionQosPolicy & ,
1347 const ACPermsMap::iterator ac_iter =
local_ac_perms_.find(permissions_handle);
1353 const gov_iter begin = ac_iter->second.gov->access_rules().begin();
1354 const gov_iter end = ac_iter->second.gov->access_rules().end();
1355 for (gov_iter giter = begin; giter != end; ++giter) {
1356 if (giter->domains.has(ac_iter->second.domain_id)) {
1357 if (std::strcmp(topic_name,
"DCPSParticipantVolatileMessageSecure") == 0) {
1368 if (std::strcmp(topic_name,
"DCPSParticipantStatelessMessage") == 0) {
1379 if (std::strcmp(topic_name,
"DCPSParticipantMessageSecure") == 0) {
1399 if (std::strcmp(topic_name,
"DCPSParticipantSecure") == 0 ||
1400 std::strcmp(topic_name,
"DCPSPublicationsSecure") == 0 ||
1401 std::strcmp(topic_name,
"DCPSSubscriptionsSecure") == 0 ||
1402 std::strcmp(topic_name,
"TypeLookupServiceRequestSecure") == 0 ||
1403 std::strcmp(topic_name,
"TypeLookupServiceReplySecure") == 0) {
1423 Governance::TopicAccessRules::iterator tr_iter;
1425 for (tr_iter = giter->topic_rules.begin(); tr_iter != giter->topic_rules.end(); ++tr_iter) {
1426 if (
pattern_match(topic_name, tr_iter->topic_expression.c_str())) {
1435 if (tr_iter->metadata_protection_kind ==
"NONE") {
1441 if (tr_iter->metadata_protection_kind ==
"ENCRYPT" ||
1442 tr_iter->metadata_protection_kind ==
"ENCRYPT_WITH_ORIGIN_AUTHENTICATION") {
1446 if (tr_iter->metadata_protection_kind ==
"SIGN_WITH_ORIGIN_AUTHENTICATION" ||
1447 tr_iter->metadata_protection_kind ==
"ENCRYPT_WITH_ORIGIN_AUTHENTICATION") {
1454 if (tr_iter->data_protection_kind ==
"NONE") {
1458 else if (tr_iter->data_protection_kind ==
"SIGN") {
1462 else if (tr_iter->data_protection_kind ==
"ENCRYPT") {
1479 const char* topic_name,
1486 for (Permissions::Rules::const_iterator rit = grant.
rules.begin(); rit != grant.
rules.end(); ++rit) {
1487 if (rit->domains.has(domain_id)) {
1488 for (Permissions::Actions::const_iterator ait = rit->actions.begin(); ait != rit->actions.end(); ++ait) {
1489 if (ait->ps_type == pub_or_sub &&
1490 ait->topic_matches(topic_name) &&
1491 ait->partitions_match(partition.
name, rit->ad_type)) {
1510 const std::string& class_id,
1511 std::string & plugin_class_name,
1512 int & major_version,
1513 int & minor_version)
1515 const std::string delimiter =
":";
1520 size_t pos = class_id.find_last_of(delimiter);
1522 if ((pos > 0UL) && (pos != class_id.length() - 1)) {
1523 plugin_class_name = class_id.substr(0, (pos - 1));
1525 const std::string period =
".";
1527 size_t period_pos = class_id.find_last_of(period);
1529 if (period_pos > 0UL) {
1530 std::string mv_string = class_id.substr((pos + 1), (period_pos - 1));
1532 major_version =
atoi(mv_string.c_str());
1534 if (period_pos != class_id.length() - 1) {
1535 mv_string = class_id.substr((period_pos + 1), (class_id.length() - 1));
1536 minor_version =
atoi(mv_string.c_str());
1541 plugin_class_name.clear();
1549 : SporadicTask(time_source, interceptor)
1557 ACE_TEXT(
"AccessControlBuiltInImpl::RevokePermissionsTask::~RevokePermissionsTask %@ handle_to_expiration_ %B expiration_to_handle_ %B\n"),
1573 const time_t& expiration)
1581 const time_t current_date_time =
time(0);
1582 tm* current_time_tm =
gmtime(¤t_date_time);
1583 const time_t cur_utc_time =
mktime(current_time_tm);
1592 ACE_TEXT(
"AccessControlBuiltInImpl::RevokePermissionsTask::insert handle_to_expiration_ (total %B)\n"),
1596 ExpirationToHandle::const_iterator pos =
1601 ACE_TEXT(
"AccessControlBuiltInImpl::RevokePermissionsTask::insert expiration_to_handle_ (total %B)\n"),
1624 const time_t expiration = iter->second;
1626 std::pair<ExpirationToHandle::iterator, ExpirationToHandle::iterator> er =
1628 while (er.first != er.second) {
1629 if (er.first->second == pm_handle) {
1633 ACE_TEXT(
"AccessControlBuiltInImpl::RevokePermissionsTask::erase expiration_to_handle_ (total %B)\n"),
1644 ACE_TEXT(
"AccessControlBuiltInImpl::RevokePermissionsTask::execute handle_to_expiration_ (total %B)\n"),
1654 const time_t current_date_time =
time(0);
1655 tm* current_time_tm =
gmtime(¤t_date_time);
1656 const time_t cur_utc_time =
mktime(current_time_tm);
1659 pos != limit && pos->first < cur_utc_time;) {
1664 ACE_TEXT(
"pm_handle %d not found!\n"), pm_handle));
1669 ACE_TEXT(
"AccessControlBuiltInImpl::RevokePermissionsTask::execute local_ac_perms_ (total %B)\n"),
1676 ACE_TEXT(
"on_revoke_permissions failed for pm_handle %d!\n"), pm_handle));
1681 ACE_TEXT(
"(%P|%t) AccessControlBuiltInImpl::Revoke_Permissions_Timer::execute: Completed...\n")));
1687 ACE_TEXT(
"AccessControlBuiltInImpl::RevokePermissionsTask::execute handle_to_expiration_ (total %B)\n"),
1694 ACE_TEXT(
"AccessControlBuiltInImpl::RevokePermissionsTask::execute expiration_to_handle_ (total %B)\n"),
1710 ACPermsMap::const_iterator pos =
local_ac_perms_.find(permissions_handle);
1712 return pos->second.subject;
virtual bool get_permissions_credential_token(DDS::Security::PermissionsCredentialToken &permissions_credential_token, DDS::Security::PermissionsHandle handle, DDS::Security::SecurityException &ex)
virtual bool return_permissions_credential_token(const DDS::Security::PermissionsCredentialToken &permissions_credential_token, DDS::Security::SecurityException &ex)
RevokePermissionsTask_rch & make_task(RevokePermissionsTask_rch &task)
#define ACE_GUARD(MUTEX, OBJ, LOCK)
ACE_Thread_Mutex handle_mutex_
Permissions::shared_ptr perm
virtual ~AccessControlBuiltInImpl()
Implements some simple wrapper functions to provide a const API around the Token data structure as sp...
const InstanceHandle_t HANDLE_NIL
const ParticipantSecurityAttributesMask PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_ORIGIN_AUTHENTICATED
RevokePermissionsTask(const DCPS::TimeSource &time_source, DCPS::ReactorInterceptor_rch interceptor, AccessControlBuiltInImpl &impl)
bool validate_date_time(const Permissions::Validity_t &validity, DDS::Security::SecurityException &ex)
virtual bool 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)
static const std::string PermissionsTokenClassId("DDS:Access:Permissions:1.0")
time_t time(time_t *tloc=0)
virtual bool return_datareader_sec_attributes(const DDS::Security::EndpointSecurityAttributes &attributes, DDS::Security::SecurityException &ex)
virtual bool check_local_datawriter_register_instance(DDS::Security::PermissionsHandle permissions_handle, DDS::DataWriter_ptr writer, DDS::DynamicData_ptr key, DDS::Security::SecurityException &ex)
TopicSecurityAttributes base
virtual bool set_listener(DDS::Security::AccessControlListener_ptr listener, DDS::Security::SecurityException &ex)
virtual bool return_permissions_token(const DDS::Security::PermissionsToken &token, DDS::Security::SecurityException &ex)
virtual bool 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)
DDS::DomainId_t DomainId_t
virtual bool check_local_datawriter_dispose_instance(DDS::Security::PermissionsHandle permissions_handle, DDS::DataWriter_ptr writer, DDS::DynamicData_ptr key, DDS::Security::SecurityException &ex)
static const std::string AccessControl_Major_Version("1")
virtual bool check_remote_datawriter(DDS::Security::PermissionsHandle permissions_handle, DDS::Security::DomainId_t domain_id, const DDS::Security::PublicationBuiltinTopicDataSecure &publication_data, DDS::Security::SecurityException &ex)
void insert(DDS::Security::PermissionsHandle pm_handle, const time_t &expiration)
static const std::string PermissionsCredentialTokenClassId("DDS:Access:PermissionsCredential")
virtual bool 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 bool 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 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)
reference_wrapper< T > ref(T &r)
void erase(DDS::Security::PermissionsHandle pm_handle)
boolean is_discovery_protected
Governance::shared_ptr gov
static bool pattern_match(const char *string, const char *pattern)
void schedule(const TimeDuration &delay)
virtual bool check_remote_participant(DDS::Security::PermissionsHandle permissions_handle, DDS::Security::DomainId_t domain_id, const DDS::Security::ParticipantBuiltinTopicDataSecure &participant_data, DDS::Security::SecurityException &ex)
PluginEndpointSecurityAttributesMask plugin_endpoint_attributes
DDS::Security::IdentityHandle identity
ACPermsMap local_ac_perms_
Implements the DDS built-in version of the Access Control plugin for the DDS Security Specification...
int increment_handle(int &next)
const ParticipantSecurityAttributesMask PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_ENCRYPTED
const PluginEndpointSecurityAttributesMask PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ORIGIN_AUTHENTICATED
virtual bool get_topic_sec_attributes(DDS::Security::PermissionsHandle permissions_handle, const char *topic_name, DDS::Security::TopicSecurityAttributes &attributes, DDS::Security::SecurityException &ex)
const ParticipantSecurityAttributesMask PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_BUILTIN_IS_DISCOVERY_ENCRYPTED
ExpirationToHandle expiration_to_handle_
struct tm * gmtime(const time_t *clock)
virtual bool check_remote_datawriter_register_instance(DDS::Security::PermissionsHandle permissions_handle, DDS::DataReader_ptr reader, DDS::InstanceHandle_t publication_handle, DDS::DynamicData_ptr key, DDS::Security::SecurityException &ex)
AccessControlBuiltInImpl()
#define ACE_GUARD_RETURN(MUTEX, OBJ, LOCK, RETURN)
virtual bool check_remote_datawriter_dispose_instance(DDS::Security::PermissionsHandle permissions_handle, DDS::DataReader_ptr reader, DDS::InstanceHandle_t publication_handle, DDS::DynamicData_ptr key, DDS::Security::SecurityException &ex)
virtual bool return_permissions_handle(DDS::Security::PermissionsHandle handle, DDS::Security::SecurityException &ex)
RevokePermissionsTask_rch remote_rp_task_
AllowDeny_t default_permission
virtual bool 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 void execute(const DCPS::MonotonicTimePoint &now)
virtual bool 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)
DDS::Security::DomainId_t domain_id
boolean is_liveliness_protected
void add_property(const char *prop_name, const char *prop_value, bool propagate=true)
sequence< octet > OctetSeq
const char * get_property_value(const std::string &property_name) const
virtual bool return_participant_sec_attributes(const DDS::Security::ParticipantSecurityAttributes &attributes, DDS::Security::SecurityException &ex)
DataTags DataTagQosPolicy
int strcmp(const char *s, const char *t)
boolean is_submessage_protected
const DDS::OctetSeq & get_bin_property_value(const std::string &property_name) const
HANDLE_TYPE_NATIVE InstanceHandle_t
ACIdentityMap local_identity_map_
virtual bool get_participant_sec_attributes(DDS::Security::PermissionsHandle permissions_handle, DDS::Security::ParticipantSecurityAttributes &attributes, DDS::Security::SecurityException &ex)
DDS::Security::AccessControlListener_ptr listener_ptr_
virtual bool check_create_participant(DDS::Security::PermissionsHandle permissions_handle, DDS::Security::DomainId_t domain_id, const DDS::DomainParticipantQos &qos, DDS::Security::SecurityException &ex)
Governance::GovernanceAccessRules::iterator gov_iter
virtual ~RevokePermissionsTask()
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)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
static const std::string AccessControl_Plugin_Name("DDS:Access:Permissions")
static const std::string AccessControl_Minor_Version("0")
virtual bool return_datawriter_sec_attributes(const DDS::Security::EndpointSecurityAttributes &attributes, DDS::Security::SecurityException &ex)
void parse_class_id(const std::string &class_id, std::string &plugin_class_name, int &major_version, int &minor_version)
const ParticipantSecurityAttributesMask PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_ORIGIN_AUTHENTICATED
const DDS::OctetSeq & original() const
ACE_Thread_Mutex gen_handle_mutex_
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
Permissions::Actions::iterator perm_topic_actions_iter
virtual bool check_remote_topic(DDS::Security::PermissionsHandle permissions_handle, DDS::Security::DomainId_t domain_id, const DDS::TopicBuiltinTopicData &topic_data, DDS::Security::SecurityException &ex)
int subject_name_to_str(std::string &dst, unsigned long flags=XN_FLAG_ONELINE) const
virtual bool 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)
time_t mktime(struct tm *timeptr)
Permissions::Grants::iterator grant_iter
int parse(const char *, bool permissive=false)
boolean is_write_protected
bool 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)
HandleToExpiration handle_to_expiration_
Token PermissionsCredentialToken
LocalAccessCredentialData::shared_ptr local_access_credential_data
virtual bool get_permissions_token(DDS::Security::PermissionsToken &permissions_token, DDS::Security::PermissionsHandle handle, DDS::Security::SecurityException &ex)
boolean is_payload_protected
Permissions::Rules::iterator perm_topic_rules_iter
bool set_security_error(DDS::Security::SecurityException &ex, int code, int minor_code, const char *message)
AccessControlBuiltInImpl & impl_
#define TheServiceParticipant
The Internal API and Implementation of OpenDDS.
boolean is_read_protected
bool wild_match(const char *s, const char *pattern, bool case_sensitive=true, bool character_classes=false)
Token AuthenticatedPeerCredentialToken
Implements some simple wrapper functions to provide a non-const API around the Token data structure a...
OpenDDS_Dcps_Export SecurityDebug security_debug
RevokePermissionsTask_rch local_rp_task_
const PluginEndpointSecurityAttributesMask PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_PAYLOAD_ENCRYPTED
SSL::SubjectName get_subject_name(DDS::Security::PermissionsHandle permissions_handle) const
virtual bool check_remote_datareader(DDS::Security::PermissionsHandle permissions_handle, DDS::Security::DomainId_t domain_id, const DDS::Security::SubscriptionBuiltinTopicDataSecure &subscription_data, bool &relay_only, DDS::Security::SecurityException &ex)
const PluginEndpointSecurityAttributesMask PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ENCRYPTED
bool search_permissions(const char *topic_name, DDS::Security::DomainId_t domain_id, const DDS::PartitionQosPolicy &partition, Permissions::PublishSubscribe_t pub_or_sub, const Permissions::Grant &grant, DDS::Security::SecurityException &ex)