joomla_test/administrator/includes/application.php
2020-01-02 22:20:31 +07:00

357 lines
8.7 KiB
PHP

<?php
/**
* @package Joomla.Administrator
*
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
/**
* Joomla! Application class
*
* Provide many supporting API functions
*
* @final
* @package Joomla.Administrator
* @since 1.5
*/
class JAdministrator extends JApplication
{
/**
* Class constructor
*
* @param array An optional associative array of configuration settings.
* Recognized key values include 'clientId' (this list is not meant to be comprehensive).
*
* @since 1.5
*/
public function __construct($config = array())
{
$config['clientId'] = 1;
parent::__construct($config);
//Set the root in the URI based on the application name
JUri::root(null, str_ireplace('/' . $this->getName(), '', JUri::base(true)));
}
/**
* Initialise the application.
*
* @param array $options An optional associative array of configuration settings.
*
* @return void
* @since 1.5
*/
public function initialise($options = array())
{
$config = JFactory::getConfig();
$user = JFactory::getUser();
// If the user is a guest we populate it with the guest user group.
if ($user->guest)
{
$guestUsergroup = JComponentHelper::getParams('com_users')->get('guest_usergroup', 1);
$user->groups = array($guestUsergroup);
}
// if a language was specified it has priority
// otherwise use user or default language settings
if (empty($options['language']))
{
$lang = $user->getParam('admin_language');
// Make sure that the user's language exists
if ($lang && JLanguage::exists($lang))
{
$options['language'] = $lang;
}
else
{
$params = JComponentHelper::getParams('com_languages');
$client = JApplicationHelper::getClientInfo($this->getClientId());
$options['language'] = $params->get($client->name, $config->get('language', 'en-GB'));
}
}
// One last check to make sure we have something
if (!JLanguage::exists($options['language']))
{
$lang = $config->get('language', 'en-GB');
if (JLanguage::exists($lang))
{
$options['language'] = $lang;
}
else
{
$options['language'] = 'en-GB'; // as a last ditch fail to english
}
}
// Execute the parent initialise method.
parent::initialise($options);
// Load Library language
$lang = JFactory::getLanguage();
$lang->load('lib_joomla', JPATH_ADMINISTRATOR);
}
/**
* Route the application
*
* @return void
* @since 1.5
*/
public function route()
{
$uri = JUri::getInstance();
if ($this->getCfg('force_ssl') >= 1 && strtolower($uri->getScheme()) != 'https')
{
//forward to https
$uri->setScheme('https');
$this->redirect((string) $uri);
}
// Trigger the onAfterRoute event.
JPluginHelper::importPlugin('system');
$this->triggerEvent('onAfterRoute');
}
/**
* Return a reference to the JRouter object.
*
* @return JRouter
* @since 1.5
*/
static public function getRouter($name = null, array $options = array())
{
$router = parent::getRouter('administrator');
return $router;
}
/**
* Dispatch the application
*
* @param string $component The component to dispatch.
*
* @return void
* @since 1.5
*/
public function dispatch($component = null)
{
if ($component === null)
{
$component = JAdministratorHelper::findOption();
}
$document = JFactory::getDocument();
switch ($document->getType())
{
case 'html':
$document->setMetaData('keywords', $this->getCfg('MetaKeys'));
break;
default:
break;
}
$document->setTitle($this->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION'));
$document->setDescription($this->getCfg('MetaDesc'));
$document->setGenerator('Joomla! - Open Source Content Management');
$contents = JComponentHelper::renderComponent($component);
$document->setBuffer($contents, 'component');
// Trigger the onAfterDispatch event.
JPluginHelper::importPlugin('system');
$this->triggerEvent('onAfterDispatch');
}
/**
* Display the application.
*
* @return void
* @since 1.5
*/
public function render()
{
$component = $this->input->get('option', 'com_login');
$template = $this->getTemplate(true);
$file = $this->input->get('tmpl', 'index');
if ($component == 'com_login')
{
$file = 'login';
}
// Safety check for when configuration.php root_user is in use.
$config = JFactory::getConfig();
$rootUser = $config->get('root_user');
if (property_exists('JConfig', 'root_user')
&& (JFactory::getUser()->get('username') == $rootUser || JFactory::getUser()->id === (string) $rootUser)
)
{
JError::raiseNotice(200, JText::sprintf('JWARNING_REMOVE_ROOT_USER', 'index.php?option=com_config&task=application.removeroot&' . JSession::getFormToken() . '=1'));
}
$params = array(
'template' => $template->template,
'file' => $file . '.php',
'directory' => JPATH_THEMES,
'params' => $template->params
);
$document = JFactory::getDocument();
$document->parse($params);
$this->triggerEvent('onBeforeRender');
$data = $document->render(false, $params);
JResponse::setBody($data);
$this->triggerEvent('onAfterRender');
}
/**
* Login authentication function
*
* @param array Array('username' => string, 'password' => string)
* @param array Array('remember' => boolean)
*
* @return boolean True on success.
* @see JApplication::login
* @since 1.5
*/
public function login($credentials, $options = array())
{
//The minimum group
$options['group'] = 'Public Backend';
//Make sure users are not autoregistered
$options['autoregister'] = false;
//Set the application login entry point
if (!array_key_exists('entry_url', $options))
{
$options['entry_url'] = JUri::base() . 'index.php?option=com_users&task=login';
}
// Set the access control action to check.
$options['action'] = 'core.login.admin';
$result = parent::login($credentials, $options);
if (!($result instanceof Exception))
{
$lang = $this->input->get('lang');
$lang = preg_replace('/[^A-Z-]/i', '', $lang);
$this->setUserState('application.lang', $lang);
self::purgeMessages();
}
return $result;
}
/**
* Get the template
*
* @return string The template name
* @since 1.0
*/
public function getTemplate($params = false)
{
static $template;
if (!isset($template))
{
$admin_style = JFactory::getUser()->getParam('admin_style');
// Load the template name from the database
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('template, s.params')
->from('#__template_styles as s')
->join('LEFT', '#__extensions as e ON e.type=' . $db->quote('template') . ' AND e.element=s.template AND e.client_id=s.client_id');
if ($admin_style)
{
$query->where('s.client_id = 1 AND id = ' . (int) $admin_style . ' AND e.enabled = 1', 'OR');
}
$query->where('s.client_id = 1 AND home = ' . $db->quote('1'), 'OR')
->order('home');
$db->setQuery($query);
$template = $db->loadObject();
$template->template = JFilterInput::getInstance()->clean($template->template, 'cmd');
$template->params = new JRegistry($template->params);
if (!file_exists(JPATH_THEMES . '/' . $template->template . '/index.php'))
{
$this->enqueueMessage(JText::_('JERROR_ALERTNOTEMPLATE'), 'error');
$template->params = new JRegistry;
$template->template = 'isis';
}
}
if (!file_exists(JPATH_THEMES . '/' . $template->template . '/index.php'))
{
throw new InvalidArgumentException(JText::sprintf('JERROR_COULD_NOT_FIND_TEMPLATE', $template->template));
}
if ($params)
{
return $template;
}
return $template->template;
}
/**
* Purge the jos_messages table of old messages
*
* @return void
* @since 1.5
*/
public static function purgeMessages()
{
$db = JFactory::getDbo();
$user = JFactory::getUser();
$userid = $user->get('id');
$query = 'SELECT *'
. ' FROM #__messages_cfg'
. ' WHERE user_id = ' . (int) $userid
. ' AND cfg_name = ' . $db->quote('auto_purge');
$db->setQuery($query);
$config = $db->loadObject();
// check if auto_purge value set
if (is_object($config) and $config->cfg_name == 'auto_purge')
{
$purge = $config->cfg_value;
}
else
{
// if no value set, default is 7 days
$purge = 7;
}
// calculation of past date
// if purge value is not 0, then allow purging of old messages
if ($purge > 0)
{
// purge old messages at day set in message configuration
$past = JFactory::getDate(time() - $purge * 86400);
$pastStamp = $past->toSql();
$query = 'DELETE FROM #__messages'
. ' WHERE date_time < ' . $db->quote($pastStamp)
. ' AND user_id_to = ' . (int) $userid;
$db->setQuery($query);
$db->execute();
}
}
}