Skip to content

Commit 4c8b2d5

Browse files
committed
SDK-662: Add try blocks to anchor parsing, tidy up tests
1 parent 99b630b commit 4c8b2d5

File tree

4 files changed

+80
-41
lines changed

4 files changed

+80
-41
lines changed

yoti_python_sdk/anchor.py

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import datetime
2+
import logging
23

34
import OpenSSL
45
import asn1
@@ -43,25 +44,36 @@ def parse_anchors(anchors):
4344
for anc in anchors:
4445
if hasattr(anc, 'origin_server_certs'):
4546
anchor_type = "Unknown"
46-
origin_server_certs_list = list(anc.origin_server_certs)
47-
origin_server_certs_item = origin_server_certs_list[0]
47+
try:
48+
origin_server_certs_list = list(anc.origin_server_certs)
49+
origin_server_certs_item = origin_server_certs_list[0]
4850

49-
crypto_cert = crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1,
50-
origin_server_certs_item).to_cryptography()
51+
crypto_cert = crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1,
52+
origin_server_certs_item).to_cryptography()
53+
54+
except Exception as exc:
55+
logging.warning(
56+
'Error loading anchor certificate, exception: {0} - {1}'.format(type(exc).__name__, exc))
57+
continue
5158

5259
for i in range(len(crypto_cert.extensions)):
53-
extensions = crypto_cert.extensions[i]
54-
if hasattr(extensions, 'oid'):
55-
oid = extensions.oid
56-
if hasattr(oid, 'dotted_string'):
57-
if oid.dotted_string == SOURCE_EXTENSION:
58-
anchor_type = config.ANCHOR_SOURCE
59-
elif oid.dotted_string == VERIFIER_EXTENSION:
60-
anchor_type = config.ANCHOR_VERIFIER
61-
62-
if anchor_type != "Unknown":
63-
parsed_anchors = Anchor.get_values_from_extensions(anc, anchor_type, extensions,
64-
crypto_cert, parsed_anchors)
60+
try:
61+
extensions = crypto_cert.extensions[i]
62+
if hasattr(extensions, 'oid'):
63+
oid = extensions.oid
64+
if hasattr(oid, 'dotted_string'):
65+
if oid.dotted_string == SOURCE_EXTENSION:
66+
anchor_type = config.ANCHOR_SOURCE
67+
elif oid.dotted_string == VERIFIER_EXTENSION:
68+
anchor_type = config.ANCHOR_VERIFIER
69+
70+
if anchor_type != "Unknown":
71+
parsed_anchors = Anchor.get_values_from_extensions(anc, anchor_type, extensions,
72+
crypto_cert, parsed_anchors)
73+
except Exception as exc:
74+
logging.warning('Error parsing anchor certificate extension, exception: {0} - {1}'.format(
75+
type(exc).__name__, exc))
76+
continue
6577

6678
return parsed_anchors
6779

yoti_python_sdk/tests/anchor_parser.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,27 @@
1111
ANCHOR_YOTI_ADMIN = join(FIXTURES_DIR, 'anchor_yoti_admin.txt')
1212

1313

14-
def parse_anchor_from_base64_text(file_path):
14+
def get_anchor_from_base64_text(file_path):
1515
base64_driving_license_anchor = read_file(file_path)
1616
driving_license_anchor_bytes = binascii.a2b_base64(base64_driving_license_anchor)
1717

1818
protobuf_anchor = protobuf.Protobuf().anchor(driving_license_anchor_bytes)
1919
anchors = list()
2020
anchors.append(protobuf_anchor)
2121

22-
return anchor.Anchor().parse_anchors(anchors)[0]
22+
return anchors
2323

2424

25-
def get_driving_license_anchor():
26-
return parse_anchor_from_base64_text(ANCHOR_DRIVING_LICENSE)
25+
def get_parsed_driving_license_anchor():
26+
return anchor.Anchor().parse_anchors(get_anchor_from_base64_text(ANCHOR_DRIVING_LICENSE))[0]
2727

2828

29-
def get_passport_anchor():
30-
return parse_anchor_from_base64_text(ANCHOR_PASSPORT)
29+
def get_parsed_passport_anchor():
30+
return anchor.Anchor().parse_anchors(get_anchor_from_base64_text(ANCHOR_PASSPORT))[0]
3131

3232

33-
def get_yoti_admin_anchor():
34-
return parse_anchor_from_base64_text(ANCHOR_YOTI_ADMIN)
33+
def get_parsed_yoti_admin_anchor():
34+
return anchor.Anchor().parse_anchors(get_anchor_from_base64_text(ANCHOR_YOTI_ADMIN))[0]
3535

3636

3737
def read_file(file_path):
Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
# -*- coding: utf-8 -*-
2+
import logging
3+
import time
4+
from datetime import datetime
5+
6+
from yoti_python_sdk.protobuf.attribute_public_api import Attribute_pb2
7+
28
import yoti_python_sdk
39
from yoti_python_sdk import config
10+
from yoti_python_sdk.anchor import Anchor
411
from yoti_python_sdk.tests import anchor_parser
5-
from datetime import datetime
6-
import time
712

813

9-
def utc_offset():
14+
def get_utc_offset():
1015
utc_offset = int(time.timezone / 60 / 60)
1116

1217
if time.daylight:
@@ -16,40 +21,62 @@ def utc_offset():
1621

1722

1823
def test_parse_anchors_driving_license():
19-
parsed_anchor = anchor_parser.get_driving_license_anchor()
24+
parsed_anchor = anchor_parser.get_parsed_driving_license_anchor()
2025

2126
assert parsed_anchor.anchor_type == config.ANCHOR_SOURCE
2227
assert parsed_anchor.sub_type == ""
2328
assert parsed_anchor.value == "DRIVING_LICENCE"
2429
assert parsed_anchor.origin_server_certs.serial_number == int("46131813624213904216516051554755262812")
25-
assert parsed_anchor.signed_timestamp == datetime(2018, 4, 11, 12 - utc_offset(), 13, 3, 923537)
30+
assert parsed_anchor.signed_timestamp == datetime(2018, 4, 11, 12 - get_utc_offset(), 13, 3, 923537)
2631

2732

2833
def test_parse_anchors_passport():
29-
parsed_anchor = anchor_parser.get_passport_anchor()
34+
parsed_anchor = anchor_parser.get_parsed_passport_anchor()
3035

3136
assert parsed_anchor.anchor_type == config.ANCHOR_SOURCE
3237
assert parsed_anchor.sub_type == "OCR"
3338
assert parsed_anchor.value == "PASSPORT"
3439
assert parsed_anchor.origin_server_certs.serial_number == int("277870515583559162487099305254898397834")
35-
assert parsed_anchor.signed_timestamp == datetime(2018, 4, 12, 13 - utc_offset(), 14, 32, 835537)
40+
assert parsed_anchor.signed_timestamp == datetime(2018, 4, 12, 13 - get_utc_offset(), 14, 32, 835537)
3641

3742

3843
def test_parse_yoti_admin():
39-
parsed_anchor = anchor_parser.get_yoti_admin_anchor()
44+
parsed_anchor = anchor_parser.get_parsed_yoti_admin_anchor()
4045

4146
assert parsed_anchor.anchor_type == config.ANCHOR_VERIFIER
4247
assert parsed_anchor.sub_type == ""
4348
assert parsed_anchor.value == "YOTI_ADMIN"
4449
assert parsed_anchor.origin_server_certs.serial_number == int("256616937783084706710155170893983549581")
45-
assert parsed_anchor.signed_timestamp == datetime(2018, 4, 11, 12 - utc_offset(), 13, 4, 95238)
50+
assert parsed_anchor.signed_timestamp == datetime(2018, 4, 11, 12 - get_utc_offset(), 13, 4, 95238)
4651

4752

4853
def test_anchor_returns_correct_default_values():
49-
anchor = yoti_python_sdk.anchor.Anchor()
54+
default_anchor = yoti_python_sdk.anchor.Anchor()
55+
56+
assert default_anchor.anchor_type == "Unknown"
57+
assert default_anchor.signed_timestamp is None
58+
assert default_anchor.sub_type == ""
59+
assert default_anchor.value == ""
60+
assert default_anchor.origin_server_certs is None
61+
5062

51-
assert anchor.anchor_type == "Unknown"
52-
assert anchor.signed_timestamp is None
53-
assert anchor.sub_type == ""
54-
assert anchor.value == ""
55-
assert anchor.origin_server_certs is None
63+
def test_error_parsing_anchor_certificate_carries_on_parsing():
64+
driving_license_anchor = anchor_parser.get_anchor_from_base64_text(anchor_parser.ANCHOR_DRIVING_LICENSE)[0]
65+
anchors = list()
66+
anchors.append(Attribute_pb2.Anchor())
67+
anchors.append(driving_license_anchor)
68+
69+
# 1st anchor will log a warning when being parsed
70+
logger = logging.getLogger()
71+
logger.propagate = False
72+
parsed_anchors = Anchor.parse_anchors(anchors)
73+
logger.propagate = True
74+
75+
assert len(parsed_anchors) == 1
76+
77+
parsed_anchor = parsed_anchors[0]
78+
assert parsed_anchor.anchor_type == config.ANCHOR_SOURCE
79+
assert parsed_anchor.sub_type == ""
80+
assert parsed_anchor.value == "DRIVING_LICENCE"
81+
assert parsed_anchor.origin_server_certs.serial_number == int("46131813624213904216516051554755262812")
82+
assert parsed_anchor.signed_timestamp == datetime(2018, 4, 11, 12 - get_utc_offset(), 13, 3, 923537)

yoti_python_sdk/tests/test_attribute.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def test_attribute_get_verifiers():
3636

3737

3838
def create_source_and_verifier_anchors():
39-
passport_anchor = anchor_parser.get_passport_anchor() # source
40-
yoti_admin_anchor = anchor_parser.get_yoti_admin_anchor() # verifier
39+
passport_anchor = anchor_parser.get_parsed_passport_anchor() # source
40+
yoti_admin_anchor = anchor_parser.get_parsed_yoti_admin_anchor() # verifier
4141

4242
return [passport_anchor, yoti_admin_anchor]

0 commit comments

Comments
 (0)