/** * Generate a user agent string * @param boolean Mask the user agent as Mozilla or Joomla! * @return string a user agent string */ function generateUAString($mask = true) { $version = new JVersion(); $lang =& JFactory::getLanguage(); $parts = array(); if ($mask) { $parts[] = 'Mozilla/5.0'; } else { $parts[] = 'Joomla!'; } $parts[] = '(Joomla; PHP; ' . PHP_OS . '; ' . $lang->getTag() . '; rv:1.9.1)'; $parts[] = 'Joomla/' . $version->getShortVersion(); $parts[] = 'JUpdateMan/' . getComponentVersion(); return implode(' ', $parts); }
function downloadFile($url, $target = false, &$params = null) { if (!function_exists('curl_init')) { $error_object = new stdClass(); $error_object->number = 40; $error_object->message = 'cURL support not available on this host. Use fopen instead.'; return $error_object; } $config =& JFactory::getConfig(); if (is_null($params)) { $params = new JParameter(); } $php_errormsg = ''; // Set the error message $track_errors = ini_set('track_errors', true); // Set track errors // create a new cURL resource $ch = curl_init(); // set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, $url); // Set the download URL curl_setopt($ch, CURLOPT_HEADER, false); // Don't include the header in the output curl_setopt($ch, CURLOPT_USERAGENT, generateUAString()); // set the user agent curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // follow redirects (required for Joomla!) curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // 10 maximum redirects // curl_setopt($ch, CURLOPT_HEADERFUNCTION, // set a custom header callback // array($this, 'header_callback')); // use this object and function 'header_callback' if (!$target) { $target = $config->getValue('config.tmp_path') . DS . Downloader::getFilenameFromURL($url); } juimport('pasamio.pfactory'); $output_stream = PFactory::getStream(true, true, 'JUpdateMan/' . getComponentVersion(), true); $relative_target = str_replace(JPATH_ROOT, '', $target); $output_handle = $output_stream->open($relative_target, 'wb'); //$output_handle = @fopen($target, "wb"); // Open a location if (!$output_handle) { $error_object->number = 43; $error_object->message = 'Local output opening failed: ' . $output_stream->getError(); ini_set('track_errors', $track_errors); return $error_object; } // since we're using streams we should be able to get everything up and running fine here curl_setopt($ch, CURLOPT_FILE, $output_stream->getFileHandle()); if ($params->get('use_proxy', 0) && strlen($params->get('proxy_host', '')) && strlen($params->get('proxy_port', ''))) { curl_setopt($ch, CURLOPT_PROXY, $params->get('proxy_host') . ':' . $params->get('proxy_port')); if (strlen($params->get('proxy_user', ''))) { curl_setopt($ch, CURLOPT_PROXYUSERPWD, $params->get('proxy_user') . ':' . $params->get('proxy_pass', '')); } } // grab URL and pass it to the browser if (curl_exec($ch) === false) { $error_object->number = 46; $error_object->message = 'cURL transfer failed(' . curl_errno($ch) . '): ' . curl_error($ch); ini_set('track_errors', $track_errors); return $error_object; } // close cURL resource, and free up system resources curl_close($ch); $output_stream->close(); return basename($target); }
function downloadFile($url, $target = false, &$params = null) { // this isn't intelligent some times $error_object = new stdClass(); $proxy = false; $php_errormsg = ''; // Set the error message $track_errors = ini_set('track_errors', true); // Set track errors $config =& JFactory::getConfig(); if (is_null($params)) { $params = new JParameter(); } $input_handle = null; // Are we on a version of PHP that supports streams? if (version_compare(PHP_VERSION, '5.0.0', '>')) { // set the ua; we could use ini_set but it might not work $http_opts = array('user_agent' => generateUAString()); // If: // - the proxy is enabled, // - the host is set and the port are set // Set the proxy settings and create a stream context if ($params->get('use_proxy', 0) && strlen($params->get('proxy_host', '')) && strlen($params->get('proxy_port', ''))) { $proxy = true; // I hate eclipse sometimes // If the user has a proxy username set fill this in as well $http_opts['proxy'] = 'tcp://' . $params->get('proxy_host') . ':' . $params->get('proxy_port'); $http_opts['request_fulluri'] = 'true'; // play nicely with squid if (strlen($params->get('proxy_user', ''))) { $credentials = base64_encode($params->get('proxy_user', '') . ':' . $params->get('proxy_pass', '')); $http_opts['header'] = "Proxy-Authorization: Basic {$credentials}\r\n"; } } $context = stream_context_create(array('http' => $http_opts)); $input_handle = @fopen($url, 'r', false, $context); } else { // Open remote server ini_set('user_agent', generateUAString()); // set the ua $input_handle = @fopen($url, "r"); // or die("Remote server connection failed"); } if (!$input_handle) { $error_object->number = 42; $error_object->message = 'Remote Server connection failed: ' . $php_errormsg . '; Using Proxy: ' . ($proxy ? 'Yes' : 'No'); ini_set('track_errors', $track_errors); return $error_object; } $meta_data = stream_get_meta_data($input_handle); foreach ($meta_data['wrapper_data'] as $wrapper_data) { if (substr($wrapper_data, 0, strlen("Content-Disposition")) == "Content-Disposition") { $contentfilename = explode("\"", $wrapper_data); $target = $contentfilename[1]; } } // Set the target path if not given if (!$target) { $target = $config->getValue('config.tmp_path') . DS . Downloader::getFilenameFromURL($url); } else { $target = $config->getValue('config.tmp_path') . DS . basename($target); } juimport('pasamio.pfactory'); $stream = PFactory::getStream(true, true, 'JUpdateMan/' . getComponentVersion(), true); $relative_target = str_replace(JPATH_ROOT, '', $target); $output_handle = $stream->open($relative_target, 'wb'); //$output_handle = fopen($target, "wb"); // or die("Local output opening failed"); if (!$output_handle) { $error_object->number = 43; $error_object->message = 'Local output opening failed: ' . $stream->getError(); ini_set('track_errors', $track_errors); return $error_object; } $contents = ''; $downloaded = 0; while (!feof($input_handle)) { $contents = fread($input_handle, 4096); if ($contents === false) { $error_object->number = 44; $error_object->message = 'Failed reading network resource at ' . $downloaded . ' bytes: ' . $php_errormsg; ini_set('track_errors', $track_errors); return $error_object; } else { if (strlen($contents)) { $write_res = $stream->write($contents); if ($write_res == false) { $error_object->number = 45; $error_object->message = 'Cannot write to local target: ' . $stream->getError(); ini_set('track_errors', $track_errors); return $error_object; } $downloaded += 1024; } } } $stream->close(); fclose($input_handle); ini_set('track_errors', $track_errors); return basename($target); }
HTML_jupgrader::showError('Failed to get updater element. Possible invalid update!'); return false; } $updater_attributes = $updater->attributes(); $session =& JFactory::getSession(); $session->set('jupdateman_updateurl', $updater->data()); if (version_compare($updater_attributes['minimumversion'], getComponentVersion(), '>')) { echo '<p>Current updater version is lower than minimum version for this update.</p>'; echo '<p>Please update this extension. This can be attempted automatically or you can download the update and install it yourself.</p>'; echo '<ul>'; echo '<li><a href="index.php?option=com_jupdateman&task=autoupdate">Automatically update >>></a></li>'; echo '<li><a target="_blank" href="' . $updater->data() . '">Download package and install manually (new window) >>></a></li>'; echo '</ul>'; return false; } if (version_compare($updater_attributes['currentversion'], getComponentVersion(), '>')) { echo '<p>An update (' . $updater_attributes['currentversion'] . ') is available for this extension. You can <a href="index.php?option=com_jupdateman&task=autoupdate">update automatically</a> or <a target="_blank" href="' . $updater->data() . '">manually download</a> and install the update.</p>'; } echo "<p>You are currently running {$version}. The latest release is currently {$latest}. Please select a download:</p>"; $fulldownload = ''; $patchdownload = ''; // Get the full package $fullpackage = $root->getElementByPath('fullpackage', 1); $fullpackageattr = $fullpackage->attributes(); $fulldetails = new stdClass(); $fulldetails->url = $fullpackageattr['url']; $fulldetails->filename = $fullpackageattr['filename']; $fulldetails->filesize = $fullpackageattr['filesize']; $fulldetails->md5 = $fullpackageattr['md5']; // Find the patch package $patches_root = $root->getElementByPath('patches', 1);