Skip to content

Commit 2625e07

Browse files
orgnized codes and add dynamic recv
1 parent c4ad584 commit 2625e07

File tree

1 file changed

+42
-33
lines changed

1 file changed

+42
-33
lines changed

charon/pkgs/radas_signature_handler.py

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@
1919
import os
2020
import asyncio
2121
import sys
22+
import tempfile
2223
import uuid
2324
from typing import List, Any, Tuple, Callable, Dict
2425
from charon.config import get_config, RadasConfig
2526
from charon.pkgs.oras_client import OrasClient
26-
from proton import SSLDomain, SSLException, Message, Event
27+
from proton import SSLDomain, Message, Event
2728
from proton.handlers import MessagingHandler
28-
from proton.utils import BlockingConnection
29+
from proton.reactor import Container
2930

3031
logger = logging.getLogger(__name__)
3132

@@ -38,9 +39,12 @@ class UmbListener(MessagingHandler):
3839
this value transfers from the cmd flag, should register UmbListener when the client starts
3940
"""
4041

41-
def __init__(self, sign_result_loc: str) -> None:
42+
def __init__(self, sign_result_loc: str, payload: str) -> None:
4243
super().__init__()
4344
self.sign_result_loc = sign_result_loc
45+
self.payload = payload
46+
self.conn = None
47+
self.timer_task = None
4448

4549
def on_start(self, event: Event) -> None:
4650
"""
@@ -54,10 +58,33 @@ def on_start(self, event: Event) -> None:
5458
# explicit check to pass the type checker
5559
if rconf is None:
5660
sys.exit(1)
57-
conn = event.container.connect(rconf.umb_target())
58-
event.container.create_receiver(conn, rconf.result_queue())
61+
62+
ssl_domain = SSLDomain(SSLDomain.MODE_CLIENT)
63+
ssl_domain.set_credentials(
64+
rconf.client_ca(),
65+
rconf.client_key(),
66+
rconf.client_key_password()
67+
)
68+
ssl_domain.set_trusted_ca_db(rconf.root_ca())
69+
ssl_domain.set_peer_authentication(SSLDomain.VERIFY_PEER)
70+
71+
self.conn = event.container.connect(
72+
url = rconf.umb_target(),
73+
ssl_domain=ssl_domain
74+
)
75+
self.sender = event.container.create_sender(self.conn)
76+
self.receiver = event.container.create_receiver(self.conn, rconf.result_queue(), dynamic=True)
5977
logger.info("Listening on %s, queue: %s", rconf.umb_target(), rconf.result_queue())
6078

79+
def on_link_opened(self, event: Event) -> None:
80+
"""
81+
On sender ready callback
82+
"""
83+
if event.receiver == self.receiver:
84+
if self.receiver.remote_source.address:
85+
self.sender.send(Message(body=self.payload))
86+
self.sender.close()
87+
6188
def on_message(self, event: Event) -> None:
6289
"""
6390
On message callback
@@ -113,8 +140,8 @@ def sign_in_radas(repo_url: str,
113140
logger.debug("params. repo_url: %s, requester: %s, sign_key: %s, result_path: %s,"
114141
"radas_config: %s", repo_url, requester, sign_key, result_path, radas_config)
115142
request_id = str(uuid.uuid4())
116-
exclude = list(ignore_patterns) if ignore_patterns else []
117-
143+
exclude = ignore_patterns if ignore_patterns else []
144+
118145
payload = {
119146
"request_id": request_id,
120147
"requested_by": requester,
@@ -124,33 +151,15 @@ def sign_in_radas(repo_url: str,
124151
"exclude": exclude
125152
}
126153

127-
try:
128-
ssl_domain = SSLDomain(SSLDomain.MODE_CLIENT)
129-
ssl_domain.set_credentials(
130-
radas_config.client_ca(),
131-
radas_config.client_key(),
132-
radas_config.client_key_password()
133-
)
134-
ssl_domain.set_trusted_ca_db(radas_config.root_ca())
135-
ssl_domain.set_peer_authentication(SSLDomain.VERIFY_PEER)
136-
137-
conn = BlockingConnection(radas_config.umb_target(), ssl_domain=ssl_domain)
138-
try:
139-
sender = conn.create_sender(radas_config.request_queue())
140-
message = Message(body=json.dumps(payload))
141-
sender.send(message)
142-
logger.info("Successfully sent signing request ID: %s", request_id)
143-
finally:
144-
conn.close()
145-
146-
except SSLException as e:
147-
logger.error("SSL connection failed: %s", str(e))
148-
sys.exit(1)
149-
except Exception as e:
150-
logger.error("Failed to send signing request: %s", str(e))
151-
sys.exit(1)
154+
temp_dir = tempfile.mktemp()
155+
listener = UmbListener(temp_dir, json.dumps(payload))
152156

153-
# wait for AMQP message to be consumed then get response message from UMB
157+
try:
158+
Container(listener).run()
159+
logger.info("Successfully sent signing request ID: %s", request_id)
160+
finally:
161+
if listener.conn and not listener.conn.closed:
162+
listener.conn.close()
154163

155164

156165
def generate_radas_sign(top_level: str, sign_result_loc: str) -> Tuple[List[str], List[str]]:

0 commit comments

Comments
 (0)