Download, verify, check, unzip, copy, remove temporary stuff for Serendipity Update: ' . $_REQUEST['serendipity']['newVersion'] . ' may take a little while...
'); $this->show_message('
PHP max execution time set to 210 seconds
'); if (false === ($update = $this->fetchUpdate($nv))) { $this->close_page(true); } serendipity_plugin_api::hook_event('backend_plugins_upgradecount', $pluginUpdates); if (empty($pluginUpdates)) { if (!empty($update)) { if ($this->verifyUpdate($update, $nv)) { if ($this->checkWritePermissions($update)) { $unpacked = $this->unpackUpdate($nv); if ($unpacked) { $disableIntegrityChecks = $this->get_config('disable_integrity_checks', false); if ($disableIntegrityChecks !== false || $this->checkIntegrity($nv)) { if ($disableIntegrityChecks !== false) { $this->set_config('disable_integrity_checks', false); //reset config $this->show_message("fcn checkIntegrity() skipped...\nReset 'disable_integrity_checks' to false\n"); } $copied = $this->copyUpdate($nv); if ($copied) { if (true === $this->cleanTemplatesC($nv, true) ) { $this->show_message('Cleanup download temp done!
'); } sleep(2); echo ''; sleep(2); $this->show_message('click to start Serendipity Installer here!
'); sleep(1); $this->doUpdate();//$logmsg } else { $this->show_message('Copying the files for the update failed
'); } } else { $this->showChecksumErrors($nv); echo sprintf( '', $nv, $serendipity['version'][0] > 1 ? '' : '' ); } } else { $this->show_message('Unpacking the update failed
'); if (true === $this->cleanTemplatesC($nv, false)) { $this->show_message('Cleaning up the failed unpack directory!
'); } $this->show_message('Please reload this page by F5 to have another try upgrading your Blog successfully!
'); } } else { $this->showNotWriteable($update); echo ''; } } } } else { $this->show_message('Please update all your plugins first.
'); } $this->close_page(true); return true; break; default: return false; } } else { return false; } } /** * fetch the zip file from server * @param string $version Version * @return mixed updatepath/bool */ function fetchUpdate($version) { global $serendipity; $url = (string)"https://github.com/s9y/Serendipity/releases/download/$version/serendipity-$version.zip"; if (strpos($version, 'beta') !== FALSE) { $url = (string)"https://github.com/s9y/Serendipity/archive/$version.zip"; } $update = (string)$serendipity ['serendipityPath'] . 'templates_c/' . "serendipity-$version.zip"; // do we already have it and is it eventually broken? if (file_exists($update)) { $zip = new ZipArchive; $res = $zip->open($update); if ($res === TRUE) { $done = true; } else { $this->show_message('Existing Zip file Error, Code:' . $res. '. The autoupdater will try to download again...'); @unlink($update); sleep(1); $done = @copy($url, $update) ? true : false; sleep(1); } $zip->close(); } else { $done = @copy($url, $update) ? true : false; sleep(1); } if (!$done) { //try it again with curl if copy was forbidden if (function_exists('curl_init')) { $out = @fopen($update, 'wb'); $ch = @curl_init(); @curl_setopt($ch, CURLOPT_FILE, $out); @curl_setopt($ch, CURLOPT_HEADER, 0); @curl_setopt($ch, CURLOPT_URL, $url); $success = @curl_exec($ch); if (!$success) { $this->show_message('
Downloading update failed (curl installed, but failed). Does '. $url .' exist?
'); return false; } } else { $this->show_message('Downloading update failed (copy failed, curl not available). Does '. $url .' exist?
'); return false; } } $this->show_message('Fetch download to templates_c done
'); return $update; } /** * compare the md5 of downloaded archive with the md5 posted on the downloadpage * @param string updatePath * @param string version * @return boolean */ function verifyUpdate($update, $version) { $url = (string)"https://github.com/s9y/Serendipity/releases/download/$version/serendipity-$version.zip"; $updatePage = (string)$this->getPage("https://github.com/s9y/Serendipity/releases/tag/$version"); $found = array(); // grep the checksum preg_match("/\(MD5: (.*)\)/", $updatePage, $found); $checksum = $found[1]; $this->show_message('Checking MD5 zip file checksum: ' . $checksum . '
'); $check = md5_file($update); if (strpos($version, 'beta') !== FALSE) { return true; } if ($check == $checksum) { return true; } else { $this->show_message('Error. Could not verify the update.
'); return false; } } /** * get file content of updatePage * @param string url * @return page content */ function getPage($url) { $page = file_get_contents($url); if (empty($page)) { //try it again with curl if fopen was forbidden if (function_exists('curl_init')) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, "20"); $page = curl_exec($ch); curl_close($ch); } } return $page; } /** * unpack the update to templates_c * @param string version * @return boolean */ function unpackUpdate($version) { global $serendipity; $update = (string)$serendipity['serendipityPath'] . 'templates_c/' . "serendipity-$version.zip"; $updateDir = (string)$serendipity['serendipityPath'] . 'templates_c/' . "serendipity-$version/"; // do we already have it? if (is_dir($updateDir) && is_file($updateDir . '/serendipity/README.markdown') && is_file($updateDir . '/serendipity/checksums.inc.php')) { return true; } $zip = new ZipArchive; if ($zip->open($update) === true) { // 1.get all filenames apart from the root 'serendipity' $i=1; $files = array(); $name = $zip->getNameIndex($i); while (!empty($name)) { $files[] = $name; $name = $zip->getNameIndex($i); $i+=1; } // 2.extraxt all files to temp $zip->extractTo($updateDir); $this->show_message('Extracting the zip in templates_c done
'); $zip->close(); } else { return false; } return true; } /** * copy the update from templates_c over the existing files * @param string version * @return boolean */ function copyUpdate($version) { global $serendipity; $update = (string)$serendipity['serendipityPath'] . 'templates_c/' . "serendipity-$version.zip"; $updateDir = (string)$serendipity['serendipityPath'] . 'templates_c/' . "serendipity-$version/"; $zip = new ZipArchive; if ($zip->open($update) === true) { // 1.get all filenames apart from the root 'serendipity' $i=1; $files = array(); $name = $zip->getNameIndex($i); while ( !empty($name) ) { $files[] = $name; $name = $zip->getNameIndex($i); $i+=1; } $zip->close(); // 2. copy them over foreach ($files as $file) { $target = $serendipity['serendipityPath'] . preg_replace('/[^\/]*/', '', $file, 1); # removes leading Serendipity[beta…] if (is_dir($updateDir .$file)) { if (!file_exists($target)) { $success = mkdir($target); } else { $success = true; } } else { $success = @copy($updateDir . $file, $target); } if (!$success) { $this->show_message('Error copying file '. $updateDir . $file .' to '. $target .'
'); return false; } } } else { return false; } return true; } /** * check write permissions * @param string updatePath * @return boolean */ function checkWritePermissions($update) { global $serendipity; $zip = new ZipArchive; if ($zip->open($update) === true) { $i=0; $files = array(); $name = $zip->getNameIndex($i); while (!empty($name)) { $files[] = $name; $name = $zip->getNameIndex($i); $i+=1; } $zip->close(); foreach ($files as $file) { $target = $serendipity['serendipityPath'] . substr($file, 12); if ((!is_writable($target)) && file_exists($target)) { return false; } } } return true; } /** * show not writable * @param string updatePath * @return error */ function showNotWriteable($update) { global $serendipity; $zip = new ZipArchive; if ($zip->open($update) === true) { $i=0; $files = array(); $name = $zip->getNameIndex($i); while (!empty($name)) { $files[] = $name; $name = $zip->getNameIndex($i); $i+=1; } $zip->close(); $notWritable = array(); foreach ($files as $file) { $target = $serendipity['serendipityPath'] . substr($file, 12); if ((!is_writable($target)) && file_exists($target)) { $notWriteable[] = $target; } } } ob_start(); echo 'Unpacking the update failed, because following files were not writeable:
'; echo "- ";
foreach ($notWriteable as $file) {
echo "
- $file "; } echo "
'.PLUGIN_EVENT_AUTOUPDATE_ERROR_INTEGRITY_CHECKS.'
'; echo '- ';
foreach ($errors as $file) {
echo "
- $file "; } echo '