@@ -304,7 +304,16 @@ def execute_qubesrpc(self, service: str, src_domain_name: str):
304
304
305
305
target = self .connect_target ()
306
306
target .handshake ()
307
- return target
307
+ return target , dom0
308
+
309
+ def check_dom0 (self , dom0 ):
310
+ self .assertEqual (
311
+ dom0 .recv_message (),
312
+ (
313
+ qrexec .MSG_CONNECTION_TERMINATED ,
314
+ struct .pack ("<LL" , self .target_domain , self .target_port ),
315
+ ),
316
+ )
308
317
309
318
def make_executable_service (self , * args ):
310
319
util .make_executable_service (self .tempdir , * args )
@@ -319,7 +328,36 @@ def test_exec_service(self):
319
328
echo "arg: $1, remote domain: $QREXEC_REMOTE_DOMAIN"
320
329
""" ,
321
330
)
322
- target = self .execute_qubesrpc ("qubes.Service+arg" , "domX" )
331
+ target , _ = self .execute_qubesrpc ("qubes.Service+arg" , "domX" )
332
+ target .send_message (qrexec .MSG_DATA_STDIN , b"" )
333
+ messages = target .recv_all_messages ()
334
+ self .assertListEqual (
335
+ util .sort_messages (messages ),
336
+ [
337
+ (qrexec .MSG_DATA_STDOUT , b"arg: arg, remote domain: domX\n " ),
338
+ (qrexec .MSG_DATA_STDOUT , b"" ),
339
+ (qrexec .MSG_DATA_STDERR , b"" ),
340
+ (qrexec .MSG_DATA_EXIT_CODE , b"\0 \0 \0 \0 " ),
341
+ ],
342
+ )
343
+
344
+ def test_exec_service_with_config (self ):
345
+ util .make_executable_service (
346
+ self .tempdir ,
347
+ "rpc" ,
348
+ "qubes.Service" ,
349
+ """\
350
+ #!/bin/sh
351
+ echo "arg: $1, remote domain: $QREXEC_REMOTE_DOMAIN"
352
+ """ ,
353
+ )
354
+ with open (
355
+ os .path .join (self .tempdir , "rpc-config" , "qubes.Service+arg" ), "w"
356
+ ) as f :
357
+ f .write ("""\
358
+ wait-for-session = 0
359
+ """ )
360
+ target , dom0 = self .execute_qubesrpc ("qubes.Service+arg" , "domX" )
323
361
target .send_message (qrexec .MSG_DATA_STDIN , b"" )
324
362
messages = target .recv_all_messages ()
325
363
self .assertListEqual (
@@ -331,6 +369,7 @@ def test_exec_service(self):
331
369
(qrexec .MSG_DATA_EXIT_CODE , b"\0 \0 \0 \0 " ),
332
370
],
333
371
)
372
+ self .check_dom0 (dom0 )
334
373
335
374
def test_wait_for_session (self ):
336
375
log = os .path .join (self .tempdir , "wait-for-session.log" )
@@ -359,17 +398,20 @@ def test_wait_for_session(self):
359
398
log
360
399
),
361
400
)
401
+ user = getpass .getuser ()
402
+ assert "'" not in user
403
+ assert "\n " not in user
362
404
with open (
363
405
os .path .join (self .tempdir , "rpc-config" , "qubes.Service+arg" ), "w"
364
406
) as f :
365
- f .write ("""\
407
+ f .write (f """\
366
408
367
409
# Test TOML file
410
+ force-user = '{ user } '
368
411
wait-for-session = 1 # line comment
369
412
""" )
370
- user = getpass .getuser ()
371
413
372
- target = self .execute_qubesrpc ("qubes.Service+arg" , "domX" )
414
+ target , dom0 = self .execute_qubesrpc ("qubes.Service+arg" , "domX" )
373
415
self .assertEqual (target .recv_message (), (
374
416
qrexec .MSG_DATA_STDOUT ,
375
417
(
@@ -395,9 +437,10 @@ def test_wait_for_session(self):
395
437
(qrexec .MSG_DATA_EXIT_CODE , b"\0 \0 \0 \0 " ),
396
438
],
397
439
)
440
+ self .check_dom0 (dom0 )
398
441
399
442
def test_exec_service_fail (self ):
400
- target = self .execute_qubesrpc ("qubes.Service+arg" , "domX" )
443
+ target , dom0 = self .execute_qubesrpc ("qubes.Service+arg" , "domX" )
401
444
target .send_message (qrexec .MSG_DATA_STDIN , b"" )
402
445
messages = target .recv_all_messages ()
403
446
self .assertListEqual (
@@ -408,6 +451,7 @@ def test_exec_service_fail(self):
408
451
(qrexec .MSG_DATA_EXIT_CODE , b"\177 \0 \0 \0 " ),
409
452
],
410
453
)
454
+ self .check_dom0 (dom0 )
411
455
412
456
def test_exec_service_with_arg (self ):
413
457
self .make_executable_service (
@@ -426,7 +470,7 @@ def test_exec_service_with_arg(self):
426
470
echo "general service"
427
471
""" ,
428
472
)
429
- target = self .execute_qubesrpc ("qubes.Service+arg" , "domX" )
473
+ target , dom0 = self .execute_qubesrpc ("qubes.Service+arg" , "domX" )
430
474
target .send_message (qrexec .MSG_DATA_STDIN , b"" )
431
475
messages = target .recv_all_messages ()
432
476
self .assertListEqual (
@@ -438,6 +482,7 @@ def test_exec_service_with_arg(self):
438
482
(qrexec .MSG_DATA_EXIT_CODE , b"\0 \0 \0 \0 " ),
439
483
],
440
484
)
485
+ self .check_dom0 (dom0 )
441
486
442
487
def test_connect_socket (self ):
443
488
socket_path = os .path .join (
@@ -446,7 +491,7 @@ def test_connect_socket(self):
446
491
server = qrexec .socket_server (socket_path )
447
492
self .addCleanup (server .close )
448
493
449
- target = self .execute_qubesrpc ("qubes.SocketService+arg" , "domX" )
494
+ target , dom0 = self .execute_qubesrpc ("qubes.SocketService+arg" , "domX" )
450
495
451
496
server .accept ()
452
497
expected = b"qubes.SocketService+arg domX\0 "
@@ -469,6 +514,7 @@ def test_connect_socket(self):
469
514
(qrexec .MSG_DATA_EXIT_CODE , b"\0 \0 \0 \0 " ),
470
515
],
471
516
)
517
+ self .check_dom0 (dom0 )
472
518
473
519
def test_service_close_stdout_stderr_early (self ):
474
520
self .make_executable_service (
@@ -486,7 +532,7 @@ def test_service_close_stdout_stderr_early(self):
486
532
exit $code
487
533
""" ,
488
534
)
489
- target = self .execute_qubesrpc ("qubes.Service" , "domX" )
535
+ target , dom0 = self .execute_qubesrpc ("qubes.Service" , "domX" )
490
536
491
537
target .send_message (qrexec .MSG_DATA_STDIN , b"\n " )
492
538
@@ -508,6 +554,7 @@ def test_service_close_stdout_stderr_early(self):
508
554
target .recv_message (),
509
555
(qrexec .MSG_DATA_EXIT_CODE , struct .pack ("<L" , 42 )),
510
556
)
557
+ self .check_dom0 (dom0 )
511
558
512
559
513
560
@unittest .skipIf (os .environ .get ("SKIP_SOCKET_TESTS" ), "socket tests not set up" )
0 commit comments