22 using namespace XmlUtils;
24 const std::string& xml = doc.
content();
29 "get_parser failed\n"));
35 const xercesc::DOMNodeList*
const grantRules =
36 parser->getDocument()->getElementsByTagName(XStr(
ACE_TEXT(
"grant")));
38 for (XMLSize_t r = 0, r_len = grantRules->getLength(); r < r_len; ++r) {
39 Grant_rch grant = DCPS::make_rch<Grant>();
40 const xercesc::DOMNode*
const grantRule = grantRules->item(r);
43 xercesc::DOMNamedNodeMap* rattrs = grantRule->getAttributes();
47 const xercesc::DOMNodeList* grantNodes = grantRule->getChildNodes();
49 bool valid_subject =
false, valid_default =
false;
50 for (XMLSize_t gn = 0, gn_len = grantNodes->getLength(); gn < gn_len; ++gn) {
52 const xercesc::DOMNode* grantNode = grantNodes->item(gn);
54 const XStr g_tag = grantNode->getNodeName();
56 if (g_tag ==
ACE_TEXT(
"subject_name")) {
57 valid_subject = grant->subject.parse(
to_string(grantNode)) == 0;
59 }
else if (g_tag ==
ACE_TEXT(
"validity")) {
60 const xercesc::DOMNodeList* validityNodes = grantNode->getChildNodes();
61 for (XMLSize_t vn = 0, vn_len = validityNodes->getLength(); vn < vn_len; ++vn) {
62 const xercesc::DOMNode* validityNode = validityNodes->item(vn);
63 const XStr v_tag = validityNode->getNodeName();
64 if (v_tag ==
ACE_TEXT(
"not_before")) {
65 if (!
parse_time(validityNode->getTextContent(), grant->validity.not_before)) {
68 "invalid datetime in not_before\n"));
72 }
else if (v_tag ==
ACE_TEXT(
"not_after")) {
73 if (!
parse_time(validityNode->getTextContent(), grant->validity.not_after)) {
76 "invalid datetime in not_after\n"));
83 }
else if (g_tag ==
ACE_TEXT(
"default")) {
84 const std::string def =
to_string(grantNode);
87 grant->default_permission =
ALLOW;
88 }
else if (def ==
"DENY") {
89 grant->default_permission =
DENY;
93 "<default> must be ALLOW or DENY\n"));
100 if (!valid_default) {
103 "<default> is required\n"));
109 const xercesc::DOMNodeList* adGrantNodes = grantRule->getChildNodes();
111 for (XMLSize_t gn = 0, gn_len = adGrantNodes->getLength(); gn < gn_len; ++gn) {
113 const xercesc::DOMNode* adGrantNode = adGrantNodes->item(gn);
115 const XStr g_tag = adGrantNode->getNodeName();
122 const xercesc::DOMNodeList* adNodeChildren = adGrantNode->getChildNodes();
124 for (XMLSize_t anc = 0, anc_len = adNodeChildren->getLength(); anc < anc_len; ++anc) {
125 const xercesc::DOMNode*
const adNodeChild = adNodeChildren->item(anc);
126 const XStr anc_tag = adNodeChild->getNodeName();
127 if (anc_tag ==
ACE_TEXT(
"domains")) {
131 "failed to parse domain set\n"));
136 }
else if (anc_tag ==
ACE_TEXT(
"publish") || anc_tag ==
ACE_TEXT(
"subscribe")) {
140 const xercesc::DOMNodeList* topicListNodes = adNodeChild->getChildNodes();
142 for (XMLSize_t tln = 0, tln_len = topicListNodes->getLength(); tln < tln_len; ++tln) {
144 const xercesc::DOMNode* topicListNode = topicListNodes->item(tln);
146 if (
ACE_TEXT(
"topics") == XStr(topicListNode->getNodeName())) {
147 const xercesc::DOMNodeList* topicNodes = topicListNode->getChildNodes();
149 for (XMLSize_t tn = 0, tn_len = topicNodes->getLength(); tn < tn_len; ++tn) {
151 const xercesc::DOMNode* topicNode = topicNodes->item(tn);
153 if (
ACE_TEXT(
"topic") == XStr(topicNode->getNodeName())) {
158 }
else if (
ACE_TEXT(
"partitions") == XStr(topicListNode->getNodeName())) {
159 const xercesc::DOMNodeList* partitionNodes = topicListNode->getChildNodes();
161 for (XMLSize_t pn = 0, pn_len = partitionNodes->getLength(); pn < pn_len; ++pn) {
163 const xercesc::DOMNode* partitionNode = partitionNodes->item(pn);
165 if (
ACE_TEXT(
"partition") == XStr(partitionNode->getNodeName())) {
172 rule.
actions.push_back(action);
176 grant->rules.push_back(rule);
180 if (!valid_subject) {
183 ACE_TEXT(
"Unable to parse subject name, ignoring grant.\n")));
188 ACE_TEXT(
"Ignoring grant with duplicate subject name.\n")));
200 for (Grants::const_iterator it =
grants_.begin(); it !=
grants_.end(); ++it) {
201 if (name == (*it)->subject) {
210 for (Grants::const_iterator it =
grants_.begin(); it !=
grants_.end(); ++it) {
211 if (name == (*it)->subject) {
219 typedef std::vector<std::string>::const_iterator vsiter_t;
224 for (vsiter_t it = topics.begin(); it != topics.end(); ++it) {
234 const unsigned int n_entity_names = entity_partitions.length();
235 if (partitions.empty()) {
236 if (allow_or_deny ==
DENY) {
249 return n_entity_names == 0 || (n_entity_names == 1 && entity_partitions[0].in()[0] == 0);
252 for (
unsigned int i = 0; i < n_entity_names; ++i) {
254 for (vsiter_t perm_it = partitions.begin(); !found && perm_it != partitions.end(); ++perm_it) {
259 if (allow_or_deny ==
ALLOW && !found) {
267 if (allow_or_deny ==
DENY && found) {
276 return allow_or_deny ==
ALLOW;
bool parse_domain_id_set(const xercesc::DOMNode *node, Security::DomainIdSet &domain_id_set)
Grant_rch find_grant(const SSL::SubjectName &name) const
std::vector< std::string > topics
bool partitions_match(const DDS::StringSeq &entity_partitions, AllowDeny_t allow_or_deny) const
int load(const SSL::SignedDocument &doc)
bool topic_matches(const char *topic) const
PublishSubscribe_t ps_type
const std::string & filename() const
bool has_grant(const SSL::SubjectName &name) const
static bool pattern_match(const char *string, const char *pattern)
bool access_error
Permissions and Governance.
const std::string & content() const
std::vector< std::string > partitions
DCPS::RcHandle< Grant > Grant_rch
bool get_parser(ParserPtr &parser, const std::string &filename, const std::string &xml)
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
bool parse_time(const XMLCh *in, time_t &value)
const char * to_string(MessageId value)
The Internal API and Implementation of OpenDDS.
OpenDDS_Dcps_Export SecurityDebug security_debug
sequence< string > StringSeq