1919import os
2020import asyncio
2121import sys
22+ import tempfile
2223import uuid
2324from typing import List , Any , Tuple , Callable , Dict
2425from charon .config import get_config , RadasConfig
2526from charon .pkgs .oras_client import OrasClient
26- from proton import SSLDomain , SSLException , Message , Event
27+ from proton import SSLDomain , Message , Event
2728from proton .handlers import MessagingHandler
28- from proton .utils import BlockingConnection
29+ from proton .reactor import Container
2930
3031logger = 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
156165def generate_radas_sign (top_level : str , sign_result_loc : str ) -> Tuple [List [str ], List [str ]]:
0 commit comments