| Current Path : /var/www/iplanru/data/www/i-plan.ru/administrator/components/com_sef/models/ |
| Current File : /var/www/iplanru/data/www/i-plan.ru/administrator/components/com_sef/models/extension.php |
<?php
/**
* SEF component for Joomla!
*
* @package JoomSEF
* @version 4.7.8
* @author ARTIO s.r.o., http://www.artio.net
* @copyright Copyright (C) 2020 ARTIO s.r.o.
* @license GNU/GPLv3 http://www.artio.net/license/gnu-general-public-license
*/
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
jimport('joomla.application.component.model');
jimport('joomla.installer.installer');
jimport('joomla.installer.helper');
require_once(JPATH_COMPONENT.'/helpers/artio-update.php');
class SEFModelExtension extends SEFModel
{
/**
* Constructor that retrieves the ID from the request
*
* @access public
* @return void
*/
function __construct()
{
parent::__construct();
$array = JRequest::getVar('cid', array(0), '', 'array');
$this->setId($array[0]);
}
function setId($id)
{
// Set id and wipe data
$this->_id = $id;
$this->_extension = null;
}
function getExtension()
{
// Load the data
if (empty($this->_extension)) {
$query = $this->_db->getQuery(true);
$query->select('*')->from('#__extensions')->where('state>=0')->where('enabled=1')->where('type='.$this->_db->quote('sef_ext'))->where('element='.$this->_db->quote($this->_id));
$this->_db->setQuery($query);
$row = $this->_db->loadObject();
if (is_null($row)) {
$row = new stdClass();
}
$option = str_replace('ext_joomsef4_', 'com_', $this->_id);
// Try to load language file for this extension
$langFile = str_replace('com_', 'sef_ext_', $option);
$lang = JFactory::getLanguage();
$lang->load($langFile, JPATH_ADMINISTRATOR);
$row->id = $this->_id;
$row->description = '';
$row->name = '';
$row->version = '';
$row->params =& SEFTools::getExtParams($option);
$row->form =& SEFTools::getExtParamsForm($option);
$row->option = $option;
$xml = SEFTools::getExtXML($option);
if ($xml) {
$version = (string)$xml['version'];
if (($xml->getName() == 'extension') && version_compare($version, '1.6', '>=') && ((string)$xml['type'] == 'sef_ext')) {
$element = $xml->description;
$row->description = $element ? trim( (string)$element ) : '';
$element = $xml->name;
$row->name = $element ? trim( (string)$element ) : '';
$element = $xml->version;
$row->version = $element ? trim( (string)$element ) : '';
}
}
// Get the component for this extension
$model = SEFModel::getInstance('Extensions', 'SEFModel');
$row->component = $model->_getComponent($option);
$this->_extension = $row;
}
return $this->_extension;
}
function getLanguages() {
return $this->_langs = JLanguageHelper::getLanguages();
}
function getStrings() {
$query="SELECT DISTINCT name \n";
$query.="FROM #__sefexttexts \n";
$query.="WHERE extension=".$this->_db->quote($this->_extension->option);
$this->_db->setQuery($query);
return $this->_strings=$this->_db->loadObjectList();
}
function getTranslation() {
$query="SELECT name, value, lang_id \n";
$query.="FROM #__sefexttexts \n";
$query.="WHERE extension=".$this->_db->quote($this->_extension->option);
$this->_db->setQuery($query);
$data=$this->_db->loadObjectList();
$ndata=array();
for($i=0;$i<count($data);$i++) {
$ndata[$data[$i]->lang_id][$data[$i]->name]=$data[$i]->value;
}
return $ndata;
}
private function _getMenuItems($lang) {
$db = JFactory::getDbo();
$db->setQuery(
'SELECT menutype AS value, title AS text' .
' FROM #__menu_types' .
' ORDER BY title'
);
$menus = $db->loadObjectList();
$query = $db->getQuery(true);
$query->select('a.id AS value, a.title AS text, a.level, a.menutype');
$query->from('#__menu AS a');
$query->where('a.parent_id > 0');
$query->where('a.type <> '.$db->quote('url'));
$query->where('a.client_id = 0');
$query->where('a.language IN('.$db->quote($lang).','.$db->quote('*').')');
$query->order('a.lft');
$db->setQuery($query);
$items = $db->loadObjectList();
// Collate menu items based on menutype
$lookup = array();
foreach ($items as &$item) {
if (!isset($lookup[$item->menutype])) {
$lookup[$item->menutype] = array();
}
$lookup[$item->menutype][] = &$item;
$item->text = str_repeat('- ', $item->level).$item->text;
}
$items = array();
foreach ($menus as &$menu) {
// Start group:
$items[] = JHtml::_('select.optgroup', $menu->text);
// Menu items:
if (isset($lookup[$menu->value])) {
foreach ($lookup[$menu->value] as &$item) {
$items[] = JHtml::_('select.option', $item->value, $item->text);
}
}
// Finish group:
$items[] = JHtml::_('select.optgroup', $menu->text);
}
return $items;
}
function getSubDomains() {
$query=$this->_db->getQuery(true);
$query->select('subdomain, lang, Itemid_titlepage');
$query->from('#__sef_subdomains');
$query->where('`option`='.$this->_db->quote(str_replace('ext_joomsef4_','com_',$this->_id)));
$this->_db->setQuery($query);
return $this->_db->loadObjectList('lang');
}
function getMenus() {
$data=array();
foreach($this->_langs as $lang) {
$data[$lang->sef]=$this->_getMenuItems($lang->lang_code);
}
return $data;
}
function store()
{
$query=$this->_db->getQuery(true);
$query->select('extension_id')
->from('#__extensions')
->where('(state>=0 OR state=-2)')
->where('type='.$this->_db->quote('sef_ext'))
->where('element='.$this->_db->quote(JRequest::getCmd('element')));
$this->_db->setQUery($query);
$id=$this->_db->loadResult();
$post = JRequest::get('post');
JTable::addIncludePath(JPATH_LIBRARIES.'/joomla/database/table');
$row=JTable::getInstance('extension');
$row->load($id);
// Bind the form fields to the table
if (!$row->bind($post,array('params'))) {
JError::raiseError(500, $row->getError() );
}
$row->type='sef_ext';
if(!$id) {
$row->state=-2;
}
// Save params
$params = JRequest::getVar( 'params', array(), 'post', 'array' );
if (is_array( $params )) {
$p = new JRegistry($row->params);
$p->loadArray($params);
$row->params = $p->toString();
}
if(isset($row->state) && $row->state>=0) {
if (!AUpdateHelper::setUpdateLink($row->element, $params['downloadId'])) {
return false;
}
}
$row->custom_data=$post["filters"];
$subdomains=JRequest::getVar('subdomain',array(),'post','array');
$query="DELETE FROM #__sef_subdomains \n";
$query.="WHERE `option`=".$this->_db->quote(str_replace("ext_joomsef4_","com_",JRequest::getString('element')))." \n";
$this->_db->setQuery($query);
if(!$this->_db->query()) {
JError::raiseError(500, $this->_db->stderr(true) );
return false;
}
foreach($subdomains as $lang=>$item) {
if(strlen($item["title"])) {
$query="INSERT INTO #__sef_subdomains \n";
$query.="SET subdomain=".$this->_db->quote($item["title"]).", `option`=".$this->_db->quote(str_replace("ext_joomsef4_","com_",JRequest::getString('element'))).", \n";
$query.="Itemid_titlepage=".$this->_db->quote($item["titlepage"]).", lang=".$this->_db->quote($lang)." \n";
/*$query.="ON DUPLICATE KEY UPDATE `option`=".$this->_db->quote(str_replace("ext_joomsef4_","com_",JRequest::getString('element'))).", \n";
$query.="Itemid_titlepage=".$this->_db->quote($item["titlepage"]).", lang=".$this->_db->quote($lang)." \n";*/
$this->_db->setQuery($query);
if(!$this->_db->query()) {
JError::raiseError(500, $this->_db->stderr(true) );
return false;
}
}
}
// Store the table to the database
if (!$row->store()) {
JError::raiseError(500, $row->getError() );
}
//$ext=str_replace('.xml','',$row->file);
if(!$this->_storeTranslation(JRequest::getCmd('element'))) {
return false;
}
return true;
}
private function _storeTranslation($ext) {
$texts=JRequest::getVar('texts',array(),'post','array');
$ext = str_replace('ext_joomsef4_', 'com_', $ext);
$query="DELETE FROM #__sefexttexts \n";
$query.="WHERE extension=".$this->_db->quote($ext);
$this->_db->setQuery($query);
if(!$this->_db->query()) {
$this->setError($this->_db->stderr(true));
return false;
}
$query="INSERT INTO #__sefexttexts (extension,name,value,lang_id) VALUES \n";
$query_arr=array();
foreach($texts as $lang_id=>$data) {
foreach($data as $name=>$value) {
if(strlen($value)==0) {
continue;
}
$query_arr[]="(".$this->_db->quote($ext).",".$this->_db->quote($name).",".$this->_db->quote($value).",".$this->_db->quote($lang_id).")";
}
}
if(count($query_arr)) {
$query.=implode(",",$query_arr);
$this->_db->setQuery($query);
if(!$this->_db->query()) {
$this->setError($this->_db->stderr(true));
return false;
}
}
return true;
}
function storeId()
{
$ext_name = JRequest::getVar('ext');
$download_id=JRequest::getVar('downloadid','');
$db=JFactory::getDBO();
if (is_null($ext_name)) {
return false;
}
$query=$db->getQuery(true);
$query->select('state, params')->from('#__extensions')->where('(state>=0 OR state=-2)')->where('enabled=1')->where('type='.$db->quote('sef_ext'))->where('element='.$db->quote($ext_name));
$db->setQuery($query);
$ext=$db->loadObject();
$params=new JRegistry(isset($ext->params)?$ext->params:null);
$params->set('downloadId', JRequest::getVar('downloadid', ''));
$nparams = $params->toString();
$query=$db->getQuery(true);
if(isset($ext->state)) {
$query->update('#__extensions')->set('params='.$db->quote($nparams))->where('(state>=0 OR state=-2)')->where('enabled=1')->where('type='.$db->quote('sef_ext'))->where('element='.$db->quote($ext_name));
} else {
$query->insert('#__extensions')->set('params='.$db->quote($nparams))->set('state=-2')->set('type='.$db->quote('sef_ext'))->set('element='.$db->quote($ext_name));
}
$db->setQuery($query);
if(!$db->query()) {
echo $db->stderr(true);
$this->setError($db->stderr(true));
return false;
}
if(isset($ext->state) && $ext->state>=0) {
if (!AUpdateHelper::setUpdateLink($ext_name, $download_id)) {
return false;
}
}
jexit();
}
function changeHandler()
{
$ext = JRequest::getVar('ext');
$db=JFactory::getDBO();
if (is_null($ext)) {
return false;
}
$query=$db->getQuery(true);
$query->select('extension_id, params')
->from('#__extensions')
->where('(state>=0 OR state=-2)')
->where('type='.$db->quote('sef_ext'))
->where('element='.$db->quote($ext));
$db->setQuery($query);
$ext_o = $db->loadObject();
$params = new JRegistry(isset($ext_o->params) ? $ext_o->params : null);
$handlers = array(0 => 3, 3 => 1, 1 => 2, 2 => 0);
$handler = intval($params->get('handling', 0));
$handler = $handlers[$handler];
$params->set('handling', $handler);
$nparams = $params->toString();
$query = $db->getQuery(true);
if ($ext_o && $ext_o->extension_id) {
// #23476: Remove other instances of the same extension to fix the previous bug
$sql = "DELETE FROM `#__extensions`
WHERE (`state` >= 0 OR `state` = -2)
AND `type` = 'sef_ext'
AND `element` = ".$db->quote($ext)."
AND `extension_id` != ".(int)$ext_o->extension_id;
$db->setQuery($sql);
$db->query();
$query->update('#__extensions')->set('params='.$db->quote($nparams))->where('extension_id = '.(int)$ext_o->extension_id);
} else {
$query->insert('#__extensions')->set('params='.$db->quote($nparams))->set('state=-2')->set('type='.$db->quote('sef_ext'))->set('element='.$db->quote($ext));
}
$db->setQuery($query);
if(!$db->query()) {
$this->setError($db->stderr(true));
return false;
}
return true;
}
function install()
{
$mainframe = JFactory::getApplication();
switch( JRequest::getVar('installtype') )
{
case 'folder':
$package = $this->_getPackageFromFolder();
break;
case 'upload':
$package = $this->_getPackageFromUpload();
break;
case 'server':
$package = $this->_getPackageFromServer();
break;
default:
$this->setState('message', 'No Install Type Found');
$this->setState('result', false);
return false;
break;
}
// Was the package unpacked?
if (!$package) {
$this->setState('message', 'Unable to find install package');
$this->setState('result', false);
return false;
}
// Get an installer object for the extension type
jimport('joomla.installer.installer');
$installer = JInstaller::getInstance();
// Install the package
if (!$installer->install($package['dir'])) {
// There was an error installing the package
$msg = JText::_('COM_SEF_SEF_EXTENSION').' '.JText::_('COM_SEF_INSTALL').': '.JText::_('COM_SEF_ERROR');
$result = false;
} else {
// Package installed sucessfully
$msg = JText::_('COM_SEF_SEF_EXTENSION').' '.JText::_('COM_SEF_INSTALL').': '.JText::_('COM_SEF_SUCCESS');
$result = true;
}
// Set some model state values
$mainframe->enqueueMessage($msg);
$this->setState('name', $installer->get('name'));
$this->setState('result', $result);
$this->setState('message', $installer->message);
$this->setState('extension.message', $installer->get('extension.message'));
// Cleanup the install files
if (!is_file($package['packagefile'])) {
$config = JFactory::getConfig();
$package['packagefile'] = $config->get('tmp_path').'/'.$package['packagefile'];
}
JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);
return $result;
}
function _getPackageFromFolder()
{
// Get the path to the package to install
$p_dir = JRequest::getString('install_directory');
$p_dir = JPath::clean( $p_dir );
// Did you give us a valid directory?
if( !is_dir($p_dir) ) {
JError::raiseWarning(100, JText::_('COM_SEF_ENTER_PACKAGE_DIRECTORY'));
return false;
}
// Detect the package type
$type = JInstallerHelper::detectType( $p_dir );
// Did you give us a valid package?
if( !$type || ($type != 'sef_ext') ) {
JError::raiseWarning(100, JText::_('COM_SEF_ERROR_NO_VALID_PACKAGE'));
return false;
}
$package['packagefile'] = null;
$package['extractdir'] = null;
$package['dir'] = $p_dir;
$package['type'] = $type;
return $package;
}
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::_('COM_SEF_WARNINSTALLFILE'));
return false;
}
// Make sure that zlib is loaded so that the package can be unpacked
if (!extension_loaded('zlib')) {
JError::raiseWarning(100, JText::_('COM_SEF_WARNINSTALLZLIB'));
return false;
}
// If there is no uploaded file, we have a problem...
if (!is_array($userfile) ) {
JError::raiseWarning(100, JText::_('COM_SEF_NO_FILE_SELECTED'));
return false;
}
// Check if there was a problem uploading the file.
if ( $userfile['error'] || $userfile['size'] < 1 )
{
JError::raiseWarning(100, JText::_('COM_SEF_WARNINSTALLUPLOADERROR'));
return false;
}
// Build the appropriate paths
$config = JFactory::getConfig();
$tmp_dest = $config->get('tmp_path').'/'.$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);
return $package;
}
function _getPackageFromServer()
{
$extension = trim(JRequest::getString('extension'));
// Make sure we have an extension selected
if( empty($extension) ) {
JError::raiseWarning(100, JText::_('COM_SEF_NO_EXTENSION_SELECTED'));
return false;
}
// Make sure that zlib is loaded so that the package can be unpacked
if (!extension_loaded('zlib')) {
JError::raiseWarning(100, JText::_('COM_SEF_WARNINSTALLZLIB'));
return false;
}
// build the appropriate paths
$sefConfig = SEFConfig::getConfig();
$config = JFactory::getConfig();
$tmp_dest = $config->get('tmp_path').'/'.$extension.'.zip';
// Validate the upgrade on server
$data = array();
$data['username'] = $sefConfig->artioUserName;
$data['password'] = $sefConfig->artioPassword;
$params =& SEFTools::getExtParams($extension);
$data['download_id'] = $params->get('downloadId', '');
$data['file'] = 'ext_joomsef4_' . 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'] = 'joomsef4';
// 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::_('COM_SEF_ERROR_SERVER_CONNECTION'));
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::_('COM_SEF_ERROR_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 delete()
{
// Get an installer object for the extension type
jimport('joomla.installer.installer');
$installer = JInstaller::getInstance();
require_once(JPATH_COMPONENT.'/adapters/sef_ext.php');
$adapter = new JInstallerSef_Ext($installer);
$installer->setAdapter('sef_ext', $adapter);
$result = $installer->uninstall('sef_ext', $this->_id, 0);
return $result;
}
}
?>