| <?php |
|
|
| namespace Kanboard\Core\Plugin; |
|
|
| use ZipArchive; |
| use Kanboard\Core\Tool; |
|
|
| |
| |
| |
| |
| |
| |
| class Installer extends \Kanboard\Core\Base |
| { |
| |
| |
| |
| |
| |
| |
| |
| public static function isConfigured() |
| { |
| return PLUGIN_INSTALLER && is_writable(PLUGINS_DIR) && extension_loaded('zip'); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function install($archiveUrl) |
| { |
| $zip = $this->downloadPluginArchive($archiveUrl); |
|
|
| if (! $zip->extractTo(PLUGINS_DIR)) { |
| $this->cleanupArchive($zip); |
| throw new PluginInstallerException(t('Unable to extract plugin archive.')); |
| } |
|
|
| $this->cleanupArchive($zip); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function uninstall($pluginId) |
| { |
| $pluginFolder = PLUGINS_DIR.DIRECTORY_SEPARATOR.basename($pluginId); |
|
|
| if (! file_exists($pluginFolder)) { |
| throw new PluginInstallerException(t('Plugin not found.')); |
| } |
|
|
| if (! is_writable($pluginFolder)) { |
| throw new PluginInstallerException(e('You don\'t have the permission to remove this plugin.')); |
| } |
|
|
| Tool::removeAllFiles($pluginFolder); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function update($archiveUrl) |
| { |
| $zip = $this->downloadPluginArchive($archiveUrl); |
|
|
| $firstEntry = $zip->statIndex(0); |
| $this->uninstall($firstEntry['name']); |
|
|
| if (! $zip->extractTo(PLUGINS_DIR)) { |
| $this->cleanupArchive($zip); |
| throw new PluginInstallerException(t('Unable to extract plugin archive.')); |
| } |
|
|
| $this->cleanupArchive($zip); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| protected function downloadPluginArchive($archiveUrl) |
| { |
| $zip = new ZipArchive(); |
| $archiveData = $this->httpClient->get($archiveUrl); |
| $archiveFile = tempnam(ini_get('upload_tmp_dir') ? ini_get('upload_tmp_dir') : sys_get_temp_dir(), 'kb_plugin'); |
|
|
| if (empty($archiveData)) { |
| unlink($archiveFile); |
| throw new PluginInstallerException(t('Unable to download plugin archive.')); |
| } |
|
|
| if (file_put_contents($archiveFile, $archiveData) === false) { |
| unlink($archiveFile); |
| throw new PluginInstallerException(t('Unable to write temporary file for plugin.')); |
| } |
|
|
| if ($zip->open($archiveFile) !== true) { |
| unlink($archiveFile); |
| throw new PluginInstallerException(t('Unable to open plugin archive.')); |
| } |
|
|
| if ($zip->numFiles === 0) { |
| unlink($archiveFile); |
| throw new PluginInstallerException(t('There is no file in the plugin archive.')); |
| } |
|
|
| return $zip; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| protected function cleanupArchive(ZipArchive $zip) |
| { |
| $filename = $zip->filename; |
| $zip->close(); |
| unlink($filename); |
| } |
| } |
|
|