OpenDDS  Snapshot(2023/04/07-19:43)
Classes | Public Types | Public Member Functions | Public Attributes | List of all members
OpenDDS::Security::Permissions Struct Reference

#include <Permissions.h>

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

Classes

struct  Action
 
struct  Grant
 
struct  Rule
 
struct  Validity_t
 

Public Types

enum  AllowDeny_t { ALLOW, DENY }
 
enum  PublishSubscribe_t { PUBLISH, SUBSCRIBE }
 
typedef DCPS::RcHandle< Permissionsshared_ptr
 
typedef std::vector< ActionActions
 
typedef std::vector< RuleRules
 
typedef DCPS::RcHandle< GrantGrant_rch
 
typedef std::vector< Grant_rchGrants
 

Public Member Functions

int load (const SSL::SignedDocument &doc)
 
bool has_grant (const SSL::SubjectName &name) const
 
Grant_rch find_grant (const SSL::SubjectName &name) const
 
- Public Member Functions inherited from OpenDDS::DCPS::RcObject
virtual ~RcObject ()
 
virtual void _add_ref ()
 
virtual void _remove_ref ()
 
long ref_count () const
 
WeakObject_get_weak_object () const
 

Public Attributes

Grants grants_
 
DDS::Security::PermissionsToken perm_token_
 
DDS::Security::PermissionsCredentialToken perm_cred_token_
 

Additional Inherited Members

- Protected Member Functions inherited from OpenDDS::DCPS::RcObject
 RcObject ()
 

Detailed Description

Definition at line 29 of file Permissions.h.

Member Typedef Documentation

◆ Actions

Definition at line 56 of file Permissions.h.

◆ Grant_rch

Definition at line 74 of file Permissions.h.

◆ Grants

Definition at line 76 of file Permissions.h.

◆ Rules

Definition at line 64 of file Permissions.h.

◆ shared_ptr

Definition at line 30 of file Permissions.h.

Member Enumeration Documentation

◆ AllowDeny_t

Enumerator
ALLOW 
DENY 

Definition at line 32 of file Permissions.h.

◆ PublishSubscribe_t

Enumerator
PUBLISH 
SUBSCRIBE 

Definition at line 37 of file Permissions.h.

Member Function Documentation

◆ find_grant()

Permissions::Grant_rch OpenDDS::Security::Permissions::find_grant ( const SSL::SubjectName name) const

Definition at line 208 of file Permissions.cpp.

References grants_.

Referenced by load().

209 {
210  for (Grants::const_iterator it = grants_.begin(); it != grants_.end(); ++it) {
211  if (name == (*it)->subject) {
212  return *it;
213  }
214  }
215  return Grant_rch();
216 }
const char *const name
Definition: debug.cpp:60
DCPS::RcHandle< Grant > Grant_rch
Definition: Permissions.h:74

◆ has_grant()

bool OpenDDS::Security::Permissions::has_grant ( const SSL::SubjectName name) const

Definition at line 198 of file Permissions.cpp.

References grants_.

199 {
200  for (Grants::const_iterator it = grants_.begin(); it != grants_.end(); ++it) {
201  if (name == (*it)->subject) {
202  return true;
203  }
204  }
205  return false;
206 }
const char *const name
Definition: debug.cpp:60

◆ load()

int OpenDDS::Security::Permissions::load ( const SSL::SignedDocument doc)

Definition at line 19 of file Permissions.cpp.

References OpenDDS::DCPS::SecurityDebug::access_error, OpenDDS::DCPS::SecurityDebug::access_warn, ACE_DEBUG, ACE_ERROR, ACE_TEXT(), OpenDDS::Security::Permissions::Rule::actions, OpenDDS::Security::Permissions::Rule::ad_type, ALLOW, OpenDDS::Security::SSL::SignedDocument::content(), DENY, OpenDDS::Security::Permissions::Rule::domains, OpenDDS::Security::SSL::SignedDocument::filename(), find_grant(), OpenDDS::Security::XmlUtils::get_parser(), grants_, LM_ERROR, LM_WARNING, OpenDDS::Security::XmlUtils::parse_domain_id_set(), OpenDDS::Security::XmlUtils::parse_time(), OpenDDS::Security::Permissions::Action::partitions, OpenDDS::Security::Permissions::Action::ps_type, PUBLISH, OpenDDS::DCPS::security_debug, SUBSCRIBE, OpenDDS::DCPS::to_string(), and OpenDDS::Security::Permissions::Action::topics.

20 {
21  using XML::XStr;
22  using namespace XmlUtils;
23 
24  const std::string& xml = doc.content();
25  ParserPtr parser;
26  if (!get_parser(parser, doc.filename(), xml)) {
28  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: {access_error} Permissions::load: "
29  "get_parser failed\n"));
30  }
31  return -1;
32  }
33 
34  // Find the validity rules
35  const xercesc::DOMNodeList* const grantRules =
36  parser->getDocument()->getElementsByTagName(XStr(ACE_TEXT("grant")));
37 
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);
41 
42  // Pull out the grant name for this grant
43  xercesc::DOMNamedNodeMap* rattrs = grantRule->getAttributes();
44  grant->name = to_string(rattrs->item(0));
45 
46  // Pull out subject name, validity, and default
47  const xercesc::DOMNodeList* grantNodes = grantRule->getChildNodes();
48 
49  bool valid_subject = false, valid_default = false;
50  for (XMLSize_t gn = 0, gn_len = grantNodes->getLength(); gn < gn_len; ++gn) {
51 
52  const xercesc::DOMNode* grantNode = grantNodes->item(gn);
53 
54  const XStr g_tag = grantNode->getNodeName();
55 
56  if (g_tag == ACE_TEXT("subject_name")) {
57  valid_subject = grant->subject.parse(to_string(grantNode)) == 0;
58 
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)) {
67  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: {access_error} Permissions::load: "
68  "invalid datetime in not_before\n"));
69  }
70  return -1;
71  }
72  } else if (v_tag == ACE_TEXT("not_after")) {
73  if (!parse_time(validityNode->getTextContent(), grant->validity.not_after)) {
75  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: {access_error} Permissions::load: "
76  "invalid datetime in not_after\n"));
77  }
78  return -1;
79  }
80  }
81  }
82 
83  } else if (g_tag == ACE_TEXT("default")) {
84  const std::string def = to_string(grantNode);
85  valid_default = true;
86  if (def == "ALLOW") {
87  grant->default_permission = ALLOW;
88  } else if (def == "DENY") {
89  grant->default_permission = DENY;
90  } else {
92  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: {access_error} Permissions::load: "
93  "<default> must be ALLOW or DENY\n"));
94  }
95  return -1;
96  }
97  }
98  }
99 
100  if (!valid_default) {
102  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: {access_error} Permissions::load: "
103  "<default> is required\n"));
104  }
105  return -1;
106  }
107 
108  // Pull out allow/deny rules
109  const xercesc::DOMNodeList* adGrantNodes = grantRule->getChildNodes();
110 
111  for (XMLSize_t gn = 0, gn_len = adGrantNodes->getLength(); gn < gn_len; ++gn) {
112 
113  const xercesc::DOMNode* adGrantNode = adGrantNodes->item(gn);
114 
115  const XStr g_tag = adGrantNode->getNodeName();
116 
117  if (g_tag == ACE_TEXT("allow_rule") || g_tag == ACE_TEXT("deny_rule")) {
118  Rule rule;
119 
120  rule.ad_type = (g_tag == ACE_TEXT("allow_rule")) ? ALLOW : DENY;
121 
122  const xercesc::DOMNodeList* adNodeChildren = adGrantNode->getChildNodes();
123 
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")) {
128  if (!parse_domain_id_set(adNodeChild, rule.domains)) {
130  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: {access_error} Permissions::load: "
131  "failed to parse domain set\n"));
132  }
133  return -1;
134  }
135 
136  } else if (anc_tag == ACE_TEXT("publish") || anc_tag == ACE_TEXT("subscribe")) {
137  Action action;
138 
139  action.ps_type = (anc_tag == ACE_TEXT("publish")) ? PUBLISH : SUBSCRIBE;
140  const xercesc::DOMNodeList* topicListNodes = adNodeChild->getChildNodes();
141 
142  for (XMLSize_t tln = 0, tln_len = topicListNodes->getLength(); tln < tln_len; ++tln) {
143 
144  const xercesc::DOMNode* topicListNode = topicListNodes->item(tln);
145 
146  if (ACE_TEXT("topics") == XStr(topicListNode->getNodeName())) {
147  const xercesc::DOMNodeList* topicNodes = topicListNode->getChildNodes();
148 
149  for (XMLSize_t tn = 0, tn_len = topicNodes->getLength(); tn < tn_len; ++tn) {
150 
151  const xercesc::DOMNode* topicNode = topicNodes->item(tn);
152 
153  if (ACE_TEXT("topic") == XStr(topicNode->getNodeName())) {
154  action.topics.push_back(to_string(topicNode));
155  }
156  }
157 
158  } else if (ACE_TEXT("partitions") == XStr(topicListNode->getNodeName())) {
159  const xercesc::DOMNodeList* partitionNodes = topicListNode->getChildNodes();
160 
161  for (XMLSize_t pn = 0, pn_len = partitionNodes->getLength(); pn < pn_len; ++pn) {
162 
163  const xercesc::DOMNode* partitionNode = partitionNodes->item(pn);
164 
165  if (ACE_TEXT("partition") == XStr(partitionNode->getNodeName())) {
166  action.partitions.push_back(to_string(partitionNode));
167  }
168  }
169  }
170  }
171 
172  rule.actions.push_back(action);
173  }
174  }
175 
176  grant->rules.push_back(rule);
177  }
178  }
179 
180  if (!valid_subject) {
182  ACE_DEBUG((LM_WARNING, ACE_TEXT("(%P|%t) WARNING: {access_warn} Permissions::load: ")
183  ACE_TEXT("Unable to parse subject name, ignoring grant.\n")));
184  }
185  } else if (find_grant(grant->subject)) {
187  ACE_DEBUG((LM_WARNING, ACE_TEXT("(%P|%t) WARNING: {access_warn} Permissions::load: ")
188  ACE_TEXT("Ignoring grant with duplicate subject name.\n")));
189  }
190  } else {
191  grants_.push_back(grant);
192  }
193  } // grant_rules
194 
195  return 0;
196 }
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
bool parse_time(const XMLCh *in, time_t &value)
Definition: XmlUtils.cpp:245
DCPS::unique_ptr< xercesc::XercesDOMParser > ParserPtr
Definition: XmlUtils.h:32
const char * to_string(MessageId value)
ACE_TEXT("TCP_Factory")
DCPS::RcHandle< Grant > Grant_rch
Definition: Permissions.h:74
bool parse_domain_id_set(const xercesc::DOMNode *node, Security::DomainIdSet &domain_id_set)
Definition: XmlUtils.cpp:445
OpenDDS_Dcps_Export SecurityDebug security_debug
Definition: debug.cpp:32
bool get_parser(ParserPtr &parser, const std::string &filename, const std::string &xml)
Definition: XmlUtils.cpp:71
bool access_error
Permissions and Governance.
Definition: debug.h:132
Grant_rch find_grant(const SSL::SubjectName &name) const

Member Data Documentation

◆ grants_

Grants OpenDDS::Security::Permissions::grants_

Definition at line 83 of file Permissions.h.

Referenced by find_grant(), has_grant(), and load().

◆ perm_cred_token_

DDS::Security::PermissionsCredentialToken OpenDDS::Security::Permissions::perm_cred_token_

Definition at line 85 of file Permissions.h.

◆ perm_token_

DDS::Security::PermissionsToken OpenDDS::Security::Permissions::perm_token_

Definition at line 84 of file Permissions.h.


The documentation for this struct was generated from the following files: