Skip to content

Commit c71b438

Browse files
committed
Adding ability to disable subject fields for VaaS
The following fields can now be disabled when creating a Policy Specification on VaaS: * organization * organizational units * localities * states * countries To do so, an array with an empty string must be passedd to the attribute, e.g.: { "subject": { "orgs": [ "" ], "orgUnits": [ "" ], "localities": [ "sample_locality" ] } }
1 parent 0620870 commit c71b438

3 files changed

Lines changed: 144 additions & 35 deletions

File tree

tests/resources/policy_specification.json

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
"policy": {
33
"domains": [
44
"venafi.com",
5-
"kwan.com"
5+
"vfidev.com",
6+
"vfidev.net",
7+
"venafi.example"
68
],
79
"wildcardAllowed": true,
810
"maxValidDays": 120,
@@ -25,23 +27,35 @@
2527
},
2628
"keyPair": {
2729
"keyTypes": [
28-
"RSA"
30+
"RSA",
31+
"EC"
2932
],
3033
"rsaKeySizes": [
31-
2048
34+
2048,
35+
4096
3236
],
3337
"ellipticCurves": [
38+
"P521",
3439
"P384"
3540
],
36-
"serviceGenerated": false,
41+
"serviceGenerated": true,
3742
"reuseAllowed": false
3843
},
3944
"subjectAltNames": {
40-
"dnsAllowed": false,
41-
"ipAllowed": false,
42-
"emailAllowed": false,
43-
"uriAllowed": false,
44-
"upnAllowed": false
45+
"dnsAllowed": true,
46+
"ipAllowed": true,
47+
"emailAllowed": true,
48+
"uriAllowed": true,
49+
"upnAllowed": false,
50+
"ipConstraints": [
51+
"v4",
52+
"v6"
53+
],
54+
"uriProtocols": [
55+
"https",
56+
"ldaps",
57+
"spiffe"
58+
]
4559
}
4660
},
4761
"defaults": {

tests/test_pm.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,12 +153,12 @@ def _create_policy_tpp(self, policy_spec=None, policy=None, defaults=None):
153153
create_policy(self.tpp_conn, zone, policy_spec, policy, defaults)
154154

155155

156-
class TestCloudPolicyManagement(unittest.TestCase):
156+
class TestVaaSPolicyManagement(unittest.TestCase):
157157
def __init__(self, *args, **kwargs):
158158
self.cloud_conn = CloudConnection(token=CLOUD_APIKEY, url=CLOUD_URL)
159159
self.json_file = POLICY_SPEC_JSON
160160
self.yaml_file = POLICY_SPEC_YAML
161-
super(TestCloudPolicyManagement, self).__init__(*args, **kwargs)
161+
super(TestVaaSPolicyManagement, self).__init__(*args, **kwargs)
162162

163163
def test_create_policy_from_json(self):
164164
# ps = json_parser.parse_file(self.json_file)
@@ -329,6 +329,23 @@ def test_create_policy_with_team(self):
329329
self.assertEqual(1, len(result.users))
330330
self.assertEqual(CLOUD_TEAM, result.users[0])
331331

332+
def test_create_policy_disabled_subject_fields(self):
333+
zone = get_vaas_zone()
334+
policy = get_policy_obj()
335+
policy.subject.orgs = [""]
336+
policy.subject.org_units = [""]
337+
policy.subject.localities = [""]
338+
policy.subject.states = [""]
339+
policy.subject.countries = [""]
340+
ps_response = create_policy(connector=self.cloud_conn, zone=zone,policy=policy)
341+
self.assertIsNotNone(ps_response.policy)
342+
self.assertIsNotNone(ps_response.policy.subject)
343+
self.assertListEqual(ps_response.policy.subject.orgs, [""])
344+
self.assertListEqual(ps_response.policy.subject.org_units, [""])
345+
self.assertListEqual(ps_response.policy.subject.localities, [""])
346+
self.assertListEqual(ps_response.policy.subject.states, [""])
347+
self.assertListEqual(ps_response.policy.subject.countries, [""])
348+
332349
def _create_policy_cloud(self, policy_spec=None, policy=None, defaults=None):
333350
zone = get_vaas_zone()
334351
response = create_policy(self.cloud_conn, zone, policy_spec, policy, defaults)

vcert/policy/pm_cloud.py

Lines changed: 102 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -88,25 +88,31 @@ def build_policy_spec(cit, ca_info, subject_cn_to_str=True):
8888
ca = f"{ca_info.ca_type}\\{ca_info.ca_account_key}\\{ca_info.vendor_name}"
8989
p.certificate_authority = ca
9090

91-
s = Subject()
92-
create_subject = False
93-
if len(cit.SubjectORegexes) > 0:
94-
create_subject = True
95-
s.orgs = cit.SubjectORegexes
96-
if len(cit.SubjectOURegexes) > 0:
97-
create_subject = True
98-
s.org_units = cit.SubjectOURegexes
99-
if len(cit.SubjectLRegexes) > 0:
100-
create_subject = True
101-
s.localities = cit.SubjectLRegexes
102-
if len(cit.SubjectSTRegexes) > 0:
103-
create_subject = True
104-
s.states = cit.SubjectSTRegexes
105-
if len(cit.SubjectCRegexes) > 0:
106-
create_subject = True
107-
s.countries = cit.SubjectCRegexes
108-
109-
p.subject = s if create_subject else None
91+
# s = Subject()
92+
# create_subject = False
93+
# if cit.SubjectORegexes is None:
94+
# s.orgs = [""]
95+
# elif len(cit.SubjectORegexes) > 0:
96+
# create_subject = True
97+
# s.orgs = cit.SubjectORegexes
98+
#
99+
# if len(cit.SubjectOURegexes) > 0:
100+
# create_subject = True
101+
# s.org_units = cit.SubjectOURegexes
102+
#
103+
# if len(cit.SubjectLRegexes) > 0:
104+
# create_subject = True
105+
# s.localities = cit.SubjectLRegexes
106+
#
107+
# if len(cit.SubjectSTRegexes) > 0:
108+
# create_subject = True
109+
# s.states = cit.SubjectSTRegexes
110+
#
111+
# if len(cit.SubjectCRegexes) > 0:
112+
# create_subject = True
113+
# s.countries = cit.SubjectCRegexes
114+
115+
p.subject = build_policy_spec_subject(cit)
110116

111117
kp = KeyPair()
112118
create_kp = False
@@ -204,6 +210,63 @@ def build_policy_spec(cit, ca_info, subject_cn_to_str=True):
204210
return ps
205211

206212

213+
def build_policy_spec_subject(cit):
214+
"""
215+
216+
:param Cit cit:
217+
:return:
218+
"""
219+
s = Subject()
220+
return_subject = False
221+
222+
orgs_values = None
223+
if cit.SubjectORegexes is None:
224+
orgs_values = [""]
225+
elif len(cit.SubjectORegexes) > 0:
226+
orgs_values = cit.SubjectORegexes
227+
if orgs_values:
228+
s.orgs = orgs_values
229+
return_subject = True
230+
231+
org_units_values = None
232+
if cit.SubjectOURegexes is None:
233+
org_units_values = [""]
234+
elif len(cit.SubjectOURegexes) > 0:
235+
org_units_values = cit.SubjectOURegexes
236+
if org_units_values:
237+
s.org_units = org_units_values
238+
return_subject = True
239+
240+
localities_values = None
241+
if cit.SubjectLRegexes is None:
242+
localities_values = [""]
243+
elif len(cit.SubjectLRegexes) > 0:
244+
localities_values = cit.SubjectLRegexes
245+
if localities_values:
246+
s.localities = localities_values
247+
return_subject = True
248+
249+
states_values = None
250+
if cit.SubjectSTRegexes is None:
251+
states_values = [""]
252+
elif len(cit.SubjectSTRegexes) > 0:
253+
states_values = cit.SubjectSTRegexes
254+
if states_values:
255+
s.states = states_values
256+
return_subject = True
257+
258+
countries_values = None
259+
if cit.SubjectCRegexes is None:
260+
countries_values = [""]
261+
elif len(cit.SubjectCRegexes) > 0:
262+
countries_values = cit.SubjectCRegexes
263+
if countries_values:
264+
s.countries = countries_values
265+
return_subject = True
266+
267+
return s if return_subject else None
268+
269+
207270
def validate_policy_spec(policy_spec):
208271
"""
209272
:param PolicySpecification policy_spec:
@@ -505,27 +568,42 @@ def build_cit_request(ps, ca_details):
505568
request['sanIpAddressRegexes'] = [re_ipv4, re_ipv6]
506569

507570
if ps.policy and ps.policy.subject and len(ps.policy.subject.orgs) > 0:
508-
request['subjectORegexes'] = ps.policy.subject.orgs
571+
if len(ps.policy.subject.orgs) == 1 and ps.policy.subject.orgs[0] == "":
572+
request['subjectORegexes'] = None
573+
else:
574+
request['subjectORegexes'] = ps.policy.subject.orgs
509575
else:
510576
request['subjectORegexes'] = [re_allow_all]
511577

512578
if ps.policy and ps.policy.subject and len(ps.policy.subject.org_units) > 0:
513-
request['subjectOURegexes'] = ps.policy.subject.org_units
579+
if len(ps.policy.subject.org_units) == 1 and ps.policy.subject.org_units[0] == "":
580+
request['subjectOURegexes'] = None
581+
else:
582+
request['subjectOURegexes'] = ps.policy.subject.org_units
514583
else:
515584
request['subjectOURegexes'] = [re_allow_all]
516585

517586
if ps.policy and ps.policy.subject and len(ps.policy.subject.localities) > 0:
518-
request['subjectLRegexes'] = ps.policy.subject.localities
587+
if len(ps.policy.subject.localities) == 1 and ps.policy.subject.localities[0] == "":
588+
request['subjectLRegexes'] = None
589+
else:
590+
request['subjectLRegexes'] = ps.policy.subject.localities
519591
else:
520592
request['subjectLRegexes'] = [re_allow_all]
521593

522594
if ps.policy and ps.policy.subject and len(ps.policy.subject.states) > 0:
523-
request['subjectSTRegexes'] = ps.policy.subject.states
595+
if len(ps.policy.subject.states) and ps.policy.subject.states[0] == "":
596+
request['subjectSTRegexes'] = None
597+
else:
598+
request['subjectSTRegexes'] = ps.policy.subject.states
524599
else:
525600
request['subjectSTRegexes'] = [re_allow_all]
526601

527602
if ps.policy and ps.policy.subject and len(ps.policy.subject.countries) > 0:
528-
request['subjectCValues'] = ps.policy.subject.countries
603+
if len(ps.policy.subject.countries) == 1 and ps.policy.subject.countries[0] == "":
604+
request['subjectCValues'] = None
605+
else:
606+
request['subjectCValues'] = ps.policy.subject.countries
529607
else:
530608
request['subjectCValues'] = [re_allow_all]
531609

0 commit comments

Comments
 (0)