<?php
/**
* @version $Id: install.php 2356 2020-10-17 18:23:20Z IOS $
* @package Elxis
* @subpackage Component Extensions Manager
* @copyright Copyright (c) 2006-2020 Elxis CMS (https://www.elxis.org). All rights reserved.
* @license Elxis Public License ( https://www.elxis.org/elxis-public-license.html )
* @author Elxis Team ( https://www.elxis.org )
* @description Elxis CMS is free software. Read the license for copyright notices and details
*/
defined('_ELXIS_') or die ('Direct access to this location is not allowed');
class installExtmanagerController extends extmanagerController {
/*********************/
/* MAGIC CONSTRUCTOR */
/*********************/
public function __construct($view=null, $task='', $model=null) {
parent::__construct($view, $task, $model);
}
/************************************************/
/* PREPARE TO DISPLAY COMPONENT'S CONTROL PANEL */
/************************************************/
public function ipanel() {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$eDoc = eFactory::getDocument();
$sync = array('components' => array(), 'modules' => array(), 'plugins' => array(), 'templates' => array(), 'engines' => array(), 'auths' => array());
$subdbupdated = true;
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
$subdbupdated = $this->model->dbisUptodate();
if (isset($_GET['upsubdb'])) {
if (!$subdbupdated) {
$this->model->updateDatabase();
$subdbupdated = $this->model->dbisUptodate();
}
}
$sync = $this->syncExtensions();
}
$eDoc->addFontAwesome();
$eDoc->addStyleLink($elxis->secureBase().'/components/com_extmanager/css/extmanager'.$eLang->getinfo('RTLSFX').'.css');
$eDoc->addScriptLink($elxis->secureBase().'/components/com_extmanager/js/extmanager.js');
eFactory::getPathway()->addNode($eLang->get('EXTENSIONS'), 'extmanager:/');
$eDoc->setTitle($eLang->get('EXTENSIONS'));
$this->view->ipanel($sync, $subdbupdated, $elxis, $eLang);
}
/************************************************/
/* GET EXTENSIONS AVAILABLE FOR SYNCHRONIZATION */
/************************************************/
private function syncExtensions() {
$eFiles = eFactory::getFiles();
$sync = array('components' => array(), 'modules' => array(), 'plugins' => array(), 'templates' => array(), 'engines' => array(), 'auths' => array());
$fcomps = array();
$icomps = array();
$cdirs = $eFiles->listFolders('components/');
if ($cdirs) {
foreach ($cdirs as $cdir) {
$cname = preg_replace('#^(com_)#', '', $cdir);
if (file_exists(ELXIS_PATH.'/components/'.$cdir.'/'.$cname.'.php')) { $fcomps[] = $cdir; }
}
}
$options = array('sn' => 'component', 'so' => 'ASC', 'limitstart' => 0, 'limit' => 500);
$dbcomps = $this->model->getComponents($options);
if ($dbcomps) {
foreach ($dbcomps as $dbcomp) { $icomps[] = $dbcomp->component; }
}
if ($fcomps) {
foreach ($fcomps as $fcomp) {
if (!in_array($fcomp, $icomps)) { $sync['components'][] = $fcomp; }
}
}
unset($cdirs, $fcomps, $icomps, $dbcomps);
$fmods = array();
$imods = array('mod_content');
$mdirs = $eFiles->listFolders('modules/');
if ($mdirs) {
foreach ($mdirs as $mdir) {
if (file_exists(ELXIS_PATH.'/modules/'.$mdir.'/'.$mdir.'.php')) { $fmods[] = $mdir; }
}
}
$options = array('sn' => 'module', 'so' => 'ASC', 'limitstart' => 0, 'limit' => 900);
$dbmods = $this->model->getModules($options);
if ($dbmods) {
foreach ($dbmods as $dbmod) { $imods[] = $dbmod->module; }
$imods = array_unique($imods);
}
if ($fmods) {
foreach ($fmods as $fmod) {
if (!in_array($fmod, $imods)) { $sync['modules'][] = $fmod; }
}
}
unset($mdirs, $fmods, $imods, $dbmods);
$fplgs = array();
$iplgs = array();
$pdirs = $eFiles->listFolders('components/com_content/plugins/');
if ($pdirs) {
foreach ($pdirs as $pdir) {
if (file_exists(ELXIS_PATH.'/components/com_content/plugins/'.$pdir.'/'.$pdir.'.plugin.php')) { $fplgs[] = $pdir; }
}
}
$options = array('sn' => 'plugin', 'so' => 'ASC', 'limitstart' => 0, 'limit' => 500);
$dbplgs = $this->model->getPlugins($options);
if ($dbplgs) {
foreach ($dbplgs as $dbplg) { $iplgs[] = $dbplg->plugin; }
}
if ($fplgs) {
foreach ($fplgs as $fplg) {
if (!in_array($fplg, $iplgs)) { $sync['plugins'][] = $fplg; }
}
}
unset($pdirs, $fplgs, $iplgs, $dbplgs);
$ftpls = array();
$itpls = array();
$tdirs = $eFiles->listFolders('templates/');
if ($tdirs) {
foreach ($tdirs as $tdir) {
if ($tdir == 'admin') { continue; }
if (file_exists(ELXIS_PATH.'/templates/'.$tdir.'/index.php')) { $ftpls[] = $tdir; }
}
}
$options = array('section' => 'frontend', 'sn' => 'template', 'so' => 'ASC', 'limitstart' => 0, 'limit' => 500);
$dbtpls = $this->model->getTemplates($options);
if ($dbtpls) {
foreach ($dbtpls as $dbtpl) { $itpls[] = $dbtpl->template; }
}
if ($ftpls) {
foreach ($ftpls as $ftpl) {
if (!in_array($ftpl, $itpls)) { $sync['templates'][] = $ftpl; }
}
}
unset($tdirs, $ftpls, $itpls, $dbtpls);
$fengs = array();
$iengs = array();
$edirs = $eFiles->listFolders('components/com_search/engines/');
if ($edirs) {
foreach ($edirs as $edir) {
if (file_exists(ELXIS_PATH.'/components/com_search/engines/'.$edir.'/'.$edir.'.engine.php')) { $fengs[] = $edir; }
}
}
$options = array('sn' => 'engine', 'so' => 'ASC', 'limitstart' => 0, 'limit' => 500);
$dbengs = $this->model->getEngines($options);
if ($dbengs) {
foreach ($dbengs as $dbeng) { $iengs[] = $dbeng->engine; }
}
if ($fengs) {
foreach ($fengs as $feng) {
if (!in_array($feng, $iengs)) { $sync['engines'][] = $feng; }
}
}
unset($edirs, $fengs, $iengs, $dbengs);
$faths = array();
$iaths = array();
$adirs = $eFiles->listFolders('components/com_user/auth/');
if ($adirs) {
foreach ($adirs as $adir) {
if (file_exists(ELXIS_PATH.'/components/com_user/auth/'.$adir.'/'.$adir.'.auth.php')) { $faths[] = $adir; }
}
}
$options = array('sn' => 'auth', 'so' => 'ASC', 'limitstart' => 0, 'limit' => 500);
$dbaths = $this->model->getAuthMethods($options);
if ($dbaths) {
foreach ($dbaths as $dbath) { $iaths[] = $dbath->auth; }
}
if ($faths) {
foreach ($faths as $fath) {
if (!in_array($fath, $iaths)) { $sync['auths'][] = $fath; }
}
}
unset($adirs, $faths, $iaths, $dbaths);
return $sync;
}
/***************************************/
/* PERFORM SYSTEM DOWNLOAD AND INSTALL */
/***************************************/
public function installextensionsys() {
$this->installextension(true);
}
/***********************************/
/* PERFORM USER UPLOAD AND INSTALL */
/***********************************/
public function installextension($system=false) {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$eSession = eFactory::getSession();
$eFiles = eFactory::getFiles();
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
$this->view->installError($eLang->get('THIS_IS_SUBSITE').' '.$eLang->get('INST_EXT_MOTHERSITE'));
exit;
}
$can_install = $elxis->acl()->check('com_extmanager', 'components', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'modules', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'templates', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'engines', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'auth', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'plugins', 'install');
if ($can_install > 0) {
if (($elxis->getConfig('SECURITY_LEVEL') > 0) && ($elxis->user()->gid <> 1)) { $can_install = 0; }
}
if ($can_install < 1) {
$this->view->installError($eLang->get('NOTALLOWACTION'));
exit;
}
$sess_token = trim($eSession->get('token_extmaninst'));
$token = trim(filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
if (($token == '') || ($sess_token == '') || ($sess_token != $token)) {
$this->view->installError($eLang->get('REQDROPPEDSEC'));
exit;
}
$packok = false;
if (isset($_FILES) && isset($_FILES['package']) && ($_FILES['package']['name'] != '') && ($_FILES['package']['error'] == 0) && ($_FILES['package']['size'] > 0)) {
$packok = true;
}
if (!$packok) {
$this->view->installError($eLang->get('NO_PACK_UPLOADED'));
exit;
}
$filext = strtolower($eFiles->getExtension($_FILES['package']['name']));
if ($filext != 'zip') {
$this->view->installError($eLang->get('ELXIS_PACK_MUST_ZIP'));
exit;
}
$upfile = 'package_'.date('YmdHis').'_'.rand(100, 999).'.zip';
$ok = $eFiles->upload($_FILES['package']['tmp_name'], 'tmp/'.$upfile, true);
if (!$ok) {
$this->view->installError($eFiles->getError());
exit;
}
elxisLoader::loadFile('components/com_extmanager/includes/installer.class.php');
$installer = new elxisInstaller();
$ok = $installer->prepare($upfile);
if (!$ok) {
$this->view->installError($installer->getError());
exit;
}
if (($system == false) && ($installer->isUpdate() === true)) {
$installer->deletePackage();
$this->view->confirmUpdate($installer, $eLang);
exit;
}
if (($system == false) && (count($installer->getWarnings()) > 0)) {
$installer->deletePackage();
$this->view->confirmInstall($installer, $eLang);
exit;
}
$ok = $installer->install();
if (!$ok) {
$this->view->installError($installer->getError());
exit;
}
$this->view->installSuccess($installer, $elxis, $eLang);
}
/**************************************/
/* CONTINUE INSTALL (BY PASS WARNINGS) */
/**************************************/
public function extcinstall() {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$eFiles = eFactory::getFiles();
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
$this->view->installError($eLang->get('THIS_IS_SUBSITE').' '.$eLang->get('INST_EXT_MOTHERSITE'));
exit;
}
$can_install = $elxis->acl()->check('com_extmanager', 'components', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'modules', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'templates', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'engines', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'auth', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'plugins', 'install');
if ($can_install > 0) {
if (($elxis->getConfig('SECURITY_LEVEL') > 0) && ($elxis->user()->gid <> 1)) { $can_install = 0; }
}
if ($can_install < 1) {
$this->view->installError($eLang->get('NOTALLOWACTION'));
exit;
}
if (!isset($_POST['ufolder'])) {
$this->view->installError('Invalid request! ufolder not set.');
exit;
}
$pat = "#([\']|[\"]|[\$]|[\#]|[\<]|[\>]|[\*]|[\%]|[\~]|[\`]|[\^]|[\|]|[\{]|[\}]|[\\\])#u";
$ufolder = filter_input(INPUT_POST, 'ufolder', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
$ufolder = preg_replace($pat, '', $ufolder);
$ufolder = trim(str_replace('..', '', $ufolder));
if (($ufolder == '') || ($ufolder != $_POST['ufolder'])) {
$this->view->installError('Temporary folder (ufolder) has an invalid name!');
exit;
}
$tmpdir = $eFiles->elxisPath('tmp/', true);
if (!is_dir($tmpdir.$ufolder.'/')) {
$this->view->installError('Temporary folder (ufolder) does not exist!');
exit;
}
elxisLoader::loadFile('components/com_extmanager/includes/installer.class.php');
$installer = new elxisInstaller();
$ok = $installer->prepareFromFolder($ufolder);
if (!$ok) {
$this->view->installError($installer->getError());
exit;
}
$ok = $installer->install();
if (!$ok) {
$this->view->installError($installer->getError());
exit;
}
$this->view->installSuccess($installer, $elxis, $eLang);
}
/*************************************/
/* CONTINUE UPDATE (BYPASS WARNINGS) */
/*************************************/
public function extcupdate() {
$this->extcinstall();
}
/**************************************************/
/* DOWNLOAD AND INSTALL/UPLOAD EXTENSION FROM EDC */
/**************************************************/
public function edcinstall() {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$eFiles = eFactory::getFiles();
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
$this->view->installError($eLang->get('THIS_IS_SUBSITE').' '.$eLang->get('INST_EXT_MOTHERSITE'));
exit;
}
$can_install = $elxis->acl()->check('com_extmanager', 'components', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'modules', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'templates', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'engines', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'auth', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'plugins', 'install');
if ($can_install > 0) {
if (($elxis->getConfig('SECURITY_LEVEL') > 0) && ($elxis->user()->gid <> 1)) { $can_install = 0; }
}
if ($can_install < 1) {
$this->view->installError($eLang->get('NOTALLOWACTION'));
exit;
}
$options = array();
$options['task'] = filter_input(INPUT_POST, 'task', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
$options['edcauth'] = trim(filter_input(INPUT_POST, 'edcauth', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
$options['pcode'] = trim(filter_input(INPUT_POST, 'pcode', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
if (($options['task'] != 'install') && ($options['task'] != 'update')) {
$this->view->installError('Invalid request!');
exit;
}
if ($options['edcauth'] == '') {
$this->view->installError('You are not authorized to access EDC!');
exit;
}
if ($options['pcode'] == '') {
$this->view->installError('No Elxis package set!');
exit;
}
$str = $this->model->componentParams();
elxisLoader::loadFile('includes/libraries/elxis/parameters.class.php');
elxisLoader::loadFile('components/com_extmanager/includes/edc.class.php');
$params = new elxisParameters($str, '', 'component');
$edc = new elxisDC($params);
$edc_result = $edc->downloadPackage($options);
unset($edc, $params, $str);
if (($edc_result['error'] == 1) || ($edc_result['pack'] == '')) {
$errormsg = ($edc_result['errormsg'] != '') ? $edc_result['errormsg'] : 'Downloading extension from EDC failed!';
$this->view->installError($errormsg);
exit;
}
$upfile = $edc_result['pack'];
elxisLoader::loadFile('components/com_extmanager/includes/installer.class.php');
$installer = new elxisInstaller();
$ok = $installer->prepare($upfile, true);
if (!$ok) {
$this->view->installError($installer->getError());
exit;
}
$ok = $installer->install();
if (!$ok) {
$this->view->installError($installer->getError());
exit;
}
$this->view->installSuccess($installer, $elxis, $eLang);
}
/*************************/
/* SYNCHRONIZE EXTENSION */
/*************************/
public function syncextension() {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$eSession = eFactory::getSession();
if (!defined('ELXIS_MULTISITE') || (ELXIS_MULTISITE == 1)) {
$this->view->installError($eLang->get('SYNC_EXT_SUBSITES'));
exit;
}
$can_install = $elxis->acl()->check('com_extmanager', 'components', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'modules', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'templates', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'engines', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'auth', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'plugins', 'install');
if ($can_install > 0) {
if (($elxis->getConfig('SECURITY_LEVEL') > 0) && ($elxis->user()->gid <> 1)) { $can_install = 0; }
}
if ($can_install < 1) {
$this->view->installError($eLang->get('NOTALLOWACTION'));
exit;
}
$sess_token = trim($eSession->get('token_extmansync'));
$token = trim(filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
if (($token == '') || ($sess_token == '') || ($sess_token != $token)) {
$this->view->installError($eLang->get('REQDROPPEDSEC'));
exit;
}
$extension = trim(filter_input(INPUT_POST, 'extension', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
if ($extension == '') {
$this->view->installError($eLang->get('NO_EXT_SELECTED'));
exit;
}
if (preg_match('#^(com\_)#', $extension)) {
$type = 'component';
$acltype = 'components';
$cname = preg_replace('#^(com_)#', '', $extension);
if (!file_exists(ELXIS_PATH.'/components/'.$extension.'/'.$cname.'.php')) {
$this->view->installError('Component '.$extension.' does not exist!');
exit;
}
} else if (preg_match('#^(mod\_)#', $extension)) {
$type = 'module';
$acltype = 'modules';
if (!file_exists(ELXIS_PATH.'/modules/'.$extension.'/'.$extension.'.php')) {
$this->view->installError('Module '.$extension.' does not exist!');
exit;
}
} else {
if (file_exists(ELXIS_PATH.'/components/com_search/engines/'.$extension.'/'.$extension.'.engine.php')) {
$type = 'engine';
$acltype = 'engines';
} else if (file_exists(ELXIS_PATH.'/components/com_user/auth/'.$extension.'/'.$extension.'.auth.php')) {
$type = 'auth';
$acltype = 'auth';
} else if (file_exists(ELXIS_PATH.'/components/com_content/plugins/'.$extension.'/'.$extension.'.plugin.php')) {
$type = 'plugin';
$acltype = 'plugins';
} else {
$type = 'template';
$acltype = 'templates';
if (!file_exists(ELXIS_PATH.'/templates/'.$extension.'/index.php')) {
$this->view->installError('Template '.$extension.' does not exist!');
exit;
}
if (($extension == 'admin') || ($extension == 'system')) {
$this->view->installError('Invalid template!');
exit;
}
}
}
if ($elxis->acl()->check('com_extmanager', $acltype, 'install') < 1) {
$this->view->installError($eLang->get('NOTALLOWACTION'));
exit;
}
elxisLoader::loadFile('components/com_extmanager/includes/installer.class.php');
$installer = new elxisInstaller();
$ok = $installer->synchronize($type, $extension);
if (!$ok) {
$this->view->installError($installer->getError());
exit;
}
$this->view->installSuccess($installer, $elxis, $eLang, true);
}
/**************************************************/
/* CHECK EDC FOR UPDATES FOR INSTALLED EXTENSIONS */
/**************************************************/
public function checkupdates() {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$eDoc = eFactory::getDocument();
$pathway = eFactory::getPathway();
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
$msg = $eLang->get('THIS_IS_SUBSITE').' '.$eLang->get('INST_EXT_MOTHERSITE');
$link = $elxis->makeAURL('cpanel:/');
$elxis->redirect($link, $msg, true);
}
$can_install = $elxis->acl()->check('com_extmanager', 'components', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'modules', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'templates', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'engines', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'auth', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'plugins', 'install');
if ($can_install > 0) {
if (($elxis->getConfig('SECURITY_LEVEL') > 0) && ($elxis->user()->gid <> 1)) { $can_install = 0; }
}
if ($can_install < 1) {
$link = $elxis->makeAURL('cpanel:/');
$elxis->redirect($link, $eLang->get('NOTALLOWACTION'), true);
}
$extensions = $this->model->getThirdExtensions();
$dbupdated = $this->model->dbisUptodate();
$final = array();
$errormsg = '';
$elxisid = '';
$edcauth = '';
$str = $this->model->componentParams();
elxisLoader::loadFile('includes/libraries/elxis/parameters.class.php');
elxisLoader::loadFile('components/com_extmanager/includes/edc.class.php');
$params = new elxisParameters($str, '', 'component');
$edc = new elxisDC($params);
$elxis_releases = $edc->getElxisReleases();
unset($str);
if ($extensions) {
$refresh_auth = false;
$edc_result = $edc->getAllExtensions();
$errormsg = $edc_result['error'];
$elxisid = $edc->getElxisId();
$edcauth = $edc->getEdcAuth();
elxisLoader::loadFile('components/com_extmanager/includes/extension.xml.php');
$exml = new extensionXML();
foreach ($extensions as $extension) {
$info = $exml->quickXML($extension['type'], $extension['name']);
if ($info['installed'] == false) {
if ($extension['type'] == 'template') {
$extension['type'] = 'atemplate';
$info = $exml->quickXML($extension['type'], $extension['name']);//try admin template
if ($info['installed'] == false) {
continue;
}
} else {
continue;
}
}
$inst_version = $info['version'];
$inst_date = $info['created'];
$inst_title = $info['title'];
$inst_author = $info['author'];
unset($info);
if ($edc_result['rows']) {
foreach ($edc_result['rows'] as $k => $edcrow) {
if (($edcrow['type'] == $extension['type']) && ($edcrow['name'] == $extension['name'])) {
$edcrow['inst_version'] = $inst_version;
$edcrow['inst_date'] = $inst_date;
$final[] = $edcrow;
//If we used a cached version and there is an update => Refresh edcauth!
if (($edcauth == '') && ($edcrow['inst_version'] != $edcrow['version'])) { $refresh_auth = true; }
unset($edc_result['rows'][$k]);
break;
}
}
} else {
$final[] = array(
'id' => 0,
'catid' => 0,
'uid' => 0,
'type' => $extension['type'],
'name' => $extension['name'],
'title' => $inst_title,
'author' => $inst_author,
'version' => '',
'created' => 0,
'modified' => 0,
'pcode' => '',
'inst_version' => $inst_version,
'inst_date' => $inst_date,
'compatibility' => '',
'edclink' => ''
);
}
}
unset($edcrows, $exml);
if ($refresh_auth) {
$edc = new elxisDC($params);
$edc->connect();
$edcauth = $edc->getEdcAuth();
unset($edc);
}
unset($params, $refresh_auth);
}
unset($extensions, $edc);
$eDoc->addFontAwesome();
$eDoc->addFontElxis();
$eDoc->addStyleLink($elxis->secureBase().'/components/com_extmanager/css/extmanager'.$eLang->getinfo('RTLSFX').'.css');
$eDoc->addScriptLink($elxis->secureBase().'/components/com_extmanager/js/extmanager.js');
$pathway->addNode($eLang->get('EXTENSIONS'), 'extmanager:/');
$pathway->addNode($eLang->get('CHECK_UPDATES'));
$eDoc->setTitle($eLang->get('CHECK_UPDATES'));
$this->view->updates($final, $elxis_releases, $errormsg, $elxisid, $edcauth, $dbupdated, $elxis, $eLang);
}
/*************************/
/* UPDATE ELXIS DATABASE */
/*************************/
public function updateelxisdb($return_result=false) {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
$msg = $eLang->get('THIS_IS_SUBSITE').' '.$eLang->get('INST_EXT_MOTHERSITE');
if ($return_result) {
$response = array('success' => 0, 'message' => $msg);
return $response;
}
$link = $elxis->makeAURL('cpanel:/');
$elxis->redirect($link, $msg, true);
}
$can_install = $elxis->acl()->check('com_extmanager', 'components', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'modules', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'templates', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'engines', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'auth', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'plugins', 'install');
if ($can_install > 0) {
if (($elxis->getConfig('SECURITY_LEVEL') > 0) && ($elxis->user()->gid <> 1)) { $can_install = 0; }
}
if ($can_install < 1) {
if ($return_result) {
$response = array('success' => 0, 'message' => $eLang->get('NOTALLOWACTION'));
return $response;
}
$link = $elxis->makeAURL('cpanel:/');
$elxis->redirect($link, $eLang->get('NOTALLOWACTION'), true);
}
$link = $elxis->makeAURL('extmanager:install/updates.html');
$dbupdated = $this->model->dbisUptodate();
if ($dbupdated) {
if ($return_result) {
$response = array('success' => 1, 'message' => '');
return $response;
}
$elxis->redirect($link);
}
$this->model->updateDatabase();
if ($return_result) {
$response = array('success' => 1, 'message' => '');
return $response;
}
$elxis->redirect($link);
}
/******************************************************************/
/* DO FILESYSTEM INTEGRITY CHECK USING HASHES FILE FROM ELXIS.ORG */
/******************************************************************/
public function checkfilesystem() {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$eDoc = eFactory::getDocument();
$pathway = eFactory::getPathway();
$prompt_upelxis = false;
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
$link = $elxis->makeAURL('cpanel:/');
$elxis->redirect($link);
}
$data = array(
'iversion' => (string)$elxis->getVersion(),
'irevision' => $elxis->fromVersion('REVISION'),
'hashfile' => 'elxis_hashes_'.$elxis->getVersion().'.txt',
'warnings' => array(),
'infos' => array(),
'do' => 0,
'cando' => 1
);
$data['do'] = isset($_GET['do']) ? (int)$_GET['do'] : 0;
elxisLoader::loadFile('components/com_extmanager/includes/edc.class.php');
$edc = new elxisDC();
if ($data['do'] == 0) {
$elxis_releases = $edc->getElxisReleases();
if ($elxis_releases['rows']) {
if ($data['iversion'] < $elxis_releases['current']) {
$data['warnings'][] = 'There is a newer Elxis version available (<strong>'.$elxis_releases['current'].'</strong>). Update Elxis or <a href="https://www.elxis.org" target="_blank">Visit elxis.org</a> for more information.';
$prompt_upelxis = true;
}
$iversion = $data['iversion'];
if (isset($elxis_releases['rows'][$iversion])) {
$release = $elxis_releases['rows'][$iversion];
if ($release['revision'] > $data['irevision']) {
$data['warnings'][] = 'There is an updated <strong>Elxis '.$release['version'].'</strong> '.$release['codename'].' available. Update Elxis! Filesystem check is performed based on the latest Elxis '.$release['version'].' release (r'.$release['revision'].').';
$prompt_upelxis = true;
} else {
$data['infos'][] = 'You have the latest <strong>Elxis '.$release['version'].'</strong> '.$release['codename'].' installed (r'.$release['revision'].').';
}
} else {
$data['warnings'][] = 'No information found on elxis.org for the Elxis version you are using (<strong>Elxis '.$data['iversion'].'</strong>).';
}
}
unset($elxis_releases);
}
$hashpath = eFactory::getFiles()->elxisPath('cache/edc/'.$data['hashfile'], true);
if ($data['do'] == 0) {
$hashupdate = true;
if (file_exists($hashpath)) {
$dt = time() - filemtime($hashpath);
if ($dt < 7200) {//less than 2 hours old, no need to update it
$hashupdate = false;
}
}
if ($hashupdate) {
$ok = $edc->getElxisHashes($data['iversion']);
if (!$ok) {
$data['warnings'][] = 'Could not receive <strong>Elxis '.$data['iversion'].'</strong> hashes file from elxis.org';
}
}
}
unset($edc);
if (!file_exists($hashpath)) {
$data['cando'] = 0;
}
$pathway->addNode($eLang->get('EXTENSIONS'), 'extmanager:/');
$pathway->addNode($eLang->get('CHECK_FS'));
$eDoc->setTitle($eLang->get('CHECK_FS'));
$eDoc->addStyleLink($elxis->secureBase().'/components/com_extmanager/css/extmanager'.$eLang->getinfo('RTLSFX').'.css');
if ($data['do'] == 0) {
$this->view->checkFilesystemHTML($data, array(), $elxis, $eLang, $prompt_upelxis);
return;
}
if (!file_exists($hashpath)) {
$data['do'] = 0;
$data['warnings'][] = 'Filesystem check cannot be executed. Cannot download <strong>Elxis '.$data['iversion'].'</strong> hashes file in folder {repository/}cache/edc/';
$this->view->checkFilesystemHTML($data, array(), $elxis, $eLang, $prompt_upelxis);
return;
}
@clearstatcache();
$temp = array();
$lines = file($hashpath);
foreach ($lines as $i => $line) {
if (trim($line == '')) { continue; }
if ($i == 0) { continue; } //Version:Elxis X.X revXXXX DATE:XXXX-XX-XX XX:XX:XX
$parts = explode(',', $line);
$temp[] = array($parts[0], trim($parts[1]), trim($parts[2]));
}
unset($lines);
$results = array();
$repl = array('/[\r\n]/','/[\n]/');
foreach ($temp as $file) {
if (!file_exists(ELXIS_PATH.'/'.$file[0])) {
$results[] = array($file[0], 'notfound');
} else if (md5_file(ELXIS_PATH.'/'.$file[0]) != $file[1]) {
$txt = file_get_contents(ELXIS_PATH.'/'.$file[0]);
if (md5(preg_replace($repl, '', $txt)) != $file[2]) {
$results[] = array($file[0], 'notuptodate');
}
}
}
unset($temp, $repl);
$this->view->checkFilesystemHTML($data, $results, $elxis, $eLang, $prompt_upelxis);
}
/************************/
/* PERFORM ELXIS UPDATE */
/************************/
public function updateelxis() {
$elxis = eFactory::getElxis();
$eDoc = eFactory::getDocument();
$eLang = eFactory::getLang();
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
echo '<div class="elx5_error">'.$eLang->get('THIS_IS_SUBSITE').' You can update Elxis only on the main site!</div>';
return;
}
$can_install = $elxis->acl()->check('com_extmanager', 'components', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'modules', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'templates', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'engines', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'auth', 'install');
$can_install += $elxis->acl()->check('com_extmanager', 'plugins', 'install');
if ($can_install > 0) {
if (($elxis->getConfig('SECURITY_LEVEL') > 0) && ($elxis->user()->gid <> 1)) { $can_install = 0; }
}
if ($can_install < 1) {
echo '<div class="elx5_error">'.$eLang->get('NOTALLOWACTION').'</div>';
return;
}
$eDoc->addFontAwesome();
$eDoc->addStyleLink($elxis->secureBase().'/components/com_extmanager/css/extmanager'.$eLang->getinfo('RTLSFX').'.css');
if (isset($_POST['step'])) {
$step = (int)$_POST['step'];
} else if (isset($_GET['step'])) {
$step = (int)$_GET['step'];
} else {
$step = 0;
}
if ($step < 0) { $step = 0; }
if ($step == 7) {//Cleanup files
$response = $this->upElxisCleanup($elxis);
if ($response['page'] < $response['maxpage']) {
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$next = $response['page'] + 1;
$this->view->updateElxisHTML(7, 'Clean up ('.$next.'/'.$response['maxpage'].')', '', array('page' => $next));
} else {
$link = $elxis->makeAURL('extmanager:install/updates.html');
$elxis->redirect($link);
}
} else if ($step == 6) {//Update db, configuration
$response = $this->updateelxisdb(true);
if ($response['success'] == 1) {
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$this->view->updateElxisHTML(7, 'Clean up');
} else {
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$this->view->updateElxisHTML(6, 'Update database', $response['message']);
}
} else if ($step == 5) {
$response = $this->upElxisUpdateFiles($elxis);
if ($response['errormsg'] != '') {
$this->view->updateElxisHTML(5, 'Update files (1/'.$response['maxpage'].')', $response['errormsg']);
} else {
if ($response['page'] < $response['maxpage']) {
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$next = $response['page'] + 1;
$this->view->updateElxisHTML(5, 'Update files ('.$next.'/'.$response['maxpage'].')', '', array('page' => $next));
} else {
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$this->view->updateElxisHTML(6, 'Update database');
}
}
} else if ($step == 4) {
$uptov = isset($_POST['uptoversion']) ? trim($_POST['uptoversion']) : '';
$response = $this->upElxisCheckFS($uptov, $elxis);
if ($response['success'] == 1) {
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$max = ceil($response['numfilestoupdate'] / 100);
$this->view->updateElxisHTML(5, 'Update '.$response['numfilestoupdate'].' files (1/'.$max.')');
} else {
$this->view->updateElxisHTML(4, 'Filesystem check', $response['message'], array('uptoversion' => $uptov));
}
} else if ($step == 3) {
$uptov = isset($_POST['uptoversion']) ? trim($_POST['uptoversion']) : '';
elxisLoader::loadFile('components/com_extmanager/includes/edc.class.php');
$edc = new elxisDC();
$ok = $edc->getElxisHashes($uptov);
unset($edc);
if ($ok) {
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$this->view->updateElxisHTML(4, 'Filesystem check', '', array('uptoversion' => $uptov));
} else {
$this->view->updateElxisHTML(3, 'Download checksums', 'Downloading Elxis hashes failed!', array('uptoversion' => $uptov));
}
} else if ($step == 2) {
$repo_path = rtrim($elxis->getConfig('REPO_PATH'), '/');
if ($repo_path == '') { $repo_path = ELXIS_PATH.'/repository'; }
$sum = 0;
if (file_exists($repo_path.'/tmp/elxis/')) {//check if it is already unzipped
if (file_exists($repo_path.'/tmp/elxis/components/')) { $sum++; }
if (file_exists($repo_path.'/tmp/elxis/includes/version.php')) { $sum++; }
if (file_exists($repo_path.'/tmp/elxis/language/')) { $sum++; }
if (file_exists($repo_path.'/tmp/elxis/templates/')) { $sum++; }
if (file_exists($repo_path.'/tmp/elxis/index.php')) { $sum++; }
}
if ($sum == 5) {//files already there
include($repo_path.'/tmp/elxis/includes/version.php');
$uptoversion = $elxis_version['RELEASE'].'.'.$elxis_version['LEVEL'];//required for hashes download
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$this->view->updateElxisHTML(3, 'Download checksums', '', array('uptoversion' => $uptoversion));
} else {
$zip = $elxis->obj('zip');
$ok = $zip->unzip($repo_path.'/tmp/elxis.zip', $repo_path.'/tmp/elxis/');
if (!$ok) {
$errormsg = $zip->getError();
unset($zip);
$this->view->updateElxisHTML(2, 'Unzip Elxis package', $errormsg);
} else {
include($repo_path.'/tmp/elxis/includes/version.php');
$uptoversion = $elxis_version['RELEASE'].'.'.$elxis_version['LEVEL'];//required for hashes download
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$this->view->updateElxisHTML(3, 'Download checksums', '', array('uptoversion' => $uptoversion));
}
}
} else if ($step == 1) {
elxisLoader::loadFile('components/com_extmanager/includes/edc.class.php');
$edc = new elxisDC();
$response = $edc->downloadElxis();
if ($response['success'] == 1) {
$eDoc->addScript('setTimeout("document.getElementById(\'fmupelxis\').submit();", 3000);');
$this->view->updateElxisHTML(2, 'Unzip Elxis package');
} else {
$msg = $response['message'].' - If the problem persists download elxis from elxis.org, name it as elxis.zip and place it inside folder repository/tmp/';
$this->view->updateElxisHTML(1, 'Download Elxis', $response['message']);
}
} else {//step = 0
$this->view->updateElxisHTML(1, 'Download Elxis');
}
}
/***********************************/
/* UPDATE ELXIS / CHECK FILESYSTEM */
/***********************************/
private function upElxisCheckFS($upversion, $elxis) {
$repo_path = rtrim($elxis->getConfig('REPO_PATH'), '/');
if ($repo_path == '') { $repo_path = ELXIS_PATH.'/repository'; }
$response = array('success' => 0, 'numfilestoupdate' => 0, 'message' => '');
$hashpath = $repo_path.'/cache/edc/elxis_hashes_'.$upversion.'.txt';
if (!file_exists($hashpath)) {
$response['message'] = 'Hashes file not found!';
return $response;
}
@clearstatcache();
$temp = array();
$lines = file($hashpath);
foreach ($lines as $i => $line) {
if (trim($line == '')) { continue; }
if ($i == 0) { continue; } //Version:Elxis X.X revXXXX DATE:XXXX-XX-XX XX:XX:XX
$parts = explode(',', $line);
$temp[] = array($parts[0], trim($parts[1]), trim($parts[2]));
}
unset($lines);
$datatxt = '';
$repl = array('/[\r\n]/','/[\n]/');
foreach ($temp as $file) {
if (!file_exists(ELXIS_PATH.'/'.$file[0])) {
$datatxt .= $file[0]."\n";
$response['numfilestoupdate']++;
} else if (md5_file(ELXIS_PATH.'/'.$file[0]) != $file[1]) {
$txt = file_get_contents(ELXIS_PATH.'/'.$file[0]);
if (md5(preg_replace($repl, '', $txt)) != $file[2]) {
$datatxt .= $file[0]."\n";
$response['numfilestoupdate']++;
}
}
}
unset($temp, $repl);
if ($datatxt == '') {
$response['success'] = 1;
return $response;
}
if ($handle = @fopen($repo_path.'/tmp/files_to_update.txt', 'w')) {
@fwrite($handle, $datatxt);
fclose($handle);
$response['success'] = 1;
return $response;
}
$response['message'] = 'Could not save list of files that need to be updated!';
return $response;
}
/***************************/
/* UPDATE ELXIS FILESYSTEM */
/***************************/
private function upElxisUpdateFiles($elxis) {
$repo_path = rtrim($elxis->getConfig('REPO_PATH'), '/');
if ($repo_path == '') { $repo_path = ELXIS_PATH.'/repository'; }
$fileslimit = 100;//update 100 files per turn
$page = isset($_POST['page']) ? (int)$_POST['page'] : 1;
if ($page < 1) { $page = 1; }
$lines = file($repo_path.'/tmp/files_to_update.txt');
$response = array(
'total' => count($lines),//-1 because the last line is empty but its ok, makes no problem
'page' => $page,
'maxpage' => 1,
'limitstart' => 0,
'errormsg' => ''
);
if ($response['total'] > 1) {
$response['maxpage'] = ceil($response['total'] / $fileslimit);
if ($response['maxpage'] < 1) { $response['maxpage'] = 1; }
if ($response['page'] > $response['maxpage']) { $response['page'] = $response['maxpage']; }
$response['limitstart'] = (($response['page'] - 1) * $fileslimit);
}
$q = 0;
foreach ($lines as $i => $path) {
if ($i < $response['limitstart']) { continue; }
if ($q >= $fileslimit) { break; }
$q++;
$path = trim($path);//also removes line endings
if ($path == '') { continue; }
$dir = dirname(ELXIS_PATH.'/'.$path);
if (!file_exists($dir)) {
$ok = @mkdir($dir, 0755, true);
if (!$ok) {
$response['errormsg'] = 'Could not create required folder '.$dir.'. Is the parent folder writeable?';
break;
}
}
$ok = @copy($repo_path.'/tmp/elxis/'.$path, ELXIS_PATH.'/'.$path);
if (!$ok) {
$response['errormsg'] = 'Could not copy file '.$path.' to destination directory.';
break;
}
}
unset($lines);
return $response;
}
/*****************************************/
/* UPDATE ELXIS: CLEANUP TEMPORARY FILES */
/*****************************************/
private function upElxisCleanup($elxis) {
$repo_path = rtrim($elxis->getConfig('REPO_PATH'), '/');
if ($repo_path == '') { $repo_path = ELXIS_PATH.'/repository'; }
$response = array('page' => 1, 'maxpage' => 4);//never return error, just continue
$response['page'] = isset($_POST['page']) ? (int)$_POST['page'] : 1;
if ($response['page'] < 1) { $response['page'] = 1; }
if ($response['page'] > $response['maxpage']) { $response['page'] = $response['maxpage']; }
if ($response['page'] == 1) {
$abspath = $repo_path.'/tmp/elxis/includes/libraries/';
if (file_exists($abspath)) {
$this->upElxisDeleteFolder($abspath);
}
return $response;
}
if ($response['page'] == 2) {
$abspath = $repo_path.'/tmp/elxis/includes/';
if (file_exists($abspath)) {
$this->upElxisDeleteFolder($abspath);
}
$abspath = $repo_path.'/tmp/elxis/media/';
if (file_exists($abspath)) {
$this->upElxisDeleteFolder($abspath);
}
return $response;
}
if ($response['page'] == 3) {
$abspath = $repo_path.'/tmp/elxis/language/';
if (file_exists($abspath)) {
$this->upElxisDeleteFolder($abspath);
}
$abspath = $repo_path.'/tmp/elxis/modules/';
if (file_exists($abspath)) {
$this->upElxisDeleteFolder($abspath);
}
$abspath = $repo_path.'/tmp/elxis/templates/';
if (file_exists($abspath)) {
$this->upElxisDeleteFolder($abspath);
}
return $response;
}
$abspath = $repo_path.'/tmp/elxis/components/';
if (file_exists($abspath)) {
$this->upElxisDeleteFolder($abspath);
}
$abspath = $repo_path.'/tmp/elxis/';
if (file_exists($abspath)) {
$this->upElxisDeleteFolder($abspath);
}
$abspath = $repo_path.'/tmp/elxis.zip';
if (file_exists($abspath)) { @unlink($abspath); }
$abspath = $repo_path.'/tmp/files_to_update.txt';
if (file_exists($abspath)) { @unlink($abspath); }
return $response;
}
private function upElxisDeleteFolder($abspath) {
$current_dir = opendir($abspath);
while ($entry = readdir($current_dir)) {
if (($entry != '.') && ($entry != '..')) {
if (is_dir($abspath.$entry)) {
$this->upElxisDeleteFolder($abspath.$entry.'/');
} else {
@unlink($abspath.$entry);
}
}
}
closedir($current_dir);
$ok = @rmdir($abspath);
return $ok;
}
}
?>