Server : LiteSpeed System : Linux server 3.10.0-1160.90.1.el7.x86_64 #1 SMP Thu May 4 15:21:22 UTC 2023 x86_64 User : alsaif ( 1057) PHP Version : 7.4.33 Disable Function : show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/alsaif/public_html/administrator/components/com_falang/models/ |
<?php
/**
* @package Falang for Joomla!
* @author Stéphane Bouey <stephane.bouey@faboba.com> - http://www.faboba.com
* @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
* @copyright Copyright (C) 2010-2017. Faboba.com All rights reserved.
*/
// No direct access to this file
defined('_JEXEC') or die;
class CPanelModelCPanel extends JModelLegacy
{
protected $_modelName = 'cpanel';
/**
* return the model name
*/
public function getName() {
return $this->_modelName;
}
/**
* Get a list of panel state information
*/
public function getPanelStates() {
//sbou TODO rewrite this part
return array();
$panelStates = array();
$systemState = $this->_checkSystemState();
if (isset($systemState)) {
$panelStates['directory_state'] = $systemState['directory_state'];
$panelStates['directory'] = $systemState['directory'];
$panelStates['extension_state'] = $systemState['extension_state'];
$panelStates['extension'] = $systemState['extension'];
$panelStates['performance_state'] = $systemState['performance_state'];
$panelStates['performance'] = $systemState['performance'];
}
//$panelStates['system'] = $this->_getSystemInfo();
return $panelStates;
}
/**
* Get a list of content informations
*/
public function getContentInfo() {
$contentInfo = array();
$contentInfo['unpublished'] = $this->_testUnpublisedTranslations();
return $contentInfo;
}
/**
* Get the list of published tabs, based on the ID
*/
public function getPublishedTabs() {
$tabs = array();
$pane = new stdClass();
$pane->title = 'Information';
$pane->name = 'Information';
$pane->alert = false;
$tabs[] = $pane;
// Validating other tabs based on extension configuration
// JFTODO Move all panels to their own administrator module
$params = JComponentHelper::getParams('com_falang');
// if( $params->get('showPanelNews', 1) ) {
// $pane = new stdClass();
// $pane->title = 'News';
// $pane->name = 'JFNews';
// $pane->alert = false;
// $tabs[] = $pane;
// }
// if( $params->get('showPanelUnpublished', 1) ) {
// $pane = new stdClass();
// $pane->title = 'TITLE_UNPUBLISHED';
// $pane->name = 'ContentState';
// $pane->alert = false;
// $tabs[] = $pane;
// }
// if( $params->get('showPanelState', 1) ) {
// $pane = new stdClass();
// $pane->title = 'System State';
// $pane->name = 'SystemState';
// $pane->alert = false;
// $tabs[] = $pane;
// }
return $tabs;
}
/**
* This method checks the different system states based on the definition in the component XML file.
* @return array with rows of the different component states
*
*/
private function _checkSystemState() {
$db = JFactory::getDBO();
$checkResult = array();
// Read the file to see if it's a valid template XML file
$xmlDoc = new DOMDocument();
$xmlfile = FALANG_ADMINPATH .DS.'sql'.DS. 'check.xml';
if (!$xmlDoc->load( $xmlfile)) {
return $checkResult;
}
$element = $xmlDoc->documentElement;
// Joomla 1.5 uses install
// if ($element->nodeName != 'install') {
// return $checkResult;
// }
// if ($element->getAttribute( "type" ) != "component") {
// return $checkResult;
// }
$checkElements = $xmlDoc->getElementsByTagName('check')->item(0);
if (!isset($checkElements) || !$checkElements->hasChildNodes()){
return $checkResult;
}
// Default values of different master states
$checkResult['directory_state'] = true;
$checkResult['extension_state'] = true;
$checkResult['performance_state'] = true;
foreach ($checkElements->childNodes as $child){
$type = $child->nodeName;
$check = new stdClass();
switch ($type) {
case 'directory':
$check->description = $child->textContent;
$check->result = is_writable(JPATH_SITE .DS. $check->description) ? true : false;
$check->resultText = $check->result ? JText::_('writable') : JText::_('not writable');
$check->link = '';
$checkResult[$type][] = $check;
$checkResult[$type. '_state'] = $checkResult[$type. '_state'] & $check->result;
break;
case 'extension':
$check->description = JText::_($child->getAttribute('name'));
//sbou
$table = 'extensions';
$type = $child->getAttribute('type');
//fin sbou
$field = $child->getAttribute('field');
$value = $child->getAttribute('value');
$name = $child->getAttribute('name');
$condition = $child->textContent;
if ($field=='ordering'){
//sbou
$sql = "SELECT extension_id, element, ordering FROM #__$table WHERE type= '$type' AND $condition ORDER BY ordering";
//fin sbou
$db->setQuery($sql);
$resultValues = $db->loadObjectList();
if (array_key_exists($value,$resultValues) && $resultValues[$value]->element==$name){
$check->result = true ;
$check->resultText = JText::_($field);
$check->link = JURI::root().'administrator/index.php?option=com_'.$table.'&client=task=editA&hidemainmenu=1&id='.$resultValues[$value]->id;
}
else {
//sbou
//$sql = "SELECT $field, id FROM #__$table WHERE $condition";
$sql = "SELECT $field, extension_id FROM #__$table WHERE type = '$type' AND $condition";
//fin sbou
$db->setQuery($sql);
$resultValue = $db->loadRow();
$check->result = false;
$check->resultText = JText::_('un'.$field);
$check->link = JURI::root().'administrator/index.php?option=com_'.$table.'&client=task=editA&hidemainmenu=1&id='.$resultValue[1];
}
}
else {
//sbou
//$sql = "SELECT $field, id FROM #__$table WHERE $condition";
$sql = "SELECT $field, extension_id FROM #__$table WHERE type = '$type' AND $condition";
//sbou
$db->setQuery($sql);
$resultValue = $db->loadRow();
if( $resultValue != null ) {
$check->result = ($value == $resultValue[0]) ? true : false;
$check->resultText = $check->result ? JText::_($field) : JText::_('un'.$field);
$check->link = JURI::root().'administrator/index.php?option=com_'.$table.'&client=task=editA&hidemainmenu=1&id='.$resultValue[1];
} else {
$check->result = false;
$check->resultText = JText::_('not installed');
$check->link = '';
}
}
$checkResult[$type][] = $check;
dump($type);
dump($check->result);
$checkResult[$type. '_state'] = $checkResult[$type. '_state'] & $check->result;
break;
case 'performance':
$check->description = JText::_($child->getAttribute('name'));
$check->name = $child->getAttribute('name');
$check->type = $child->getAttribute('type');
$check->link = $child->getAttribute('link');
$check->link = ($check->link != '' && preg_match('/http:/i', $check->link)) ? JURI::root() .$check->link : $check->link;
if($check->type=='database') {
$checkfunction = $child->getAttribute('check_function');
$check_true = $child->getAttribute('check_true');
$check_false = $child->getAttribute('check_false');
$optimal_value = $child->getAttribute('optimal_value');
$check->current = $db->name;
$check->available = function_exists($checkfunction) ? $check_true : $check_false;
$check->optimal = $optimal_value;
if($check->available==$optimal_value && $check->available != $check->current) {
$check->result = false;
$check->resultText = JText::sprintf('JF_PERFORMANCE_NOT_OPTIMAL', $check->current, $check->optimal);
} else {
$check->result = true;
$check->resultText = JText::sprintf('JF_PERFORMANCE_OPTIMAL', $check->current, $check->optimal);
}
} elseif ($check->type=='php') {
$check->required = $child->getAttribute('required');
$check->optimal = $child->getAttribute('optimal_value');
$check->current = phpversion();
if (version_compare($check->current,$check->required,"<")){
$check->result = false;
$check->resultText = JText::sprintf('JF_PERFORMANCE_LESS_REQUIRED', $check->current, $check->required);
} elseif(version_compare($check->current,$check->required,">=") && version_compare($check->current,$check->optimal,"<")) {
$check->result = true;
$check->resultText = JText::sprintf('JF_PERFORMANCE_NOT_OPTIMAL', $check->current, $check->optimal);
} else {
$check->result = true;
$check->resultText = JText::sprintf('JF_PERFORMANCE_OPTIMAL', $check->current, $check->optimal);
}
} elseif ($check->type=='config') {
$check->value = $child->getAttribute('value');
$check->optimal = $child->getAttribute('optimal_value');
$jfm = FalangManager::getInstance();
$check->current = $jfm->getCfg($check->value);
if($check->current == $check->optimal) {
$check->result = true;
$check->resultText = JText::sprintf('JF_PERFORMANCE_CONFIG_OPTIMAL', JText::_($check->value), $check->current);
} else {
$check->result = false;
$check->resultText = JText::sprintf('JF_PERFORMANCE_CONFIG_NOT_OPTIMAL', JText::_($check->value), $check->current, $check->optimal);
}
}
$checkResult[$type][] = $check;
$checkResult[$type. '_state'] = $checkResult[$type. '_state'] & $check->result;
break;
}
}
return $checkResult;
}
/**
* Testing if old installation is found and upgraded?
* This method is rebuild and checks now for old JoomFish installations not MambelFish anymore!
* @return int 0 := component not installed, 1 := installed but not upgraded, 2 := installed and upgraded
*/
private function _testOldInstall()
{
$db = JFactory::getDBO();
$oldInstall = 0;
$db->setQuery( "SHOW TABLES LIKE '%jf_%'" );
$db->query();
$rows = $db->loadResultArray();
foreach ($rows as $row) {
if( preg_match( '/mbf_content/i', $row ) ) {
$oldInstall = 1;
break;
}
}
$jfManager = FalangManager::getInstance();
if( $oldInstall == 1 && $jfManager->getCfg( 'mbfupgradeDone' ) ) {
$oldInstall = 2;
}
return $oldInstall;
}
/**
* This method gethers certain information of the system which can be used for presenting
* @return array with inforation about the system
*/
private function _getSystemInfo() {
$db = JFactory::getDBO();
$db->setQuery( 'SELECT count(DISTINCT reference_id, reference_table) FROM #__falang_content');
$db->query();
$translations = $db->loadResult();
$res = array( 'translations' => $translations );
return $res;
}
/**
* Start of a function to obtain overview summary of orphan translations
*
* @return array of orphan tables or nothing if no orphans found
*/
private function _testOrphans( ) {
global $mainframe;
$config = JFactory::getConfig();
$dbprefix = $config->get("dbprefix");
$db = JFactory::getDBO();
$orphans = array();
$tranFilters=array();
$filterHTML=array();
$query = "select distinct CONCAT('".$dbprefix."',reference_table) from #__falang_content";
$db->setQuery( $query );
$tablesWithTranslations = $db->loadResultArray();
$query = "SHOW TABLES";
$db->setQuery( $query );
$tables = $db->loadResultArray();
$allContentElements = $this->_falangManager->getContentElements();
foreach ($allContentElements as $catid=>$ce){
$tablename = $dbprefix.$ce->referenceInformation["tablename"];
if (in_array($tablename,$tables) &&
in_array($tablename,$tablesWithTranslations)){
$db->setQuery( $ce->createOrphanSQL( -1, null, -1, -1,$tranFilters ) );
$rows = $db->loadObjectList();
if ($db->getErrorNum()) {
$this->_message = $db->stderr();
return false;
}
$total = count($rows);
if ($total>0) {
$orphans[] = array( 'catid' => $catid, 'name' => $ce->Name, 'total' => $total);
}
}
}
foreach ($tablesWithTranslations as $twv) {
if (!in_array($twv,$tables)) {
$this->_message = "Translations exists for table <b>$twv</b> which is no longer in the database<br/>";
}
}
return $orphans;
}
/**
* This method tests for the content elements and their original/translation status
* It will return an array listing all content element names including information about how may originals
*
* @param array $originalStatus array with original state values if exist
* @param int $phase which phase of the status check
* @param string $statecheck_i running row number starting with -1!
* @param string $message system message
* @param array $languages array of availabe languages
* @return array with resulting rows
*/
private function _testOriginalStatus($originalStatus, &$phase, &$statecheck_i, &$message, $languages) {
$dbprefix = $config->get("dbprefix");
$db = JFactory::getDBO();
$tranFilters=array();
$filterHTML=array();
$sql = '';
switch ($phase) {
case 1:
$originalStatus = array();
$sql = "select distinct CONCAT('".$dbprefix."',reference_table) from #__falang_content";
$db->setQuery( $sql );
$tablesWithTranslations = $db->loadResultArray();
$sql = "SHOW TABLES";
$db->setQuery( $sql );
$tables = $db->loadResultArray();
$allContentElements = $this->_falangManager->getContentElements();
foreach ($allContentElements as $catid=>$ce){
$ceInfo = array();
$ceInfo['name'] = $ce->Name;
$ceInfo['catid'] = $catid;
$ceInfo['total'] = '??';
$ceInfo['missing_table'] = false;
$ceInfo['message'] = '';
$tablename = $dbprefix.$ce->referenceInformation["tablename"];
if (in_array($tablename,$tables)){
// get total count of table entries
$db->setQuery( 'SELECT COUNT(*) FROM ' .$tablename );
$ceInfo['total'] = $db->loadResult();
if( in_array($tablename,$tablesWithTranslations) ) {
// get orphans
$db->setQuery( $ce->createOrphanSQL( -1, null, -1, -1,$tranFilters ) );
$rows = $db->loadObjectList();
if ($db->getErrorNum()) {
$this->_message = $db->stderr();
return false;
}
$ceInfo['orphans'] = count($rows);
// get number of valid translations
$ceInfo['valid'] = 0;
// get number of outdated translations
$ceInfo['outdated'] = $ceInfo['total'] - $ceInfo['orphans'] - $ceInfo['valid'];
}else {
$ceInfo['orphans'] = '0';
}
} elseif (!in_array($tablename, $tables)) {
$ceInfo['missing_table'] = true;
$ceInfo['message'] = JText::sprintf(TABLE_DOES_NOT_EXIST, $tablename );
}
$originalStatus[] = $ceInfo;
}
$message = JText::sprintf('ORIGINAL_PHASE1_CHECK', '');
$phase ++;
$statecheck_i = 0;
break;
case 2:
if( is_array($originalStatus) && count ($originalStatus)>0 ) {
if( $statecheck_i>=0 && $statecheck_i<count($originalStatus)) {
$stateRow = $originalStatus[$statecheck_i];
foreach ($languages as $lang) {
$sql = "SELECT * FROM #__falang_content as jfc" .
"\n WHERE jfc.language_id=" .$lang->id .
"\n AND jfc.reference_table='" .$stateRow['catid'] ."'".
"\n AND jfc.published=1" .
"\n GROUP BY reference_id";
$db->setQuery($sql);
$rows = $db->loadRowList();
$key = 'langentry_' .$lang->getLanguageCode();
$stateRow[$key] = count($rows);
}
}
if ($statecheck_i<count($originalStatus)-1) {
$statecheck_i ++;
$message = JText::sprintf('ORIGINAL_PHASE1_CHECK', ' ('. $originalStatus[$statecheck_i]['name'] .')');
} else {
$message = JText::_('ORIGINAL_PHASE2_CHECK');
$phase = 3; // exit
}
} else {
$phase = 3; // exit
$message = JText::_('ORIGINAL_PHASE2_CHECK');
}
break;
}
return $originalStatus;
}
/**
* This method checks the translation status
* The process follows goes through out all existing translations and checks their individual status.
* The output is a summary information based grouped by content element files and the languages
*
* @param array $translationStatus array with translation state values
* @param int $phase which phase of the status check
* @param string $statecheck_i running row number starting with -1!
* @param string $message system message
*/
private function _testTranslationStatus( $translationStatus, &$phase, &$statecheck_i, &$message ) {
$db = JFactory::getDBO();
$sql = '';
switch ($phase) {
case 1:
$sql = "SELECT jfc.reference_table, jfc.language_id, jfl.name AS language" .
"\n FROM #__falang_content AS jfc" .
"\n JOIN #__languages AS jfl ON jfc.language_id = jfl.id" .
"\n GROUP BY jfc.reference_table, jfc.language_id";
$db->setQuery($sql);
$rows = $db->loadObjectList();
$translationStatus = array();
if( is_array($rows) && count($rows)>0 ) {
foreach ($rows as $row) {
$status = array();
$contentElement = $this->_falangManager->getContentElement( $row->reference_table );
$status['content'] = $contentElement->Name;
$status['catid'] = $row->reference_table;
$status['language_id'] = $row->language_id;
$status['language'] = $row->language;
$status['total'] = '';
$status['state_valid'] = '';
$status['state_unvalid'] = '';
$status['state_missing'] = '';
$status['state'] = '';
$status['published'] = '';
$sql = "SELECT * FROM #__falang_content" .
"\n WHERE reference_table='" .$row->reference_table. "'" .
"\n AND language_id=" .$row->language_id .
"\n GROUP BY reference_id";
$db->setQuery($sql);
$totalrows = $db->loadRowList();
if( $totalrows = $db->loadRowList() ) {
$status['total'] = count($totalrows);
}
$translationStatus[] = $status;
}
$message = JText::_('TRANSLATION_PHASE1_GENERALCHECK');
$phase ++;
} else {
$message = JText::_('No Translation available');
$phase = 4; // exit
}
break;
case 2:
if( is_array($translationStatus) && count ($translationStatus)>0 ) {
for ($i=0; $i<count($translationStatus); $i++) {
$stateRow = $translationStatus[$i];
$sql = "select *" .
"\n from #__falang_content as jfc" .
"\n where published=1" .
"\n and reference_table='" .$stateRow['catid']. "'".
"\n and language_id=" .$stateRow['language_id'].
"\n group by reference_ID";
$db->setQuery($sql);
if( $rows = $db->loadRowList() ) {
$stateRow['published'] = count($rows);
} else {
$stateRow['published'] = 0;
}
}
}
$message = JText::sprintf('TRANSLATION_PHASE2_PUBLISHEDCHECK', '');
$phase ++;
break;
case 3:
if( is_array($translationStatus) && count ($translationStatus)>0 ) {
if( $statecheck_i>=0 && $statecheck_i<count($translationStatus)) {
$stateRow = $translationStatus[$statecheck_i];
$contentElement = $this->_falangManager->getContentElement( $stateRow['catid'] );
$filters = array();
// we need to find an end, thats why the filter is at 10.000!
$db->setQuery( $contentElement->createContentSQL( $stateRow['language_id'], null, 0, 10000,$filters ) );
if( $rows = $db->loadObjectList() ) {
$stateRow['state_valid'] = 0;
$stateRow['state_unvalid'] = 0;
$stateRow['state_missing'] = 0;
for( $i=0; $i<count($rows); $i++ ) {
$contentObject = new ContentObject( $stateRow['language_id'], $contentElement );
$contentObject->readFromRow( $rows[$i] );
$rows[$i] = $contentObject;
switch( $contentObject->state ) {
case 1:
$stateRow['state_valid'] ++;
break;
case 0:
$stateRow['state_unvalid'] ++;
break;
case -1:
default:
$stateRow['state_missing'] ++;
break;
}
}
}
}
if ($statecheck_i<count($translationStatus)-1) {
$statecheck_i ++;
$message = JText::sprintf('TRANSLATION_PHASE2_PUBLISHEDCHECK', ' ('. $translationStatus[$statecheck_i]['content'] .'/' .$translationStatus[$statecheck_i]['language'].')');
} else {
$message = JText::_('TRANSLATION_PHASE3_STATECHECK');
$phase = 4; // exit
}
} else {
$message = JText::_('TRANSLATION_PHASE3_STATECHECK');
$phase = 4; // exit
}
break;
}
return $translationStatus;
}
/**
* This method creates an overview of unpublished translations independed of the content element
* @return array of unpublished translations or null
*/
private function _testUnpublisedTranslations() {
$db = JFactory::getDBO();
$unpublishedTranslations = null;
//sbou
$sql = "select jfc.reference_table, jfc.reference_id, jfc.language_id, jfl.title as language" .
//$sql = "select jfc.reference_table, jfc.reference_id, jfc.language_id, jfl.name as language" .
"\n from #__falang_content as jfc, #__languages as jfl" .
//"\n where published=0 and jfc.language_id = jfl.id" .
"\n where jfl.published=0 and jfc.language_id = jfl.lang_id" .
"\n group by jfc.reference_table, jfc.reference_id, jfc.language_id" .
"\n limit 0, 50";
//fin sbou
$db->setQuery($sql);
if( $rows = $db->loadObjectList() ) {
foreach ($rows as $row) {
$unpublished = array();
$unpublished['reference_table'] = $row->reference_table;
$unpublished['catid'] = $row->reference_table;
$unpublished['reference_id'] = $row->reference_id;
$unpublished['language_id'] = $row->language_id;
$unpublished['language'] = $row->language;
$unpublishedTranslations[] = $unpublished;
}
}
return $unpublishedTranslations;
}
public function updateDownloadId(){
// For joomla versions < 3.1 (no extra query available)
if (version_compare(JVERSION, '3.1', 'lt')) {
return;
}
$db = $this->getDbo();
// Get current extension ID
$extension_id = $this->getExtensionId();
if (!$extension_id)
{
return;
}
$component = JComponentHelper::getComponent('com_falang');
$dlid = $component->params->get('downloadid', '');
if (empty($dlid)) return;
// store only valid downloadid
if (!preg_match('/^([0-9]{1,}:)?[0-9a-f]{32}$/i', $dlid)) return;
$extra_query = "'dlid=$dlid'";
// Get the update sites for current extension
$query = $db->getQuery(true)
->select($db->qn('update_site_id'))
->from($db->qn('#__update_sites_extensions'))
->where($db->qn('extension_id') . ' = ' . $db->q($extension_id));
$db->setQuery($query);
$updateSiteIDs = $db->loadColumn(0);
// Loop through all update sites
foreach ($updateSiteIDs as $id)
{
$query = $db->getQuery(true)
->update('#__update_sites')
->set('extra_query = '.$extra_query)
->where('update_site_id = "'.$id.'"');
$db->setQuery($query);
$db->execute();
}
}
/**
* Get extension Id
*
* @params void
*
* @return extension id
*
* @since 1.1.7
*
*/
public function getExtensionId()
{
$db = $this->getDbo();
$extensionType = 'package';
$extensionElement = 'pkg_falang';
// Get current extension ID
$query = $db->getQuery(true)
->select($db->qn('extension_id'))
->from($db->qn('#__extensions'))
->where($db->qn('type') . ' = ' . $db->q($extensionType))
->where($db->qn('element') . ' = ' . $db->q($extensionElement));
$db->setQuery($query);
$extension_id = $db->loadResult();
if (empty($extension_id))
{
return 0;
}
else
{
return $extension_id;
}
}
}