From 683d75db31caf5074764e6e748421f7e028a8e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Marczykowska-G=C3=B3recka?= Date: Fri, 15 May 2020 08:21:03 +0200 Subject: [PATCH] Better error handling for opening VM settings in Qube Manager No more silent errors - the user will get an error message. fixes QubesOS/qubes-issues#5810 --- qubesmanager/qube_manager.py | 68 ++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/qubesmanager/qube_manager.py b/qubesmanager/qube_manager.py index 137a8b1..807b88e 100644 --- a/qubesmanager/qube_manager.py +++ b/qubesmanager/qube_manager.py @@ -1042,43 +1042,51 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow): "ERROR: {1}").format(vm.name, ex)) return + def open_settings(self, vm, tab='basic'): + try: + with common_threads.busy_cursor(): + settings_window = settings.VMSettingsWindow( + vm, self.qt_app, tab) + settings_window.exec_() + except exc.QubesException as ex: + QtWidgets.QMessageBox.warning( + self, + self.tr("Qube settings unavailable"), + self.tr( + "Qube settings cannot be opened. The qube might have " + "been removed or unavailable due to policy settings." + "\nError: {}".format(str(ex)))) + return + + vm_deleted = False + + try: + # the VM might not exist after running Settings - it might + # have been cloned or removed + self.vms_in_table[vm.qid].update() + except exc.QubesException: + vm_deleted = True + + if vm_deleted: + for row in self.vms_in_table: + try: + self.vms_in_table[row].update() + except exc.QubesException: + pass + # noinspection PyArgumentList @QtCore.pyqtSlot(name='on_action_settings_triggered') def action_settings_triggered(self): vm = self.get_selected_vm() if vm: - with common_threads.busy_cursor(): - settings_window = settings.VMSettingsWindow( - vm, self.qt_app, "basic") - settings_window.exec_() - - vm_deleted = False - - try: - # the VM might not exist after running Settings - it might - # have been cloned or removed - self.vms_in_table[vm.qid].update() - except exc.QubesException: - # TODO: this will be replaced by proper signal handling once - # settings are migrated to AdminAPI - vm_deleted = True - - if vm_deleted: - for row in self.vms_in_table: - try: - self.vms_in_table[row].update() - except exc.QubesException: - pass + self.open_settings(vm, "basic") # noinspection PyArgumentList @QtCore.pyqtSlot(name='on_action_appmenus_triggered') def action_appmenus_triggered(self): vm = self.get_selected_vm() if vm: - with common_threads.busy_cursor(): - settings_window = settings.VMSettingsWindow( - vm, self.qt_app, "applications") - settings_window.exec_() + self.open_settings(vm, "applications") # noinspection PyArgumentList @QtCore.pyqtSlot(name='on_action_updatevm_triggered') @@ -1136,11 +1144,9 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow): # noinspection PyArgumentList @QtCore.pyqtSlot(name='on_action_editfwrules_triggered') def action_editfwrules_triggered(self): - with common_threads.busy_cursor(): - vm = self.get_selected_vm() - settings_window = settings.VMSettingsWindow(vm, self.qt_app, - "firewall") - settings_window.exec_() + vm = self.get_selected_vm() + if vm: + self.open_settings(vm, "firewall") # noinspection PyArgumentList @QtCore.pyqtSlot(name='on_action_global_settings_triggered')