function fetch_latest_version() { $last_update_timestamp = WT_Site::preference('LATEST_WT_VERSION_TIMESTAMP'); if ($last_update_timestamp < WT_TIMESTAMP - 24 * 60 * 60) { $row = WT_DB::prepare("SHOW VARIABLES LIKE 'version'")->fetchOneRow(); $params = '?w=' . WT_VERSION . '&p=' . PHP_VERSION . '&m=' . $row->value . '&o=' . (DIRECTORY_SEPARATOR == '/' ? 'u' : 'w'); $latest_version_txt = WT_File::fetchUrl('http://svn.webtrees.net/build/latest-version.txt' . $params); if ($latest_version_txt) { WT_Site::preference('LATEST_WT_VERSION', $latest_version_txt); WT_Site::preference('LATEST_WT_VERSION_TIMESTAMP', WT_TIMESTAMP); return $latest_version_txt; } else { // Cannot connect to server - use cached version (if we have one) return WT_Site::preference('LATEST_WT_VERSION'); } } else { return WT_Site::preference('LATEST_WT_VERSION'); } }
public static function fetchUrl($url, $stream = null) { $host = parse_url($url, PHP_URL_HOST); $port = parse_url($url, PHP_URL_PORT); $path = parse_url($url, PHP_URL_PATH); $query = parse_url($url, PHP_URL_QUERY); if (!$port) { $port = parse_url($url, PHP_URL_SCHEME) == 'https' ? 443 : 80; } $scheme = $port == 443 ? 'ssl://' : ''; $fp = @fsockopen($scheme . $host, $port, $errno, $errstr, 5); if (!$fp) { return null; } fputs($fp, "GET {$path}?{$query} HTTP/1.0\r\nHost: {$host}\r\nConnection: Close\r\n\r\n"); // The first part of the response include the HTTP headers $response = fread($fp, 65536); // The file has moved? Follow it. if (preg_match('/^HTTP\\/1.[01] 30[23].+\\nLocation: ([^\\r\\n]+)/s', $response, $match)) { fclose($fp); return WT_File::fetchUrl($match[1], $stream); } else { // The response includes headers, a blank line, then the content $response = substr($response, strpos($response, "\r\n\r\n") + 4); } if ($stream) { fwrite($stream, $response); while ($tmp = fread($fp, 8192)) { fwrite($stream, $tmp); } fclose($fp); return null; } else { while ($tmp = fread($fp, 8192)) { $response .= $tmp; } fclose($fp); return $response; } }
} else { echo '<br>', WT_I18N::translate('Unable to create %s. Check the permissions.', '<span dir="ltr">' . $filename . '</span>'), $icon_failure; } flush(); } echo '</li>'; //////////////////////////////////////////////////////////////////////////////// // Download a .ZIP file containing the new code //////////////////////////////////////////////////////////////////////////////// echo '<li>', WT_I18N::translate('Download %s…', $download_url_html); $zip_file = WT_DATA_DIR . basename($download_url); $zip_dir = WT_DATA_DIR . basename($download_url, '.zip'); $zip_stream = fopen($zip_file, 'w'); reset_timeout(); $start_time = microtime(true); WT_File::fetchUrl($download_url, $zip_stream); $end_time = microtime(true); $zip_size = filesize($zip_file); fclose($zip_stream); echo '<br>', WT_I18N::translate('%1$sKB were downloaded in %2$s seconds.', WT_I18N::number($zip_size / 1024), WT_I18N::number($end_time - $start_time, 2)); if ($zip_size) { echo $icon_success; } else { echo $icon_failure; // Guess why we might have failed... if (preg_match('/^https:/', $download_url) && !in_array('ssl', stream_get_transports())) { echo '<br>', WT_I18N::translate('This server does not support secure downloads using HTTPS.'); } } echo '</li>'; flush();