| Current Path : /var/www/iplanru/data/old/www/i-plan.ru/administrator/components/com_sef/models/ |
| Current File : /var/www/iplanru/data/old/www/i-plan.ru/administrator/components/com_sef/models/upgrade.php |
<?php
/**
* SEF component for Joomla! 1.5
*
* @author ARTIO s.r.o.
* @copyright ARTIO s.r.o., http://www.artio.cz
* @package JoomSEF
* @version 3.3.0
*/
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
jimport('joomla.application.component.model');
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
jimport('joomla.installer.helper');
class SEFModelUpgrade extends JModel
{
function getUpgradeExts()
{
if (!isset($this->_upgradeExts)) {
$this->_loadVersions();
$basedir = JPATH_ROOT.DS.'components'.DS.'com_sef'.DS.'sef_ext';
$extensions = array();
if( count($this->_extVersions) > 0 ) {
foreach( $this->_extVersions as $ext ) {
$xmlfile = $basedir.DS.$ext->name.'.xml';
if (!JFile::exists($xmlfile)) {
continue;
}
$xml =& JFactory::getXMLParser('Simple');
if (!$xml->loadFile($xmlfile)) {
unset($xml);
continue;
}
$root =& $xml->document;
if (!is_object($root) ||
($root->name() != 'install') ||
version_compare($root->attributes('version'), '1.5', '<') ||
($root->attributes('type') != 'sef_ext' ))
{
unset($xml);
continue;
}
$extension = new stdClass();
$extension->new = $ext->version;
$element = &$root->getElementByPath('name');
$extension->name = $element ? $element->data() : '';
$element = &$root->getElementByPath('version');
$extension->old = $element ? $element->data() : '';
$extensions[$ext->name] = $extension;
}
}
$this->_upgradeExts = $extensions;
}
return $this->_upgradeExts;
}
function getNewSEFVersion()
{
if( !isset($this->_newSEFVersion) ) {
$this->_loadVersions();
}
return $this->_newSEFVersion;
}
function getRegisteredInfo()
{
if (!isset($this->_regInfo) ) {
$regInfo = new stdClass();
$sefConfig =& SEFConfig::getConfig();
if( trim($sefConfig->artioDownloadId) != '' ) {
// Send the request to ARTIO server to check registration
$data = array('download_id' => trim($sefConfig->artioDownloadId));
$response = SEFTools::PostRequest($sefConfig->serverLicenser, null, $data);
if( ($response === false) || ($response->code != 200) ) {
JError::raiseNotice(100, JText::_('ERROR_REG_CHECK_FAIL'));
return null;
}
else {
// Parse the response - get individual lines
$lines = explode("\n", $response->content);
// Get the code
$pos = strpos($lines[0], ' ');
if( $pos === false ) {
JError::raiseNotice(100, JText::_('ERROR_REG_CHECK_FAIL'));
return null;
}
$regInfo->code = intval(substr($lines[0], 0, $pos));
if( ($regInfo->code == 10) || ($regInfo->code == 20) ) {
// Download id found
if (count($lines) < 3) {
// Wrong response
JError::raiseNotice(100, JText::_('ERROR_REG_CHECK_FAIL'));
return null;
}
// Parse the date
$date =& JFactory::getDate(str_replace('.', '/', trim($lines[1])));
$regInfo->date = $date->toFormat(JText::_('DATE_FORMAT_LC3'));
// Parse the name
$regInfo->name = trim($lines[2]);
// Parse the company
$regInfo->company = isset($lines[3]) ? trim($lines[3]) : '';
// Is upgrade expired?
if ($regInfo->code == 20) {
JError::raiseNotice(100, JText::_('INFO_UPGRADE_LICENSE_EXPIRED') . ' ' . JText::_('INFO_YOU_GET_FREE_VERSION'));
}
// Is upgrade inactive
if ($regInfo->code == 30) {
JError::raiseNotice(100, JText::_('INFO_UPGRADE_NOT_ACTIVE') . ' ' . JText::_('INFO_YOU_GET_FREE_VERSION'));
$regInfo->date = JText::_('not activated yet');
}
}
else if( $regInfo->code == 90 ) {
// Download id not found, do nothing
JError::raiseNotice(100, JText::_('ERROR_DOWNLOAD_ID_NOT_FOUND') . ' ' . JText::_('INFO_YOU_GET_FREE_VERSION'));
}
else {
// Wrong response
JError::raiseNotice(100, JText::_('ERROR_REG_CHECK_FAIL'));
return null;
}
}
}
else {
// Download ID not set
JError::raiseNotice(100, JText::_('Download ID not set.') . ' ' . JText::_('INFO_YOU_GET_FREE_VERSION'));
return null;
}
$this->_regInfo = $regInfo;
}
return $this->_regInfo;
}
function _loadVersions()
{
if (!isset($this->_newSEFVersion) || !isset($this->_extVersions)) {
$sefConfig =& SEFConfig::getConfig();
// Get the response from server
$response = SEFTools::PostRequest($sefConfig->serverNewVersionURL);
// Check the response
if( ($response === false) || ($response->code != 200) ) {
JError::raiseNotice(100, JText::_('ERROR_NO_VERSION_INFO'));
$versions = '?.?.?';
}
else {
$versions = $response->content;
}
$versions = explode("\n", trim($versions));
$this->_newSEFVersion = trim(array_shift($versions));
$this->_extVersions = array();
if (count($versions) > 0) {
foreach($versions as $version) {
$parts = preg_split('/[\s]+/', $version);
$ext = new stdClass();
$ext->name = $parts[0];
$ext->version = trim($parts[1]);
if (isset($parts[2])) {
$ext->link = trim($parts[2]);
$ext->type = 'Paid';
}
else {
$ext->link = '';
$ext->type = 'Free';
}
$this->_extVersions[$ext->name] = $ext;
}
}
}
}
function &getVersions()
{
$this->_loadVersions();
return $this->_extVersions;
}
function getIsPaidVersion()
{
if( !isset($this->_isPaidVersion) ) {
$check = SEFTools::GetSEFGlobalMeta();
$ctrl = md5(implode(file(JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_sef'.DS.'sef.xml')));
$this->_isPaidVersion = ($check == $ctrl);
}
return $this->_isPaidVersion;
}
function upgrade()
{
$extDir = JPATH_ROOT.DS.'components'.DS.'com_sef'.DS.'sef_ext';
$fromServer = JRequest::getVar('fromserver');
$extension = JRequest::getVar('ext');
if( !empty($extension) && !JFile::exists($extDir.DS.$extension.'.php')) {
$this->setState('message', JText::_('You are not allowed to upgrade this extension.'));
return false;
}
if( is_null($fromServer) ) {
$this->setState('message', JText::_('Upgrade source not given.'));
return false;
}
if( $fromServer == 1 ) {
$package = $this->_getPackageFromServer($extension);
} else {
$package = $this->_getPackageFromUpload();
}
// was the package unpacked?
if (!$package) {
$this->setState('message', 'Unable to find install package.');
return false;
}
// get current version
if (empty($extension)) {
$curVersion = SEFTools::getSEFVersion();
} else {
$curVersion = SEFTools::getExtVersion($extension);
}
if (empty($curVersion)) {
$this->setState('message', JText::_('Could not find current version.'));
JFolder::delete($package['dir']);
return false;
}
// create an array of upgrade files
$upgradeDir = $package['dir'].DS.'upgrade';
$upgradeFiles = JFolder::files($upgradeDir, '.php$');
if (empty($upgradeFiles)) {
$this->setState('message', JText::_('This package does not contain any upgrade informations.'));
JFolder::delete($package['dir']);
return false;
}
// check if current version is upgradeable with downloaded package
$reinstall = false;
if (!in_array($curVersion . '.php', $upgradeFiles)) {
if (empty($extension)) {
// check if current version is being manually reinstalled with the same version package
$xmlFile = $package['dir'] . DS . 'sef.xml';
$packVersion = $this->_getXmlText($xmlFile, 'version');
if (($packVersion == $curVersion) && JFile::exists($upgradeDir.DS.'reinstall.php')) {
// initiate the reinstall
$reinstall = true;
global $mainframe;
$mainframe->enqueueMessage(JText::_('INFO_SEF_REINSTALL'));
}
}
if (!$reinstall) {
$this->setState('message', JText::_('ERROR_CANT_UPGRADE'));
JFolder::delete($package['dir']);
return false;
}
}
natcasesort($upgradeFiles);
// prepare arrays of upgrade operations and functions to manipulate them
$this->_fileError = false;
$this->_fileList = array();
$this->_sqlList = array();
$this->_scriptList = array();
if (!$reinstall) {
// load each upgrade file starting with current version in ascending order
foreach ($upgradeFiles as $uFile) {
//if (!eregi("^[0-9]+\.[0-9]+\.[0-9]+\.php$", $uFile)) {
if (!preg_match("/^[0-9]+\.[0-9]+\.[0-9]+\.php$/i", $uFile)) {
continue;
}
if (strnatcasecmp($uFile, $curVersion.".php") >= 0) {
require_once($upgradeDir.DS.$uFile);
}
}
} else {
// create list of all files to upgrade
require_once($upgradeDir.DS.'reinstall.php');
}
if ($this->_fileError == false) {
// set errors variable
$errors = false;
// first of all check if all the files are writeable
// ONLY IF FTP IS DISABLED
jimport('joomla.client.helper');
$ftpOptions = JClientHelper::getCredentials('ftp');
if( $ftpOptions['enabled'] != 1 ) {
foreach ($this->_fileList as $dest => $op) {
$file = JPath::clean(JPATH_ROOT.DS.$dest);
// check if source file is present in upgrade package
if ($op->operation == 'upgrade') {
$from = JPath::clean($package['dir'].DS.$op->packagePath);
if( !JFile::exists($from) ) {
JError::raiseWarning( 100, JText::_('File does not exist in upgrade package') . ': ' . $op->packagePath );
$errors = true;
}
}
if ((($op->operation == 'delete') && (JFile::exists($file))) ||
(($op->operation == 'upgrade') && (!JFile::exists($file)))) {
// if the file is to be deleted or created, the file's directory must be writable
$dir = dirname($file);
if (!JFolder::exists($dir)) {
// we need to create the directory where the file is to be created
if( !JFolder::create($dir) ) {
JError::raiseWarning( 100, JText::_('Directory could not be created') . ': ' . $dir );
$errors = true;
}
}
if (!is_writable($dir)) {
if (!JPath::setPermissions($dir, '0755', '0777')) {
JError::raiseWarning( 100, JText::_('Directory not writeable') . ': ' . $dir );
$errors = true;
}
}
}
elseif ($op->operation == 'upgrade') {
// the file itself must be writeable
if (!is_writable($file)) {
if (!JPath::setPermissions($file, '0755', '0777')) {
JError::raiseWarning( 100, JText::_('File not writeable') . ': ' . $file );
$errors = true;
}
}
}
}
}
// If there are no errors, let's upgrade
if (!$errors) {
$db =& JFactory::getDBO();
// execute SQL queries
foreach ($this->_sqlList as $sql) {
$db->setQuery($sql);
if( !$db->query() ) {
JError::raiseWarning(100, JText::_('Unable to execute SQL query') . ': ' . $sql);
$errors = true;
}
}
// perform file operations
foreach ($this->_fileList as $dest => $op) {
if ($op->operation == 'delete') {
$file = JPath::clean(JPATH_ROOT.DS.$dest);
if (JFile::exists($file)) {
$success = JFile::delete($file);
if (!$success) {
JError::raiseWarning(100, JText::_('Could not delete file. Please, check the write permissions on').' '.$dest);
$errors = true;
}
}
}
elseif ($op->operation == 'upgrade') {
$from = JPath::clean( $package['dir'].DS.$op->packagePath );
$to = JPath::clean( JPATH_ROOT.DS.$dest );
$destDir = dirname($to);
// create the destination directory if needed
if (!JFolder::exists($destDir)) {
JFolder::create($destDir);
}
$success = JFile::copy($from, $to);
if (!$success) {
JError::raiseWarning(100, JText::_('Could not rewrite file. Please, check the write permissions on').' '.$dest);
$errors = true;
}
}
}
// run scripts
foreach ($this->_scriptList as $script) {
$file = JPath::clean( $package['dir'].DS.$script );
if( !JFile::exists($file) ) {
JError::raiseWarning(100, JText::_('Could not find script file').': '.$script);
$errors = true;
} else {
include($file);
}
}
}
if (!$errors) {
$what = (empty($extension)) ? JText::_('JoomSEF') : JText::_('SEF Extension').' '.$extension;
$this->setState('message', $what . ' ' . JText::_('successfully upgraded.'));
}
else {
$this->setState('message', JText::_('ERROR_UPGRADE_PROBLEM'));
}
}
JFolder::delete($package['dir']);
return true;
}
// Adds a file operation to $fileList
// $joomlaPath - destination file path (e.g. '/administrator/components/com_sef/admin.sef.php')
// $operation - can be 'delete' or 'upgrade'
// $packagePath - source file path in upgrade package if $operation is 'upgrade' (e.g. '/admin.sef.php')
function _addFileOp($joomlaPath, $operation, $packagePath = '')
{
if (!in_array($operation, array('upgrade', 'delete'))) {
$this->fileError = true;
JError::raiseWarning(100, JText::_('Invalid upgrade operation') . ': ' . $operation);
return false;
}
// Do not check if file in package exists - it may be deleted in some future version during upgrade
// It will be checked before running file operations
$file = new stdClass();
$file->operation = $operation;
$file->packagePath = $packagePath;
$this->_fileList[$joomlaPath] = $file;
}
function _addSQL($sql)
{
$this->_sqlList[] = $sql;
}
function _addScript($script)
{
$this->_scriptList[] = $script;
}
function _getPackageFromUpload()
{
// Get the uploaded file information
$userfile = JRequest::getVar('install_package', null, 'files', 'array' );
// Make sure that file uploads are enabled in php
if (!(bool) ini_get('file_uploads')) {
JError::raiseWarning(100, JText::_('WARNINSTALLFILE'));
return false;
}
// Make sure that zlib is loaded so that the package can be unpacked
if (!extension_loaded('zlib')) {
JError::raiseWarning(100, JText::_('WARNINSTALLZLIB'));
return false;
}
// If there is no uploaded file, we have a problem...
if (!is_array($userfile) ) {
JError::raiseWarning(100, JText::_('No file selected'));
return false;
}
// Check if there was a problem uploading the file.
if ( $userfile['error'] || $userfile['size'] < 1 )
{
JError::raiseWarning(100, JText::_('WARNINSTALLUPLOADERROR'));
return false;
}
// Build the appropriate paths
$config =& JFactory::getConfig();
$tmp_dest = $config->getValue('config.tmp_path').DS.$userfile['name'];
$tmp_src = $userfile['tmp_name'];
// Move uploaded file
jimport('joomla.filesystem.file');
$uploaded = JFile::upload($tmp_src, $tmp_dest);
// Unpack the downloaded package file
$package = JInstallerHelper::unpack($tmp_dest);
// Delete the package file
JFile::delete($tmp_dest);
return $package;
}
function _getPackageFromServer($extension)
{
// Make sure that zlib is loaded so that the package can be unpacked
if (!extension_loaded('zlib')) {
JError::raiseWarning(100, JText::_('WARNINSTALLZLIB'));
return false;
}
// build the appropriate paths
$sefConfig =& SEFConfig::getConfig();
$config =& JFactory::getConfig();
if( empty($extension) ) {
$tmp_dest = $config->getValue('config.tmp_path').DS.'joomsef.zip';
}
else {
$tmp_dest = $config->getValue('config.tmp_path').DS.$extension.'.zip';
}
// Validate the upgrade on server
$data = array();
$data['username'] = $sefConfig->artioUserName;
$data['password'] = $sefConfig->artioPassword;
if( empty($extension) ) {
$data['download_id'] = $sefConfig->artioDownloadId;
$data['file'] = 'com_joomsef';
}
else {
$params =& SEFTools::getExtParams($extension);
$data['download_id'] = $params->get('downloadId', '');
$data['file'] = 'ext_joomsef3_' . substr($extension, 4);
}
$uri = parse_url(JURI::root());
$url = $uri['host'].$uri['path'];
$url = trim($url, '/');
$data['site'] = $url;
$data['ip'] = $_SERVER['SERVER_ADDR'];
$lang =& JFactory::getLanguage();
$data['lang'] = $lang->getTag();
$data['cat'] = 'joomsef3';
// Get the server response
$response = SEFTools::PostRequest($sefConfig->serverAutoUpgrade, JURI::root(), $data);
// Check the response
if( ($response === false) || ($response->code != 200) ) {
JError::raiseWarning(100, JText::_('Connection to server could not be established.'));
return false;
}
// Response OK, check what we got
if( strpos($response->header, 'Content-Type: application/zip') === false ) {
JError::raiseWarning(100, $response->content);
return false;
}
// Seems we got the ZIP installation package, let's save it to disk
if (!JFile::write($tmp_dest, $response->content)) {
JError::raiseWarning(100, JText::_('Unable to save installation file in temp directory.'));
return false;
}
// Unpack the downloaded package file
$package = JInstallerHelper::unpack($tmp_dest);
// Delete the package file
JFile::delete($tmp_dest);
return $package;
}
function _getXmlText($file, $variable)
{
// try to find variable
$value = null;
if (JFile::exists($file)) {
$xml =& JFactory::getXMLParser('Simple');
if ($xml->loadFile($file)) {
$root =& $xml->document;
$element =& $root->getElementByPath($variable);
$value = $element ? $element->data() : '';
}
}
return $value;
}
}
?>