[Dicson] check for manifest file when installing a plugin. Fixes #5925

This commit is contained in:
Yann Leboulanger 2010-09-20 07:08:47 +02:00
parent 463eade6dc
commit 2c95192037
3 changed files with 47 additions and 24 deletions

View File

@ -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):

View File

@ -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):

View File

@ -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: