Merge remote-tracking branch 'origin/pr/330'
* origin/pr/330: gui: fixes from Marek's comments gui: improvements of feature keyboard layout checks tests: adapt tests for keyboard-layout gui: drop legacy qubes-keyboard support
This commit is contained in:
		
						commit
						8f0ec59f95
					
				| @ -21,8 +21,11 @@ | |||||||
| # License along with this library; if not, see <https://www.gnu.org/licenses/>. | # License along with this library; if not, see <https://www.gnu.org/licenses/>. | ||||||
| # | # | ||||||
| 
 | 
 | ||||||
|  | import re | ||||||
|  | 
 | ||||||
| import qubes.config | import qubes.config | ||||||
| import qubes.ext | import qubes.ext | ||||||
|  | import qubes.exc | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class GUI(qubes.ext.Extension): | class GUI(qubes.ext.Extension): | ||||||
| @ -96,16 +99,6 @@ class GUI(qubes.ext.Extension): | |||||||
|             if kbd_layout: |             if kbd_layout: | ||||||
|                 vm.untrusted_qdb.write('/keyboard-layout', kbd_layout) |                 vm.untrusted_qdb.write('/keyboard-layout', kbd_layout) | ||||||
| 
 | 
 | ||||||
|                 # 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 |         # Set GuiVM prefix | ||||||
|         guivm_windows_prefix = vm.features.get('guivm-windows-prefix', 'GuiVM') |         guivm_windows_prefix = vm.features.get('guivm-windows-prefix', 'GuiVM') | ||||||
|         if vm.features.get('service.guivm-gui-agent', None): |         if vm.features.get('service.guivm-gui-agent', None): | ||||||
| @ -128,3 +121,23 @@ class GUI(qubes.ext.Extension): | |||||||
|         for attached_vm in attached_vms: |         for attached_vm in attached_vms: | ||||||
|             attached_vm.untrusted_qdb.write('/qubes-gui-domain-xid', |             attached_vm.untrusted_qdb.write('/qubes-gui-domain-xid', | ||||||
|                                             str(vm.xid)) |                                             str(vm.xid)) | ||||||
|  | 
 | ||||||
|  |     @qubes.ext.handler('domain-feature-pre-set:keyboard-layout') | ||||||
|  |     def on_feature_pre_set(self, subject, event, feature, value, oldvalue=None): | ||||||
|  |         untrusted_xkb_layout = value.split('+') | ||||||
|  |         if len(untrusted_xkb_layout) != 3: | ||||||
|  |             raise qubes.exc.QubesValueError("Invalid number of parameters") | ||||||
|  | 
 | ||||||
|  |         untrusted_layout = untrusted_xkb_layout[0] | ||||||
|  |         untrusted_variant = untrusted_xkb_layout[1] | ||||||
|  |         untrusted_options = untrusted_xkb_layout[2] | ||||||
|  | 
 | ||||||
|  |         re_variant = r'^[a-zA-Z0-9-_]*$' | ||||||
|  |         re_options = r'^[a-zA-Z0-9-_:,]*$' | ||||||
|  | 
 | ||||||
|  |         if not untrusted_layout.isalpha(): | ||||||
|  |             raise qubes.exc.QubesValueError("Invalid layout provided") | ||||||
|  |         if not re.match(re_variant, untrusted_variant): | ||||||
|  |             raise qubes.exc.QubesValueError("Invalid variant provided") | ||||||
|  |         if not re.match(re_options, untrusted_options): | ||||||
|  |             raise qubes.exc.QubesValueError("Invalid options provided") | ||||||
|  | |||||||
| @ -1832,14 +1832,7 @@ class TC_90_QubesVM(QubesVMTestsMixin, qubes.tests.QubesTestCase): | |||||||
|             name='appvm', qid=3) |             name='appvm', qid=3) | ||||||
|         vm.netvm = None |         vm.netvm = None | ||||||
|         vm.guivm = guivm |         vm.guivm = guivm | ||||||
|         guivm.features['keyboard-layout'] = 'fr' |         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};' |  | ||||||
|         guivm.is_running = lambda: True |         guivm.is_running = lambda: True | ||||||
|         vm.events_enabled = True |         vm.events_enabled = True | ||||||
|         test_qubesdb = TestQubesDB() |         test_qubesdb = TestQubesDB() | ||||||
| @ -1851,8 +1844,7 @@ class TC_90_QubesVM(QubesVMTestsMixin, qubes.tests.QubesTestCase): | |||||||
|             '/name': 'test-inst-appvm', |             '/name': 'test-inst-appvm', | ||||||
|             '/type': 'AppVM', |             '/type': 'AppVM', | ||||||
|             '/default-user': 'user', |             '/default-user': 'user', | ||||||
|             '/qubes-keyboard': xkb_keymap, |             '/keyboard-layout': 'fr++', | ||||||
|             '/keyboard-layout': 'fr', |  | ||||||
|             '/qubes-vm-type': 'AppVM', |             '/qubes-vm-type': 'AppVM', | ||||||
|             '/qubes-gui-domain-xid': '{}'.format(guivm.xid), |             '/qubes-gui-domain-xid': '{}'.format(guivm.xid), | ||||||
|             '/qubes-debug-mode': '0', |             '/qubes-debug-mode': '0', | ||||||
| @ -1918,6 +1910,22 @@ class TC_90_QubesVM(QubesVMTestsMixin, qubes.tests.QubesTestCase): | |||||||
|             '/connected-ips6': '', |             '/connected-ips6': '', | ||||||
|         }) |         }) | ||||||
| 
 | 
 | ||||||
|  |     @unittest.mock.patch('qubes.utils.get_timezone') | ||||||
|  |     @unittest.mock.patch('qubes.utils.urandom') | ||||||
|  |     @unittest.mock.patch('qubes.vm.qubesvm.QubesVM.untrusted_qdb') | ||||||
|  |     def test_624_qdb_guivm_invalid_keyboard_layout(self, mock_qubesdb, | ||||||
|  |                                                    mock_urandom, mock_timezone): | ||||||
|  |         mock_urandom.return_value = b'A' * 64 | ||||||
|  |         mock_timezone.return_value = 'UTC' | ||||||
|  |         template = self.get_vm( | ||||||
|  |             cls=qubes.vm.templatevm.TemplateVM, name='template') | ||||||
|  |         guivm = self.get_vm(cls=qubes.vm.appvm.AppVM, template=template, | ||||||
|  |             name='sys-gui', qid=2, provides_network=False) | ||||||
|  |         guivm.is_running = lambda: True | ||||||
|  |         guivm.events_enabled = True | ||||||
|  |         with self.assertRaises(qubes.exc.QubesValueError): | ||||||
|  |             guivm.features['keyboard-layout'] = 'fr123++' | ||||||
|  | 
 | ||||||
|     @asyncio.coroutine |     @asyncio.coroutine | ||||||
|     def coroutine_mock(self, mock, *args, **kwargs): |     def coroutine_mock(self, mock, *args, **kwargs): | ||||||
|         return mock(*args, **kwargs) |         return mock(*args, **kwargs) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki