29
29
using namespace OpenDDS ::RTPS;
30
30
using namespace OpenDDS ::DCPS;
31
31
32
+ // security setup helpers:
33
+
34
+ const char DDSSEC_PROP_IDENTITY_CA[] = " dds.sec.auth.identity_ca" ;
35
+ const char DDSSEC_PROP_IDENTITY_CERT[] = " dds.sec.auth.identity_certificate" ;
36
+ const char DDSSEC_PROP_IDENTITY_PRIVKEY[] = " dds.sec.auth.private_key" ;
37
+ const char DDSSEC_PROP_PERM_CA[] = " dds.sec.access.permissions_ca" ;
38
+ const char DDSSEC_PROP_PERM_GOV_DOC[] = " dds.sec.access.governance" ;
39
+ const char DDSSEC_PROP_PERM_DOC[] = " dds.sec.access.permissions" ;
40
+
41
+ const char auth_ca_file[] = " file:security/TESTONLY_identity_ca_cert.pem" ;
42
+ const char perm_ca_file[] = " file:security/TESTONLY_permissions_ca_cert.pem" ;
43
+ const char id_cert_file[] =
44
+ " file:security/TESTONLY_oci_opendds_dds_identity_cert.pem" ;
45
+ const char id_key_file[] =
46
+ " file:security/TESTONLY_oci_opendds_dds_identity_private_key.pem" ;
47
+
48
+ void append (DDS::PropertySeq& props, const char * name, const char * value)
49
+ {
50
+ const DDS::Property_t prop = {name, value, false /* propagate*/ };
51
+ const unsigned int len = props.length ();
52
+ props.length (len + 1 );
53
+ props[len] = prop;
54
+ }
55
+
32
56
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) {
33
57
int retval = -1 ;
34
58
@@ -51,7 +75,7 @@ int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) {
51
75
DDS::DomainId_t domain = 0 ;
52
76
bool multicast = true ;
53
77
unsigned int resend = 1 ;
54
- std::string partition;
78
+ std::string partition, governance, permissions ;
55
79
int defaultSize = 0 ;
56
80
57
81
int curr = 1 ;
@@ -66,69 +90,88 @@ int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) {
66
90
if (ACE_OS::strcmp (ACE_TEXT (" -u" ), argv[curr]) == 0 ) {
67
91
multicast = false ;
68
92
std::cout << " SEDP unicast only" << std::endl;
69
- }
70
- else if (( ACE_OS::strcmp ( ACE_TEXT ( " -r " ), argv[curr]) == 0 ) && (curr + 1 < argc)) {
93
+ } else if (( ACE_OS::strcmp ( ACE_TEXT ( " -r " ), argv[curr]) == 0 ) &&
94
+ (curr + 1 < argc)) {
71
95
resend = ACE_OS::atoi (argv[++curr]);
72
96
std::cout << " Resend: " << resend << " sec" << std::endl;
73
- }
74
- else if (( ACE_OS::strcmp ( ACE_TEXT ( " -pb " ), argv[curr]) == 0 ) && (curr + 1 < argc)) {
97
+ } else if (( ACE_OS::strcmp ( ACE_TEXT ( " -pb " ), argv[curr]) == 0 ) &&
98
+ (curr + 1 < argc)) {
75
99
const u_short temp = ACE_OS::atoi (argv[++curr]);
76
100
std::cout << " pb: " << temp << std::endl;
77
101
disc->pb (temp);
78
- }
79
- else if (( ACE_OS::strcmp ( ACE_TEXT ( " -dg " ), argv[curr]) == 0 ) && (curr + 1 < argc)) {
102
+ } else if (( ACE_OS::strcmp ( ACE_TEXT ( " -dg " ), argv[curr]) == 0 ) &&
103
+ (curr + 1 < argc)) {
80
104
const u_short temp = ACE_OS::atoi (argv[++curr]);
81
105
std::cout << " dg: " << temp << std::endl;
82
106
disc->dg (temp);
83
- }
84
- else if (( ACE_OS::strcmp ( ACE_TEXT ( " -pg " ), argv[curr]) == 0 ) && (curr + 1 < argc)) {
107
+ } else if (( ACE_OS::strcmp ( ACE_TEXT ( " -pg " ), argv[curr]) == 0 ) &&
108
+ (curr + 1 < argc)) {
85
109
const u_short temp = ACE_OS::atoi (argv[++curr]);
86
110
std::cout << " pg: " << temp << std::endl;
87
111
disc->pg (temp);
88
- }
89
- else if (( ACE_OS::strcmp ( ACE_TEXT ( " -d0 " ), argv[curr]) == 0 ) && (curr + 1 < argc)) {
112
+ } else if (( ACE_OS::strcmp ( ACE_TEXT ( " -d0 " ), argv[curr]) == 0 ) &&
113
+ (curr + 1 < argc)) {
90
114
const u_short temp = ACE_OS::atoi (argv[++curr]);
91
115
std::cout << " d0: " << temp << std::endl;
92
116
disc->d0 (temp);
93
- }
94
- else if (( ACE_OS::strcmp ( ACE_TEXT ( " -d1 " ), argv[curr]) == 0 ) && (curr + 1 < argc)) {
117
+ } else if (( ACE_OS::strcmp ( ACE_TEXT ( " -d1 " ), argv[curr]) == 0 ) &&
118
+ (curr + 1 < argc)) {
95
119
const u_short temp = ACE_OS::atoi (argv[++curr]);
96
120
std::cout << " d1: " << temp << std::endl;
97
121
disc->d1 (temp);
98
- }
99
- else if (( ACE_OS::strcmp ( ACE_TEXT ( " -dx " ), argv[curr]) == 0 ) && (curr + 1 < argc)) {
122
+ } else if (( ACE_OS::strcmp ( ACE_TEXT ( " -dx " ), argv[curr]) == 0 ) &&
123
+ (curr + 1 < argc)) {
100
124
const u_short temp = ACE_OS::atoi (argv[++curr]);
101
125
std::cout << " dx: " << temp << std::endl;
102
126
disc->dx (temp);
103
- }
104
- else if ((ACE_OS::strcmp (ACE_TEXT (" -partition" ), argv[curr]) == 0 ) &&
105
- (curr + 1 < argc)) {
127
+ } else if ((ACE_OS::strcmp (ACE_TEXT (" -partition" ), argv[curr]) == 0 ) &&
128
+ (curr + 1 < argc)) {
106
129
partition = ACE_TEXT_ALWAYS_CHAR (argv[++curr]);
107
130
std::cout << " Partition[0]: " << partition << std::endl;
108
- }
109
- else if ((ACE_OS::strcmp (ACE_TEXT (" -defaultSize" ), argv[curr]) == 0 ) &&
110
- (curr + 1 < argc)) {
131
+ } else if ((ACE_OS::strcmp (ACE_TEXT (" -defaultSize" ), argv[curr]) == 0 ) &&
132
+ (curr + 1 < argc)) {
111
133
defaultSize = ACE_OS::atoi (argv[++curr]);
112
- }
113
- else {
114
- std::cout << " Ignoring unknown param: " << ACE_TEXT_ALWAYS_CHAR (argv[curr]) << std::endl;
134
+ } else if ((ACE_OS::strcmp (ACE_TEXT (" -governance" ), argv[curr]) == 0 ) &&
135
+ (curr + 1 < argc)) {
136
+ governance = argv[++curr];
137
+ } else if ((ACE_OS::strcmp (ACE_TEXT (" -permissions" ), argv[curr]) == 0 ) &&
138
+ (curr + 1 < argc)) {
139
+ permissions = argv[++curr];
140
+ } else {
141
+ std::cout << " Ignoring unknown param: " <<
142
+ ACE_TEXT_ALWAYS_CHAR (argv[curr]) << std::endl;
115
143
}
116
144
}
117
145
118
146
disc->resend_period (ACE_Time_Value (resend));
119
147
disc->sedp_multicast (multicast);
120
148
TheServiceParticipant->add_discovery (static_rchandle_cast<Discovery>(disc));
121
149
TheServiceParticipant->set_repo_domain (domain, disc->key ());
150
+ DDS::DomainParticipantQos dp_qos;
151
+ dpf->get_default_participant_qos (dp_qos);
152
+
153
+ if (!governance.empty () && !permissions.empty ()) {
154
+ TheServiceParticipant->set_security (true );
155
+ DDS::PropertySeq& props = dp_qos.property .value ;
156
+ append (props, DDSSEC_PROP_IDENTITY_CA, auth_ca_file);
157
+ append (props, DDSSEC_PROP_IDENTITY_CERT, id_cert_file);
158
+ append (props, DDSSEC_PROP_IDENTITY_PRIVKEY, id_key_file);
159
+ append (props, DDSSEC_PROP_PERM_CA, perm_ca_file);
160
+ append (props, DDSSEC_PROP_PERM_GOV_DOC, (" file:" + governance).c_str ());
161
+ append (props, DDSSEC_PROP_PERM_DOC, (" file:" + permissions).c_str ());
162
+ }
122
163
123
164
// Create DomainParticipant
124
165
DDS::DomainParticipant_var participant =
125
166
dpf->create_participant (domain,
126
- PARTICIPANT_QOS_DEFAULT ,
167
+ dp_qos ,
127
168
0 ,
128
169
DEFAULT_STATUS_MASK);
129
170
130
171
if (!participant) {
131
172
std::cerr << " Could not connect to domain " << std::endl;
173
+ TheServiceParticipant->shutdown ();
174
+ return EXIT_FAILURE;
132
175
}
133
176
134
177
srand (clock ());
@@ -137,6 +180,9 @@ int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) {
137
180
Q_INIT_RESOURCE (ishape);
138
181
// create and show your widgets here
139
182
ShapesDialog shapes (participant, partition, defaultSize);
183
+ if (TheServiceParticipant->get_security ()) {
184
+ shapes.setWindowTitle (" OpenDDS Security BETA" );
185
+ }
140
186
shapes.show ();
141
187
retval = app.exec ();
142
188
0 commit comments