|
|
403b09 |
From c5fe2ba58e011425d56d5edc7823d575e3366b7d Mon Sep 17 00:00:00 2001
|
|
|
403b09 |
From: Jan Cholasta <jcholast@redhat.com>
|
|
|
403b09 |
Date: Tue, 23 Aug 2016 13:59:33 +0200
|
|
|
403b09 |
Subject: [PATCH] cert: include CA name in cert command output
|
|
|
403b09 |
|
|
|
403b09 |
Include name of the CA that issued a certificate in cert-request, cert-show
|
|
|
403b09 |
and cert-find.
|
|
|
403b09 |
|
|
|
403b09 |
This allows the caller to call further commands on the cert without having
|
|
|
403b09 |
to call ca-find to find the name of the CA.
|
|
|
403b09 |
|
|
|
403b09 |
https://fedorahosted.org/freeipa/ticket/6151
|
|
|
403b09 |
|
|
|
403b09 |
Reviewed-By: Martin Basti <mbasti@redhat.com>
|
|
|
403b09 |
---
|
|
|
403b09 |
ipaserver/plugins/cert.py | 33 ++++++++++++++++++++++++---------
|
|
|
403b09 |
1 file changed, 24 insertions(+), 9 deletions(-)
|
|
|
403b09 |
|
|
|
403b09 |
diff --git a/ipaserver/plugins/cert.py b/ipaserver/plugins/cert.py
|
|
|
403b09 |
index a1166a0d0e5b09586832550c055fc6714c3efe26..67eaeba33610321bf88143dc4ac06a94887427cd 100644
|
|
|
403b09 |
--- a/ipaserver/plugins/cert.py
|
|
|
403b09 |
+++ b/ipaserver/plugins/cert.py
|
|
|
403b09 |
@@ -262,6 +262,15 @@ def bind_principal_can_manage_cert(cert):
|
|
|
403b09 |
|
|
|
403b09 |
class BaseCertObject(Object):
|
|
|
403b09 |
takes_params = (
|
|
|
403b09 |
+ Str(
|
|
|
403b09 |
+ 'cacn?',
|
|
|
403b09 |
+ cli_name='ca',
|
|
|
403b09 |
+ default=IPA_CA_CN,
|
|
|
403b09 |
+ autofill=True,
|
|
|
403b09 |
+ label=_('Issuing CA'),
|
|
|
403b09 |
+ doc=_('Name of issuing CA'),
|
|
|
403b09 |
+ flags={'no_create', 'no_update', 'no_search'},
|
|
|
403b09 |
+ ),
|
|
|
403b09 |
Bytes(
|
|
|
403b09 |
'certificate', validate_certificate,
|
|
|
403b09 |
label=_("Certificate"),
|
|
|
403b09 |
@@ -336,14 +345,7 @@ class BaseCertObject(Object):
|
|
|
403b09 |
|
|
|
403b09 |
class BaseCertMethod(Method):
|
|
|
403b09 |
def get_options(self):
|
|
|
403b09 |
- yield Str('cacn?',
|
|
|
403b09 |
- cli_name='ca',
|
|
|
403b09 |
- default=IPA_CA_CN,
|
|
|
403b09 |
- autofill=True,
|
|
|
403b09 |
- query=True,
|
|
|
403b09 |
- label=_('Issuing CA'),
|
|
|
403b09 |
- doc=_('Name of issuing CA'),
|
|
|
403b09 |
- )
|
|
|
403b09 |
+ yield self.obj.params['cacn'].clone(query=True)
|
|
|
403b09 |
|
|
|
403b09 |
for option in super(BaseCertMethod, self).get_options():
|
|
|
403b09 |
yield option
|
|
|
403b09 |
@@ -432,7 +434,8 @@ class cert_request(Create, BaseCertMethod, VirtualCommand):
|
|
|
403b09 |
# referencing nonexistant CA) and look up authority ID.
|
|
|
403b09 |
#
|
|
|
403b09 |
ca = kw['cacn']
|
|
|
403b09 |
- ca_id = api.Command.ca_show(ca)['result']['ipacaid'][0]
|
|
|
403b09 |
+ ca_obj = api.Command.ca_show(ca)['result']
|
|
|
403b09 |
+ ca_id = ca_obj['ipacaid'][0]
|
|
|
403b09 |
|
|
|
403b09 |
"""
|
|
|
403b09 |
Access control is partially handled by the ACI titled
|
|
|
403b09 |
@@ -623,6 +626,7 @@ class cert_request(Create, BaseCertMethod, VirtualCommand):
|
|
|
403b09 |
if not raw:
|
|
|
403b09 |
self.obj._parse(result)
|
|
|
403b09 |
result['request_id'] = int(result['request_id'])
|
|
|
403b09 |
+ result['cacn'] = ca_obj['cn'][0]
|
|
|
403b09 |
|
|
|
403b09 |
# Success? Then add it to the principal's entry
|
|
|
403b09 |
# (unless the profile tells us not to)
|
|
|
403b09 |
@@ -802,6 +806,7 @@ class cert_show(Retrieve, CertMethod, VirtualCommand):
|
|
|
403b09 |
self.obj._parse(result)
|
|
|
403b09 |
result['revoked'] = ('revocation_reason' in result)
|
|
|
403b09 |
self.obj._fill_owners(result)
|
|
|
403b09 |
+ result['cacn'] = ca_obj['cn'][0]
|
|
|
403b09 |
|
|
|
403b09 |
return dict(result=result, value=pkey_to_value(serial_number, options))
|
|
|
403b09 |
|
|
|
403b09 |
@@ -1072,11 +1077,19 @@ class cert_find(Search, CertMethod):
|
|
|
403b09 |
raise
|
|
|
403b09 |
return result, False, complete
|
|
|
403b09 |
|
|
|
403b09 |
+ ca_objs = self.api.Command.ca_find()['result']
|
|
|
403b09 |
+ ca_objs = {DN(ca['ipacasubjectdn'][0]): ca for ca in ca_objs}
|
|
|
403b09 |
+
|
|
|
403b09 |
ra = self.api.Backend.ra
|
|
|
403b09 |
for ra_obj in ra.find(ra_options):
|
|
|
403b09 |
issuer = DN(ra_obj['issuer'])
|
|
|
403b09 |
serial_number = ra_obj['serial_number']
|
|
|
403b09 |
|
|
|
403b09 |
+ try:
|
|
|
403b09 |
+ ca_obj = ca_objs[issuer]
|
|
|
403b09 |
+ except KeyError:
|
|
|
403b09 |
+ continue
|
|
|
403b09 |
+
|
|
|
403b09 |
if pkey_only:
|
|
|
403b09 |
obj = {'serial_number': serial_number}
|
|
|
403b09 |
else:
|
|
|
403b09 |
@@ -1093,6 +1106,8 @@ class cert_find(Search, CertMethod):
|
|
|
403b09 |
ra_obj['certificate'].replace('\r\n', ''))
|
|
|
403b09 |
self.obj._parse(obj)
|
|
|
403b09 |
|
|
|
403b09 |
+ obj['cacn'] = ca_obj['cn'][0]
|
|
|
403b09 |
+
|
|
|
403b09 |
result[issuer, serial_number] = obj
|
|
|
403b09 |
|
|
|
403b09 |
return result, False, complete
|
|
|
403b09 |
--
|
|
|
403b09 |
2.7.4
|
|
|
403b09 |
|