/** * Handle uploaded plugin * * @return string HTML or error message * */ function MONITOR_plugin_upload($plugin = '') { global $_CONF, $_MONITOR_CONF, $_TABLES; $retval = ''; if ($plugin == '' || $_MONITOR_CONF['repository'] == '') { return; } $url = "https://api.github.com/repos/{$_MONITOR_CONF['repository']}/" . $plugin . '/releases'; //Get last release for this plugin $releases = MONITOR_curlRequestOnGitApi($url); $version = $releases[0]['tag_name']; $path_admin = $_CONF['path_html'] . substr($_CONF['site_admin_url'], strlen($_CONF['site_url']) + 1) . '/'; $upload_success = false; //Download the zip file from repository $source = "https://codeload.github.com/{$_MONITOR_CONF['repository']}/{$plugin}/zip/{$version}"; $destination = fopen($_CONF['path_data'] . $plugin . '.zip', 'w+'); set_time_limit(0); // unlimited max execution time $options = array(CURLOPT_FILE => $destination, CURLOPT_TIMEOUT => 28800, CURLOPT_URL => $source, CURLOPT_USERAGENT => $_MONITOR_CONF['repository'], CURLOPT_SSL_VERIFYPEER => false); $ch = curl_init(); curl_setopt_array($ch, $options); $result = curl_exec($ch); curl_close($ch); $plugin_file = $_CONF['path_data'] . $plugin . '.zip'; // Name the plugin file if (!file_exists($plugin_file)) { COM_errorLog('MONITOR - Download failed for Plugin: ' . $plugin); return 'Download failed for Plugin: ' . $plugin; } else { chmod($plugin_file, 0755); } require_once $_CONF['path_system'] . 'classes/unpacker.class.php'; $archive = new unpacker($plugin_file, 'application/x-zip'); if ($archive == false) { return 72; } COM_errorLog('MONITOR - Download ' . $plugin . ' plugin: ok'); $pi_did_exist = false; // plugin directory already existed $pi_had_entry = false; // plugin had an entry in the database $pi_was_enabled = false; // plugin was enabled $alternate = false; if (file_exists($_CONF['path'] . 'plugins/' . $plugin)) { $pi_did_exist = true; // plugin directory already exists $pstatus = DB_query("SELECT pi_name, pi_enabled FROM {$_TABLES['plugins']} WHERE pi_name = '{$plugin}'"); $A = DB_fetchArray($pstatus); if (isset($A['pi_name'])) { $pi_had_entry = true; $pi_was_enabled = $A['pi_enabled'] == 1; } if ($pi_was_enabled) { // disable temporarily while we move the files around DB_change($_TABLES['plugins'], 'pi_enabled', 0, 'pi_name', $plugin); COM_errorLog('MONITOR - Disable Plugin: ' . $plugin); } require_once 'System.php'; $plugin_dir = $_CONF['path'] . 'plugins/' . $plugin; if (file_exists($plugin_dir . '.previous')) { @System::rm('-rf ' . $plugin_dir . '.previous'); } if (file_exists($plugin_dir)) { rename($plugin_dir, $plugin_dir . '.previous'); COM_errorLog('MONITOR - Rename: ' . $plugin_dir . ' to ' . $plugin_dir . '.previous'); } $public_dir = $_CONF['path_html'] . $plugin; if (file_exists($public_dir . '.previous')) { @System::rm('-rf ' . $public_dir . '.previous'); } if (file_exists($public_dir)) { rename($public_dir, $public_dir . '.previous'); COM_errorLog('MONITOR - Rename: ' . $public_dir . ' to ' . $public_dir . '.previous'); } $admin_dir = $path_admin . 'plugins/' . $plugin; if (file_exists($admin_dir . '.previous')) { @System::rm('-rf ' . $admin_dir . '.previous'); } if (file_exists($admin_dir)) { rename($admin_dir, $admin_dir . '.previous'); COM_errorLog('MONITOR - Rename: ' . $admin_dir . ' to ' . $admin_dir . '.previous'); } } $upload_success = false; // Extract the uploaded archive to the data directory $upload_success = $archive->unpack($_CONF['path_data']); if (!$upload_success) { //Try alternative unzip unset($archive); require_once 'Archive/Zip.php'; $archive = new Archive_Zip($plugin_file); if ($archive == false) { return 72; } $params = array('add_path' => $_CONF['path_data']); $extract = $archive->extract($params); if (is_array($extract)) { $upload_success = true; } $alternate = true; } if (!$upload_success) { COM_errorLog("MONITOR - Can't unzip the archive. Update for {$plugin_dir} plugin failed! Please check the archive in your data folder. Could be an OS issue during unzip."); if (file_exists($plugin_dir . '.previous')) { rename($plugin_dir . '.previous', $plugin_dir); COM_errorLog('MONITOR - Rename: ' . $plugin_dir . '.previous' . ' to ' . $plugin_dir); } if (file_exists($public_dir . '.previous')) { rename($public_dir . '.previous', $public_dir); COM_errorLog('MONITOR - Rename: ' . $public_dir . '.previous' . ' to ' . $public_dir); } if (file_exists($admin_dir . '.previous')) { rename($admin_dir . '.previous', $admin_dir); COM_errorLog('MONITOR - Rename: ' . $admin_dir . '.previous' . ' to ' . $admin_dir); } if ($pi_was_enabled) { DB_change($_TABLES['plugins'], 'pi_enabled', 1, 'pi_name', $plugin); COM_errorLog('MONITOR - Enable Plugin: ' . $plugin); } return 72; exit; } else { //Move files to plugins directory COM_errorLog('MONITOR - Plugin update: ' . $plugin); if (!$alternate) { $folder_name = $archive->getdir(); } else { $listcontent = $archive->listContent(); $folder_name = $listcontent[0]['filename']; if (substr($folder_name, -1) == '/') { $folder_name = substr($folder_name, 0, -1); } } if ($folder_name == '') { exit; } $srcDir = $_CONF['path_data'] . $folder_name; $destDir = $_CONF['path'] . 'plugins/' . $plugin; //Move from data folder to plugins folder rename($srcDir, $destDir); $plg_path = $_CONF['path'] . 'plugins/' . $plugin . '/'; if (file_exists($plg_path . 'public_html')) { rename($plg_path . 'public_html', $_CONF['path_html'] . $plugin); COM_errorLog('MONITOR - Move ' . $plg_path . 'public_html to ' . $_CONF['path_html'] . $plugin); } else { COM_errorLog('MONITOR - ' . $plg_path . 'public_html does not exist'); } if (file_exists($plg_path . 'admin')) { rename($plg_path . 'admin', $path_admin . 'plugins/' . $plugin); COM_errorLog('MONITOR - Move ' . $plg_path . 'admin to ' . $path_admin . 'plugins/' . $plugin); } else { COM_errorLog('MONITOR - ' . $plg_path . 'admin does not exist'); } unset($archive); // Collect some garbage // cleanup when uploading a new version if ($pi_did_exist) { $plugin_dir = $_CONF['path'] . 'plugins/' . $plugin; if (file_exists($plugin_dir . '.previous')) { @System::rm('-rf ' . $plugin_dir . '.previous'); } $public_dir = $_CONF['path_html'] . $plugin; if (file_exists($public_dir . '.previous')) { @System::rm('-rf ' . $public_dir . '.previous'); } $admin_dir = $path_admin . 'plugins/' . $plugin; if (file_exists($admin_dir . '.previous')) { @System::rm('-rf ' . $admin_dir . '.previous'); } if ($pi_was_enabled) { DB_change($_TABLES['plugins'], 'pi_enabled', 1, 'pi_name', $plugin); COM_errorLog('MONITOR - Enable Plugin: ' . $plugin); } } $msg_with_plugin_name = false; if ($pi_did_exist) { if ($pi_was_enabled) { // check if we have to perform an update $pi_version = DB_getItem($_TABLES['plugins'], 'pi_version', "pi_name = '{$plugin}'"); $code_version = PLG_chkVersion($plugin); COM_errorLog('MONITOR - Reading' . $plugin . ' plugin installed version: ' . $pi_version . ' and code version: ' . $code_version); if (!empty($code_version) && $code_version != $pi_version) { /** * At this point, we would have to call PLG_upgrade(). * However, we've loaded the plugin's old functions.inc * (in lib-common.php). We can't load the new one here * now since that would result in duplicate function * definitions. Solution: Trigger a reload (with the new * functions.inc) and continue there. */ $url = $_CONF['site_admin_url'] . '/plugins/monitor/index.php' . '?action=continue_upgrade' . '&codeversion=' . urlencode($code_version) . '&piversion=' . urlencode($pi_version) . '&plugin_update=' . urlencode($plugin); COM_errorLog('MONITOR - Update Plugin ' . $plugin . ' from version: ' . $pi_version . ' to code version: ' . $code_version); echo COM_refresh($url); exit; } else { $msg = 98; // successfully uploaded } } else { $msg = 98; // successfully uploaded } } elseif (file_exists($plg_path . 'autoinstall.php')) { // if the plugin has an autoinstall.php, install it now if (plugin_autoinstall($plugin)) { PLG_pluginStateChange($plugin, 'installed'); $msg = 44; // successfully installed } else { $msg = 72; // an error occured while installing the plugin } } else { $msg = 98; // successfully uploaded } } return $msg; }