public function _doCheck() { // if not set to auto check and not forced to do so // when user click on "check updates" button // we don't actually try to get updates info $sefConfig =& Sh404sefFactory::getConfig(); // prepare a default response object $response = new stdClass(); $response->status = true; $response->statusMessage = JText::_('COM_SH404SEF_CLICK_TO_CHECK_UPDATES'); $response->current = 0; $response->note = ''; $response->changelogLink = ''; $response->minVersionToUpgrade = 0; $response->maxVersionToUpgrade = 0; $response->shouldUpdate = false; $response->excludes = array(); // check if allowed to auto check, w/o user clicking on button if (!$sefConfig->autoCheckNewVersion && empty(self::$_forced['updates'])) { return $response; } // get an http client require_once JPATH_ROOT . DS . 'administrator' . DS . 'components' . DS . 'com_sh404sef' . DS . 'lib' . DS . 'Zend' . DS . 'Http' . DS . 'Client.php'; $hClient = new Sh_Zend_Http_Client(); $hClient->setConfig(array('maxredirects' => 0, 'timeout' => 10)); // find where to call ... $remoteConfig = Sh404sefHelperUpdates::getRemoteConfig($forced = false); // hardcoded default update server $defaultServers = array(array('url' => self::$_endPoint . '/' . self::$_updateFile)); // try to read from remote, central, configuration file $remoteServers = empty($remoteConfig->config['updateservers']) ? array() : $remoteConfig->config['updateservers']; // merge default and remote $servers = array_merge($remoteServers, $defaultServers); // check for urls in both defaults and remote $serverList = array(); foreach ($servers as $server) { $serverList[] = $server['url']; } $serverList = array_unique($serverList); // now iterate over server list, until we find one that responds foreach ($serverList as $server) { $response->status = true; // actually place a call to find about available updates try { $hClient->setUri($server); } catch (Exception $e) { // move to next update server in list $response->status = false; continue; } // request file content $adapters = array('Sh_Zend_Http_Client_Adapter_Curl', 'Sh_Zend_Http_Client_Adapter_Socket'); $rawResponse = null; foreach ($adapters as $adapter) { try { $hClient->setAdapter($adapter); $rawResponse = $hClient->request(); break; } catch (Exception $e) { // need that to be Exception, so as to catche Sh_Zend_Exceptions.. as well // we failed, let's try another method } } // (un)set flag if we have a response if (empty($rawResponse)) { $response->status = false; $msg = 'unknown code'; $response->statusMessage = JText::sprintf('COM_SH404SEF_COULD_NOT_CHECK_FOR_NEW_VERSION', $msg); } else { if (!is_object($rawResponse) || $rawResponse->isError()) { $response->status = false; $msg = method_exists($rawResponse, 'getStatus') ? $rawResponse->getStatus() : 'unknown code'; $response->statusMessage = JText::sprintf('COM_SH404SEF_COULD_NOT_CHECK_FOR_NEW_VERSION', $msg); } else { // communication was fine, check the file type $type = $rawResponse->getHeader('Content-type'); if (strtolower($type) != 'text/xml' && strtolower($type) != 'application/xml') { $response->status = false; $response->statusMessage = JText::sprintf('COM_SH404SEF_COULD_NOT_CHECK_FOR_NEW_VERSION', $rawResponse->getStatus()); } } } // if there was a valid response, break out of // loop over available update servers if ($response->status) { break; } } // if we were not able to contact any update server // return this if (!$response->status) { return $response; } // get an xml object and parse the response $xml =& JFactory::getXMLparser('Simple'); $xml->loadString($rawResponse->getBody()); // into our response object // first version of version check used an xml file that could only hold one // version data set. So we only iterate over the "update" group if it exists if (empty($xml->document->update)) { $response = self::_readUpdateInformation($xml->document, $response); } else { foreach ($xml->document->update as $updateRecord) { $product = $updateRecord->product[0]->data(); // only use if this update record is for us if ($product == self::$_product) { $response = self::_readUpdateInformation($updateRecord, $response); // find if user should update $response = Sh404sefHelperUpdates::_updateRequired($response); // if found an update, break out if ($response->shouldUpdate) { break; } } } } // check if this is a valid information file return $response; }
public function _doCheck() { // if not set to auto check and not forced to do so // when user click on "check updates" button // we don't actually try to get updates info $sefConfig =& shRouter::shGetConfig(); // prepare a default response object $response = new stdClass(); $response->status = true; $response->statusMessage = JText16::_('COM_SH404SEF_CLICK_TO_CHECK_UPDATES'); $response->current = 0; $response->note = ''; $response->changelogLink = ''; $response->minVersionToUpgrade = 0; $response->maxVersionToUpgrade = 0; $response->shouldUpdate = false; $response->excludes = array(); // check if allowed to auto check, w/o user clicking on button if (!$sefConfig->autoCheckNewVersion && !self::$_forced) { return $response; } // get an http client require_once JPATH_COMPONENT . DS . 'lib' . DS . 'Zend' . DS . 'Http' . DS . 'Client.php'; $hClient = new Zend_Http_Client(); // set params $hClient->setUri(self::$_endPoint . '/' . self::$_product); $hClient->setConfig(array('maxredirects' => 0, 'timeout' => 10)); // request file content $adapters = array('Zend_Http_Client_Adapter_Curl', 'Zend_Http_Client_Adapter_Socket'); $rawResponse = null; foreach ($adapters as $adapter) { try { $hClient->setAdapter($adapter); $rawResponse = $hClient->request(); break; } catch (Exception $e) { // need that to be Exception, so as to catche Zend_Exceptions.. as well // we failed, let's try another method } } // return if error if (!is_object($rawResponse) || $rawResponse->isError()) { $response->status = false; $msg = method_exists($rawResponse, 'getStatus') ? $rawResponse->getStatus() : 'unknown code'; $response->statusMessage = JText16::sprintf('COM_SH404SEF_COULD_NOT_CHECK_FOR_NEW_VERSION', $msg); return $response; } // check the file $type = $rawResponse->getHeader('Content-type'); if (strtolower($type) != 'text/xml' && strtolower($type) != 'application/xml') { $response->status = false; $response->statusMessage = JText16::sprintf('COM_SH404SEF_COULD_NOT_CHECK_FOR_NEW_VERSION', $rawResponse->getStatus()); return $response; } // should be OK then $response->status = true; // get an xml object and parse the response $xml =& JFactory::getXMLparser('Simple'); $xml->loadString($rawResponse->getBody()); // into our response object $response->current = $xml->document->current[0]->data(); $response->note = $xml->document->note[0]->data(); $response->changelogLink = $xml->document->changelogLink[0]->data(); $response->downloadLink = $xml->document->downloadLink[0]->data(); $response->minVersionToUpgrade = $xml->document->minVersionToUpgrade[0]->data(); $response->maxVersionToUpgrade = $xml->document->maxVersionToUpgrade[0]->data(); $rawExcludes = $xml->document->exclude; $response->excludes = array(); if (!empty($rawExcludes)) { foreach ($rawExcludes as $exclude) { $response->excludes[] = $exclude->data(); } } // find if user should update $response = Sh404sefHelperUpdates::_updateRequired($response); // check if this is a valid information file return $response; }