First pass to clean up code.

This commit is contained in:
Jean-Christian Denis 2021-09-07 00:09:09 +02:00
parent b2deebd188
commit bbdd672463
15 changed files with 1071 additions and 1051 deletions

View file

@ -6,7 +6,8 @@
- [ ] fix php7.3+ and php8.0
- [ ] fix PSR(1)2 coding style
- [ ] fix translation
- [ ] update license
- [x] add dcstore (pre release)
- [x] update license
- [x] update readme
0.7.3 - 2018.03.12 - Pierre Van Glabeke

View file

@ -32,7 +32,7 @@ Once it's done you can manage your reports from menu
* Source & contribution : [GitHub Page](https://github.com/JcDenis/dcAdvancedCleaner)
* Packages & details: [Dotaddict Page](https://plugins.dotaddict.org/dc2/details/dcAdvancedCleaner)
* Discuss and help : [Dotclear Forum](https://forum.dotclear.org/viewtopic.php?id=40381)
## CONTRIBUTORS
* Jean-Christian Denis

View file

@ -1,34 +1,35 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of dcAdvancedCleaner, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2018 JC Denis and contributors
# jcdenis@gdwd.com
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
/**
* @brief dcAdvancedCleaner, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_CONTEXT_ADMIN')){return;}
$_menu['Plugins']->addItem(
__('Advanced cleaner'),
'plugin.php?p=dcAdvancedCleaner',
'index.php?pf=dcAdvancedCleaner/icon.png',
preg_match('/plugin.php\?p=dcAdvancedCleaner(&.*)?$/',$_SERVER['REQUEST_URI']),
$core->auth->isSuperAdmin()
__('Advanced cleaner'),
'plugin.php?p=dcAdvancedCleaner',
'index.php?pf=dcAdvancedCleaner/icon.png',
preg_match('/plugin.php\?p=dcAdvancedCleaner(&.*)?$/',$_SERVER['REQUEST_URI']),
$core->auth->isSuperAdmin()
);
$core->addBehavior('adminDashboardFavorites','dcAdvancedCleanerDashboardFavorites');
function dcAdvancedCleanerDashboardFavorites($core,$favs)
{
$favs->register('dcAdvancedCleaner', array(
'title' => __('Advanced cleaner'),
'url' => 'plugin.php?p=dcAdvancedCleaner',
'small-icon' => 'index.php?pf=dcAdvancedCleaner/icon.png',
'large-icon' => 'index.php?pf=dcAdvancedCleaner/icon-big.png',
'permissions' => 'usage,contentadmin'
));
$favs->register('dcAdvancedCleaner', array(
'title' => __('Advanced cleaner'),
'url' => 'plugin.php?p=dcAdvancedCleaner',
'small-icon' => 'index.php?pf=dcAdvancedCleaner/icon.png',
'large-icon' => 'index.php?pf=dcAdvancedCleaner/icon-big.png',
'permissions' => 'usage,contentadmin'
));
}

View file

@ -1,29 +1,31 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of dcAdvancedCleaner, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2018 JC Denis and contributors
# jcdenis@gdwd.com
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
/**
* @brief dcAdvancedCleaner, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_RC_PATH')){return;}
if (!defined('DC_RC_PATH')) {
return null;
}
$this->registerModule(
/* Name */ "Advanced cleaner",
/* Description*/ "Make a huge cleaning of dotclear",
/* Author */ "JC Denis",
/* Version */ '0.7.3',
/* Properties */
array(
'permissions' => null,
'type' => 'plugin',
'dc_min' => '2.9',
'support' => 'https://forum.dotclear.org/viewtopic.php?id=40381',
'details' => 'http://plugins.dotaddict.org/dc2/details/dcAdvancedCleaner'
)
);
/* date */ #20180213
'Advanced cleaner',
'Make a huge cleaning of dotclear',
'Jean-Christian Denis and Contributors',
'0.7.3.1',
[
'requires' => [['core', '2.19']],
'permissions' => null,
'type' => 'plugin',
'support' => 'https://github.com/JcDenis/dcAdvancedCleaner',
'details' => 'https://plugins.dotaddict.org/dc2/details/dcAdvancedCleaner',
'repository' => 'https://raw.githubusercontent.com/JcDenis/dcAdvancedCleaner/master/dcstore.xml'
]
);

View file

@ -1,14 +1,15 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of dcAdvancedCleaner, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2018 JC Denis and contributors
# jcdenis@gdwd.com
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
/**
* @brief dcAdvancedCleaner, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_CONTEXT_ADMIN')){return;}
@ -22,24 +23,24 @@ if (version_compare($old_version,$new_version,'>=')) {return;}
# Install or update
try
{
# Check DC version
if (version_compare(str_replace("-r","-p",DC_VERSION),'2.2-alpha','<'))
{
throw new Exception('dcAdvancedCleaner requires Dotclear 2.2');
}
# Settings
$core->blog->settings->addNamespace('dcAdvancedCleaner');
$core->blog->settings->dcAdvancedCleaner->put('dcAdvancedCleaner_behavior_active',true,'boolean','',false,true);
$core->blog->settings->dcAdvancedCleaner->put('dcAdvancedCleaner_dcproperty_hide',true,'boolean','',false,true);
# Version
$core->setVersion('dcAdvancedCleaner',$new_version);
return true;
# Check DC version
if (version_compare(str_replace("-r","-p",DC_VERSION),'2.2-alpha','<'))
{
throw new Exception('dcAdvancedCleaner requires Dotclear 2.2');
}
# Settings
$core->blog->settings->addNamespace('dcAdvancedCleaner');
$core->blog->settings->dcAdvancedCleaner->put('dcAdvancedCleaner_behavior_active',true,'boolean','',false,true);
$core->blog->settings->dcAdvancedCleaner->put('dcAdvancedCleaner_dcproperty_hide',true,'boolean','',false,true);
# Version
$core->setVersion('dcAdvancedCleaner',$new_version);
return true;
}
catch (Exception $e)
{
$core->error->add($e->getMessage());
return false;
$core->error->add($e->getMessage());
return false;
}

View file

@ -1,14 +1,15 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of dcAdvancedCleaner, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2018 JC Denis and contributors
# jcdenis@gdwd.com
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
/**
* @brief dcAdvancedCleaner, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_RC_PATH')) return;
@ -17,34 +18,34 @@ $core->blog->settings->addNamespace('dcAdvancedCleaner');
# Main class
$__autoload['dcAdvancedCleaner'] =
dirname(__FILE__).'/inc/class.dc.advanced.cleaner.php';
dirname(__FILE__).'/inc/class.dc.advanced.cleaner.php';
# Behaviors class
$__autoload['behaviorsDcAdvancedCleaner'] =
dirname(__FILE__).'/inc/lib.dc.advanced.cleaner.behaviors.php';
dirname(__FILE__).'/inc/lib.dc.advanced.cleaner.behaviors.php';
# Unsintaller class
$__autoload['dcUninstaller'] =
dirname(__FILE__).'/inc/class.dc.uninstaller.php';
dirname(__FILE__).'/inc/class.dc.uninstaller.php';
# Add tab on plugin admin page
$core->addBehavior('pluginsToolsTabs',
array('behaviorsDcAdvancedCleaner','pluginsToolsTabs'));
array('behaviorsDcAdvancedCleaner','pluginsToolsTabs'));
# Action on plugin deletion
$core->addBehavior('pluginsBeforeDelete',
array('behaviorsDcAdvancedCleaner','pluginsBeforeDelete'));
array('behaviorsDcAdvancedCleaner','pluginsBeforeDelete'));
# Action on theme deletion
$core->addBehavior('themeBeforeDelete',
array('behaviorsDcAdvancedCleaner','themeBeforeDelete'));
array('behaviorsDcAdvancedCleaner','themeBeforeDelete'));
# Tabs of dcAvdancedCleaner admin page
$core->addBehavior('dcAdvancedCleanerAdminTabs',
array('behaviorsDcAdvancedCleaner','dcAdvancedCleanerAdminTabs'));
array('behaviorsDcAdvancedCleaner','dcAdvancedCleanerAdminTabs'));
# Add dcac events on plugin activityReport
if (defined('ACTIVITY_REPORT'))
{
require_once dirname(__FILE__).'/inc/lib.dc.advanced.cleaner.activityreport.php';
require_once dirname(__FILE__).'/inc/lib.dc.advanced.cleaner.activityreport.php';
}

12
dcstore.xml Normal file
View file

@ -0,0 +1,12 @@
<modules xmlns:da="http://dotaddict.org/da/">
<module id="dcAdvancedCleaner">
<name>Nettoyeur avancé</name>
<version>0.7.3.1</version>
<author>Jean-Christian Denis and Contributors</author>
<desc>Make a huge cleaning of dotclear</desc>
<file>https://github.com/JcDenis/dcAdvancedCleaner/releases/download/v0.7.3.1/plugin-dcAdvancedCleaner.zip</file>
<da:dcmin>2.19</da:dcmin>
<da:details>https://plugins.dotaddict.org/dc2/details/dcAdvancedCleaner</da:details>
<da:support>https://github.com/JcDenis/dcAdvancedCleaner</da:support>
</module>
</modules>

View file

@ -1,395 +1,396 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of dcAdvancedCleaner, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2018 JC Denis and contributors
# jcdenis@gdwd.com
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
/**
* @brief dcAdvancedCleaner, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_ADMIN_CONTEXT')){return;}
class dcAdvancedCleaner
{
protected static $errors = array(
'settings' => array(
'delete_global' => 'Failed to delete global settings',
'delete_local' => 'Failed to delete local settings',
'delete_all' => 'Failed to delete all settings'
),
'tables' => array(
'empty' => 'Failed to empty table',
'delete' => 'Failed to delete table'
),
'plugins' => array(
'empty' => 'Failed to empty plugin folder',
'delete' => 'Failed to delete plugin folder'
),
'themes' => array(
'empty' => 'Failed to empty themes folder',
'delete' => 'Failed to delete themes folder'
),
'caches' => array(
'empty' => 'Failed to empty cache folder',
'delete' => 'Failed to delete cache folder'
),
'versions' => array(
'delete' => 'Failed to delete version'
)
);
protected static $errors = array(
'settings' => array(
'delete_global' => 'Failed to delete global settings',
'delete_local' => 'Failed to delete local settings',
'delete_all' => 'Failed to delete all settings'
),
'tables' => array(
'empty' => 'Failed to empty table',
'delete' => 'Failed to delete table'
),
'plugins' => array(
'empty' => 'Failed to empty plugin folder',
'delete' => 'Failed to delete plugin folder'
),
'themes' => array(
'empty' => 'Failed to empty themes folder',
'delete' => 'Failed to delete themes folder'
),
'caches' => array(
'empty' => 'Failed to empty cache folder',
'delete' => 'Failed to delete cache folder'
),
'versions' => array(
'delete' => 'Failed to delete version'
)
);
public static $dotclear = array(
'settings' => array(
'akismet','antispam','breadcrumb','dcckeditor','dclegacyeditor','maintenance',
public static $dotclear = array(
'settings' => array(
'akismet','antispam','breadcrumb','dcckeditor','dclegacyeditor','maintenance',
'pages','pings','system','themes','widgets'
),
'tables' => array(
'blog','category','comment','link','log','media',
'meta','permissions','ping','post','post_media','pref','session',
'setting','spamrule','user','version'
),
'plugins' => array(
'aboutConfig','akismet','antispam','attachments','blogroll','blowupConfig',
'breadcrumb','dcCKEditor','dclegacy','dcLegacyEditor','fairTrackbacks','importExport','maintenance',
'pages','pings','simpleMenu','tags','themeEditor','userPref','widgets'
),
'themes' => array(
'default','customCSS','blueSilence','berlin','ductile'
),
'caches' => array(
'cbfeed','dcrepo','versions'
),
'versions' => array(
'antispam','blogroll','blowupConfig','core','dcCKEditor','dcLegacyEditor','pages','pings','simpleMenu','tags','widgets'
)
);
),
'tables' => array(
'blog','category','comment','link','log','media',
'meta','permissions','ping','post','post_media','pref','session',
'setting','spamrule','user','version'
),
'plugins' => array(
'aboutConfig','akismet','antispam','attachments','blogroll','blowupConfig',
'breadcrumb','dcCKEditor','dclegacy','dcLegacyEditor','fairTrackbacks','importExport','maintenance',
'pages','pings','simpleMenu','tags','themeEditor','userPref','widgets'
),
'themes' => array(
'default','customCSS','blueSilence','berlin','ductile'
),
'caches' => array(
'cbfeed','dcrepo','versions'
),
'versions' => array(
'antispam','blogroll','blowupConfig','core','dcCKEditor','dcLegacyEditor','pages','pings','simpleMenu','tags','widgets'
)
);
public static $exclude = array(
'.','..','__MACOSX','.svn','CVS','.DS_Store','Thumbs.db'
);
public static $exclude = array(
'.','..','__MACOSX','.svn','CVS','.DS_Store','Thumbs.db'
);
public static function getSettings($core)
{
$res = $core->con->select(
'SELECT setting_ns '.
'FROM '.$core->prefix.'setting '.
'WHERE blog_id IS NULL '.
"OR blog_id IS NOT NULL ".
'GROUP BY setting_ns');
public static function getSettings($core)
{
$res = $core->con->select(
'SELECT setting_ns '.
'FROM '.$core->prefix.'setting '.
'WHERE blog_id IS NULL '.
"OR blog_id IS NOT NULL ".
'GROUP BY setting_ns');
$rs = array();
$i = 0;
while($res->fetch()) {
$rs = array();
$i = 0;
while($res->fetch()) {
$rs[$i]['key'] = $res->setting_ns;
$rs[$i]['value'] = $core->con->select(
'SELECT count(*) FROM '.$core->prefix.'setting '.
"WHERE setting_ns = '".$res->setting_ns."' ".
"AND (blog_id IS NULL OR blog_id IS NOT NULL) ".
"GROUP BY setting_ns ")->f(0);
$i++;
}
return $rs;
}
$rs[$i]['key'] = $res->setting_ns;
$rs[$i]['value'] = $core->con->select(
'SELECT count(*) FROM '.$core->prefix.'setting '.
"WHERE setting_ns = '".$res->setting_ns."' ".
"AND (blog_id IS NULL OR blog_id IS NOT NULL) ".
"GROUP BY setting_ns ")->f(0);
$i++;
}
return $rs;
}
protected static function deleteGlobalSettings($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->prefix.'setting '.
'WHERE blog_id IS NULL '.
"AND setting_ns = '".$core->con->escape($entry)."' "
);
}
protected static function deleteGlobalSettings($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->prefix.'setting '.
'WHERE blog_id IS NULL '.
"AND setting_ns = '".$core->con->escape($entry)."' "
);
}
protected static function deleteLocalSettings($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->prefix.'setting '.
"WHERE blog_id = '".$core->con->escape($core->blog->id)."' ".
"AND setting_ns = '".$core->con->escape($entry)."' "
);
}
protected static function deleteLocalSettings($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->prefix.'setting '.
"WHERE blog_id = '".$core->con->escape($core->blog->id)."' ".
"AND setting_ns = '".$core->con->escape($entry)."' "
);
}
protected static function deleteAllSettings($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->prefix.'setting '.
"WHERE setting_ns = '".$core->con->escape($entry)."' ".
"AND (blog_id IS NULL OR blog_id != '') "
);
}
protected static function deleteAllSettings($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->prefix.'setting '.
"WHERE setting_ns = '".$core->con->escape($entry)."' ".
"AND (blog_id IS NULL OR blog_id != '') "
);
}
public static function getTables($core)
{
$object = dbSchema::init($core->con);
$res = $object->getTables();
public static function getTables($core)
{
$object = dbSchema::init($core->con);
$res = $object->getTables();
$rs = array();
$i = 0;
foreach($res as $k => $v)
{
if ('' != $core->prefix)
{
if (!preg_match('/^'.preg_quote($core->prefix).'(.*?)$/',$v,$m)) continue;
$v = $m[1];
}
$rs[$i]['key'] = $v;
$rs[$i]['value'] = $core->con->select('SELECT count(*) FROM '.$res[$k])->f(0);
$i++;
}
return $rs;
}
$rs = array();
$i = 0;
foreach($res as $k => $v)
{
if ('' != $core->prefix)
{
if (!preg_match('/^'.preg_quote($core->prefix).'(.*?)$/',$v,$m)) continue;
$v = $m[1];
}
$rs[$i]['key'] = $v;
$rs[$i]['value'] = $core->con->select('SELECT count(*) FROM '.$res[$k])->f(0);
$i++;
}
return $rs;
}
protected static function emptyTable($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->con->escapeSystem($core->prefix.$entry)
);
}
protected static function emptyTable($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->con->escapeSystem($core->prefix.$entry)
);
}
protected static function deleteTable($core,$entry)
{
self::emptyTable($core,$entry);
protected static function deleteTable($core,$entry)
{
self::emptyTable($core,$entry);
$core->con->execute(
'DROP TABLE '.$core->con->escapeSystem($core->prefix.$entry)
);
}
$core->con->execute(
'DROP TABLE '.$core->con->escapeSystem($core->prefix.$entry)
);
}
public static function getVersions($core)
{
$res = $core->con->select('SELECT * FROM '.$core->prefix.'version');
public static function getVersions($core)
{
$res = $core->con->select('SELECT * FROM '.$core->prefix.'version');
$rs = array();
$i = 0;
while ($res->fetch()) {
$rs = array();
$i = 0;
while ($res->fetch()) {
$rs[$i]['key'] = $res->module;
$rs[$i]['value'] = $res->version;
$i++;
}
return $rs;
}
$rs[$i]['key'] = $res->module;
$rs[$i]['value'] = $res->version;
$i++;
}
return $rs;
}
protected static function deleteVersion($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->prefix.'version '.
"WHERE module = '".$core->con->escape($entry)."' "
);
}
protected static function deleteVersion($core,$entry)
{
$core->con->execute(
'DELETE FROM '.$core->prefix.'version '.
"WHERE module = '".$core->con->escape($entry)."' "
);
}
public static function getPlugins($core)
{
$res = explode(PATH_SEPARATOR,DC_PLUGINS_ROOT);
return self::getDirs($res);
}
public static function getPlugins($core)
{
$res = explode(PATH_SEPARATOR,DC_PLUGINS_ROOT);
return self::getDirs($res);
}
protected static function emptyPlugin($core,$entry)
{
$res = explode(PATH_SEPARATOR,DC_PLUGINS_ROOT);
self::delDir($res,$entry,false);
}
protected static function emptyPlugin($core,$entry)
{
$res = explode(PATH_SEPARATOR,DC_PLUGINS_ROOT);
self::delDir($res,$entry,false);
}
protected static function deletePlugin($core,$entry)
{
$res = explode(PATH_SEPARATOR,DC_PLUGINS_ROOT);
self::delDir($res,$entry,true);
}
protected static function deletePlugin($core,$entry)
{
$res = explode(PATH_SEPARATOR,DC_PLUGINS_ROOT);
self::delDir($res,$entry,true);
}
public static function getThemes($core)
{
return self::getDirs($core->blog->themes_path);
}
public static function getThemes($core)
{
return self::getDirs($core->blog->themes_path);
}
protected static function emptyTheme($core,$entry)
{
self::delDir($core->blog->themes_path,$entry,false);
}
protected static function emptyTheme($core,$entry)
{
self::delDir($core->blog->themes_path,$entry,false);
}
protected static function deleteTheme($core,$entry)
{
self::delDir($core->blog->themes_path,$entry,true);
}
protected static function deleteTheme($core,$entry)
{
self::delDir($core->blog->themes_path,$entry,true);
}
public static function getCaches($core)
{
return self::getDirs(DC_TPL_CACHE);
}
public static function getCaches($core)
{
return self::getDirs(DC_TPL_CACHE);
}
protected static function emptyCache($core,$entry)
{
self::delDir(DC_TPL_CACHE,$entry,false);
}
protected static function emptyCache($core,$entry)
{
self::delDir(DC_TPL_CACHE,$entry,false);
}
protected static function deleteCache($core,$entry)
{
self::delDir(DC_TPL_CACHE,$entry,true);
}
protected static function deleteCache($core,$entry)
{
self::delDir(DC_TPL_CACHE,$entry,true);
}
public static function execute($core,$type,$action,$ns)
{
if (strtolower($ns) == 'dcadvancedcleaner')
throw new exception("dcAdvancedCleaner can't remove itself");
public static function execute($core,$type,$action,$ns)
{
if (strtolower($ns) == 'dcadvancedcleaner')
throw new exception("dcAdvancedCleaner can't remove itself");
# BEHAVIOR dcAdvancedCleanerBeforeAction
$core->callBehavior('dcAdvancedCleanerBeforeAction',$type,$action,$ns);
# BEHAVIOR dcAdvancedCleanerBeforeAction
$core->callBehavior('dcAdvancedCleanerBeforeAction',$type,$action,$ns);
try {
# Delete global settings
if ($type == 'settings' && $action == 'delete_global')
self::deleteGlobalSettings($core,$ns);
try {
# Delete global settings
if ($type == 'settings' && $action == 'delete_global')
self::deleteGlobalSettings($core,$ns);
# Delete local settings
if ($type == 'settings' && $action == 'delete_local')
self::deleteLocalSettings($core,$ns);
# Delete local settings
if ($type == 'settings' && $action == 'delete_local')
self::deleteLocalSettings($core,$ns);
# Delete all settings
if ($type == 'settings' && $action == 'delete_all')
self::deleteAllSettings($core,$ns);
# Delete all settings
if ($type == 'settings' && $action == 'delete_all')
self::deleteAllSettings($core,$ns);
# Empty tables
if ($type == 'tables' && $action == 'empty')
self::emptyTable($core,$ns);
# Empty tables
if ($type == 'tables' && $action == 'empty')
self::emptyTable($core,$ns);
# Delete tables
if ($type == 'tables' && $action == 'delete')
self::deleteTable($core,$ns);
# Delete tables
if ($type == 'tables' && $action == 'delete')
self::deleteTable($core,$ns);
# Delete versions
if ($type == 'versions' && $action == 'delete')
self::deleteVersion($core,$ns);
# Delete versions
if ($type == 'versions' && $action == 'delete')
self::deleteVersion($core,$ns);
# Empty plugins
if ($type == 'plugins' && $action == 'empty')
self::emptyPlugin($core,$ns);
# Empty plugins
if ($type == 'plugins' && $action == 'empty')
self::emptyPlugin($core,$ns);
# Delete plugins
if ($type == 'plugins' && $action == 'delete')
self::deletePlugin($core,$ns);
# Delete plugins
if ($type == 'plugins' && $action == 'delete')
self::deletePlugin($core,$ns);
# Empty themes
if ($type == 'themes' && $action == 'empty')
self::emptyTheme($core,$ns);
# Empty themes
if ($type == 'themes' && $action == 'empty')
self::emptyTheme($core,$ns);
# Delete themes
if ($type == 'themes' && $action == 'delete')
self::deleteTheme($core,$ns);
# Delete themes
if ($type == 'themes' && $action == 'delete')
self::deleteTheme($core,$ns);
# Empty caches
if ($type == 'caches' && $action == 'empty')
self::emptyCache($core,$ns);
# Empty caches
if ($type == 'caches' && $action == 'empty')
self::emptyCache($core,$ns);
# Delete caches
if ($type == 'caches' && $action == 'delete')
self::deleteCache($core,$ns);
# Delete caches
if ($type == 'caches' && $action == 'delete')
self::deleteCache($core,$ns);
return true;
}
catch(Exception $e) {
$errors = self::$errors;
if (isset($errors[$type][$action])) {
throw new Exception(__($errors[$type][$action]));
}
else {
throw new Exception(sprintf(__('Cannot execute "%s" of type "%s"'),$action,$type));
}
return false;
}
}
return true;
}
catch(Exception $e) {
$errors = self::$errors;
if (isset($errors[$type][$action])) {
throw new Exception(__($errors[$type][$action]));
}
else {
throw new Exception(sprintf(__('Cannot execute "%s" of type "%s"'),$action,$type));
}
return false;
}
}
protected static function getDirs($roots)
{
if (!is_array($roots))
$roots = array($roots);
protected static function getDirs($roots)
{
if (!is_array($roots))
$roots = array($roots);
$rs = array();
$i = 0;
foreach ($roots as $root) {
$rs = array();
$i = 0;
foreach ($roots as $root) {
$dirs = files::scanDir($root);
foreach($dirs as $k) {
$dirs = files::scanDir($root);
foreach($dirs as $k) {
if ('.' == $k || '..' == $k || !is_dir($root.'/'.$k)) continue;
if ('.' == $k || '..' == $k || !is_dir($root.'/'.$k)) continue;
$rs[$i]['key'] = $k;
$rs[$i]['value'] = count(self::scanDir($root.'/'.$k));
$i++;
}
}
return $rs;
}
$rs[$i]['key'] = $k;
$rs[$i]['value'] = count(self::scanDir($root.'/'.$k));
$i++;
}
}
return $rs;
}
protected static function delDir($roots,$folder,$delfolder=true)
{
if (strpos($folder,'/'))
return false;
protected static function delDir($roots,$folder,$delfolder=true)
{
if (strpos($folder,'/'))
return false;
if (!is_array($roots))
$roots = array($roots);
if (!is_array($roots))
$roots = array($roots);
foreach ($roots as $root)
{
if (file_exists($root.'/'.$folder))
return self::delTree($root.'/'.$folder,$delfolder);
}
return false;
}
foreach ($roots as $root)
{
if (file_exists($root.'/'.$folder))
return self::delTree($root.'/'.$folder,$delfolder);
}
return false;
}
protected static function scanDir($path,$dir='',$res=array())
{
$exclude = self::$exclude;
protected static function scanDir($path,$dir='',$res=array())
{
$exclude = self::$exclude;
$path = path::real($path);
if (!is_dir($path) || !is_readable($path)) return array();
$path = path::real($path);
if (!is_dir($path) || !is_readable($path)) return array();
$files = files::scandir($path);
$files = files::scandir($path);
foreach($files AS $file) {
if (in_array($file,$exclude)) continue;
foreach($files AS $file) {
if (in_array($file,$exclude)) continue;
if (is_dir($path.'/'.$file)) {
if (is_dir($path.'/'.$file)) {
$res[] = $file;
$res = self::scanDir($path.'/'.$file,$dir.'/'.$file,$res);
} else {
$res[] = $file;
$res = self::scanDir($path.'/'.$file,$dir.'/'.$file,$res);
} else {
$res[] = empty($dir) ? $file : $dir.'/'.$file;
}
}
return $res;
}
$res[] = empty($dir) ? $file : $dir.'/'.$file;
}
}
return $res;
}
protected static function delTree($dir,$delroot=true)
{
if (!is_dir($dir) || !is_readable($dir)) return false;
protected static function delTree($dir,$delroot=true)
{
if (!is_dir($dir) || !is_readable($dir)) return false;
if (substr($dir,-1) != '/') $dir .= '/';
if (substr($dir,-1) != '/') $dir .= '/';
if (($d = @dir($dir)) === false) return false;
if (($d = @dir($dir)) === false) return false;
while (($entryname = $d->read()) !== false)
{
if ($entryname != '.' && $entryname != '..')
{
if (is_dir($dir.'/'.$entryname))
{
if (!self::delTree($dir.'/'.$entryname)) return false;
}
else
{
if (!@unlink($dir.'/'.$entryname)) return false;
}
}
}
$d->close();
while (($entryname = $d->read()) !== false)
{
if ($entryname != '.' && $entryname != '..')
{
if (is_dir($dir.'/'.$entryname))
{
if (!self::delTree($dir.'/'.$entryname)) return false;
}
else
{
if (!@unlink($dir.'/'.$entryname)) return false;
}
}
}
$d->close();
if ($delroot)
return @rmdir($dir);
else
return true;
}
if ($delroot)
return @rmdir($dir);
else
return true;
}
}

View file

@ -1,14 +1,15 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of dcAdvancedCleaner, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2018 JC Denis and contributors
# jcdenis@gdwd.com
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
/**
* @brief dcAdvancedCleaner, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_ADMIN_CONTEXT')){return;}
@ -21,334 +22,334 @@ This class used dcAdvancedCleaner.
*/
class dcUninstaller
{
protected $path;
protected $path;
protected $modules = array(); ///< <b>array</b> Modules informations array
protected $actions = array('user'=>array(),'callback'=>array());
protected $callbacks = array('user'=>array(),'callback'=>array());
protected $modules = array(); ///< <b>array</b> Modules informations array
protected $actions = array('user'=>array(),'callback'=>array());
protected $callbacks = array('user'=>array(),'callback'=>array());
protected $id = null;
protected $mroot = null;
protected $id = null;
protected $mroot = null;
/**
Array of all allowed properties to uninstall parts of modules.
'settings' : settings set on dcSettings,
'tables' : if module creates table,
'plugins' : if module has files on plugin path,
'themes' : if module has files on theme path, (on current blog)
'caches' : if module has files on DC caches path,
'versions' : if module set a versions on DC table 'version'
*/
protected static $allowed_properties = array(
'versions' => array(
'delete' => 'delete version in dc'
),
'settings' => array(
'delete_global' => 'delete global settings',
'delete_local' => 'delete local settings',
'delete_all' => 'delete all settings'
),
'tables' => array(
'empty' => 'empty table',
'delete' => 'delete table'
),
'plugins' => array(
'empty' => 'empty plugin folder',
'delete' => 'delete plugin folder'
),
'themes' => array(
'empty' => 'empty theme folder',
'delete' => 'delete theme folder'
),
'caches' => array(
'empty' => 'empty cache folder',
'delete' => 'delete cache folder'
)
);
/**
Array of all allowed properties to uninstall parts of modules.
'settings' : settings set on dcSettings,
'tables' : if module creates table,
'plugins' : if module has files on plugin path,
'themes' : if module has files on theme path, (on current blog)
'caches' : if module has files on DC caches path,
'versions' : if module set a versions on DC table 'version'
*/
protected static $allowed_properties = array(
'versions' => array(
'delete' => 'delete version in dc'
),
'settings' => array(
'delete_global' => 'delete global settings',
'delete_local' => 'delete local settings',
'delete_all' => 'delete all settings'
),
'tables' => array(
'empty' => 'empty table',
'delete' => 'delete table'
),
'plugins' => array(
'empty' => 'empty plugin folder',
'delete' => 'delete plugin folder'
),
'themes' => array(
'empty' => 'empty theme folder',
'delete' => 'delete theme folder'
),
'caches' => array(
'empty' => 'empty cache folder',
'delete' => 'delete cache folder'
)
);
protected static $priority_properties = array(
'versions','settings','tables','themes','plugins','caches'
);
protected static $priority_properties = array(
'versions','settings','tables','themes','plugins','caches'
);
public $core; ///< <b>dcCore</b> dcCore instance
/**
Object constructor.
@param core <b>dcCore</b> dcCore instance
*/
public function __construct($core)
{
$this->core =& $core;
}
public $core; ///< <b>dcCore</b> dcCore instance
public static function getAllowedProperties()
{
return self::$allowed_properties;
}
/**
Loads modules.
Files _defines.php and _uninstall.php must be present on module
to be recognized.
(path separator depends on your OS).
@param path <b>string</b> Separated list of paths
*/
public function loadModules($path)
{
$this->path = explode(PATH_SEPARATOR,$path);
/**
Object constructor.
foreach ($this->path as $root)
{
if (!is_dir($root) || !is_readable($root)) continue;
@param core <b>dcCore</b> dcCore instance
*/
public function __construct($core)
{
$this->core =& $core;
}
if (substr($root,-1) != '/') $root .= '/';
public static function getAllowedProperties()
{
return self::$allowed_properties;
}
if (($d = @dir($root)) === false) continue;
/**
Loads modules.
Files _defines.php and _uninstall.php must be present on module
to be recognized.
(path separator depends on your OS).
while (($entry = $d->read()) !== false)
{
$full_entry = $root.'/'.$entry;
@param path <b>string</b> Separated list of paths
*/
public function loadModules($path)
{
$this->path = explode(PATH_SEPARATOR,$path);
if ($entry != '.' && $entry != '..' && is_dir($full_entry))
{
$this->loadModule($full_entry);
}
}
$d->close();
}
foreach ($this->path as $root)
{
if (!is_dir($root) || !is_readable($root)) continue;
# Sort modules by name
uasort($this->modules,array($this,'sortModules'));
}
/**
Load one module.
Files _defines.php and _uninstall.php must be present on module
to be recognized.
@param root <b>string</b> path of module
*/
public function loadModule($root)
{
if (file_exists($root.'/_define.php')
&& file_exists($root.'/_uninstall.php')) {
if (substr($root,-1) != '/') $root .= '/';
$this->id = basename($root);
$this->mroot = $root;
if (($d = @dir($root)) === false) continue;
require $root.'/_define.php';
require $root.'/_uninstall.php';
while (($entry = $d->read()) !== false)
{
$full_entry = $root.'/'.$entry;
$this->id = null;
$this->mroot = null;
}
}
/**
This method registers a module in modules list. You should use
this to register a new module.
@param name <b>string</b> Module name
@param desc <b>string</b> Module description
@param author <b>string</b> Module author name
@param version <b>string</b> Module version
*/
public function registerModule($name,$desc,$author,$version)
{
if ($this->id) {
$this->modules[$this->id] = array(
'root' => $this->mroot,
'name' => $name,
'desc' => $desc,
'author' => $author,
'version' => $version,
'root_writable' => is_writable($this->mroot)
);
}
}
/**
Returns all modules associative array or only one module if <var>$id</var>
is present.
@param id <b>string</b> Optionnal module ID
@return <b>array</b>
*/
public function getModules($id=null)
{
if ($id && isset($this->modules[$id])) {
return $this->modules[$id];
}
return $this->modules;
}
/**
Returns true if the module with ID <var>$id</var> exists.
@param id <b>string</b> Module ID
@return <b>boolean</b>
*/
public function moduleExists($id)
{
return isset($this->modules[$id]);
}
if ($entry != '.' && $entry != '..' && is_dir($full_entry))
{
$this->loadModule($full_entry);
}
}
$d->close();
}
/**
Add a predefined action to unsintall features.
This action is set in _uninstall.php.
@param type <b>string</b> Type of action (from $allowed_properties)
@param action <b>string</b> Action (from $allowed_properties)
@param ns <b>string</b> Name of setting related to module.
@param desc <b>string</b> Description of action
*/
protected function addUserAction($type,$action,$ns,$desc='')
{
$this->addAction('user',$type,$action,$ns,$desc);
}
# Sort modules by name
uasort($this->modules,array($this,'sortModules'));
}
protected function addDirectAction($type,$action,$ns,$desc='')
{
$this->addAction('direct',$type,$action,$ns,$desc);
}
/**
Load one module.
Files _defines.php and _uninstall.php must be present on module
to be recognized.
private function addAction($group,$type,$action,$ns,$desc)
{
$group = self::group($group);
@param root <b>string</b> path of module
*/
public function loadModule($root)
{
if (file_exists($root.'/_define.php')
&& file_exists($root.'/_uninstall.php')) {
if (null === $this->id) return;
$this->id = basename($root);
$this->mroot = $root;
if (empty($type) || empty($ns)) return;
require $root.'/_define.php';
require $root.'/_uninstall.php';
if (!isset(self::$allowed_properties[$type][$action])) return;
$this->id = null;
$this->mroot = null;
}
}
if (empty($desc)) $desc = __($action);
/**
This method registers a module in modules list. You should use
this to register a new module.
$this->actions[$group][$this->id][$type][] = array(
'ns' => $ns,
'action' => $action,
'desc' => $desc
);
}
@param name <b>string</b> Module name
@param desc <b>string</b> Module description
@param author <b>string</b> Module author name
@param version <b>string</b> Module version
*/
public function registerModule($name,$desc,$author,$version)
{
if ($this->id) {
$this->modules[$this->id] = array(
'root' => $this->mroot,
'name' => $name,
'desc' => $desc,
'author' => $author,
'version' => $version,
'root_writable' => is_writable($this->mroot)
);
}
}
/**
Returns modules <var>$id</var> predefined actions associative array
ordered by priority
@param id <b>string</b> Optionnal module ID
@return <b>array</b>
*/
public function getUserActions($id)
{
return $this->getActions('user',$id);
}
/**
Returns all modules associative array or only one module if <var>$id</var>
is present.
public function getDirectActions($id)
{
return $this->getActions('direct',$id);
}
@param id <b>string</b> Optionnal module ID
@return <b>array</b>
*/
public function getModules($id=null)
{
if ($id && isset($this->modules[$id])) {
return $this->modules[$id];
}
return $this->modules;
}
protected function getActions($group,$id)
{
$group = self::group($group);
/**
Returns true if the module with ID <var>$id</var> exists.
if (!isset($this->actions[$group][$id])) return array();
@param id <b>string</b> Module ID
@return <b>boolean</b>
*/
public function moduleExists($id)
{
return isset($this->modules[$id]);
}
$res = array();
foreach(self::$priority_properties as $k => $v)
{
if (!isset($this->actions[$group][$id][$v])) continue;
$res[$v] = $this->actions[$group][$id][$v];
}
/**
Add a predefined action to unsintall features.
This action is set in _uninstall.php.
return $res;
}
@param type <b>string</b> Type of action (from $allowed_properties)
@param action <b>string</b> Action (from $allowed_properties)
@param ns <b>string</b> Name of setting related to module.
@param desc <b>string</b> Description of action
*/
protected function addUserAction($type,$action,$ns,$desc='')
{
$this->addAction('user',$type,$action,$ns,$desc);
}
/**
Add a callable function for unsintall features.
This action is set in _uninstall.php.
@param func <b>string</b> Callable function
@param desc <b>string</b> Description of action
*/
protected function addUserCallback($func,$desc='')
{
$this->addCallback('user',$func,$desc);
}
protected function addDirectAction($type,$action,$ns,$desc='')
{
$this->addAction('direct',$type,$action,$ns,$desc);
}
protected function addDirectCallback($func,$desc='')
{
$this->addCallback('direct',$func,$desc);
}
private function addAction($group,$type,$action,$ns,$desc)
{
$group = self::group($group);
private function addCallback($group,$func,$desc)
{
$group = self::group($group);
if (null === $this->id) return;
if (null === $this->id) return;
if (empty($type) || empty($ns)) return;
if (empty($desc)) $desc = __('extra action');
if (!isset(self::$allowed_properties[$type][$action])) return;
if (!is_callable($func)) return;
if (empty($desc)) $desc = __($action);
$this->callbacks[$group][$this->id][] = array(
'func' => $func,
'desc' => $desc
);
}
/**
Returns modules <var>$id</var> callback actions associative array
@param id <b>string</b> Optionnal module ID
@return <b>array</b>
*/
public function getUserCallbacks($id)
{
return $this->getCallbacks('user',$id);
}
$this->actions[$group][$this->id][$type][] = array(
'ns' => $ns,
'action' => $action,
'desc' => $desc
);
}
public function getDirectCallbacks($id)
{
return $this->getCallbacks('direct',$id);
}
/**
Returns modules <var>$id</var> predefined actions associative array
ordered by priority
protected function getCallbacks($group,$id)
{
$group = self::group($group);
@param id <b>string</b> Optionnal module ID
@return <b>array</b>
*/
public function getUserActions($id)
{
return $this->getActions('user',$id);
}
if (!isset($this->callbacks[$group][$id])) return array();
public function getDirectActions($id)
{
return $this->getActions('direct',$id);
}
return $this->callbacks[$group][$id];
}
/**
Execute a predifined action. This function call dcAdvancedCleaner
to do actions.
@param type <b>string</b> Type of action (from $allowed_properties)
@param action <b>string</b> Action (from $allowed_properties)
@param ns <b>string</b> Name of setting related to module.
@return <b>array</b>
*/
public function execute($type,$action,$ns)
{
$prop = $this->getAllowedProperties();
protected function getActions($group,$id)
{
$group = self::group($group);
if (!isset($prop[$type][$action]) || empty($ns)) return;
if (!isset($this->actions[$group][$id])) return array();
dcAdvancedCleaner::execute($this->core,$type,$action,$ns);
}
$res = array();
foreach(self::$priority_properties as $k => $v)
{
if (!isset($this->actions[$group][$id][$v])) continue;
$res[$v] = $this->actions[$group][$id][$v];
}
private function sortModules($a,$b)
{
return strcasecmp($a['name'],$b['name']);
}
return $res;
}
private function group($group)
{
return in_array($group,array('user','direct')) ? $group : null;
}
/**
Add a callable function for unsintall features.
This action is set in _uninstall.php.
@param func <b>string</b> Callable function
@param desc <b>string</b> Description of action
*/
protected function addUserCallback($func,$desc='')
{
$this->addCallback('user',$func,$desc);
}
protected function addDirectCallback($func,$desc='')
{
$this->addCallback('direct',$func,$desc);
}
private function addCallback($group,$func,$desc)
{
$group = self::group($group);
if (null === $this->id) return;
if (empty($desc)) $desc = __('extra action');
if (!is_callable($func)) return;
$this->callbacks[$group][$this->id][] = array(
'func' => $func,
'desc' => $desc
);
}
/**
Returns modules <var>$id</var> callback actions associative array
@param id <b>string</b> Optionnal module ID
@return <b>array</b>
*/
public function getUserCallbacks($id)
{
return $this->getCallbacks('user',$id);
}
public function getDirectCallbacks($id)
{
return $this->getCallbacks('direct',$id);
}
protected function getCallbacks($group,$id)
{
$group = self::group($group);
if (!isset($this->callbacks[$group][$id])) return array();
return $this->callbacks[$group][$id];
}
/**
Execute a predifined action. This function call dcAdvancedCleaner
to do actions.
@param type <b>string</b> Type of action (from $allowed_properties)
@param action <b>string</b> Action (from $allowed_properties)
@param ns <b>string</b> Name of setting related to module.
@return <b>array</b>
*/
public function execute($type,$action,$ns)
{
$prop = $this->getAllowedProperties();
if (!isset($prop[$type][$action]) || empty($ns)) return;
dcAdvancedCleaner::execute($this->core,$type,$action,$ns);
}
private function sortModules($a,$b)
{
return strcasecmp($a['name'],$b['name']);
}
private function group($group)
{
return in_array($group,array('user','direct')) ? $group : null;
}
}

