From dbacd07b437196d471c43ca38a4400819b8d62a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Pierret=20=28fepitre=29?= Date: Mon, 10 Feb 2020 14:42:30 +0100 Subject: [PATCH 1/4] gui: handle legacy keymap setting /qubes-keyboard --- qubes/ext/gui.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/qubes/ext/gui.py b/qubes/ext/gui.py index 412ce6523..2c7205a3c 100644 --- a/qubes/ext/gui.py +++ b/qubes/ext/gui.py @@ -21,6 +21,8 @@ # License along with this library; if not, see . # +import subprocess + import qubes.config import qubes.ext @@ -79,6 +81,16 @@ def on_domain_qdb_create(self, vm, event): if kbd_layout: vm.untrusted_qdb.write('/keyboard-layout', kbd_layout) + # Legacy value for setting keyboard layout + try: + xkb_keymap = subprocess.run(['/usr/bin/setxkbmap', '-print'], + stdout=subprocess.PIPE) + if xkb_keymap.stdout: + vm.untrusted_qdb.write('/qubes-keyboard', xkb_keymap.stdout) + except FileNotFoundError: + # Prevent any reason for 'setxkbmap' being not present + pass + # Set GuiVM prefix guivm_windows_prefix = vm.features.get('guivm-windows-prefix', 'GuiVM') if vm.features.get('service.guivm-gui-agent', None): From 2e1290eec11b6a1b54d439676aa2f7ebc51b4a74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Pierret=20=28fepitre=29?= Date: Thu, 13 Feb 2020 22:31:33 +0100 Subject: [PATCH 2/4] gui: no check in subprocess.run --- qubes/ext/gui.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qubes/ext/gui.py b/qubes/ext/gui.py index 2c7205a3c..2dc005d8b 100644 --- a/qubes/ext/gui.py +++ b/qubes/ext/gui.py @@ -84,7 +84,8 @@ def on_domain_qdb_create(self, vm, event): # Legacy value for setting keyboard layout try: xkb_keymap = subprocess.run(['/usr/bin/setxkbmap', '-print'], - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, + check=False) if xkb_keymap.stdout: vm.untrusted_qdb.write('/qubes-keyboard', xkb_keymap.stdout) except FileNotFoundError: From 65238c187f23e3f5a2412f0aa3e3845b1428a73e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Pierret=20=28fepitre=29?= Date: Thu, 13 Feb 2020 22:46:52 +0100 Subject: [PATCH 3/4] tests: handle legacy layout --- qubes/tests/vm/qubesvm.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qubes/tests/vm/qubesvm.py b/qubes/tests/vm/qubesvm.py index ff1da7564..3d9c7a9b4 100644 --- a/qubes/tests/vm/qubesvm.py +++ b/qubes/tests/vm/qubesvm.py @@ -1843,6 +1843,7 @@ def test_622_qdb_keyboard_layout(self, mock_qubesdb, mock_urandom, '/name': 'test-inst-appvm', '/type': 'AppVM', '/default-user': 'user', + '/qubes-keyboard': unittest.mock.ANY, '/keyboard-layout': 'fr', '/qubes-vm-type': 'AppVM', '/qubes-gui-domain-xid': '{}'.format(guivm.xid), From a67b8f35bad4e642fe0f62a0a17f76cfed7a9eae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Pierret=20=28fepitre=29?= Date: Tue, 25 Feb 2020 11:09:53 +0100 Subject: [PATCH 4/4] gui: set xkb_layout manually --- qubes/ext/gui.py | 21 +++++++++------------ qubes/tests/vm/qubesvm.py | 9 ++++++++- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/qubes/ext/gui.py b/qubes/ext/gui.py index 2dc005d8b..69e97df67 100644 --- a/qubes/ext/gui.py +++ b/qubes/ext/gui.py @@ -21,8 +21,6 @@ # License along with this library; if not, see . # -import subprocess - import qubes.config import qubes.ext @@ -81,16 +79,15 @@ def on_domain_qdb_create(self, vm, event): if kbd_layout: vm.untrusted_qdb.write('/keyboard-layout', kbd_layout) - # Legacy value for setting keyboard layout - try: - xkb_keymap = subprocess.run(['/usr/bin/setxkbmap', '-print'], - stdout=subprocess.PIPE, - check=False) - if xkb_keymap.stdout: - vm.untrusted_qdb.write('/qubes-keyboard', xkb_keymap.stdout) - except FileNotFoundError: - # Prevent any reason for 'setxkbmap' being not present - pass + # Legacy value for setting keyboard layout + xkb_keymap = \ + 'xkb_keymap {\x0a\x09xkb_keycodes { include ' \ + '"evdev"\x09};\x0a\x09xkb_types { include ' \ + '"complete"\x09};\x0a\x09xkb_compat { include ' \ + '"complete"\x09};\x0a\x09xkb_symbols { include ' \ + '"pc+%s+inet(evdev)"\x09};\x0a\x09xkb_geometry ' \ + '{ include "pc(pc105)"\x09};\x0a};' % kbd_layout + vm.untrusted_qdb.write('/qubes-keyboard', xkb_keymap) # Set GuiVM prefix guivm_windows_prefix = vm.features.get('guivm-windows-prefix', 'GuiVM') diff --git a/qubes/tests/vm/qubesvm.py b/qubes/tests/vm/qubesvm.py index 3d9c7a9b4..8d50007c6 100644 --- a/qubes/tests/vm/qubesvm.py +++ b/qubes/tests/vm/qubesvm.py @@ -1833,6 +1833,13 @@ def test_622_qdb_keyboard_layout(self, mock_qubesdb, mock_urandom, vm.netvm = None vm.guivm = guivm guivm.features['keyboard-layout'] = 'fr' + xkb_keymap = \ + 'xkb_keymap {\x0a\x09xkb_keycodes { include ' \ + '"evdev"\x09};\x0a\x09xkb_types { include ' \ + '"complete"\x09};\x0a\x09xkb_compat { include ' \ + '"complete"\x09};\x0a\x09xkb_symbols { include ' \ + '"pc+fr+inet(evdev)"\x09};\x0a\x09xkb_geometry ' \ + '{ include "pc(pc105)"\x09};\x0a};' vm.events_enabled = True test_qubesdb = TestQubesDB() mock_qubesdb.write.side_effect = test_qubesdb.write @@ -1843,7 +1850,7 @@ def test_622_qdb_keyboard_layout(self, mock_qubesdb, mock_urandom, '/name': 'test-inst-appvm', '/type': 'AppVM', '/default-user': 'user', - '/qubes-keyboard': unittest.mock.ANY, + '/qubes-keyboard': xkb_keymap, '/keyboard-layout': 'fr', '/qubes-vm-type': 'AppVM', '/qubes-gui-domain-xid': '{}'.format(guivm.xid),