From b7a7b4cb5e2a5c52fc132e5e2053954829e1be3f Mon Sep 17 00:00:00 2001 From: Rob Crittenden Date: Mar 14 2012 08:40:51 +0000 Subject: Display serial number as HEX (DECIMAL) when showing certificates. https://fedorahosted.org/freeipa/ticket/1991 --- diff --git a/install/ui/certificate.js b/install/ui/certificate.js index 9645aad..b535622 100755 --- a/install/ui/certificate.js +++ b/install/ui/certificate.js @@ -319,6 +319,7 @@ IPA.cert.view_dialog = function(spec) { that.subject = IPA.cert.parse_dn(spec.subject); that.serial_number = spec.serial_number || ''; + that.serial_number_hex = spec.serial_number_hex || ''; that.issuer = IPA.cert.parse_dn(spec.issuer); that.issued_on = spec.issued_on || ''; that.expires_on = spec.expires_on || ''; @@ -368,6 +369,12 @@ IPA.cert.view_dialog = function(spec) { }).appendTo(tr); tr = $('').appendTo(table); + $(''+IPA.messages.objects.cert.serial_number_hex+':').appendTo(tr); + $('', { + text: that.serial_number_hex + }).appendTo(tr); + + tr = $('').appendTo(table); $('', { 'colspan': 2, 'html': '

'+IPA.messages.objects.cert.issued_by+'

' @@ -785,6 +792,7 @@ IPA.cert.status_widget = function(spec) { 'title': title, 'subject': result['subject'], 'serial_number': result['serial_number'], + 'serial_number_hex': result['serial_number_hex'], 'issuer': result['issuer'], 'issued_on': result['valid_not_before'], 'expires_on': result['valid_not_after'], diff --git a/ipalib/plugins/cert.py b/ipalib/plugins/cert.py index 130ebc7..7a38881 100644 --- a/ipalib/plugins/cert.py +++ b/ipalib/plugins/cert.py @@ -232,37 +232,32 @@ class cert_request(VirtualCommand): ) has_output_params = ( - Str('certificate?', + Str('certificate', label=_('Certificate'), - flags=['no_create', 'no_update', 'no_search'], ), - Str('subject?', + Str('subject', label=_('Subject'), - flags=['no_create', 'no_update', 'no_search'], ), - Str('issuer?', + Str('issuer', label=_('Issuer'), - flags=['no_create', 'no_update', 'no_search'], ), - Str('valid_not_before?', + Str('valid_not_before', label=_('Not Before'), - flags=['no_create', 'no_update', 'no_search'], ), - Str('valid_not_after?', + Str('valid_not_after', label=_('Not After'), - flags=['no_create', 'no_update', 'no_search'], ), - Str('md5_fingerprint?', + Str('md5_fingerprint', label=_('Fingerprint (MD5)'), - flags=['no_create', 'no_update', 'no_search'], ), - Str('sha1_fingerprint?', + Str('sha1_fingerprint', label=_('Fingerprint (SHA1)'), - flags=['no_create', 'no_update', 'no_search'], ), - Str('serial_number?', + Str('serial_number', label=_('Serial number'), - flags=['no_create', 'no_update', 'no_search'], + ), + Str('serial_number_hex', + label=_('Serial number (hex)'), ), ) @@ -456,9 +451,12 @@ class cert_show(VirtualCommand): Str('sha1_fingerprint', label=_('Fingerprint (SHA1)'), ), - Str('revocation_reason?', + Str('revocation_reason', label=_('Revocation reason'), ), + Str('serial_number_hex', + label=_('Serial number (hex)'), + ), ) takes_options = ( @@ -565,10 +563,10 @@ class cert_remove_hold(VirtualCommand): takes_args = _serial_number has_output_params = ( - Flag('unrevoked?', + Flag('unrevoked', label=_('Unrevoked'), ), - Str('error_string?', + Str('error_string', label=_('Error'), ), ) diff --git a/ipalib/plugins/host.py b/ipalib/plugins/host.py index 3814215..9db98e7 100644 --- a/ipalib/plugins/host.py +++ b/ipalib/plugins/host.py @@ -146,6 +146,9 @@ host_output_params = ( Str('serial_number', label=_('Serial Number'), ), + Str('serial_number_hex', + label=_('Serial Number (hex)'), + ), Str('issuer', label=_('Issuer'), ), diff --git a/ipalib/plugins/internal.py b/ipalib/plugins/internal.py index deff866..160b401 100644 --- a/ipalib/plugins/internal.py +++ b/ipalib/plugins/internal.py @@ -313,6 +313,7 @@ class i18n_messages(Command): "revoke_confirmation": _("To confirm your intention to revoke this certificate, select a reason from the pull-down list, and click the \"Revoke\" button."), "revoked": _("Certificate Revoked"), "serial_number": _("Serial Number"), + "serial_number_hex": _("Serial Number (hex)"), "sha1_fingerprint": _("SHA1 Fingerprint"), "superseded": _("Superseded"), "unspecified": _("Unspecified"), diff --git a/ipalib/plugins/service.py b/ipalib/plugins/service.py index 71e4ac4..e75d71f 100644 --- a/ipalib/plugins/service.py +++ b/ipalib/plugins/service.py @@ -96,6 +96,9 @@ output_params = ( Str('serial_number', label=_('Serial Number'), ), + Str('serial_number_hex', + label=_('Serial Number (hex)'), + ), Str('issuer', label=_('Issuer'), ), @@ -190,6 +193,7 @@ def set_certificate_attrs(entry_attrs): cert = x509.load_certificate(cert, datatype=x509.DER) entry_attrs['subject'] = unicode(cert.subject) entry_attrs['serial_number'] = unicode(cert.serial_number) + entry_attrs['serial_number_hex'] = u'0x%X' % cert.serial_number entry_attrs['issuer'] = unicode(cert.issuer) entry_attrs['valid_not_before'] = unicode(cert.valid_not_before_str) entry_attrs['valid_not_after'] = unicode(cert.valid_not_after_str) diff --git a/ipaserver/plugins/dogtag.py b/ipaserver/plugins/dogtag.py index b31058c..b56e04f 100644 --- a/ipaserver/plugins/dogtag.py +++ b/ipaserver/plugins/dogtag.py @@ -609,6 +609,7 @@ def parse_profile_submit_result_xml(doc): if len(serial_number) == 1: serial_number = int(serial_number[0].text, 16) # parse as hex response_request['serial_number'] = serial_number + response['serial_number_hex'] = u'0x%X' % serial_number certificate = request.xpath('b64[1]') if len(certificate) == 1: @@ -834,6 +835,7 @@ def parse_display_cert_xml(doc): if len(serial_number) == 1: serial_number = int(serial_number[0].text, 16) # parse as hex response['serial_number'] = serial_number + response['serial_number_hex'] = u'0x%X' % serial_number pkcs7_chain = doc.xpath('//xml/header/pkcs7ChainBase64[1]') if len(pkcs7_chain) == 1: @@ -1026,6 +1028,7 @@ def parse_revoke_cert_xml(doc): if len(serial_number) == 1: serial_number = int(serial_number[0].text, 16) # parse as hex response_record['serial_number'] = serial_number + response['serial_number_hex'] = u'0x%X' % serial_number error_string = record.xpath('error[1]') if len(error_string) == 1: @@ -1187,6 +1190,7 @@ def parse_unrevoke_cert_xml(doc): if len(serial_number) == 1: serial_number = int(serial_number[0].text, 16) # parse as hex response['serial_number'] = serial_number + response['serial_number_hex'] = u'0x%X' % serial_number return response @@ -1471,6 +1475,7 @@ class ra(rabase.rabase): if parse_result.has_key('serial_number'): # see module documentation concerning serial numbers and XMLRPC cmd_result['serial_number'] = unicode(parse_result['serial_number']) + cmd_result['serial_number_hex'] = u'0x%X' % int(cmd_result['serial_number']) if parse_result.has_key('revocation_reason'): cmd_result['revocation_reason'] = parse_result['revocation_reason'] @@ -1539,6 +1544,7 @@ class ra(rabase.rabase): if request.has_key('serial_number'): # see module documentation concerning serial numbers and XMLRPC cmd_result['serial_number'] = unicode(request['serial_number']) + cmd_result['serial_number_hex'] = u'0x%X' % request['serial_number'] if request.has_key('certificate'): cmd_result['certificate'] = request['certificate'] diff --git a/ipaserver/plugins/selfsign.py b/ipaserver/plugins/selfsign.py index 2f13b1f..bbf8fa7 100644 --- a/ipaserver/plugins/selfsign.py +++ b/ipaserver/plugins/selfsign.py @@ -221,6 +221,7 @@ class ra(rabase.rabase): cmd_result = {} cmd_result['serial_number'] = unicode(serial) # convert long to decimal unicode string + cmd_result['serial_number_hex'] = u'0x%X' % serial cmd_result['certificate'] = unicode(cert) cmd_result['subject'] = unicode(subject) diff --git a/tests/test_xmlrpc/test_host_plugin.py b/tests/test_xmlrpc/test_host_plugin.py index 4f24b6e..7068d9a 100644 --- a/tests/test_xmlrpc/test_host_plugin.py +++ b/tests/test_xmlrpc/test_host_plugin.py @@ -26,6 +26,7 @@ from ipalib import api, errors, x509 from ipalib.dn import * from tests.test_xmlrpc.xmlrpc_test import Declarative, fuzzy_uuid, fuzzy_digits from tests.test_xmlrpc.xmlrpc_test import fuzzy_hash, fuzzy_date, fuzzy_issuer +from tests.test_xmlrpc.xmlrpc_test import fuzzy_hex from tests.test_xmlrpc import objectclasses import base64 @@ -253,6 +254,7 @@ class test_host(Declarative): subject=lambda x: DN(x) == \ DN(('CN',api.env.host),('O',api.env.realm)), serial_number=fuzzy_digits, + serial_number_hex=fuzzy_hex, md5_fingerprint=fuzzy_hash, sha1_fingerprint=fuzzy_hash, issuer=fuzzy_issuer, @@ -284,6 +286,7 @@ class test_host(Declarative): subject=lambda x: DN(x) == \ DN(('CN',api.env.host),('O',api.env.realm)), serial_number=fuzzy_digits, + serial_number_hex=fuzzy_hex, md5_fingerprint=fuzzy_hash, sha1_fingerprint=fuzzy_hash, issuer=fuzzy_issuer, @@ -482,6 +485,7 @@ class test_host(Declarative): subject=lambda x: DN(x) == \ DN(('CN',api.env.host),('O',api.env.realm)), serial_number=fuzzy_digits, + serial_number_hex=fuzzy_hex, md5_fingerprint=fuzzy_hash, sha1_fingerprint=fuzzy_hash, macaddress=[u'00:50:56:30:F6:5F'], @@ -511,6 +515,7 @@ class test_host(Declarative): subject=lambda x: DN(x) == \ DN(('CN',api.env.host),('O',api.env.realm)), serial_number=fuzzy_digits, + serial_number_hex=fuzzy_hex, md5_fingerprint=fuzzy_hash, sha1_fingerprint=fuzzy_hash, macaddress=[u'00:50:56:30:F6:5F', u'00:50:56:2C:8D:82'], diff --git a/tests/test_xmlrpc/test_service_plugin.py b/tests/test_xmlrpc/test_service_plugin.py index e97fb7c..7eccd20 100644 --- a/tests/test_xmlrpc/test_service_plugin.py +++ b/tests/test_xmlrpc/test_service_plugin.py @@ -24,6 +24,7 @@ Test the `ipalib/plugins/service.py` module. from ipalib import api, errors, x509 from tests.test_xmlrpc.xmlrpc_test import Declarative, fuzzy_uuid, fuzzy_hash from tests.test_xmlrpc.xmlrpc_test import fuzzy_digits, fuzzy_date, fuzzy_issuer +from tests.test_xmlrpc.xmlrpc_test import fuzzy_hex from tests.test_xmlrpc import objectclasses import base64 from ipalib.dn import * @@ -380,6 +381,7 @@ class test_service(Declarative): subject=lambda x: DN(x) == \ DN(('CN',api.env.host),('O',api.env.realm)), serial_number=fuzzy_digits, + serial_number_hex=fuzzy_hex, md5_fingerprint=fuzzy_hash, sha1_fingerprint=fuzzy_hash, issuer=fuzzy_issuer, @@ -407,6 +409,7 @@ class test_service(Declarative): subject=lambda x: DN(x) == \ DN(('CN',api.env.host),('O',api.env.realm)), serial_number=fuzzy_digits, + serial_number_hex=fuzzy_hex, md5_fingerprint=fuzzy_hash, sha1_fingerprint=fuzzy_hash, issuer=fuzzy_issuer, diff --git a/tests/test_xmlrpc/xmlrpc_test.py b/tests/test_xmlrpc/xmlrpc_test.py index fd30cc6..716ce03 100644 --- a/tests/test_xmlrpc/xmlrpc_test.py +++ b/tests/test_xmlrpc/xmlrpc_test.py @@ -53,6 +53,8 @@ fuzzy_date = Fuzzy('^[a-zA-Z]{3} [a-zA-Z]{3} \d{2} \d{2}:\d{2}:\d{2} \d{4} UTC$' fuzzy_issuer = Fuzzy(type=basestring, test=lambda issuer: valid_issuer(issuer, api.env.realm)) +fuzzy_hex = Fuzzy('^0x[0-9a-fA-F]+$', type=basestring) + # Matches password - password consists of all printable characters without whitespaces # The only exception is space, but space cannot be at the beggingin or end of the pwd fuzzy_password = Fuzzy('^\S([\S ]*\S)*$')