View file

@ -1,14 +1,15 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of dcAdvancedCleaner, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2018 JC Denis and contributors
# jcdenis@gdwd.com
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
/**
* @brief dcAdvancedCleaner, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_RC_PATH')){return;}
@ -18,20 +19,20 @@ $core->activityReport->addGroup('dcadvancedcleaner',__('Plugin dcAdvancedCleaner
# from BEHAVIOR dcAdvancedCleanerBeforeAction
# in dcAdvancedCleaner/inc/class.dc.advanced.cleaner.php
$core->activityReport->addAction(
'dcadvancedcleaner',
'maintenance',
__('Maintenance'),
__('New action from dcAdvancedCleaner has been made with type="%s", action="%s", ns="%s".'),
'dcAdvancedCleanerBeforeAction',
array('dcAdvancedCleanerActivityReportBehaviors','maintenance')
'dcadvancedcleaner',
'maintenance',
__('Maintenance'),
__('New action from dcAdvancedCleaner has been made with type="%s", action="%s", ns="%s".'),
'dcAdvancedCleanerBeforeAction',
array('dcAdvancedCleanerActivityReportBehaviors','maintenance')
);
class dcAdvancedCleanerActivityReportBehaviors
{
public static function maintenance($type,$action,$ns)
{
$logs = array($type,$action,$ns);
public static function maintenance($type,$action,$ns)
{
$logs = array($type,$action,$ns);
$GLOBALS['core']->activityReport->addLog('dcadvancedcleaner','maintenance',$logs);
}
$GLOBALS['core']->activityReport->addLog('dcadvancedcleaner','maintenance',$logs);
}
}

View file

@ -1,224 +1,225 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of dcAdvancedCleaner, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2018 JC Denis and contributors
# jcdenis@gdwd.com
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
/**
* @brief dcAdvancedCleaner, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_ADMIN_CONTEXT')){return;}
class behaviorsDcAdvancedCleaner
{
public static function pluginsBeforeDelete($plugin)
{
self::moduleBeforeDelete($plugin,'plugins.php?removed=1');
}
public static function pluginsBeforeDelete($plugin)
{
self::moduleBeforeDelete($plugin,'plugins.php?removed=1');
}
public static function themeBeforeDelete($theme)
{
self::moduleBeforeDelete($theme,'blog_theme.php?del=1');
}
public static function themeBeforeDelete($theme)
{
self::moduleBeforeDelete($theme,'blog_theme.php?del=1');
}
# Generic module before delete
public static function moduleBeforeDelete($module,$redir)
{
global $core;
$done = false;
# Generic module before delete
public static function moduleBeforeDelete($module,$redir)
{
global $core;
$done = false;
if (!$core->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) return;
if (!$core->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) return;
$uninstaller = new dcUninstaller($core);
$uninstaller->loadModule($module['root']);
$uninstaller = new dcUninstaller($core);
$uninstaller->loadModule($module['root']);
$m_callbacks = $uninstaller->getDirectCallbacks($module['id']);
$m_actions = $uninstaller->getDirectActions($module['id']);
$m_callbacks = $uninstaller->getDirectCallbacks($module['id']);
$m_actions = $uninstaller->getDirectActions($module['id']);
foreach($m_callbacks as $k => $callback)
{
if (!isset($callback['func']) || !is_callable($callback['func'])) continue;
foreach($m_callbacks as $k => $callback)
{
if (!isset($callback['func']) || !is_callable($callback['func'])) continue;
call_user_func($callback['func'],$module);
$done = true;
}
call_user_func($callback['func'],$module);
$done = true;
}
foreach($m_actions as $type => $actions)
{
foreach($actions as $v)
{
$uninstaller->execute($type,$v['action'],$v['ns']);
$done = true;
}
}
foreach($m_actions as $type => $actions)
{
foreach($actions as $v)
{
$uninstaller->execute($type,$v['action'],$v['ns']);
$done = true;
}
}
if ($done) {
http::redirect($redir);
}
}
if ($done) {
http::redirect($redir);
}
}
public static function dcAdvancedCleanerAdminTabs($core,$p_url)
{
self::modulesTabs($core,DC_PLUGINS_ROOT,$p_url.'&tab=uninstaller');
}
public static function dcAdvancedCleanerAdminTabs($core,$p_url)
{
self::modulesTabs($core,DC_PLUGINS_ROOT,$p_url.'&tab=uninstaller');
}
public static function pluginsToolsTabs($core)
{
self::modulesTabs($core,DC_PLUGINS_ROOT,'plugins.php?tab=uninstaller');
}
public static function pluginsToolsTabs($core)
{
self::modulesTabs($core,DC_PLUGINS_ROOT,'plugins.php?tab=uninstaller');
}
# Generic module tabs
public static function modulesTabs($core,$path,$redir,$title='')
{
if (!$core->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) return;
# Generic module tabs
public static function modulesTabs($core,$path,$redir,$title='')
{
if (!$core->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) return;
$err = '';
$title = empty($title) ? __('Advanced uninstall') : $title;
$err = '';
$title = empty($title) ? __('Advanced uninstall') : $title;
$uninstaller = new dcUninstaller($core);
$uninstaller->loadModules($path);
$modules = $uninstaller->getModules();
$props = $uninstaller->getAllowedProperties();
$uninstaller = new dcUninstaller($core);
$uninstaller->loadModules($path);
$modules = $uninstaller->getModules();
$props = $uninstaller->getAllowedProperties();
# Execute
if (isset($_POST['action']) && $_POST['action'] == 'uninstall'
&& (!empty($_POST['extras']) || !empty($_POST['actions']))) {
# Execute
if (isset($_POST['action']) && $_POST['action'] == 'uninstall'
&& (!empty($_POST['extras']) || !empty($_POST['actions']))) {
try {
# Extras
if (!empty($_POST['extras'])) {
foreach($_POST['extras'] as $module_id => $extras)
{
foreach($extras as $k => $sentence)
{
$extra = @unserialize(@base64_decode($sentence));
try {
# Extras
if (!empty($_POST['extras'])) {
foreach($_POST['extras'] as $module_id => $extras)
{
foreach($extras as $k => $sentence)
{
$extra = @unserialize(@base64_decode($sentence));
if (!$extra || !is_callable($extra)) continue;
if (!$extra || !is_callable($extra)) continue;
call_user_func($extra,$modul_id);
}
}
}
# Actions
if (!empty($_POST['actions'])) {
foreach($_POST['actions'] as $module_id => $actions)
{
foreach($actions as $k => $sentence)
{
$action = @unserialize(@base64_decode($sentence));
call_user_func($extra,$modul_id);
}
}
}
# Actions
if (!empty($_POST['actions'])) {
foreach($_POST['actions'] as $module_id => $actions)
{
foreach($actions as $k => $sentence)
{
$action = @unserialize(@base64_decode($sentence));
if (!$action
|| !isset($action['type'])
|| !isset($action['action'])
|| !isset($action['ns'])) continue;
if (!$action
|| !isset($action['type'])
|| !isset($action['action'])
|| !isset($action['ns'])) continue;
$uninstaller->execute($action['type'],$action['action'],$action['ns']);
}
}
}
http::redirect($redir.'&msg=1');
}
catch(Exception $e) {
$err = $e->getMessage();
}
}
$uninstaller->execute($action['type'],$action['action'],$action['ns']);
}
}
}
http::redirect($redir.'&msg=1');
}
catch(Exception $e) {
$err = $e->getMessage();
}
}
echo
'<div class="multi-part" id="uninstaller" title="'.__($title).'">';
echo
'<div class="multi-part" id="uninstaller" title="'.__($title).'">';
if($err)
echo '<p class="error">'.$err.'</p>';
if($err)
echo '<p class="error">'.$err.'</p>';
if(!count($modules)) {
echo '<p>'.__('There is no module with uninstall features').'</p></div>';
return;
}
if(!count($modules)) {
echo '<p>'.__('There is no module with uninstall features').'</p></div>';
return;
}
echo
'<p>'.__('List of modules with advanced uninstall features').'</p>'.
'<form method="post" action="'.$redir.'">'.
'<table class="clear"><tr>'.
'<th>'.__('id').'</th>'.
'<th>'.__('n°').'</th>';
foreach($props as $pro_id => $prop) {
echo '<th>'.__($pro_id).'</th>';
}
echo
'<p>'.__('List of modules with advanced uninstall features').'</p>'.
'<form method="post" action="'.$redir.'">'.
'<table class="clear"><tr>'.
'<th>'.__('id').'</th>'.
'<th>'.__('n°').'</th>';
echo
'<th>'.__('extra').'</th>'.
'</tr>';
foreach($props as $pro_id => $prop) {
echo '<th>'.__($pro_id).'</th>';
}
$i = 0;
foreach($modules as $module_id => $module) {
echo
'<th>'.__('extra').'</th>'.
'</tr>';
echo
'<tr class="line">'.
'<td class="nowrap">'.$module_id.'</td>'.
'<td class="nowrap">'.$module['version'].'</td>';
$i = 0;
foreach($modules as $module_id => $module) {
$actions = $uninstaller->getUserActions($module_id);
echo
'<tr class="line">'.
'<td class="nowrap">'.$module_id.'</td>'.
'<td class="nowrap">'.$module['version'].'</td>';
foreach($props as $prop_id => $prop) {
echo '<td class="nowrap">';
$actions = $uninstaller->getUserActions($module_id);
if (!isset($actions[$prop_id])) {
echo '--</td>';
continue;
}
foreach($props as $prop_id => $prop) {
echo '<td class="nowrap">';
$j = 0;
foreach($actions[$prop_id] as $action_id => $action) {
if (!isset($actions[$prop_id])) {
echo '--</td>';
continue;
}
if (!isset($props[$prop_id][$action['action']])) continue;
$j = 0;
foreach($actions[$prop_id] as $action_id => $action) {
$ret = base64_encode(serialize(array(
'type' => $prop_id,
'action'=>$action['action'],
'ns'=>$action['ns']
)));
if (!isset($props[$prop_id][$action['action']])) continue;
echo '<label class="classic">'.
form::checkbox(array('actions['.$module_id.']['.$j.']'),$ret).
' '.$action['desc'].'</label><br />';
$ret = base64_encode(serialize(array(
'type' => $prop_id,
'action'=>$action['action'],
'ns'=>$action['ns']
)));
$j++;
}
echo '</td>';
}
echo '<label class="classic">'.
form::checkbox(array('actions['.$module_id.']['.$j.']'),$ret).
' '.$action['desc'].'</label><br />';
echo '<td class="nowrap">';
$j++;
}
echo '</td>';
}
$callbacks = $uninstaller->getUserCallbacks($module_id);
echo '<td class="nowrap">';
if (empty($callbacks)) {
echo '--';
}
$callbacks = $uninstaller->getUserCallbacks($module_id);
$k = 0;
foreach($callbacks as $callback_id => $callback) {
if (empty($callbacks)) {
echo '--';
}
$ret = base64_encode(serialize($callback['func']));
$k = 0;
foreach($callbacks as $callback_id => $callback) {
echo '<label class="classic">'.
form::checkbox(array('extras['.$module_id.']['.$k.']'),$ret).
' '.$callback['desc'].'</label><br />';
}
$ret = base64_encode(serialize($callback['func']));
echo '</td></tr>';
}
echo
'</table>'.
'<p>'.
$core->formNonce().
form::hidden(array('redir'),$redir).
form::hidden(array('action'),'uninstall').
'<input type="submit" name="submit" value="'.__('Perform selected actions').'" /> '.
'</p>'.
'</form>'.
'</div>';
}
echo '<label class="classic">'.
form::checkbox(array('extras['.$module_id.']['.$k.']'),$ret).
' '.$callback['desc'].'</label><br />';
}
echo '</td></tr>';
}
echo
'</table>'.
'<p>'.
$core->formNonce().
form::hidden(array('redir'),$redir).
form::hidden(array('action'),'uninstall').
'<input type="submit" name="submit" value="'.__('Perform selected actions').'" /> '.
'</p>'.
'</form>'.
'</div>';
}
}

268
index.php
View file

@ -1,14 +1,15 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of dcAdvancedCleaner, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2018 JC Denis and contributors
# jcdenis@gdwd.com
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
/**
* @brief dcAdvancedCleaner, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_CONTEXT_ADMIN')){return;}
@ -19,99 +20,99 @@ $page_title = __('Advanced cleaner');
# Lists
function drawDcAdvancedCleanerLists($core,$type)
{
$combo_funcs = array(
'settings' => array('dcAdvancedCleaner','getSettings'),
'tables' => array('dcAdvancedCleaner','getTables'),
'plugins' => array('dcAdvancedCleaner','getPlugins'),
'themes' => array('dcAdvancedCleaner','getThemes'),
'caches' => array('dcAdvancedCleaner','getCaches'),
'versions' => array('dcAdvancedCleaner','getVersions')
);
$combo_actions = array(
'settings' => array(
__('delete global settings') => 'delete_global',
__('delete blog settings') => 'delete_local',
__('delete all settings') =>'delete_all'
),
'tables' => array(
__('delete') => 'delete',
__('empty') => 'empty'
),
'plugins' => array(
__('delete') => 'delete',
__('empty') => 'empty'
),
'themes' => array(
__('delete') => 'delete',
__('empty') => 'empty'
),
'caches' => array(
__('delete') => 'delete',
__('empty') => 'empty'
),
'versions' => array(
__('delete') => 'delete'
)
);
$combo_help = array(
'settings' => __('Namespaces registered in dcSettings'),
'tables' => __('All database tables of Dotclear'),
'plugins' => __('Folders from plugins directories'),
'themes' => __('Folders from blog themes directory'),
'caches' => __('Folders from cache directory'),
'versions' => __('Versions registered in table "version" of Dotclear')
);
$combo_funcs = array(
'settings' => array('dcAdvancedCleaner','getSettings'),
'tables' => array('dcAdvancedCleaner','getTables'),
'plugins' => array('dcAdvancedCleaner','getPlugins'),
'themes' => array('dcAdvancedCleaner','getThemes'),
'caches' => array('dcAdvancedCleaner','getCaches'),
'versions' => array('dcAdvancedCleaner','getVersions')
);
$combo_actions = array(
'settings' => array(
__('delete global settings') => 'delete_global',
__('delete blog settings') => 'delete_local',
__('delete all settings') =>'delete_all'
),
'tables' => array(
__('delete') => 'delete',
__('empty') => 'empty'
),
'plugins' => array(
__('delete') => 'delete',
__('empty') => 'empty'
),
'themes' => array(
__('delete') => 'delete',
__('empty') => 'empty'
),
'caches' => array(
__('delete') => 'delete',
__('empty') => 'empty'
),
'versions' => array(
__('delete') => 'delete'
)
);
$combo_help = array(
'settings' => __('Namespaces registered in dcSettings'),
'tables' => __('All database tables of Dotclear'),
'plugins' => __('Folders from plugins directories'),
'themes' => __('Folders from blog themes directory'),
'caches' => __('Folders from cache directory'),
'versions' => __('Versions registered in table "version" of Dotclear')
);
if (!isset($combo_funcs[$type])) return '';
if (!isset($combo_funcs[$type])) return '';
$rs = call_user_func($combo_funcs[$type],$core);
$rs = call_user_func($combo_funcs[$type],$core);
echo
'<div class="listDcAdvancedCleaner">'.
'<p class="form-note">'.$combo_help[$type].'</p>';
if (empty($rs)) {
echo
'<p>'.sprintf(__('There is no %s'),__(substr($type,0,-1))).'</p>';
} else {
echo
'<div class="listDcAdvancedCleaner">'.
'<p class="form-note">'.$combo_help[$type].'</p>';
echo
'<p>'.sprintf(__('There are %s %s'),count($rs),__($type)).'</p>'.
'<form method="post" action="plugin.php?p=dcAdvancedCleaner&amp;tab=lists&amp;part='.$type.'">'.
'<table><thead><tr>'.
'<th>'.__('Name').'</th><th>'.__('Objects').'</th>'.
'</tr></thead><tbody>';
if (empty($rs)) {
echo
'<p>'.sprintf(__('There is no %s'),__(substr($type,0,-1))).'</p>';
} else {
foreach($rs as $k => $v)
{
$offline = in_array($v['key'],dcAdvancedCleaner::$dotclear[$type]);
echo
'<p>'.sprintf(__('There are %s %s'),count($rs),__($type)).'</p>'.
'<form method="post" action="plugin.php?p=dcAdvancedCleaner&amp;tab=lists&amp;part='.$type.'">'.
'<table><thead><tr>'.
'<th>'.__('Name').'</th><th>'.__('Objects').'</th>'.
'</tr></thead><tbody>';
if ($core->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_dcproperty_hide && $offline) continue;
foreach($rs as $k => $v)
{
$offline = in_array($v['key'],dcAdvancedCleaner::$dotclear[$type]);
echo
'<tr class="line'.
($offline ? ' offline' : '').
'">'.
'<td class="nowrap"><label class="classic">'.
form::checkbox(array('entries['.$k.']'),html::escapeHTML($v['key'])).' '.$v['key'].'</label></td>'.
'<td class="nowrap">'.$v['value'].'</td>'.
'</tr>';
}
if ($core->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_dcproperty_hide && $offline) continue;
echo
'</tbody></table>'.
'<p>'.__('Action on selected rows:').'<br />'.
form::combo(array('action'),$combo_actions[$type]).
'<input type="submit" value="'.__('ok').'" />'.
form::hidden(array('p'),'dcAdvancedCleaner').
form::hidden(array('tab'),'lists').
form::hidden(array('part'),$type).
form::hidden(array('type'),$type).
$core->formNonce().'</p>'.
'</form>';
}
echo
'<div>';
echo
'<tr class="line'.
($offline ? ' offline' : '').
'">'.
'<td class="nowrap"><label class="classic">'.
form::checkbox(array('entries['.$k.']'),html::escapeHTML($v['key'])).' '.$v['key'].'</label></td>'.
'<td class="nowrap">'.$v['value'].'</td>'.
'</tr>';
}
echo
'</tbody></table>'.
'<p>'.__('Action on selected rows:').'<br />'.
form::combo(array('action'),$combo_actions[$type]).
'<input type="submit" value="'.__('ok').'" />'.
form::hidden(array('p'),'dcAdvancedCleaner').
form::hidden(array('tab'),'lists').
form::hidden(array('part'),$type).
form::hidden(array('type'),$type).
$core->formNonce().'</p>'.
'</form>';
}
echo
'<div>';
}
# Localized l10n
@ -147,35 +148,35 @@ $s = $core->blog->settings->dcAdvancedCleaner;
# Combos
$combo_title = array(
'settings' => __('Settings'),
'tables' => __('Tables'),
'plugins' => __('Extensions'),
'themes' => __('Themes'),
'caches' => __('Cache'),
'versions' => __('Versions')
'settings' => __('Settings'),
'tables' => __('Tables'),
'plugins' => __('Extensions'),
'themes' => __('Themes'),
'caches' => __('Cache'),
'versions' => __('Versions')
);
$combo_type = array(
'settings' => array('delete_global','delete_local','delete_all'),
'tables' => array('empty','delete'),
'plugins' => array('empty','delete'),
'themes' => array('empty','delete'),
'caches' => array('empty','delete'),
'versions' => array('delete')
'settings' => array('delete_global','delete_local','delete_all'),
'tables' => array('empty','delete'),
'plugins' => array('empty','delete'),
'themes' => array('empty','delete'),
'caches' => array('empty','delete'),
'versions' => array('delete')
);
# This plugin settings
if ($tab == 'dcac' && $action == 'dcadvancedcleaner_settings')
{
try {
$s->put('dcAdvancedCleaner_behavior_active',isset($_POST['dcadvancedcleaner_behavior_active']),'boolean');
$s->put('dcAdvancedCleaner_dcproperty_hide',isset($_POST['dcadvancedcleaner_dcproperty_hide']),'boolean');
try {
$s->put('dcAdvancedCleaner_behavior_active',isset($_POST['dcadvancedcleaner_behavior_active']),'boolean');
$s->put('dcAdvancedCleaner_dcproperty_hide',isset($_POST['dcadvancedcleaner_dcproperty_hide']),'boolean');
http::redirect($p_url.'&tab=dcac&part=dcac&part=&msg=done');
}
catch(Exception $e) {
$core->error->add($e->getMessage());
}
http::redirect($p_url.'&tab=dcac&part=dcac&part=&msg=done');
}
catch(Exception $e) {
$core->error->add($e->getMessage());
}
}
# Actions
@ -183,16 +184,16 @@ if ($tab == 'lists' && !empty($entries)
&& isset($combo_type[$type])
&& in_array($action,$combo_type[$type])) {
try {
foreach($entries as $v) {
dcAdvancedCleaner::execute($core,$type,$action,$v);
}
try {
foreach($entries as $v) {
dcAdvancedCleaner::execute($core,$type,$action,$v);
}
http::redirect($p_url.'&tab=lists&part='.$part.'&msg=done');
}
catch(Exception $e) {
$core->error->add($e->getMessage());
}
http::redirect($p_url.'&tab=lists&part='.$part.'&msg=done');
}
catch(Exception $e) {
$core->error->add($e->getMessage());
}
}
echo '
@ -208,7 +209,7 @@ $core->callBehavior('dcAdvancedCleanerAdminHeader',$core,$p_url,$tab);
echo '
</head><body>'.
dcPage::breadcrumb(
dcPage::breadcrumb(
array(
html::escapeHTML($core->blog->name) => '',
'<span class="page-title">'.$page_title.'</span>' => ''
@ -225,20 +226,20 @@ echo '<div class="multi-part" id="lists" title="'.__('Records and folders').'">'
'<p>';
foreach($combo_title as $k => $v)
{
echo '<a class="button" href="'.$p_url.'&amp;tab=lists&part='.$k.'">'.$v.'</a> ';
echo '<a class="button" href="'.$p_url.'&amp;tab=lists&part='.$k.'">'.$v.'</a> ';
}
echo '</p>';
# Load "part" page
if (isset($combo_title[$part]))
{
echo '<fieldset><legend>'.$combo_title[$part].'</legend>';
drawDcAdvancedCleanerLists($core,$part);
echo '</fieldset>';
echo '<fieldset><legend>'.$combo_title[$part].'</legend>';
drawDcAdvancedCleanerLists($core,$part);
echo '</fieldset>';
}
if ($s->dcAdvancedCleaner_dcproperty_hide)
{
echo '<p class="info">'.__('Default values of Dotclear are hidden. You can change this in settings tab').'</p>';
echo '<p class="info">'.__('Default values of Dotclear are hidden. You can change this in settings tab').'</p>';
}
echo '</div>';
@ -278,5 +279,4 @@ echo '
dcAdvancedCleaner - '.$core->plugins->moduleInfo('dcAdvancedCleaner','version').'&nbsp;
<img alt="dcMiniUrl" src="index.php?pf=dcAdvancedCleaner/icon.png" />
</p>
</body></html>';
?>
</body></html>';

View file

@ -12,5 +12,5 @@
if (!defined('DC_RC_PATH')){return;}
if (!isset($__resources['help']['dcAdvancedCleaner']))
{
$__resources['help']['dcAdvancedCleaner'] = dirname(__FILE__).'/help/dcAdvancedCleaner.html';
$__resources['help']['dcAdvancedCleaner'] = dirname(__FILE__).'/help/dcAdvancedCleaner.html';
}

View file

@ -187,6 +187,4 @@ $GLOBALS['__l10n']['Hide Dotclear default properties in actions tabs'] = 'Cacher
#index.php:262
$GLOBALS['__l10n']['Prevent from deleting Dotclear important properties.'] = 'Évite de supprimer des propriétés importantes de Dotclear.';
$GLOBALS['__l10n']['Make a huge cleaning of dotclear'] = 'Faites un énorme nettoyage de dotclear';
?>
$GLOBALS['__l10n']['Make a huge cleaning of dotclear'] = 'Faites un énorme nettoyage de dotclear';

View file

@ -12,5 +12,5 @@
if (!defined('DC_RC_PATH')){return;}
if (!isset($__resources['help']['dcAdvancedCleaner']))
{
$__resources['help']['dcAdvancedCleaner'] = dirname(__FILE__).'/help/dcAdvancedCleaner.html';
$__resources['help']['dcAdvancedCleaner'] = dirname(__FILE__).'/help/dcAdvancedCleaner.html';
}