diff --git a/linux/keyman-config/keyman_config/install_kmp.py b/linux/keyman-config/keyman_config/install_kmp.py index bed23e3f41..f9a9c4792a 100755 --- a/linux/keyman-config/keyman_config/install_kmp.py +++ b/linux/keyman-config/keyman_config/install_kmp.py @@ -283,8 +283,11 @@ class InstallKmp(): def extract_kmp(kmpfile, directory): - with zipfile.ZipFile(kmpfile, "r") as zip_ref: - zip_ref.extractall(directory) + try: + with zipfile.ZipFile(kmpfile, "r") as zip_ref: + zip_ref.extractall(directory) + except zipfile.BadZipFile as e: + raise InstallError(InstallStatus.Abort, e) def process_keyboard_data(keyboardID, packageDir) -> None: diff --git a/linux/keyman-config/keyman_config/install_window.py b/linux/keyman-config/keyman_config/install_window.py index 2220012326..71605a3f4b 100755 --- a/linux/keyman-config/keyman_config/install_window.py +++ b/linux/keyman-config/keyman_config/install_window.py @@ -49,6 +49,7 @@ class InstallKmpWindow(Gtk.Dialog): def __init__(self, kmpfile, online=False, viewkmp=None, language=None): logging.debug("InstallKmpWindow: kmpfile: %s", kmpfile) + self.is_error = False self.kmpfile = kmpfile self.online = online self.viewwindow = viewkmp @@ -68,7 +69,13 @@ class InstallKmpWindow(Gtk.Dialog): mainhbox = Gtk.Box() with tempfile.TemporaryDirectory() as tmpdirname: - extract_kmp(kmpfile, tmpdirname) + try: + extract_kmp(kmpfile, tmpdirname) + except InstallError as e: + self._handle_install_error(e, kmpfile) + self.is_error = True + return + info, system, options, keyboards, files = get_metadata(tmpdirname) if not keyboards: # Likely not a keyboard .kmp file @@ -358,27 +365,30 @@ class InstallKmpWindow(Gtk.Dialog): dialog.run() dialog.destroy() except InstallError as e: - if e.status == InstallStatus.Abort: - message = _("Keyboard {name} could not be installed.").format(name=self.kbname) \ - + "\n\n" + _("Error Message:") + "\n %s" % (e.message) - logging.error(message) - message_type = Gtk.MessageType.ERROR - else: - message = _("Keyboard {name} could not be installed.").format(name=self.kbname) \ - + "\n\n" + _("Warning Message:") + "\n %s" % (e.message) - logging.warning(message) - message_type = Gtk.MessageType.WARNING - dialog = Gtk.MessageDialog( - self, 0, message_type, - Gtk.ButtonsType.OK, message) - dialog.run() - dialog.destroy() + self._handle_install_error(e, self.kbname) self.close() def on_cancel_clicked(self, button): logging.info("Cancel install keyboard") self.response(Gtk.ResponseType.CANCEL) + def _handle_install_error(self, e, kbname): + if e.status == InstallStatus.Abort: + message = _("Keyboard {name} could not be installed.").format(name=kbname) \ + + "\n\n" + _("Error Message:") + "\n %s" % (e.message) + logging.error(message) + message_type = Gtk.MessageType.ERROR + else: + message = _("Keyboard {name} could not be installed.").format(name=kbname) \ + + "\n\n" + _("Warning Message:") + "\n %s" % (e.message) + logging.warning(message) + message_type = Gtk.MessageType.WARNING + dialog = Gtk.MessageDialog( + self, 0, message_type, + Gtk.ButtonsType.OK, message) + dialog.run() + dialog.destroy() + def main(argv): if len(sys.argv) != 2: diff --git a/linux/keyman-config/keyman_config/view_installed.py b/linux/keyman-config/keyman_config/view_installed.py index 959c0196d9..6684cc2aa3 100755 --- a/linux/keyman-config/keyman_config/view_installed.py +++ b/linux/keyman-config/keyman_config/view_installed.py @@ -81,6 +81,8 @@ class ViewInstalledWindowBase(Gtk.Window): def install_file(self, kmpfile, language=None): installDlg = InstallKmpWindow(kmpfile, viewkmp=self, language=language) + if installDlg.is_error: + return Gtk.ResponseType.CANCEL result = installDlg.run() installDlg.destroy() return result