From d8ff9a7032bbb78b9128ce596b0a29bc9f265910 Mon Sep 17 00:00:00 2001 From: Radek Vykydal Date: Jun 04 2020 11:41:44 +0000 Subject: Merge pull request #2634 from rvykydal/rhel-8-localization-us-altgr-intl-crash localization: do not crash on failed parsing of X layout (#1836047) --- diff --git a/pyanaconda/modules/localization/localed.py b/pyanaconda/modules/localization/localed.py index 8bbba00..285d1af 100644 --- a/pyanaconda/modules/localization/localed.py +++ b/pyanaconda/modules/localization/localed.py @@ -18,7 +18,8 @@ from pyanaconda.core.dbus import SystemBus from pyanaconda.modules.common.constants.services import LOCALED from pyanaconda.core.configuration.anaconda import conf -from pyanaconda.keyboard import join_layout_variant, parse_layout_variant +from pyanaconda.keyboard import join_layout_variant, parse_layout_variant, \ + InvalidLayoutVariantSpec from pyanaconda.core.constants import DEFAULT_KEYBOARD from pyanaconda.anaconda_loggers import get_module_logger @@ -160,12 +161,21 @@ class LocaledWrapper(object): layouts = [] variants = [] + parsing_failed = False for layout_variant in (nonempty for nonempty in layouts_variants if nonempty): - (layout, variant) = parse_layout_variant(layout_variant) + try: + (layout, variant) = parse_layout_variant(layout_variant) + except InvalidLayoutVariantSpec as e: + log.debug("Parsing of %s failed: %s", layout_variant, e) + parsing_failed = True + continue layouts.append(layout) variants.append(variant) + if not layouts and parsing_failed: + return + layouts_str = ",".join(layouts) variants_str = ",".join(variants) options_str = ",".join(options) if options else "" diff --git a/tests/nosetests/pyanaconda_tests/module_localization_test.py b/tests/nosetests/pyanaconda_tests/module_localization_test.py index 22391d9..12f13ab 100644 --- a/tests/nosetests/pyanaconda_tests/module_localization_test.py +++ b/tests/nosetests/pyanaconda_tests/module_localization_test.py @@ -853,6 +853,7 @@ class LocaledWrapperTestCase(unittest.TestCase): convert=True) localed_wrapper.set_and_convert_layouts(["cz (qwerty)", "us (euro)"]) localed_wrapper.convert_layouts(["cz (qwerty)", "us (euro)"]) + localed_wrapper.set_layouts(["us-altgr-intl"]) @patch("pyanaconda.modules.localization.localed.SystemBus") @patch("pyanaconda.modules.localization.localed.LOCALED") @@ -891,6 +892,43 @@ class LocaledWrapperTestCase(unittest.TestCase): self.assertEqual(localed_wrapper.layouts_variants, []) @patch("pyanaconda.modules.localization.localed.SystemBus") + @patch("pyanaconda.modules.localization.localed.LOCALED") + @patch("pyanaconda.modules.localization.localed.conf") + def localed_wrapper_safe_calls_test(self, mocked_conf, mocked_localed_service, + mocked_system_bus): + """Test calling LocaledWrapper with invalid values does not raise exception.""" + mocked_system_bus.check_connection.return_value = True + mocked_conf.system.provides_system_bus = True + mocked_localed_proxy = Mock() + mocked_localed_service.get_proxy.return_value = mocked_localed_proxy + mocked_localed_proxy.VConsoleKeymap = "cz" + mocked_localed_proxy.X11Layout = "cz,fi,us,fr" + mocked_localed_proxy.X11Variant = "qwerty,,euro" + mocked_localed_proxy.X11Options = "grp:alt_shift_toggle,grp:ctrl_alt_toggle" + localed_wrapper = LocaledWrapper() + # valid values + localed_wrapper.set_keymap("cz") + localed_wrapper.set_keymap("cz", convert=True) + localed_wrapper.convert_keymap("cz") + localed_wrapper.set_and_convert_keymap("cz") + # invalid values + localed_wrapper.set_keymap("iinvalid") + localed_wrapper.set_keymap("iinvalid", convert=True) + localed_wrapper.convert_keymap("iinvalid") + localed_wrapper.set_and_convert_keymap("iinvalid") + # valid values + localed_wrapper.set_layouts(["cz (qwerty)", "us (euro)"], + options="grp:alt_shift_toggle", + convert=True) + localed_wrapper.set_and_convert_layouts(["cz (qwerty)", "us (euro)"]) + localed_wrapper.convert_layouts(["cz (qwerty)", "us (euro)"]) + # invalid values + # rhbz#1843379 + localed_wrapper.set_layouts(["us-altgr-intl"]) + localed_wrapper.set_and_convert_layouts(["us-altgr-intl"]) + localed_wrapper.convert_layouts(["us-altgr-intl"]) + + @patch("pyanaconda.modules.localization.localed.SystemBus") def localed_wrapper_no_systembus_test(self, mocked_system_bus): """Test LocaledWrapper in environment without system bus.