diff --git a/lemur/certificates/schemas.py b/lemur/certificates/schemas.py index 3c19ea21..f112fdec 100644 --- a/lemur/certificates/schemas.py +++ b/lemur/certificates/schemas.py @@ -6,7 +6,7 @@ .. moduleauthor:: Kevin Glisson """ from flask import current_app -from marshmallow import fields, validate, validates_schema, post_load, pre_load, post_dump +from marshmallow import fields, validate, validates_schema, post_load, pre_load from marshmallow.exceptions import ValidationError from lemur.schemas import AssociatedAuthoritySchema, AssociatedDestinationSchema, AssociatedCertificateSchema, \ @@ -23,7 +23,7 @@ from lemur.common.schema import LemurInputSchema, LemurOutputSchema from lemur.common import validators, missing from lemur.notifications import service as notification_service -from lemur.common.fields import ArrowDateTime +from lemur.common.fields import ArrowDateTime, Hex class CertificateSchema(LemurInputSchema): @@ -181,6 +181,7 @@ class CertificateOutputSchema(LemurOutputSchema): owner = fields.Email() san = fields.Boolean() serial = fields.String() + serial_hex = Hex(attribute='serial') signing_algorithm = fields.String() status = fields.Boolean() @@ -198,12 +199,6 @@ class CertificateOutputSchema(LemurOutputSchema): endpoints = fields.Nested(EndpointNestedOutputSchema, many=True, missing=[]) replaced_by = fields.Nested(CertificateNestedOutputSchema, many=True, attribute='replaced') - @post_dump - def convert_serial_to_hex(self, data): - if data: - data['serial'] = hex(int(data['serial']))[2:].upper() - return data - class CertificateUploadInputSchema(CertificateCreationSchema): name = fields.String() diff --git a/lemur/common/fields.py b/lemur/common/fields.py index 90fc538b..9bd6bde3 100644 --- a/lemur/common/fields.py +++ b/lemur/common/fields.py @@ -19,6 +19,16 @@ from marshmallow.fields import Field from marshmallow.exceptions import ValidationError +class Hex(Field): + """ + A hex formatted string. + """ + def _serialize(self, value, attr, obj): + if value: + value = hex(int(value))[2:].upper() + return value + + class ArrowDateTime(Field): """A formatted datetime string in UTC. diff --git a/lemur/static/app/angular/certificates/view/view.tpl.html b/lemur/static/app/angular/certificates/view/view.tpl.html index 4dd4996d..f37a3d91 100644 --- a/lemur/static/app/angular/certificates/view/view.tpl.html +++ b/lemur/static/app/angular/certificates/view/view.tpl.html @@ -108,6 +108,10 @@ Serial {{ certificate.serial }} +
  • + Serial (Hex) + {{ certificate.serialHex }} +
  • diff --git a/lemur/tests/test_certificates.py b/lemur/tests/test_certificates.py index 5842299e..cbb9b844 100644 --- a/lemur/tests/test_certificates.py +++ b/lemur/tests/test_certificates.py @@ -366,7 +366,8 @@ def test_certificate_get(client, token, status): def test_certificate_get_body(client): response_body = client.get(api.url_for(Certificates, certificate_id=1), headers=VALID_USER_HEADER_TOKEN).json - assert response_body['serial'] == "3E9" + assert response_body['serial'] == '1001' + assert response_body['serialHex'] == '3E9' @pytest.mark.parametrize("token,status", [