Skip to content

Commit 9c9f7f3

Browse files
committed
Merge branch 'main' into YOMA-181-build-pipeline
2 parents bb1e524 + f948f05 commit 9c9f7f3

16 files changed

+954
-11
lines changed

.coverage

172 KB
Binary file not shown.

aries_cloudcontroller/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
from aries_cloudcontroller.aries_controller import AriesAgentController
1+
from aries_cloudcontroller.aries_controller import AriesAgentController
2+
from aries_cloudcontroller.aries_controller_base import AriesAgentControllerBase
3+
from aries_cloudcontroller.aries_tenant_controller import AriesTenantController
4+
from aries_cloudcontroller.aries_webhook_server import AriesWebhookServer

aries_cloudcontroller/aries_controller.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ async def listen_webhooks(self):
6363
await self.webhook_server.listen_webhooks()
6464
logger.info("Webhook server started.")
6565
except AttributeError:
66-
logger.warning("Webhook server not initialised.")
66+
warning = "Webhook server not initialised."
67+
logger.warning(warning)
68+
raise AttributeError(warning)
6769
except Exception as exc:
6870
logger.warning(
6971
f"Listening webhooks failed! {exc!r} occurred.")
72+
raise Exception(f"{exc!r}")

aries_cloudcontroller/aries_controller_base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ async def listen_webhooks(self):
238238

239239
async def terminate(self):
240240
await self.client_session.close()
241+
logger.info("Client Session closed.")
241242
try:
242243
await self.webhook_server.terminate()
243244
except AttributeError:

aries_cloudcontroller/aries_tenant_controller.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,19 @@ def add_listener(self, listener):
7171
"topic":"topicname" key-value pairs
7272
"""
7373
try:
74+
assert (type(wallet_id) is str), "wallet_id must be a string"
75+
assert (wallet_id.__ne__("")), "Cannot add listener for empty wallet_id."
7476
pub_topic_path_base = listener['topic']
7577
pub_topic_path = f"{self.wallet_id}.{pub_topic_path_base}"
7678
pub.subscribe(listener["handler"], pub_topic_path)
7779
logger.debug("Lister added for topic : ", pub_topic_path)
78-
except self.wallet_id == "":
79-
logger.error(
80-
"Cannot add listener for empty wallet_id.")
80+
except AssertionError as err:
81+
logger.error(err)
82+
raise
8183
except Exception as exc:
8284
logger.warning(
8385
f"Adding webhooks listener failed! {exc!r} occurred.")
86+
raise
8487

8588
def update_wallet_id(self, wallet_id: str):
8689
"""This wallet_id is used to register for webhooks
@@ -92,9 +95,12 @@ def update_wallet_id(self, wallet_id: str):
9295
The tenant wallet identifier
9396
"""
9497
try:
98+
assert (type(wallet_id) is str), "wallet_id must be a string"
99+
assert (wallet_id.__ne__("")), "wallet_id must not be empty"
95100
self.wallet_id = wallet_id
96-
except wallet_id == "":
97-
raise Exception("wallet_id must not be empty")
101+
except AssertionError as err:
102+
logger.info(f"{err!r}")
103+
raise
98104

99105
def update_tenant_jwt(self, tenant_jwt: str, wallet_id: str):
100106
"""Update the tenant JW token attribute and the header
@@ -107,18 +113,22 @@ def update_tenant_jwt(self, tenant_jwt: str, wallet_id: str):
107113
The tenant wallet identifier
108114
"""
109115
try:
116+
assert (type(tenant_jwt) is str), "tenant_jwt must be a string"
117+
assert (tenant_jwt.__ne__("")), "tenant_jwt must not be empty"
110118
self.tenant_jwt = tenant_jwt
111119
self.update_wallet_id(wallet_id)
112120
self.headers.update(
113121
{'Authorization': 'Bearer ' + tenant_jwt,
114122
'content-type': "application/json"})
115123
self.client_session.headers.update(self.headers)
116-
except tenant_jwt == "":
117-
raise Exception("tenant_jwt must not be empty")
124+
except AssertionError as err:
125+
logger.info(f"{err!r}")
126+
raise
118127
except Exception as exc:
119128
logger.warning(
120129
(f"Updating tenant JW token"
121130
f" failed! {exc!r} occurred."))
131+
raise
122132

123133
def remove_tenant_jwt(self):
124134
"""Removes the tenant's JW Token attribute and corresponding
@@ -134,3 +144,4 @@ def remove_tenant_jwt(self):
134144
except Exception as exc:
135145
logger.warning(
136146
f"Removing JW token failed! {exc!r} occurred.")
147+
raise

