<?php
/**
* @version $Id: base.php 2435 2022-01-19 17:47:51Z IOS $
* @package Elxis
* @subpackage Component Extensions Manager
* @copyright Copyright (c) 2006-2022 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 extmanagerController {
protected $view = null;
protected $model = null;
protected function __construct($view=null, $task='', $model=null) {
$this->view = $view;
$this->model = $model;
}
/******************************/
/* PREPARE TO LIST EXTENSIONS */
/******************************/
protected function listExtensions($type) {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$pathway = eFactory::getPathway();
$eDoc = eFactory::getDocument();
$options = array('limit' => 20, 'page' => 1, 'maxpage' => 1, 'sn' => 'title', 'so' => 'asc', 'limitstart' => 0, 'total' => 0, 'key' => '');
if ($type == 'engines') {
$extdata = array(
'id' => 'id',
'type' => 'engines',
'pgtitle' => $eLang->get('SEARCH_ENGINES'),
'countfunc' => 'countEngines',
'getfunc' => 'getEngines',
'columns' => array(
array('title' => $eLang->get('TITLE'), 'name' => 'title', 'sortable' => true, 'class' => ''),
array('title' => $eLang->get('SEARCH_ENGINE'), 'name' => 'engine', 'sortable' => true, 'class' => 'elx5_lmobhide'),
array('title' => $eLang->get('PUBLISHED'), 'name' => 'published', 'sortable' => true, 'class' => 'elx5_center'),
array('title' => $eLang->get('ORDERING'), 'name' => 'ordering', 'sortable' => true, 'class' => 'elx5_center elx5_smallscreenhide'),
array('title' => $eLang->get('DEFAULT'), 'name' => 'defengine', 'sortable' => false, 'class' => 'elx5_center elx5_tabhide'),
array('title' => $eLang->get('ACCESS'), 'name' => 'alevel', 'sortable' => false, 'class' => 'elx5_midscreenhide'),
array('title' => $eLang->get('VERSION'), 'name' => 'version', 'sortable' => false, 'class' => 'elx5_center elx5_smallscreenhide'),
array('title' => $eLang->get('DATE'), 'name' => 'created', 'sortable' => false, 'class' => 'elx5_midscreenhide')
)
);
$options['sn'] = 'ordering';
} else if ($type == 'auth') {
$extdata = array(
'id' => 'id',
'type' => 'auth',
'pgtitle' => $eLang->get('AUTH_METHODS'),
'countfunc' => 'countAuthMethods',
'getfunc' => 'getAuthMethods',
'columns' => array(
array('title' => $eLang->get('TITLE'), 'name' => 'title', 'sortable' => true, 'class' => ''),
array('title' => $eLang->get('AUTH_METHOD'), 'name' => 'auth', 'sortable' => true, 'class' => 'elx5_tabhide'),
array('title' => $eLang->get('PUBLISHED'), 'name' => 'published', 'sortable' => true, 'class' => 'elx5_center'),
array('title' => $eLang->get('ORDERING'), 'name' => 'ordering', 'sortable' => true, 'class' => 'elx5_center elx5_smallscreenhide'),
array('title' => $eLang->get('VERSION'), 'name' => 'version', 'sortable' => false, 'class' => 'elx5_center elx5_smallscreenhide'),
array('title' => $eLang->get('DATE'), 'name' => 'created', 'sortable' => false, 'class' => 'elx5_midscreenhide')
)
);
$options['sn'] = 'ordering';
} else if ($type == 'plugins') {
$extdata = array(
'id' => 'id',
'type' => 'plugins',
'pgtitle' => $eLang->get('CONTENT_PLUGINS'),
'countfunc' => 'countPlugins',
'getfunc' => 'getPlugins',
'columns' => array(
array('title' => $eLang->get('TITLE'), 'name' => 'title', 'sortable' => true, 'class' => ''),
array('title' => $eLang->get('PLUGIN'), 'name' => 'plugin', 'sortable' => true, 'class' => 'elx5_tabhide'),
array('title' => $eLang->get('PUBLISHED'), 'name' => 'published', 'sortable' => true, 'class' => 'elx5_center'),
array('title' => $eLang->get('ORDERING'), 'name' => 'ordering', 'sortable' => true, 'class' => 'elx5_center elx5_smallscreenhide'),
array('title' => $eLang->get('ACCESS'), 'name' => 'alevel', 'sortable' => false, 'class' => 'elx5_midscreenhide'),
array('title' => $eLang->get('VERSION'), 'name' => 'version', 'sortable' => false, 'class' => 'elx5_center elx5_smallscreenhide'),
array('title' => $eLang->get('DATE'), 'name' => 'created', 'sortable' => false, 'class' => 'elx5_midscreenhide')
)
);
$options['sn'] = 'ordering';
} else if ($type == 'components') {
$extdata = array(
'id' => 'id',
'type' => 'components',
'pgtitle' => $eLang->get('COMPONENTS'),
'countfunc' => 'countComponents',
'getfunc' => 'getComponents',
'columns' => array(
array('title' => $eLang->get('TITLE'), 'name' => 'name', 'sortable' => true, 'class' => ''),
array('title' => $eLang->get('COMPONENT'), 'name' => 'component', 'sortable' => true, 'class' => 'elx5_mobhide'),
array('title' => $eLang->get('VERSION'), 'name' => 'version', 'sortable' => false, 'class' => 'elx5_center elx5_tabhide'),
array('title' => $eLang->get('DATE'), 'name' => 'created', 'sortable' => false, 'class' => 'elx5_midscreenhide'),
array('title' => $eLang->get('AUTHOR'), 'name' => 'author', 'sortable' => false, 'class' => 'elx5_smallscreenhide'),
array('title' => $eLang->get('ROUTE'), 'name' => 'route', 'sortable' => false, 'class' => 'elx5_midscreenhide')
)
);
$options['sn'] = 'name';
} else if ($type == 'templates') {
$extdata = array(
'id' => 'id',
'type' => 'templates',
'pgtitle' => $eLang->get('TEMPLATES'),
'countfunc' => 'countTemplates',
'getfunc' => 'getTemplates',
'columns' => array(
array('title' => $eLang->get('TITLE'), 'name' => 'title', 'sortable' => true, 'class' => ''),
array('title' => $eLang->get('TEMPLATE'), 'name' => 'template', 'sortable' => true, 'class' => 'elx5_tabhide'),
array('title' => $eLang->get('VERSION'), 'name' => 'version', 'sortable' => false, 'class' => 'elx5_center elx5_lmobhide'),
array('title' => $eLang->get('DATE'), 'name' => 'created', 'sortable' => false, 'class' => 'elx5_midscreenhide'),
array('title' => $eLang->get('DEFAULT'), 'name' => 'deftpl', 'sortable' => false, 'class' => 'elx5_center'),
array('title' => $eLang->get('AUTHOR'), 'name' => 'author', 'sortable' => false, 'class' => 'elx5_midscreenhide'),
array('title' => $eLang->get('SECTION'), 'name' => 'section', 'sortable' => true, 'class' => 'elx5_smallscreenhide')
)
);
$options['sn'] = 'title';
if (isset($_POST['section'])) {
$options['section'] = trim($_POST['section']);
} else if (isset($_GET['section'])) {
$options['section'] = trim($_GET['section']);
} else {
$options['section'] = 'frontend';
}
if ($options['section'] != 'backend') { $options['section'] = 'frontend'; }
} else if ($type == 'modules') {
$extdata = array(
'id' => 'id',
'type' => 'modules',
'pgtitle' => $eLang->get('MODULES'),
'countfunc' => 'countModules',
'getfunc' => 'getModules',
'columns' => array(
array('title' => $eLang->get('TITLE'), 'name' => 'title', 'sortable' => true, 'class' => ''),
array('title' => $eLang->get('MODULE'), 'name' => 'module', 'sortable' => true, 'class' => 'elx5_smallscreenhide'),
array('title' => $eLang->get('VERSION'), 'name' => 'version', 'sortable' => false, 'class' => 'elx5_center elx5_smallscreenhide'),
array('title' => $eLang->get('PUBLISHED'), 'name' => 'published', 'sortable' => true, 'class' => 'elx5_center'),
array('title' => $eLang->get('POSITION'), 'name' => 'position', 'sortable' => true, 'class' => 'elx5_lmobhide'),
array('title' => $eLang->get('ORDERING'), 'name' => 'ordering', 'sortable' => true, 'class' => 'elx5_center elx5_smallscreenhide'),
array('title' => $eLang->get('ACCESS'), 'name' => 'modaccess', 'sortable' => false, 'class' => 'elx5_midscreenhide'),
array('title' => $eLang->get('SECTION'), 'name' => 'section', 'sortable' => false, 'class' => 'elx5_midscreenhide')
)
);
$extdata['allgroups'] = $this->model->getGroups();
$options['sn'] = 'position';
if (isset($_POST['section'])) {
$options['section'] = trim($_POST['section']);
} else if (isset($_GET['section'])) {
$options['section'] = trim($_GET['section']);
} else {
$options['section'] = 'frontend';
}
if ($options['section'] != 'backend') { $options['section'] = 'frontend'; }
$pat = "#([\']|[\"]|[\$]|[\#]|[\<]|[\>]|[\*]|[\%]|[\~]|[\`]|[\^]|[\|]|[\}]|[\\\])#u";
$options['position'] = filter_input(INPUT_GET, 'position', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW || FILTER_FLAG_STRIP_HIGH);
$options['position'] = eUTF::trim(preg_replace($pat, '', $options['position']));
} else {
$link = $elxis->makeAURL('extmanager:/');
$elxis->redirect($link, 'Invalid extension type!', true);
}
$sortcols = array();
foreach ($extdata['columns'] as $col) {
if ($col['sortable']) { $sortcols[] = $col['name']; }
}
if (isset($_GET['key'])) {
$options['key'] = trim(filter_input(INPUT_GET, 'key', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
if (eUTF::strlen($options['key']) < 3) { $options['key'] = ''; }
}
$options['limit'] = (isset($_GET['limit'])) ? (int)$_GET['limit'] : 20;
if ($options['limit'] < 1) { $options['limit'] = 20; }
$elxis->updateCookie('limit', $options['limit']);
$options['page'] = (isset($_GET['page'])) ? (int)$_GET['page'] : 1;
if ($options['page'] < 1) { $options['page'] = 1; }
if (isset($_GET['sn'])) {
$sn = trim($_GET['sn']);
if ($sn != '') { if (in_array($sn, $sortcols)) { $options['sn'] = $sn; } }
}
$options['so'] = (isset($_GET['so'])) ? trim($_GET['so']) : 'asc';
if ($options['so'] != 'desc') { $options['so'] = 'asc'; }
$func = $extdata['countfunc'];
$options['total'] = $this->model->$func($options);
$rows = array();
$modsacl = array();
$options['maxpage'] = ceil($options['total']/$options['limit']);
if ($options['maxpage'] < 1) { $options['maxpage'] = 1; }
if ($options['page'] > $options['maxpage']) { $options['page'] = $options['maxpage']; }
$options['limitstart'] = (($options['page'] - 1) * $options['limit']);
if ($options['total'] > 0) {
$func = $extdata['getfunc'];
$rows = $this->model->$func($options);
if ($rows) {
if ($extdata['type'] == 'modules') {
$modids = array();
foreach ($rows as $row) { $modids[] = $row->id; }
$modsacl = $this->model->getModulesViewACL($modids);
}
elxisLoader::loadFile('components/com_extmanager/includes/extension.xml.php');
$exml = new extensionXML();
foreach ($rows as $k => $row) {
$rows[$k]->version = 0;
$rows[$k]->created = '';
$rows[$k]->author = '';
$rows[$k]->authorurl = '';
$info = false;
if ($extdata['type'] == 'engines') {
$info = $exml->quickXML('engine', $row->engine);
} else if ($extdata['type'] == 'auth') {
$info = $exml->quickXML('auth', $row->auth);
} else if ($extdata['type'] == 'plugins') {
$info = $exml->quickXML('plugin', $row->plugin);
} else if ($extdata['type'] == 'modules') {
$info = $exml->quickXML('module', $row->module);
} else if ($extdata['type'] == 'components') {
$cname = preg_replace('#^(com\_)#', '', $row->component);
$info = $exml->quickXML('component', $cname);
} else if ($extdata['type'] == 'templates') {
$exttype = ($options['section'] == 'backend') ? 'atemplate' : 'template';
$info = $exml->quickXML($exttype, $row->template);
$cur_template = ($options['section'] == 'backend') ? $elxis->getConfig('ATEMPLATE') : $elxis->getConfig('TEMPLATE');
$rows[$k]->deftpl = ($row->template == $cur_template) ? 1 : 0;
}
if ($info) {
$rows[$k]->version = $info['version'];
$rows[$k]->created = $info['created'];
$rows[$k]->author = $info['author'];
$rows[$k]->authorurl = $info['authorurl'];
}
unset($info);
}
unset($exml);
}
}
$warnmsg = '';
if (($extdata['type'] == 'modules') && ($options['page'] == 1)) {
if ($elxis->getConfig('CRONJOBS') == 0) {
$scheduled = $this->model->countScheduledItems();
if ($scheduled > 0) {
$warnmsg = sprintf($eLang->get('SCHEDULED_CRON_DIS'), $scheduled);
if ($elxis->acl()->check('com_cpanel', 'settings', 'edit') > 0) {
$link = $elxis->makeAURL('cpanel:config.html');
$warnmsg .= ' <a href="'.$link.'">'.$eLang->get('SETTINGS').'</a>';
}
}
}
}
$pathway->addNode($eLang->get('EXTENSIONS'), 'extmanager:/');
$pathway->addNode($extdata['pgtitle'], 'extmanager:'.$extdata['type'].'/');
$eDoc->setTitle($extdata['pgtitle']);
$eDoc->addFontAwesome();
$eDoc->addScriptLink($elxis->secureBase().'/components/com_extmanager/js/extmanager.js');
if ($rows) {
$eDoc->addNativeDocReady('elx5DataTable(\'extensionstbl\', false);');
}
$this->view->listExtensionsHTML($extdata, $options, $rows, $modsacl, $warnmsg, $elxis, $eLang);
}
/*************************************/
/* TOGGLE EXTENSION'S PUBLISH STATUS */
/*************************************/
protected function toggleExtension($type) {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$response = array('success' => 0, 'published' => -1, 'icontitle' => '', 'reloadpage' => 0);
if (($type == '') || ($elxis->acl()->check('com_extmanager', $type, 'edit') < 1)) {
$response['icontitle'] = $eLang->get('NOTALLOWACTION');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
$id = isset($_POST['elid']) ? (int)$_POST['elid'] : 0;
if ($id < 1) {
$response['icontitle'] = 'No item requested!';
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
if ($type == 'engines') {
$results = $this->model->publishEngine($id, -1);
} else if ($type == 'modules') {
$results = $this->model->publishModule($id, -1);
} else if ($type == 'auth') {
$results = $this->model->publishAuth($id, -1);
} else if ($type == 'plugins') {
$results = $this->model->publishPlugin($id, -1);
} else {
$results = array('success' => false, 'message' => 'Not supported extension type!', 'newpublished' => -1);
}
if ($results['success'] === false) {
$response['icontitle'] = $results['message'];
} else {
$response['success'] = 1;
$response['published'] = $results['newpublished'];
if ($results['newpublished'] == 1) {
$response['icontitle'] = $eLang->get('PUBLISHED').' - '.$eLang->get('CLICK_TOGGLE_STATUS');
} else {
$response['icontitle'] = $eLang->get('UNPUBLISHED').' - '.$eLang->get('CLICK_TOGGLE_STATUS');
}
}
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
/*************************************/
/* TOGGLE EXTENSION'S DEFAULT STATUS */
/*************************************/
protected function toggleExtensionDefault($type) {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$response = array('success' => 0, 'published' => -1, 'icontitle' => '', 'reloadpage' => 0);
if (($type == '') || ($elxis->acl()->check('com_extmanager', $type, 'edit') < 1)) {
$response['icontitle'] = $eLang->get('NOTALLOWACTION');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
$id = isset($_POST['elid']) ? (int)$_POST['elid'] : 0;
if ($id < 1) {
$response['icontitle'] = 'No item requested!';
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
if ($type == 'engines') {
$results = $this->model->setDefaultEngine($id);
} else {
$results = array('success' => false, 'message' => 'Not supported extension type!');
}
if ($results['success'] === false) {
$response['icontitle'] = $results['message'];
} else {
$response['success'] = 1;
$response['published'] = 1;
$response['icontitle'] = $eLang->get('DEFAULT').' - '.$eLang->get('CLICK_TOGGLE_STATUS');
$response['reloadpage'] = 1;
}
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
/****************************/
/* SET EXTENSION'S ORDERING */
/****************************/
protected function setExtensionOrdering($type) {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$response = array('success' => 0, 'message' => '');
if (($type == '') || ($elxis->acl()->check('com_extmanager', $type, 'edit') < 1)) {
$response['message'] = $eLang->get('NOTALLOWACTION');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
$ordering = isset($_POST['ordering']) ? (int)$_POST['ordering'] : 0;
$id = isset($_POST['elid']) ? (int)$_POST['elid'] : 0;
if ($id < 1) {
$response['message'] = 'No item requested!';
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
if (($ordering < 1) || ($ordering > 99999999)) {
$response['message'] = 'Invalid value for ordering!';
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
if ($type == 'engines') {
$row = new enginesDbTable();
} else if ($type == 'auth') {
$row = new authenticationDbTable();
} else if ($type == 'plugins') {
$row = new pluginsDbTable();
} else if ($type == 'modules') {
$row = new modulesDbTable();
} else {
$response['message'] = 'Invalid/not supported extension type '.$type.'!';
}
if ($response['message'] == '') {
if (!$row->load($id)) {
$response['message'] = 'Item not found!';
}
}
if ($response['message'] == '') {
if ($type == 'modules') {
if ($elxis->acl()->check('module', $row->module, 'manage', $id) < 1) {
$response['message'] = $eLang->get('NOTALLOWMANITEM');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
}
$row->ordering = $ordering;
$ok = $row->store();
if (!$ok) {
$response['message'] = $row->getErrorMsg();
} else {
$response['success'] = 1;
}
}
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
/******************************/
/* DELETE/UNINSTALL EXTENSION */
/******************************/
protected function deleteExtension($type) {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$response = array('success' => 0, 'message' => '');
if (($type == '') || ($elxis->acl()->check('com_extmanager', $type, 'install') < 1)) {
$response['message'] = $eLang->get('NOTALLOWACTION');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
if (($type == 'engines') || ($type == 'auth') || ($type == 'plugins') || ($type == 'components') || ($type == 'templates')) {
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
$response['message'] = $eLang->get('UNINST_EXT_MOTHERSITE');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
}
$id = (isset($_POST['elids'])) ? (int)$_POST['elids'] : 0;
if ($id < 1) {
$response['message'] = 'Invalid extension!';
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
if ($type == 'engines') {
$row = new enginesDbTable();
$xmltype = 'engine';
$dbcol = 'engine';
} else if ($type == 'auth') {
$row = new authenticationDbTable();
$xmltype = 'auth';
$dbcol = 'auth';
} else if ($type == 'plugins') {
$row = new pluginsDbTable();
$xmltype = 'plugin';
$dbcol = 'plugin';
} else if ($type == 'modules') {
$row = new modulesDbTable();
$xmltype = 'module';
$dbcol = 'module';
} else if ($type == 'components') {
$row = new componentsDbTable();
$xmltype = 'component';
$dbcol = 'component';
} else if ($type == 'templates') {
$row = new templatesDbTable();
$xmltype = 'template';
$dbcol = 'template';
} else {
$response['message'] = 'Invalid/not supported extension type '.$type.'!';
}
if ($response['message'] == '') {
if (!$row->load($id)) {
$response['message'] = 'Extension not found!';
}
}
if ($response['message'] != '') {
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
$instances = 1;
$uninstall = true;
if ($type == 'modules') {
if ($elxis->acl()->check('module', $row->module, 'manage', $id) < 1) {
$response['message'] = $eLang->get('NOTALLOWMANITEM');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
$instances = $this->model->countModuleInstances($row->module);
if ($instances < 1) {
$response['message'] = 'Module not found!';
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
$uninstall = false;
if ($instances == 1) { $uninstall = true; }
if ($row->module == 'mod_content') { $uninstall = false; }
if (defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) { $uninstall = false; }
}
if ($type == 'components') {
if ($elxis->acl()->check('component', $row->component, 'manage') < 1) {
$response['message'] = $eLang->get('NOTALLOWMANITEM');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
}
if (($uninstall == true) && ($elxis->getConfig('SECURITY_LEVEL') > 0)) {
$response['message'] = $eLang->get('UNINST_NALLOW_SECLEVEL');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
if (($row->iscore == 1) && ($uninstall == true)) {
$response['message'] = $eLang->get('CNOT_UNINST_CORE_EXTS');
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
if ($type == 'modules') {
if (!$uninstall) {
$ok = $this->model->deleteModule($row->id, $row->module);
$this->ajaxHeaders('text/plain');
if (!$ok) {
$response['message'] = $eLang->get('ACTION_FAILED');
} else {
$response['success'] = 1;
}
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
}
if ($type == 'engines') {
if ($row->defengine == 1) {
$response['message'] = 'You can not uninstall the default search engine!';
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
} else if ($type == 'auth') {
if ($row->auth == 'elxis') {
$response['message'] = 'You can not uninstall the Elxis authentication method!';
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
} else if ($type == 'templates') {
$cur_template = ($row->section == 'backend') ? $elxis->getConfig('ATEMPLATE') : $elxis->getConfig('TEMPLATE');
if ($cur_template == $row->template) {
$response['message'] = 'You can not uninstall the current template!';
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
if ($row->section == 'backend') { $xmltype = 'atemplate'; }
}
elxisLoader::loadFile('components/com_extmanager/includes/extension.xml.php');
$exml = new extensionXML();
$info = $exml->quickXML($xmltype, $row->$dbcol);
$version = $info['version'];
unset($exml);
elxisLoader::loadFile('components/com_extmanager/includes/installer.class.php');
$installer = new elxisInstaller();
$ok = $installer->uninstall($xmltype, $row->$dbcol, $row->id, $version);
if (!$ok) {
$msg = $installer->getError();
if ($msg == '') { $msg = $eLang->get('ACTION_FAILED'); }
$response['message'] = $msg;
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
$response['success'] = 1;
$this->ajaxHeaders('application/json');
echo json_encode($response);
exit;
}
/*************************************************************/
/* PREPARE TO EDIT EXTENSION (ALSO "ADD" ACTION FOR MODULES) */
/*************************************************************/
protected function editExtension($type, $is_add=false) {
$eLang = eFactory::getLang();
$elxis = eFactory::getElxis();
$pathway = eFactory::getPathway();
$eDoc = eFactory::getDocument();
if (($type == '') || ($elxis->acl()->check('com_extmanager', $type, 'edit') < 1)) {
$msg = $eLang->get('NOTALLOWACTION');
$link = $elxis->makeAURL('extmanager:/');
$elxis->redirect($link, $msg, true);
}
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
$extdata = $this->loadExtension($type, $id, $elxis, $eLang, $is_add);
if ($extdata['errormsg'] != '') {
$link = $elxis->makeAURL('extmanager:/').$type.'/';
$elxis->redirect($link, $extdata['errormsg'], true);
}
elxisLoader::loadFile('components/com_extmanager/includes/extension.xml.php');
$exml = new extensionXML();
$exml->parse($extdata['xmlfile'], true);
$exml->checkDependencies();
$pathway->addNode($eLang->get('EXTENSIONS'), 'extmanager:/');
$pathway->addNode($extdata['typetitle'], 'extmanager:'.$type.'/');
if ($type == 'templates') {
$pgtitle = sprintf($eLang->get('EDIT_TEMPLATE_X'), $extdata['exttitle']);
$eDoc->setTitle($pgtitle);
$pathway->addNode($extdata['exttitle']);
} else if ($type == 'components') {
$pgtitle = sprintf($eLang->get('EDIT_COMPONENT_X'), $extdata['exttitle']);
$eDoc->setTitle($pgtitle);
$pathway->addNode($extdata['exttitle']);
} else if ($type == 'modules') {
if ($is_add) {
$eDoc->setTitle($eLang->get('ADD_NEW_MODULE'));
$pathway->addNode($eLang->get('NEW'));
} else {
if ($extdata['extension']->module == 'mod_content') {
$eDoc->setTitle($eLang->get('EDIT_TEXT_MODULE'));
} else {
$pgtitle = sprintf($eLang->get('EDIT_MODULE_X'), $extdata['extension']->module);
$eDoc->setTitle($pgtitle);
}
$pathway->addNode($extdata['extension']->title);
}
} else {
$eDoc->setTitle($eLang->get('EDIT').' '.$extdata['exttitle']);
$pathway->addNode($extdata['exttitle']);
}
$cancel_link = $elxis->makeAURL('extmanager:'.$extdata['type'].'/');
$p = array();
if ($extdata['listpage']['page'] > 0) { $p[] = 'page='.$extdata['listpage']['page']; }
if ($extdata['listpage']['sn'] != '') { $p[] = 'sn='.$extdata['listpage']['sn']; }
if ($extdata['listpage']['so'] != '') { $p[] = 'so='.$extdata['listpage']['so']; }
if ($extdata['listpage']['section'] != '') { $p[] = 'section='.$extdata['listpage']['section']; }
if ($p) { $cancel_link .= '?'.implode('&', $p); }
unset($p);
$toolbar = $elxis->obj('toolbar');
$toolbar->add($eLang->get('SAVE'), 'save', false, '', 'elx5Submit(\'save\', \'fmextedit\', \'eexttask\');');
$toolbar->add($eLang->get('APPLY'), 'saveedit', false, '', 'elx5Submit(\'apply\', \'fmextedit\', \'eexttask\');');
$toolbar->add($eLang->get('CANCEL'), 'cancel', false, $cancel_link);
if ($extdata['type'] == 'modules') {
if ((intval($extdata['extension']->id) > 0) && ($extdata['extension']->section == 'frontend')) {
$deflang = $elxis->getConfig('LANG');
$prevurl = $elxis->makeURL($deflang.':content:modpreview', 'inner.php').'?id='.$extdata['extension']->id;
$toolbar->add($eLang->get('PREVIEW'), 'fas fa-eye', false, '', 'elxPopup(\''.$prevurl.'\', 700, 500, \'modulepreview\', \'yes\');', '', '', '');
}
}
unset($cancel_link);
$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');
$this->view->editExtension($extdata, $exml, $elxis, $eLang);
}
/***********************************************************/
/* LOAD EXTENSION FOR EDIT (ALSO "ADD" ACTION FOR MODULES) */
/***********************************************************/
private function loadExtension($type, $id, $elxis, $eLang, $is_add=false) {
$extdata = array(
'errormsg' => '',
'type' => $type,
'extension' => false,
'xmltype' => '',
'xmlfile' => '',
'typetitle' => '',
'exttitle' => '',
'listpage' => array('page' => 0, 'sn' => '', 'so' => '', 'section' => ''),
'extspecific' => array()
);
if (isset($_GET['page'])) {$extdata['listpage']['page'] = (int)$_GET['page']; }
if (isset($_GET['sn'])) { $extdata['listpage']['sn'] = trim($_GET['sn']); }
if (isset($_GET['so'])) { $extdata['listpage']['so'] = trim($_GET['so']); }
if (isset($_GET['section'])) { $extdata['listpage']['section'] = trim($_GET['section']); }
if ($type == 'engines') {
$row = new enginesDbTable();
if (!$row->load($id)) {
$extdata['errormsg'] = 'Search engine not found!';
return $extdata;
}
$extdata['xmltype'] = 'engine';
$extdata['xmlfile'] = ELXIS_PATH.'/components/com_search/engines/'.$row->engine.'/'.$row->engine.'.engine.xml';
if (!file_exists($extdata['xmlfile'])) {
$extdata['errormsg'] = 'Extension XML file was not found!';
return $extdata;
}
$eLang->load('com_search', 'component');
$eLang->load($row->engine, 'engine');
$extdata['extspecific']['allengines'] = $this->model->getAllEngines();
$extdata['typetitle'] = $eLang->get('SEARCH_ENGINES');
$extdata['exttitle'] = $row->title;
$extdata['extension'] = $row;
return $extdata;
}
if ($type == 'auth') {
$row = new authenticationDbTable();
if (!$row->load($id)) {
$extdata['errormsg'] = 'Authentication method not found!';
return $extdata;
}
$extdata['xmltype'] = 'auth';
$extdata['xmlfile'] = ELXIS_PATH.'/components/com_user/auth/'.$row->auth.'/'.$row->auth.'.auth.xml';
if (!file_exists($extdata['xmlfile'])) {
$extdata['errormsg'] = 'Extension XML file was not found!';
return $extdata;
}
$eLang->load($row->auth, 'auth');
$extdata['extspecific']['allauths'] = $this->model->getAllAuths();
$extdata['typetitle'] = $eLang->get('AUTH_METHODS');
$extdata['exttitle'] = $row->title;
$extdata['extension'] = $row;
return $extdata;
}
if ($type == 'templates') {
$row = new templatesDbTable();
if (!$row->load($id)) {
$extdata['errormsg'] = 'Authentication method not found!';
return $extdata;
}
$reldir = ($row->section == 'backend') ? 'templates/admin/' : 'templates/';
$extdata['xmltype'] = 'template';
$extdata['xmlfile'] = ELXIS_PATH.'/'.$reldir.$row->template.'/'.$row->template.'.xml';
if (!file_exists($extdata['xmlfile'])) {
$extdata['xmlfile'] = ELXIS_PATH.'/'.$reldir.$row->template.'/templateDetails.xml'; //elxis 2009.x compatibility
if (!file_exists($xmlfile)) {
$extdata['errormsg'] = 'Extension XML file was not found!';
return $extdata;
}
}
$exttype = ($row->section == 'backend') ? 'atemplate' : 'template';
$eLang->load($row->template, $exttype);
$extdata['typetitle'] = $eLang->get('TEMPLATES');
$extdata['exttitle'] = $row->title;
$extdata['extension'] = $row;
return $extdata;
}
if ($type == 'plugins') {
$row = new pluginsDbTable();
if (!$row->load($id)) {
$extdata['errormsg'] = 'Plugin not found!';
return $extdata;
}
$extdata['xmltype'] = 'plugin';
$extdata['xmlfile'] = ELXIS_PATH.'/components/com_content/plugins/'.$row->plugin.'/'.$row->plugin.'.plugin.xml';
if (!file_exists($extdata['xmlfile'])) {
$extdata['errormsg'] = 'Extension XML file was not found!';
return $extdata;
}
$eLang->load($row->plugin, 'plugin');
$extdata['extspecific']['allplugins'] = $this->model->getAllPlugins();
$extdata['typetitle'] = $eLang->get('CONTENT_PLUGINS');
$extdata['exttitle'] = $row->title;
$extdata['extension'] = $row;
return $extdata;
}
if ($type == 'components') {
$row = new componentsDbTable();
if (!$row->load($id)) {
$extdata['errormsg'] = 'Component not found!';
return $extdata;
}
if ($elxis->acl()->check('component', $row->component, 'manage') < 1) {
$extdata['errormsg'] = $eLang->get('NOTALLOWMANITEM');
return $extdata;
}
$aclrows = array();
$wheres = array('category' => 'component', 'element' => $row->component);
$aclrows1 = $this->model->queryACL($wheres);
$wheres = array('category' => $row->component);
$aclrows2 = $this->model->queryACL($wheres);
if ($aclrows1) {
$aclrows = $aclrows1;
if ($aclrows2) {
foreach($aclrows2 as $aclrow2) { $aclrows[] = $aclrow2; }
}
} else if ($aclrows2) {
$aclrows = $aclrows2;
}
$extdata['extspecific']['aclrows'] = $aclrows;
unset($aclrows1, $aclrows2, $wheres, $aclrows);
$cname = preg_replace('/^(com\_)/', '', $row->component);
$extdata['xmltype'] = 'component';
$extdata['xmlfile'] = ELXIS_PATH.'/components/'.$row->component.'/'.$cname.'.xml';
if (!file_exists($extdata['xmlfile'])) {
$extdata['errormsg'] = 'Extension XML file was not found!';
return $extdata;
}
$eLang->load($row->component, 'component');
$groups = $this->model->getGroups('level', 'DESC');
$extdata['extspecific']['groups'] = $this->translateGroupNames($groups, $eLang);
$extdata['extspecific']['users'] = array();
$totalusers = $this->model->countUsers();
if ($totalusers < 50) { $extdata['extspecific']['users'] = $this->model->getUsers(); }
$extdata['typetitle'] = $eLang->get('COMPONENTS');
$extdata['exttitle'] = $row->name;
$extdata['extension'] = $row;
return $extdata;
}
if ($type != 'modules') {
$extdata['errormsg'] = 'Not supported extension type '.$type.'!';
return $extdata;
}
//modules
$extdata['extspecific']['aclrows'] = array();
$extdata['extspecific']['groups'] = array();
$extdata['extspecific']['users'] = array();
$extdata['extspecific']['allmenuitems'] = array();
$extdata['extspecific']['modmenuitems'] = array(0);
if ($is_add) {
if ($elxis->acl()->check('com_extmanager', 'modules', 'install') < 1) {
$extdata['errormsg'] = $eLang->get('NOTALLOWACTION');
return $extdata;
}
$row = new modulesDbTable();
$row->position = 'left';
$row->published = 1;
$row->ordering = 0;
$row->module = 'mod_content';
$row->iscore = 1;
$row->section = 'frontend';
} else {
$row = new modulesDbTable();
if (!$row->load($id)) {
$extdata['errormsg'] = 'Module not found!';
return $extdata;
}
if ($elxis->acl()->check('module', $row->module, 'manage', $id) < 1) {
$extdata['errormsg'] = $eLang->get('NOTALLOWMANITEM');
return $extdata;
}
$wheres = array('category' => 'module', 'element' => $row->module, 'identity' => $row->id);
$extdata['extspecific']['aclrows'] = $this->model->queryACL($wheres);
unset($wheres);
$groups = $this->model->getGroups('level', 'DESC');
$extdata['extspecific']['groups'] = $this->translateGroupNames($groups, $eLang);
$totalusers = $this->model->countUsers();
if ($totalusers < 50) { $extdata['extspecific']['users'] = $this->model->getUsers(); }
unset($groups, $totalusers);
}
$extdata['extspecific']['positions'] = $this->model->getPositions();
$extdata['extspecific']['posmods'] = $this->model->getModsByPosition($row->position);
if ($row->section == 'frontend') { $extdata['extspecific']['allmenuitems'] = $this->model->getMenuItems($row->section); }
if (!$is_add) {
if ($row->section == 'frontend') {
$extdata['extspecific']['modmenuitems'] = $this->model->getModMenuItems($row->id);
}
}
$extdata['xmltype'] = 'module';
$extdata['xmlfile'] = ELXIS_PATH.'/modules/'.$row->module.'/'.$row->module.'.xml';
if (!file_exists($extdata['xmlfile'])) {
$extdata['errormsg'] = 'Extension XML file was not found!';
return $extdata;
}
$eLang->load($row->module, 'module');
$extdata['extspecific']['cron_msg'] = array('info', '');
if ($elxis->getConfig('CRONJOBS') == 0) {
$extdata['extspecific']['cron_msg'] = array('warning', $eLang->get('CRON_DISABLED'));
} else {
$path = eFactory::getFiles()->elxisPath('logs/lastcron.txt', true);
if (file_exists($path)) {
$lastcronts = filemtime($path);
$extdata['extspecific']['cron_msg'] = array('info', 'Cron jobs - '.$eLang->get('LAST_RUN').': ');
if ($lastcronts > 1406894400) { //2014-08-01 12:00:00
$dt = time() - $lastcronts;
if ($dt < 60) {
$extdata['extspecific']['cron_msg'][1] .= sprintf($eLang->get('SEC_AGO'), $dt);
} else if ($dt < 3600) {
$min = floor($dt / 60);
$sec = $dt % 60;
$extdata['extspecific']['cron_msg'][1] .= sprintf($eLang->get('MIN_SEC_AGO'), $min, $sec);
} else if ($dt < 7200) {
$min = floor(($dt - 3600) / 60);
$extdata['extspecific']['cron_msg'][1] .= sprintf($eLang->get('HOUR_MIN_AGO'), $min);
} else if ($dt < 172800) {//2 days
$hours = floor($dt / 3600);
$sec = $dt - ($hours * 3600);
$min = floor($sec / 60);
$extdata['extspecific']['cron_msg'][1] .= sprintf($eLang->get('HOURS_MIN_AGO'), $hours, $min);
} else {
$extdata['extspecific']['cron_msg'][1] .= eFactory::getDate()->formatTS($lastcronts, $eLang->get('DATE_FORMAT_4'));
}
} else {
$extdata['extspecific']['cron_msg'][1] .= $eLang->get('NEVER');
}
} else {
$extdata['extspecific']['cron_msg'][0] = 'warning';
$extdata['extspecific']['cron_msg'][1] = 'Cron jobs file '.$path.' does not exist!';
}
unset($path);
}
$extdata['typetitle'] = $eLang->get('MODULES');
$extdata['exttitle'] = $row->module;
$extdata['extension'] = $row;
return $extdata;
}
/***************************************/
/* ECHO PAGE HEADERS FOR AJAX REQUESTS */
/***************************************/
protected function ajaxHeaders($type='text/plain') {
if(ob_get_length() > 0) { ob_end_clean(); }
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').'GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
header('Content-type: '.$type.'; charset=utf-8');
}
/*************************/
/* TRANSLATE GROUP NAMES */
/*************************/
protected function translateGroupNames($rows, $eLang) {
if (!$rows) { return $rows; }
foreach ($rows as $i => $row) {
switch ($row['gid']) {
case 1: $rows[$i]['groupname'] = $eLang->get('ADMINISTRATOR'); break;
case 5: $rows[$i]['groupname'] = $eLang->get('USER'); break;
case 6: $rows[$i]['groupname'] = $eLang->get('EXTERNALUSER'); break;
case 7: $rows[$i]['groupname'] = $eLang->get('GUEST'); break;
default: break;
}
}
return $rows;
}
}
?>