Skip to content

Commit 352d29b

Browse files
committed
Allow fewer qubes to use the U2F proxy
Most qubes are not intended to connect to the U2F proxy. Trim the selection down by hiding improper qubes that should never be clients, such as templates, disposable templates, netvm, AudioVM, GUIVM.
1 parent 93b6192 commit 352d29b

2 files changed

Lines changed: 30 additions & 14 deletions

File tree

qubes_config/global_config/usb_devices.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from qubesadmin.device_protocol import DeviceCategory
2828

2929
from ..widgets.gtk_widgets import TokenName, TextModeler, VMListModeler
30-
from ..widgets.utils import get_feature, apply_feature_change
30+
from ..widgets.utils import get_feature, get_boolean_feature, apply_feature_change
3131
from ..widgets.gtk_utils import ask_question, show_error
3232
from .page_handler import PageHandler
3333
from .policy_rules import RuleTargetedAdminVM, Rule
@@ -465,13 +465,17 @@ def load_rules_for_usb_qube(self):
465465
self.error_handler.clear_all_errors()
466466

467467
for vm in self.qapp.domains:
468-
if vm.features.check_with_template(self.SUPPORTED_SERVICE_FEATURE):
469-
if vm == usb_qube:
470-
continue
468+
if vm == usb_qube:
469+
continue
470+
if vm.features.check_with_template(self.SUPPORTED_SERVICE_FEATURE) and not (
471+
vm.klass == "TemplateVM"
472+
or getattr(vm, "template_for_dispvms", False)
473+
or getattr(vm, "provides_network", False)
474+
or get_boolean_feature(vm, "service.audiovm")
475+
or get_boolean_feature(vm, "service.guivm")
476+
):
471477
self.available_vms.append(vm)
472478
if get_feature(vm, self.SERVICE_FEATURE):
473-
if vm == usb_qube:
474-
continue
475479
self.initially_enabled_vms.append(vm)
476480

477481
if not self.available_vms:

qubes_config/tests/test_usb_devices.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ def test_u2f_handler_init(test_qapp, test_policy_manager, real_builder):
350350
assert handler.enable_check.get_active()
351351
assert handler.enable_some_handler.selected_vms == [testvm]
352352
assert handler.enable_some_handler.add_qube_model.is_vm_available(testvm)
353-
assert handler.enable_some_handler.add_qube_model.is_vm_available(fedora35)
353+
assert not handler.enable_some_handler.add_qube_model.is_vm_available(fedora35)
354354
assert not handler.enable_some_handler.add_qube_model.is_vm_available(testred)
355355
assert not handler.enable_some_handler.add_qube_model.is_vm_available(sysusb)
356356

@@ -856,7 +856,7 @@ def test_u2f_handler_save_complex(test_qapp, test_policy_manager, real_builder):
856856
)
857857
assert (
858858
call(test_qapp.domains["fedora-35"], handler.SERVICE_FEATURE, True)
859-
in mock_apply.mock_calls
859+
not in mock_apply.mock_calls
860860
)
861861
assert len(mock_apply.mock_calls) == 2
862862

@@ -915,7 +915,7 @@ def test_u2f_handler_save_complex_2(test_qapp, test_policy_manager, real_builder
915915
)
916916
assert (
917917
call(test_qapp.domains["fedora-35"], handler.SERVICE_FEATURE, True)
918-
in mock_apply.mock_calls
918+
not in mock_apply.mock_calls
919919
)
920920
assert len(mock_apply.mock_calls) == 2
921921

@@ -933,22 +933,22 @@ def test_u2f_handler_save_complex_2(test_qapp, test_policy_manager, real_builder
933933

934934
def test_u2f_handler_add_without_service(test_qapp, test_policy_manager, real_builder):
935935
sys_usb = test_qapp.domains["sys-usb"]
936-
fedora35 = test_qapp.domains["fedora-35"]
936+
testblue = test_qapp.domains["test-blue"]
937937
testvm = test_qapp.domains["test-vm"]
938938
handler = U2FPolicyHandler(test_qapp, test_policy_manager, real_builder, {sys_usb})
939939

940940
assert handler.get_unsaved() == ""
941941

942942
# settings from conftest: only vms that have this available are 'test-vm'
943-
# and 'fedora-35', only test-vm can use the service, policy is default
943+
# and 'test-blue', only test-vm can use the service, policy is default
944944

945945
handler.register_check.set_active(True)
946946
handler.register_some_radio.set_active(True)
947947

948948
assert not handler.register_some_handler.selected_vms
949949
assert handler.enable_some_handler.selected_vms == [testvm]
950950

951-
handler.register_some_handler.add_qube_model.select_value("fedora-35")
951+
handler.register_some_handler.add_qube_model.select_value("test-blue")
952952
# refuse
953953
with patch("qubes_config.global_config.usb_devices.ask_question") as mock_question:
954954
mock_question.return_value = Gtk.ResponseType.NO
@@ -962,9 +962,9 @@ def test_u2f_handler_add_without_service(test_qapp, test_policy_manager, real_bu
962962
mock_question.return_value = Gtk.ResponseType.YES
963963
handler.register_some_handler.add_button.clicked()
964964
assert mock_question.mock_calls
965-
assert handler.register_some_handler.selected_vms == [fedora35]
965+
assert handler.register_some_handler.selected_vms == [testblue]
966966

967-
assert handler.enable_some_handler.selected_vms == [fedora35, testvm]
967+
assert handler.enable_some_handler.selected_vms == [testblue, testvm]
968968

969969

970970
def test_devices_handler_unsaved(test_qapp, test_policy_manager, real_builder):
@@ -981,6 +981,12 @@ def test_devices_handler_unsaved(test_qapp, test_policy_manager, real_builder):
981981
b"_function='0' _bus='00' _libvirt_name='pci_0000_00_0d_0' "
982982
b"_device='0d'\n"
983983
)
984+
test_qapp.expected_calls[
985+
("test-vm", "admin.vm.feature.Get", "service.audiovm", None)
986+
] = b"0\x00"
987+
test_qapp.expected_calls[
988+
("test-vm", "admin.vm.feature.Get", "service.guivm", None)
989+
] = b"0\x00"
984990

985991
handler = DevicesHandler(test_qapp, test_policy_manager, real_builder)
986992

@@ -1023,6 +1029,12 @@ def test_devices_handler_detect_usbvms(test_qapp, test_policy_manager, real_buil
10231029
b"_function='0' _bus='00' _libvirt_name='pci_0000_00_0d_0' "
10241030
b"_device='0d'\n"
10251031
)
1032+
test_qapp.expected_calls[
1033+
("test-vm", "admin.vm.feature.Get", "service.audiovm", None)
1034+
] = b"0\x00"
1035+
test_qapp.expected_calls[
1036+
("test-vm", "admin.vm.feature.Get", "service.guivm", None)
1037+
] = b"0\x00"
10261038

10271039
handler = DevicesHandler(test_qapp, test_policy_manager, real_builder)
10281040

0 commit comments

Comments
 (0)