def on_error(func, path, error): if func == os.path.islink: # if symlink os.unlink(path) return # access is denied or other raise PluginsystemError(error[1][1])
def install_from_zip(self, zip_filename, overwrite=None): ''' Install plugin from zip and return plugin ''' try: zip_file = zipfile.ZipFile(zip_filename) except zipfile.BadZipfile: # it is not zip file raise PluginsystemError(_('Archive corrupted')) except IOError: raise PluginsystemError(_('Archive empty')) if zip_file.testzip(): # CRC error raise PluginsystemError(_('Archive corrupted')) dirs = [] manifest = None for filename in zip_file.namelist(): if filename.startswith('.') or filename.startswith('/') or \ ('/' not in filename): # members not safe raise PluginsystemError(_('Archive is malformed')) if filename.endswith('/') and filename.find('/', 0, -1) < 0: dirs.append(filename.strip('/')) if 'manifest.ini' in filename.split('/')[1]: manifest = True if not manifest: return None if len(dirs) > 1: raise PluginsystemError(_('Archive is malformed')) plugin_name = dirs[0] user_dir = configpaths.get('PLUGINS_USER') plugin_path = user_dir / plugin_name if plugin_path.exists(): # Plugin dir already exists if not overwrite: raise PluginsystemError(_('Plugin already exists')) self.uninstall_plugin(self.get_plugin_by_path(str(plugin_path))) zip_file.extractall(user_dir) zip_file.close() plugin = self._load_plugin(plugin_path) if plugin is None: log.warning('Error while installing from zip') rmtree(plugin_path) raise PluginsystemError(_('Installation failed')) return self.add_plugin(plugin)
def install_from_zip(self, zip_filename, owerwrite=None): ''' Install plugin from zip and return plugin ''' try: zip_file = zipfile.ZipFile(zip_filename) except zipfile.BadZipfile: # it is not zip file raise PluginsystemError(_('Archive corrupted')) except IOError: raise PluginsystemError(_('Archive empty')) if zip_file.testzip(): # CRC error raise PluginsystemError(_('Archive corrupted')) dirs = [] manifest = None for filename in zip_file.namelist(): if filename.startswith('.') or filename.startswith('/') or \ ('/' not in filename): # members not safe raise PluginsystemError(_('Archive is malformed')) if filename.endswith('/') and filename.find('/', 0, -1) < 0: dirs.append(filename.strip('/')) if 'manifest.ini' in filename.split('/')[1]: manifest = True if not manifest: return if len(dirs) > 1: raise PluginsystemError(_('Archive is malformed')) user_dir = configpaths.get('PLUGINS_USER') plugin_dir = os.path.join(user_dir, dirs[0]) if os.path.isdir(plugin_dir): # Plugin dir already exists if not owerwrite: raise PluginsystemError(_('Plugin already exists')) self.uninstall_plugin(self.get_plugin_by_path(plugin_dir)) zip_file.extractall(user_dir) zip_file.close() plugins = self.scan_dir_for_plugins(plugin_dir, package=True) if not plugins: return self.add_plugin(plugins[0]) plugin = self.plugins[-1] return plugin