aries_cloudcontroller/aries_webhook_server.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,11 @@ async def listen_webhooks(self):
5151
self.webhook_host,
5252
self.webhook_port)
5353
await self.webhook_site.start()
54+
logger.info(
55+
f"Listening Webhooks on {self.webhook_host}:{self.webhook_port}")
5456
except Exception as exc:
5557
logger.warning(f"Listening webhooks failed! {exc!r} occurred.")
58+
raise
5659

5760
async def _receive_webhook(self, request: ClientRequest):
5861
"""Helper to receive webhooks by requesting it
@@ -79,6 +82,7 @@ async def _receive_webhook(self, request: ClientRequest):
7982
return web.Response(status=200)
8083
except Exception as exc:
8184
logger.warning(f"Receiving webhooks failed! {exc!r} occurred.")
85+
raise
8286

8387
async def _handle_webhook(self, wallet_id, topic, payload):
8488
"""Helper handling a webhook
@@ -103,14 +107,17 @@ async def _handle_webhook(self, wallet_id, topic, payload):
103107
logger.warning(
104108
(f"Handling webhooks failed! {exc!r} occurred"
105109
f" when trying to handle this topic: {topic}"))
110+
raise
106111

107112
async def terminate(self):
108113
"""Terminate the controller client session and webhook listeners"""
109114
try:
110115
await self.webhook_site.stop()
116+
logger.info("Webhook server terminated.")
111117
except AttributeError:
112118
# Do nothing if no webhook site server is running
113119
return
114120
except Exception as exc:
115121
logger.warning(
116122
f"Terminating webhooks listener failed! {exc!r} occurred.")
123+
raise
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import json
2+
import logging
3+
4+
logger = logging.getLogger("aries_controller.models.presentation")
5+
6+
7+
class Presentation():
8+
def __init__(self, presentation_json):
9+
try:
10+
self.json_data = json.loads(presentation_json)
11+
except Exception:
12+
logger.error("Failed to load presentation JSON")
13+
raise
14+
self.validate_presentation_json(presentation_json)
15+
if not self.is_verified():
16+
logger.error('Presentation Object Verification not verified')
17+
raise Exception('Presentation Object Verification not verified')
18+
19+
def get_self_attested_attrs(self):
20+
if self.is_verified():
21+
data = {}
22+
for (name, val) in self.json_data['presentation']['requested_proof']['self_attested_attrs'].items():
23+
data[name] = val['raw']
24+
return json.dumps(data)
25+
26+
def get_revealed_attrs(self):
27+
if self.is_verified():
28+
data = {}
29+
for (name, val) in self.json_data['presentation']['requested_proof']['revealed_attrs'].items():
30+
data[name] = val['raw']
31+
return json.dumps(data)
32+
33+
def get_unrevealed_attrs(self):
34+
if self.is_verified():
35+
data = {}
36+
for (name, val) in self.json_data['presentation']['requested_proof']['unrevealed_attrs'].items():
37+
data[name] = val['raw']
38+
return json.dumps(data)
39+
40+
def get_predicates(self):
41+
if self.is_verified():
42+
data = {}
43+
for (name, val) in self.json_data['presentation']['requested_proof']['predicates'].items():
44+
data[name] = val['raw']
45+
return json.dumps(data)
46+
47+
def get_identifiers(self):
48+
if self.__has_identifiers():
49+
data = {}
50+
identifiers = []
51+
for index in range(len(self.json_data['presentation']['identifiers'])):
52+
identifiers.extend([self.json_data['presentation']['identifiers'][index]])
53+
data['identifiers'] = identifiers
54+
return json.dumps(data)
55+
56+
def get_schemas(self):
57+
if self.__has_identifiers():
58+
data = {}
59+
creds = []
60+
for index in range(len(self.json_data['presentation']['identifiers'])):
61+
for key in self.json_data['presentation']['identifiers'][index]:
62+
if key == 'schema_id':
63+
creds.extend([self.json_data['presentation']['identifiers'][index][key]])
64+
data['schema_id'] = creds
65+
return json.dumps(data)
66+
67+
def get_cred_def_ids(self):
68+
if self.__has_identifiers():
69+
data = {}
70+
creds = []
71+
for index in range(len(self.json_data['presentation']['identifiers'])):
72+
for key in self.json_data['presentation']['identifiers'][index]:
73+
if key == 'cred_def_id':
74+
creds.extend([self.json_data['presentation']['identifiers'][index][key]])
75+
data['cred_def_id'] = creds
76+
return json.dumps(data)
77+
78+
def get_rev_reg_ids(self):
79+
if self.__has_identifiers():
80+
data = {}
81+
creds = []
82+
for index in range(len(self.json_data['presentation']['identifiers'])):
83+
for key in self.json_data['presentation']['identifiers'][index]:
84+
if key == 'rev_reg_id':
85+
creds.extend([self.json_data['presentation']['identifiers'][index][key]])
86+
data['rev_reg_id'] = creds
87+
return json.dumps(data)
88+
89+
def get_role(self):
90+
return(self.json_data['role'])
91+
92+
def get_threadid(self):
93+
return(self.json_data['thread_id'])
94+
95+
def get_presentation_request(self):
96+
return(self.json_data['presentation_request'])
97+
98+
def get_verified_state(self):
99+
return self.json_data['state']
100+
101+
def get_presxid(self):
102+
return self.json_data['presentation_exchange_id']
103+
104+
def get_from_conn_id(self):
105+
return self.json_data['connection_id']
106+
107+
def is_verified(self):
108+
try:
109+
assert self.json_data['verified'] == "true"
110+
except AssertionError:
111+
logger.debug('Verification Failed')
112+
return False
113+
return True
114+
115+
def validate_presentation_json(self, presentation_json):
116+
try:
117+
# Taken from sample response in swagger UI
118+
# TODO Determine whether this is the minimal set of keys
119+
presentation_keys = [
120+
"auto_present",
121+
"connection_id",
122+
"created_at",
123+
"error_msg",
124+
"initiator",
125+
"presentation",
126+
"presentation_exchange_id",
127+
"presentation_proposal_dict",
128+
"presentation_request",
129+
"presentation_request_dict",
130+
"role",
131+
"state",
132+
"thread_id",
133+
"trace",
134+
"updated_at",
135+
"verified"
136+
]
137+
for key in presentation_keys:
138+
assert key in json.loads(presentation_json),\
139+
f"Invalid presentation. Missing key {key}"
140+
except AssertionError:
141+
raise
142+
143+
def __has_identifiers(self):
144+
try:
145+
assert 'identifiers' in self.json_data['presentation'],\
146+
"No key 'identifiers' in presentation"
147+
return True
148+
except AssertionError:
149+
logger.warning("No key 'identifiers' in presentation")
150+
raise

requirements.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ python-dotenv
77
termcolor
88
pillow
99
qrcode
10-
beautifulsoup4
10+
beautifulsoup4
11+
pytest~=6.2
12+
pytest_asyncio

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def parse_requirements(filename):
2222
if __name__ == "__main__":
2323
setup(
2424
name=PACKAGE_NAME,
25-
version="0.1.3",
25+
version="0.1.4",
2626
description="A simple python package for controlling an aries agent through the admin-api interface",
2727
long_description=long_description,
2828
long_description_content_type="text/markdown",

tests/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)