| Current Path : /var/www/administrator/components/com_jcomments/ |
| Current File : /var/www/administrator/components/com_jcomments/script.jcomments.php |
<?php
/**
* JComments - Joomla Comment System
*
* @version 3.0
* @package JComments
* @author Sergey M. Litvinov (smart@joomlatune.ru)
* @copyright (C) 2006-2013 by Sergey M. Litvinov (http://www.joomlatune.ru)
* @license GNU/GPL: http://www.gnu.org/copyleft/gpl.html
*/
defined('_JEXEC') or die;
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.archive');
jimport('joomla.filesystem.path');
jimport('joomla.error.error');
class com_jcommentsInstallerScript
{
function preflight($type, $parent)
{
if (!version_compare(JVERSION, '2.5.1', 'ge')) {
echo "<h1>Unsupported Joomla! version</h1>";
echo "<p>This component can only be installed on Joomla! 2.5.1 or later</p>";
return false;
}
return true;
}
function postflight($type, $parent)
{
$db = JFactory::getDBO();
$language = JFactory::getLanguage();
$language->load('com_jcomments', JPATH_ADMINISTRATOR, 'en-GB', true);
$language->load('com_jcomments', JPATH_ADMINISTRATOR, null, true);
$messages = array();
$messages['content'] = JText::_('A_INSTALL_PLUGIN_CONTENT');
$messages['search'] = JText::_('A_INSTALL_PLUGIN_SEARCH');
$messages['system'] = JText::_('A_INSTALL_PLUGIN_SYSTEM');
$messages['user'] = JText::_('A_INSTALL_PLUGIN_USER');
$messages['editors-xtd'] = JText::_('A_INSTALL_PLUGIN_EDITORS_XTD');
$data = new stdClass;
$data->title = JText::_('A_INSTALL_LOG');
$data->finish = JText::_('A_INSTALL_COMPLETE');
$data->next = JUri::root() . 'administrator/index.php?option=com_jcomments&view=settings';
$data->messages = array();
$data->plugins = array();
$src = $parent->getParent()->getPath('source');
$manifest = $parent->getParent()->manifest;
$plugins = $manifest->xpath('plugins/plugin');
foreach ($plugins as $plugin) {
$name = (string)$plugin->attributes()->plugin;
$group = (string)$plugin->attributes()->group;
$path = $src . '/plugins/' . $group;
if (JFolder::exists($src . '/plugins/' . $group . '/' . $name)) {
$path = $src . '/plugins/' . $group . '/' . $name;
}
$installer = new JInstaller;
$result = $installer->install($path);
$query = $db->getQuery(true);
$query->update($db->quoteName('#__extensions'));
$query->set($db->quoteName('enabled') . ' = 1');
$query->where($db->quoteName('type') . ' = ' . $db->Quote('plugin'));
$query->where($db->quoteName('element') . ' = ' . $db->Quote($name));
$query->where($db->quoteName('folder') . ' = ' . $db->Quote($group));
$db->setQuery($query);
$db->execute();
if (isset($messages[$group])) {
$data->messages[] = array('text' => $messages[$group], 'result' => $result);
unset($messages[$group]);
}
$data->plugins[] = array('name' => $name, 'group' => $group, 'result' => $result);
}
// Extract plugins for integration with 3rd party extensions
$source = JPATH_SITE . '/components/com_jcomments/plugins/plugins.zip';
$destination = JPATH_SITE . '/components/com_jcomments/plugins/';
JArchive::extract($source, $destination);
JFile::delete($source);
// Execute database updates
$scripts = JFolder::files(JPATH_ROOT . '/administrator/components/com_jcomments/install/sql/updates', '\.sql',
true, true);
foreach ($scripts as $script) {
// TODO: compare current and previous versions number
$this->executeSQL($script);
}
// Fix default guest usergroup in com_users parameters
// $this->fixGuestUsergroup();
// Load default settings
$query = $db->getQuery(true);
$query->select('COUNT(*)');
$query->from($db->quoteName('#__jcomments_settings'));
$db->setQuery($query);
$count = $db->loadResult();
if ($count == 0) {
$this->executeSQL(JPATH_ROOT . '/administrator/components/com_jcomments/install/sql/default.settings.sql');
$this->fixUsergroups();
}
// Load default custom bbcodes
$query = $db->getQuery(true);
$query->select('COUNT(*)');
$query->from($db->quoteName('#__jcomments_custom_bbcodes'));
$db->setQuery($query);
$count = $db->loadResult();
if ($count == 0) {
$this->executeSQL(JPATH_ROOT . '/administrator/components/com_jcomments/install/sql/default.custom_bbcodes.sql');
$this->fixUsergroupsCustomBBCodes();
}
// Load default smilies
$query = $db->getQuery(true);
$query->select('COUNT(*)');
$query->from($db->quoteName('#__jcomments_smilies'));
$db->setQuery($query);
$count = $db->loadResult();
if ($count == 0) {
$this->executeSQL(JPATH_ROOT . '/administrator/components/com_jcomments/install/sql/default.smilies.sql');
}
// Some fixes
$this->fixComponentName();
// Copy JomSocial rule
$source = JPATH_ROOT . '/administrator/components/com_jcomments/install/xml/jomsocial_rule.xml';
$destination = JPATH_SITE . '/components/com_jcomments/jomsocial_rule.xml';
if (!is_file($destination)) {
JFile::copy($source, $destination);
}
$cache = JFactory::getCache('com_jcomments');
$cache->clean();
$this->displayResults($data);
}
function update($parent)
{
// Delete obsolete files and folders (from previous installations)
$this->deleteObsoleteFiles();
// Fix default guest usergroup in com_users parameters
$this->fixGuestUsergroup();
// Copy smilies from old folder to new one
try {
$oldPath = JPATH_SITE . '/components/com_jcomments/images/smiles';
$newPath = JPATH_SITE . '/components/com_jcomments/images/smilies';
if (is_dir($oldPath)) {
$files = JFolder::files($oldPath);
foreach ($files as $file) {
if (!is_file($newPath . '/' . $file)) {
JFile::copy($oldPath . '/' . $file, $newPath . '/' . $file);
}
}
JFolder::delete($oldPath);
}
} catch (Exception $e) {
}
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('*');
$query->from($db->quoteName('#__jcomments_settings'));
$query->where($db->quoteName('name') . ' = ' . $db->Quote('badwords'));
$db->setQuery($query);
$rows = $db->loadObjectList();
if (is_array($rows)) {
foreach($rows as $row) {
$value = preg_replace("#,+#", ',', preg_replace("#[\n|\r]+#", ',', $row->value));
$query = $db->getQuery(true);
$query->update($db->quoteName('#__jcomments_settings'));
$query->set($db->quoteName('value') . ' = ' . $db->Quote($value));
$query->where($db->quoteName('name') . ' = ' . $db->Quote($row->name));
$query->where($db->quoteName('lang') . ' = ' . $db->Quote($row->lang));
$query->where($db->quoteName('component') . ' = ' . $db->Quote($row->component));
$db->setQuery($query);
$db->execute();
}
}
}
function uninstall($parent)
{
$db = JFactory::getDBO();
$language = JFactory::getLanguage();
$language->load('com_jcomments', JPATH_ADMINISTRATOR, 'en-GB', true);
$language->load('com_jcomments', JPATH_ADMINISTRATOR, null, true);
$messages = array();
$messages['content'] = JText::_('A_UNINSTALL_PLUGIN_CONTENT');
$messages['search'] = JText::_('A_UNINSTALL_PLUGIN_SEARCH');
$messages['system'] = JText::_('A_UNINSTALL_PLUGIN_SYSTEM');
$messages['editors-xtd'] = JText::_('A_UNINSTALL_PLUGIN_EDITORS_XTD');
$data = new stdClass;
$data->title = JText::_('A_UNINSTALL_LOG');
$data->finish = JText::_('A_UNINSTALL_COMPLETE');
$data->messages = array();
$manifest = $parent->getParent()->manifest;
$plugins = $manifest->xpath('plugins/plugin');
foreach ($plugins as $plugin) {
$name = (string)$plugin->attributes()->plugin;
$group = (string)$plugin->attributes()->group;
$query = $db->getQuery(true);
$query->select($db->quoteName('extension_id'));
$query->from($db->quoteName('#__extensions'));
$query->where($db->quoteName('type') . ' = ' . $db->Quote('plugin'));
$query->where($db->quoteName('element') . ' = ' . $db->Quote($name));
$query->where($db->quoteName('folder') . ' = ' . $db->Quote($group));
$db->setQuery($query);
$extensions = $db->loadColumn();
if (count($extensions)) {
$result = false;
foreach ($extensions as $id) {
$installer = new JInstaller;
$result = $installer->uninstall('plugin', $id);
}
if (isset($messages[$group])) {
$data->messages[] = array('text' => $messages[$group], 'result' => $result);
unset($messages[$group]);
}
}
}
if (JFactory::getApplication()->getCfg('caching') != 0) {
$query = $db->getQuery(true);
$query->select('DISTINCT(' . $db->quoteName('object_group') . ')');
$query->from($db->quoteName('#__jcomments'));
$db->setQuery($query);
$extensions = $db->loadColumn();
if (count($extensions)) {
foreach ($extensions as $extension) {
$cache = JFactory::getCache($extension);
$cache->clean();
}
$data->messages[] = array('text' => JText::_('A_UNINSTALL_CLEAN_CACHE'), 'result' => true);
}
}
$this->displayResults($data);
}
private function executeSQL($filename = '')
{
if (is_file($filename)) {
$buffer = file_get_contents($filename);
if ($buffer === false) {
return false;
}
if (version_compare(JVERSION, '3.0', 'ge')) {
$queries = JDatabaseDriver::splitSql($buffer);
} else {
$queries = JFactory::getDbo()->splitSql($buffer);
}
if (count($queries)) {
$db = JFactory::getDBO();
foreach ($queries as $query) {
$query = trim($query);
if ($query != '' && $query{0} != '#') {
try {
$db->setQuery($query);
$db->execute();
} catch (RuntimeException $e) {
}
}
}
}
}
return true;
}
private function fixComponentName()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->update($db->quoteName('#__extensions'));
$query->set($db->quoteName('name') . ' = ' . $db->Quote('com_jcomments'));
$query->where($db->quoteName('element') . ' = ' . $db->Quote('com_jcomments'));
$db->setQuery($query);
$db->execute();
}
private function fixUsergroups()
{
$db = JFactory::getDBO();
$groups = $this->getUsergroups();
$guest_usergroup = JComponentHelper::getParams('com_users')->get('guest_usergroup', 1);
if (count($groups)) {
$query = $db->getQuery(true);
$query->select('*');
$query->from($db->quoteName('#__jcomments_settings'));
$query->where($db->quoteName('name') . ' != ' . $db->Quote('badwords'));
$query->where($db->quoteName('name') . ' != ' . $db->Quote('forbidden_names'));
$query->where($db->quoteName('name') . ' != ' . $db->Quote('smilies_path'));
$where = array();
foreach ($groups as $group) {
$where[] = $db->quoteName('value') . " LIKE " . $db->Quote('%' . $group->title . '%');
}
if (count($where)) {
$query->where('(' . implode(' OR ', $where) . ')');
}
$db->setQuery($query);
$rows = $db->loadObjectList();
foreach ($rows as $row) {
$values = explode(',', $row->value);
foreach ($groups as $group) {
for ($i = 0, $n = count($values); $i < $n; $i++) {
if ($values[$i] == $group->title) {
$values[$i] = $group->id;
}
}
}
if ($guest_usergroup !== 1 && in_array(1, $values)) {
$values[] = $guest_usergroup;
}
$row->value = implode(',', $values);
$query = $db->getQuery(true);
$query->update($db->quoteName('#__jcomments_settings'));
$query->set($db->quoteName('value') . ' = ' . $db->Quote($row->value));
$query->where($db->quoteName('component') . ' = ' . $db->Quote($row->component));
$query->where($db->quoteName('lang') . ' = ' . $db->Quote($row->lang));
$query->where($db->quoteName('name') . ' = ' . $db->Quote($row->name));
$db->setQuery($query);
$db->execute();
}
}
}
private function fixUsergroupsCustomBBCodes()
{
$db = JFactory::getDBO();
$groups = $this->getUsergroups();
$guest_usergroup = JComponentHelper::getParams('com_users')->get('guest_usergroup', 1);
if (count($groups)) {
$query = $db->getQuery(true);
$query->select('*');
$query->from($db->quoteName('#__jcomments_custom_bbcodes'));
$where = array();
foreach ($groups as $group) {
$where[] = $db->quoteName('button_acl') . " LIKE " . $db->Quote('%' . $group->title . '%');
}
if (count($where)) {
$query->where('(' . implode(' OR ', $where) . ')');
}
$db->setQuery($query);
$rows = $db->loadObjectList();
foreach ($rows as $row) {
$values = explode(',', $row->button_acl);
foreach ($groups as $group) {
for ($i = 0, $n = count($values); $i < $n; $i++) {
if ($values[$i] == $group->title) {
$values[$i] = $group->id;
}
}
}
if ($guest_usergroup !== 1 && in_array(1, $values)) {
$values[] = $guest_usergroup;
}
$row->button_acl = implode(',', $values);
$query = $db->getQuery(true);
$query->update($db->quoteName('#__jcomments_custom_bbcodes'));
$query->set($db->quoteName('button_acl') . ' = ' . $db->Quote($row->button_acl));
$query->where($db->quoteName('name') . ' = ' . $db->Quote($row->name));
$db->setQuery($query);
$db->execute();
}
}
}
private function fixGuestUsergroup()
{
$params = JComponentHelper::getParams('com_users');
$guest_usergroup = $params->get('guest_usergroup');
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('COUNT(*)');
$query->from($db->quoteName('#__usergroups'));
$query->where($db->quoteName('id') . ' = ' . (int) $guest_usergroup);
$db->setQuery($query);
$count = $db->loadResult();
if ($count == 0) {
$params->set('guest_usergroup', '1');
$query = $db->getQuery(true);
$query->update($db->quoteName('#__extensions'));
$query->set($db->quoteName('params') . '= ' . $db->quote((string)$params));
$query->where($db->quoteName('element') . ' = ' . $db->quote('com_users'));
$db->setQuery($query);
$db->execute();
JFactory::getCache('com_users')->clean();
JFactory::getCache('_system')->clean();
}
}
private function getUsergroups()
{
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('a.*, COUNT(DISTINCT b.id) AS level');
$query->from($db->quoteName('#__usergroups') . ' AS a');
$query->join('LEFT', $db->quoteName('#__usergroups') . ' AS b ON a.lft > b.lft AND a.rgt < b.rgt');
$query->group('a.id, a.title, a.lft, a.rgt, a.parent_id');
$query->order('a.lft ASC');
$db->setQuery($query);
$groups = $db->loadObjectList();
return $groups;
}
private function deleteObsoleteFiles()
{
$files = array(
'/components/com_jcomments/helpers/html.php'
, '/components/com_jcomments/jcomments.config.php'
, '/administrator/components/com_jcomments/admin.jcomments.blacklist.php'
, '/administrator/components/com_jcomments/admin.jcomments.custombbcodes.php'
, '/administrator/components/com_jcomments/admin.jcomments.html.php'
, '/administrator/components/com_jcomments/admin.jcomments.installer.php'
, '/administrator/components/com_jcomments/admin.jcomments.subscription.php'
, '/administrator/components/com_jcomments/admin.jcomments.php'
, '/administrator/components/com_jcomments/classes/objectinfo.php'
, '/administrator/components/com_jcomments/install.jcomments.php'
, '/administrator/components/com_jcomments/install/sql/custom_bbcodes.sql'
, '/administrator/components/com_jcomments/install/sql/install.mysql.nonutf8.sql'
, '/administrator/components/com_jcomments/install/sql/settings.sql'
, '/administrator/components/com_jcomments/install/sql/custom_bbcodes.sql'
, '/administrator/components/com_jcomments/install/xml/config.xm'
, '/administrator/components/com_jcomments/install/xml/jomsocial_rule.xm'
, '/administrator/components/com_jcomments/toolbar.jcomments.html.php'
, '/administrator/components/com_jcomments/toolbar.jcomments.php'
, '/administrator/components/com_jcomments/uninstall.jcomments.php'
);
$folders = array(
'/components/com_jcomments/languages'
, '/components/com_jcomments/libraries/convert'
, '/components/com_jcomments/libraries/joomlatune/joomla'
, '/administrator/components/com_jcomments/classes/button'
, '/administrator/components/com_jcomments/elements'
, '/administrator/components/com_jcomments/fields'
, '/administrator/components/com_jcomments/install/helpers'
, '/administrator/components/com_jcomments/install/plugins'
);
foreach ($files as $file) {
if (JFile::exists(JPATH_ROOT . $file)) {
try {
JFile::delete(JPATH_ROOT . $file);
} catch (Exception $e) {
}
}
}
foreach ($folders as $folder) {
if (JFolder::exists(JPATH_ROOT . $folder)) {
try {
JFolder::delete(JPATH_ROOT . $folder);
} catch (Exception $e) {
}
}
}
$files = JFolder::files(JPATH_ROOT . '/administrator/components/com_jcomments/assets/', '\.(png|gif|css|js)',
false, true);
foreach ($files as $file) {
try {
JFile::delete($file);
} catch (Exception $e) {
}
}
}
private function displayResults($data)
{
require_once(JPATH_ROOT . '/administrator/components/com_jcomments/version.php');
$version = new JCommentsVersion();
?>
<style type="text/css">
.adminform tr th {
display: none;
}
#jcomments-installer {
margin: 10px auto;
padding: 8px;
width: 700px;
min-height: 48px;
background-color: #fff;
border: 1px solid #ccc;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
}
#jcomments-installer .status-error {
color: red;
}
#jcomments-installer .status-ok {
color: green;
}
#jcomments-installer .extension-copyright {
color: #777;
display: block;
margin-top: 12px;
}
#jcomments-installer .extension-name {
color: #FF9900;
font-family: Arial, Helvetica, sans-serif;
font-size: 16px;
font-weight: bold;
}
#jcomments-installer .extension-date {
color: #FF9900;
font-family: Arial, Helvetica, sans-serif;
font-size: 16px;
font-weight: normal;
}
#jcomments-installer .installer-messages-header {
margin: 10px 0;
color: #FF9900;
font-family: Arial, Helvetica, sans-serif;
font-size: 16px;
font-weight: bold;
}
#jcomments-installer ul {
padding: 0 0 0 20px;
margin: 0 0 10px 0;
}
#jcomments-installer table {
padding: 0;
margin: 0;
border: none;
}
#jcomments-installer table td {
vertical-align: top;
}
#jcomments-installer .btn {
display: inline-block;
*display: inline;
*zoom: 1;
padding: 4px 14px;
margin-bottom: 0;
font-size: 13px;
line-height: 18px;
*line-height: 18px;
text-align: center;
vertical-align: middle;
cursor: pointer;
color: #333;
text-shadow: 0 1px 1px rgba(255,255,255,0.75);
background-color: #f5f5f5;
background-image: -moz-linear-gradient(top,#fff,#e6e6e6);
background-image: -webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));
background-image: -webkit-linear-gradient(top,#fff,#e6e6e6);
background-image: -o-linear-gradient(top,#fff,#e6e6e6);
background-image: linear-gradient(to bottom,#fff,#e6e6e6);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe5e5e5', GradientType=0);
border-color: #e6e6e6 #e6e6e6 #bfbfbf;
border-color: rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);
*background-color: #e6e6e6;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
border: 1px solid #bbb;
*border: 0;
border-bottom-color: #a2a2a2;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
*margin-left: .3em;
-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
}
#jcomments-installer .btn:hover,
#jcomments-installer .btn:active,
#jcomments-installer .btn.active {
color: #333;
text-decoration: none;
background-color: #e6e6e6;
*background-color: #d9d9d9;
background-position: 0 -15px;
-webkit-transition: background-position .1s linear;
-moz-transition: background-position .1s linear;
-o-transition: background-position .1s linear;
transition: background-position .1s linear;
}
#jcomments-installer .btn:active,
#jcomments-installer .btn.active {
background-color: #cccccc \9;
}
</style>
<div id="jcomments-installer">
<table width="95%" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td width="50px">
<img src="http://www.joomlatune.com/images/logo/jcomments.png" alt=""/>
</td>
<td>
<div>
<span class="extension-name"><?php echo $version->getLongVersion(); ?></span>
<span class="extension-date">[<?php echo $version->getReleaseDate(); ?>]</span>
</div>
<div class="extension-copyright">
© 2006-<?php echo date('Y'); ?> smart (<a
href="http://www.joomlatune.ru">JoomlaTune.ru</a> | <a href="http://www.joomlatune.com">JoomlaTune.com</a>).
<?php echo JText::_('A_ABOUT_COPYRIGHT'); ?>
</div>
<div class="installer-messages-header">
<?php echo $data->title; ?>
</div>
<div>
<ul>
<?php if (count($data->messages)): ?>
<?php foreach ($data->messages as $message):
$class = $message['result'] ? 'status-ok' : 'status-error';
$text = $message['result'] ? JText::_('A_INSTALL_STATE_OK') : JText::_('A_INSTALL_STATE_ERROR');
?>
<li>
<?php echo $message['text']; ?>:
<span class="<?php echo $class; ?>"><?php echo $text; ?></span>
</li>
<?php endforeach; ?>
<?php endif; ?>
<li>
<span style="color: green"><strong><?php echo $data->finish; ?></strong></span>
</li>
</ul>
</div>
<?php if (!empty($data->next)): ?>
<div>
<div class="jcomments-installer-next">
<a href="<?php echo $data->next; ?>" class="btn">
<?php echo JText::_('A_INSTALL_BUTTON_NEXT'); ?>
</a>
</div>
</div>
<?php endif; ?>
</td>
</tr>
</tbody>
</table>
</div>
<?php
}
}