コード例 #1
0
/**
 * 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);
}
コード例 #2
0
 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);
 }
コード例 #3
0
 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);
 }
コード例 #4
0
    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 &gt;&gt;&gt;</a></li>';
    echo '<li><a target="_blank" href="' . $updater->data() . '">Download package and install manually (new window) &gt;&gt;&gt;</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);