Skip to content

Commit 2bada1c

Browse files
use separate sender script
1 parent 371db68 commit 2bada1c

File tree

1 file changed

+78
-31
lines changed

1 file changed

+78
-31
lines changed

charon/pkgs/radas_signature_handler.py

Lines changed: 78 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@
1919
import os
2020
import asyncio
2121
import sys
22-
import tempfile
22+
import threading
2323
import uuid
2424
from typing import List, Any, Tuple, Callable, Dict
2525
from charon.config import get_config, RadasConfig
2626
from charon.pkgs.oras_client import OrasClient
2727
from proton import SSLDomain, Message, Event
28+
from proton.utils import BlockingConnection
2829
from proton.handlers import MessagingHandler
2930
from proton.reactor import Container
3031

@@ -45,7 +46,6 @@ def __init__(self, sign_result_loc: str, request_id: str) -> None:
4546
self.sign_result_loc = sign_result_loc
4647
self.request_id = request_id
4748
self.conn = None
48-
self.timer_task = None
4949

5050
def on_start(self, event: Event) -> None:
5151
"""
@@ -129,39 +129,56 @@ def _process_message(self, msg: Any) -> None:
129129
logger.info("Number of files pulled: %d, path: %s", len(files), files[0])
130130

131131

132-
def sign_in_radas(repo_url: str,
133-
requester: str,
134-
sign_key: str,
135-
result_path: str,
136-
ignore_patterns: List[str],
137-
radas_config: RadasConfig):
132+
133+
class RadasSender(MessagingHandler):
138134
"""
139-
This function will be responsible to do the overall controlling of the whole process,
140-
like trigger the send and register the receiver, and control the wait and timeout there.
135+
This simple sender will send given string massage to UMB message queue to request signing.
136+
Attributes:
137+
payload (str): payload json string for radas to read,
138+
this value construct from the cmd flag
141139
"""
142-
logger.debug("params. repo_url: %s, requester: %s, sign_key: %s, result_path: %s,"
143-
"radas_config: %s", repo_url, requester, sign_key, result_path, radas_config)
144-
request_id = str(uuid.uuid4())
145-
exclude = ignore_patterns if ignore_patterns else []
140+
def __init__(self, payload: str):
141+
super().__init__()
142+
self.payload = payload
143+
self.container = None
146144

147-
payload = {
148-
"request_id": request_id,
149-
"requested_by": requester,
150-
"type": "mrrc",
151-
"file_reference": repo_url,
152-
"sig_keyname": sign_key,
153-
"exclude": exclude
154-
}
145+
def on_start(self, event):
146+
"""
147+
On start callback
148+
"""
149+
conf = get_config()
150+
if not (conf and conf.is_radas_enabled()):
151+
sys.exit(1)
155152

156-
temp_dir = tempfile.mktemp()
157-
listener = RadasReceiver(temp_dir, json.dumps(payload))
153+
rconf = conf.get_radas_config()
154+
if rconf is None:
155+
sys.exit(1)
158156

159-
try:
160-
Container(listener).run()
161-
logger.info("Successfully sent signing request ID: %s", request_id)
162-
finally:
163-
if listener.conn and not listener.conn.closed:
164-
listener.conn.close()
157+
ssl_domain = SSLDomain(SSLDomain.MODE_CLIENT)
158+
ssl_domain.set_credentials(
159+
rconf.client_ca(),
160+
rconf.client_key(),
161+
rconf.client_key_password()
162+
)
163+
ssl_domain.set_trusted_ca_db(rconf.root_ca())
164+
ssl_domain.set_peer_authentication(SSLDomain.VERIFY_PEER)
165+
166+
self.conn = event.container.connect(
167+
url = rconf.umb_target(),
168+
ssl_domain=ssl_domain
169+
)
170+
self.container = event.container
171+
self.sender = event.container.create_sender(self.conn, rconf.request_queue())
172+
173+
def on_sendable(self):
174+
"""
175+
On message able to send callback
176+
"""
177+
request = self.payload
178+
msg = Message(body=request)
179+
self.sender.send(msg)
180+
if self.container:
181+
self.container.stop()
165182

166183

167184
def generate_radas_sign(top_level: str, sign_result_loc: str) -> Tuple[List[str], List[str]]:
@@ -257,4 +274,34 @@ def sign_in_radas(repo_url: str,
257274
result_path: str,
258275
ignore_patterns: List[str],
259276
radas_config: RadasConfig):
260-
logger.info("Start signing for %s", repo_url)
277+
"""
278+
This function will be responsible to do the overall controlling of the whole process,
279+
like trigger the send and register the receiver, and control the wait and timeout there.
280+
"""
281+
logger.debug("params. repo_url: %s, requester: %s, sign_key: %s, result_path: %s,"
282+
"radas_config: %s", repo_url, requester, sign_key, result_path, radas_config)
283+
request_id = str(uuid.uuid4())
284+
exclude = ignore_patterns if ignore_patterns else []
285+
286+
payload = {
287+
"request_id": request_id,
288+
"requested_by": requester,
289+
"type": "mrrc",
290+
"file_reference": repo_url,
291+
"sig_keyname": sign_key,
292+
"exclude": exclude
293+
}
294+
295+
listener = RadasReceiver(result_path, request_id)
296+
sender = RadasSender(json.dumps(payload))
297+
298+
try:
299+
Container(sender).run()
300+
logger.info("Successfully sent signing request ID: %s", request_id)
301+
Container(listener).run()
302+
303+
finally:
304+
if listener.conn is not None:
305+
listener.conn.close()
306+
if sender.conn is not None:
307+
sender.conn.close()

0 commit comments

Comments
 (0)