From 2c9519203717c4e8f18b62f41f550978f536fb52 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Mon, 20 Sep 2010 07:08:47 +0200 Subject: [PATCH] [Dicson] check for manifest file when installing a plugin. Fixes #5925 --- src/dialogs.py | 9 ++++++--- src/plugins/gui.py | 25 +++++++++++++++++------- src/plugins/pluginmanager.py | 37 ++++++++++++++++++++++-------------- 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index e9ca65d96..558c5af2c 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1467,12 +1467,15 @@ class WarningDialog(HigDialog): HIG compliant warning dialog """ - def __init__(self, pritext, sectext=''): + def __init__(self, pritext, sectext='', transient_for=None): HigDialog.__init__(self, None, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, pritext, sectext) self.set_modal(False) - if hasattr(gajim.interface, 'roster') and gajim.interface.roster: - self.set_transient_for(gajim.interface.roster.window) + if transient_for is None and hasattr(gajim.interface, 'roster') and \ + gajim.interface.roster: + transient_for = gajim.interface.roster.window + if transient_for: + self.set_transient_for(transient_for) self.popup() class InformationDialog(HigDialog): diff --git a/src/plugins/gui.py b/src/plugins/gui.py index aaecc707d..b0e526f1e 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -30,7 +30,7 @@ import pango import gtk, gobject import gtkgui_helpers -import dialogs +from dialogs import WarningDialog, YesNoDialog, ArchiveChooserDialog from common import gajim from plugins.helpers import log_calls, log from common.exceptions import PluginsystemError @@ -194,17 +194,26 @@ class PluginsWindow(object): try: gajim.plugin_manager.remove_plugin(plugin) except PluginsystemError, e: - dialogs.WarningDialog(_('Unable to properly remove the plugin'), + WarningDialog(_('Unable to properly remove the plugin'), str(e)) return model.remove(iter) @log_calls('PluginsWindow') def on_install_plugin_button_clicked(self, widget): + def show_warn_dialog(): + text = _('Archive is malformed') + dialog = WarningDialog(text, '', transient_for=self.window) + dialog.set_modal(False) + dialog.popup() + def _on_plugin_exists(zip_filename): def on_yes(is_checked): plugin = gajim.plugin_manager.install_from_zip(zip_filename, True) + if not plugin: + show_warn_dialog() + return model = self.installed_plugins_model for row in xrange(len(model)): @@ -216,8 +225,8 @@ class PluginsWindow(object): sel = self.installed_plugins_treeview.get_selection() sel.select_iter(iter_) - dialogs.YesNoDialog(_('Plugin already exists'), - sectext=_('Overwrite?'), on_response_yes=on_yes) + YesNoDialog(_('Plugin already exists'), sectext=_('Overwrite?'), + on_response_yes=on_yes) def _try_install(zip_filename): try: @@ -228,15 +237,17 @@ class PluginsWindow(object): _on_plugin_exists(zip_filename) return - dialogs.WarningDialog(error_text, '"%s"' % zip_filename) + WarningDialog(error_text, '"%s"' % zip_filename) + return + if not plugin: + show_warn_dialog() return - model = self.installed_plugins_model iter_ = model.append([plugin, plugin.name, False]) sel = self.installed_plugins_treeview.get_selection() sel.select_iter(iter_) - self.dialog = dialogs.ArchiveChooserDialog(on_response_ok=_try_install) + self.dialog = ArchiveChooserDialog(on_response_ok=_try_install) class GajimPluginConfigDialog(gtk.Dialog): diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py index de3d4e059..d535081ae 100644 --- a/src/plugins/pluginmanager.py +++ b/src/plugins/pluginmanager.py @@ -431,6 +431,12 @@ class PluginManager(object): if module is None: continue + + manifest_path = os.path.join(os.path.dirname(file_path), + 'manifest.ini') + if scan_dirs and (not os.path.isfile(manifest_path)): + continue + log.debug('Attributes processing started') for module_attr_name in [attr_name for attr_name in dir(module) if not (attr_name.startswith('__') or attr_name.endswith('__'))]: @@ -445,11 +451,7 @@ class PluginManager(object): module_attr.__path__ = os.path.abspath( os.path.dirname(file_path)) - manifest_path = os.path.join(module_attr.__path__, - 'manifest.ini') # read metadata from manifest.ini - if not os.path.isfile(manifest_path): - continue conf.readfp(open(manifest_path, 'r')) for option in fields: if conf.get('info', option) is '': @@ -484,6 +486,7 @@ class PluginManager(object): raise PluginsystemError(_('Archive corrupted')) dirs = [] + manifest = None for filename in zip_file.namelist(): if filename.startswith('.') or filename.startswith('/') or \ ('/' not in filename): @@ -491,16 +494,18 @@ class PluginManager(object): raise PluginsystemError(_('Archive is malformed')) if filename.endswith('/') and filename.find('/', 0, -1) < 0: dirs.append(filename) - + if 'manifest.ini' in filename.split('/')[1]: + manifest = True + if not manifest: + return if len(dirs) > 1: - # several directories in the root of the archive raise PluginsystemError(_('Archive is malformed')) base_dir, user_dir = gajim.PLUGINS_DIRS plugin_dir = os.path.join(user_dir, dirs[0]) if os.path.isdir(plugin_dir): - # Plugin already exists + # Plugin dir already exists if not owerwrite: raise PluginsystemError(_('Plugin already exists')) self.remove_plugin(self.get_plugin_by_path(plugin_dir)) @@ -508,7 +513,10 @@ class PluginManager(object): zip_file.extractall(user_dir) zip_file.close() path = os.path.join(user_dir, dirs[0]) - self.add_plugin(self.scan_dir_for_plugins(plugin_dir, False)[0]) + plugins = self.scan_dir_for_plugins(plugin_dir, False) + if not plugins: + return + self.add_plugin(plugins[0]) plugin = self.plugins[-1] return plugin @@ -524,12 +532,13 @@ class PluginManager(object): # access is denied or other raise PluginsystemError(error[1]) - if plugin.active: - self.deactivate_plugin(plugin) - rmtree(plugin.__path__, False, on_error) - self.plugins.remove(plugin) - if self._plugin_has_entry_in_global_config(plugin): - self._remove_plugin_entry_in_global_config(plugin) + if plugin: + if plugin.active: + self.deactivate_plugin(plugin) + rmtree(plugin.__path__, False, on_error) + self.plugins.remove(plugin) + if self._plugin_has_entry_in_global_config(plugin): + self._remove_plugin_entry_in_global_config(plugin) def get_plugin_by_path(self, plugin_dir): for plugin in self.plugins: