Skip to content

Commit

Permalink
feat(Vc-V2): verify expirationDate/validUntil is set after issuanceDa…
Browse files Browse the repository at this point in the history
…te/validFrom
  • Loading branch information
lemoustachiste committed Jan 30, 2024
1 parent cb41e73 commit eaf47c8
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 17 deletions.
52 changes: 36 additions & 16 deletions cert_issuer/models/verifiable_credential.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ def validate_valid_until_date (certificate_valid_until_date):
validate_date_RFC3339_string_format(certificate_valid_until_date, 'validUntil')
pass

def validate_date_set_after_other_date(second_date, first_date, second_date_key, first_date_key):
if not second_date > first_date:
raise ValueError('`{}` property must be a date set after `{}`'.format(second_date_key, first_date_key))
pass

def validate_credential_status (certificate_credential_status):
if not isinstance(certificate_credential_status, list):
certificate_credential_status = [certificate_credential_status]
Expand Down Expand Up @@ -151,14 +156,21 @@ def verify_credential(certificate_metadata):
except ValueError as err:
raise ValueError(err)

try:
# if undefined will throw KeyError
validate_expiration_date(certificate_metadata['expirationDate'])
except KeyError:
# optional property
pass
except ValueError as err:
raise ValueError(err)
if 'expirationDate' in certificate_metadata:
try:
# if undefined will throw KeyError
validate_expiration_date(certificate_metadata['expirationDate'])
validate_date_set_after_other_date(
certificate_metadata['expirationDate'],
certificate_metadata['issuanceDate'],
'expirationDate',
'issuanceDate'
)
except KeyError:
# optional property
pass
except ValueError as err:
raise ValueError(err)

if is_V2_verifiable_credential(certificate_metadata['@context']):
try:
Expand All @@ -170,14 +182,22 @@ def verify_credential(certificate_metadata):
except ValueError as err:
raise ValueError(err)

try:
# if undefined will throw KeyError
validate_valid_until_date(certificate_metadata['validUntil'])
except KeyError:
# optional property
pass
except ValueError as err:
raise ValueError(err)
if 'validUntil' in certificate_metadata:
try:
# if undefined will throw KeyError
validate_valid_until_date(certificate_metadata['validUntil'])
if 'validFrom' in certificate_metadata:
validate_date_set_after_other_date(
certificate_metadata['validUntil'],
certificate_metadata['validFrom'],
'validUntil',
'validFrom'
)
except KeyError:
# optional property
pass
except ValueError as err:
raise ValueError(err)

try:
# if undefined will throw KeyError
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"BlockcertsCredential"
],
"issuer": "https://raw.githubusercontent.com/AnthonyRonning/https-github.com-labnol-files/master/issuer-eth.json",
"issuanceDate": "2010-01-01T19:33:24Z",
"issuanceDate": "2024-01-01T19:33:24Z",
"credentialSubject": {
"id": "did:key:z6Mkq3L1jEDDZ5R7eT523FMLxC4k6MCpzqD7ff1CrkWpoJwM",
"alumniOf": {
Expand Down Expand Up @@ -140,6 +140,25 @@ def test_verify_expiration_date (self):

assert False

def test_verify_expiration_date_before_issuance_date_invalid (self):
candidate = copy.deepcopy(credential_example)
candidate['expirationDate'] = '2023-01-01T19:33:24Z'
handler = CertificateBatchHandler(
secret_manager=mock.Mock(),
certificate_handler=MockCertificateV3Handler(candidate),
merkle_tree=mock.Mock(),
config=mock.Mock()
)
handler.certificates_to_issue = {'metadata': mock.Mock()}

try:
handler.prepare_batch()
except Exception as e:
self.assertEqual(str(e), '`expirationDate` property must be a date set after `issuanceDate`')
return

assert False

def test_verify_credential_status (self):
candidate = copy.deepcopy(credential_example)
candidate['credentialStatus'] = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,25 @@ def test_verify_valid_until (self):

assert False

def test_verify_valid_until_before_validFrom_invalid (self):
candidate = copy.deepcopy(credential_example)
candidate['validUntil'] = '2024-01-01T19:33:24Z'
handler = CertificateBatchHandler(
secret_manager=mock.Mock(),
certificate_handler=MockCertificateV3Handler(candidate),
merkle_tree=mock.Mock(),
config=mock.Mock()
)
handler.certificates_to_issue = {'metadata': mock.Mock()}

try:
handler.prepare_batch()
except Exception as e:
self.assertEqual(str(e), '`validUntil` property must be a date set after `validFrom`')
return

assert False

class MockCertificateV3Handler(CertificateV3Handler):
def __init__(self, test_certificate):
self.test_certificate = test_certificate
Expand Down

0 comments on commit eaf47c8

Please sign in to comment.