From f23ca51572376ea6abfe0ee549a8d119388ac247 Mon Sep 17 00:00:00 2001 From: brol Date: Mon, 19 Feb 2018 19:10:58 +0100 Subject: [PATCH] v0.7.2 cf release.txt --- _admin.php | 34 ++ _define.php | 29 ++ _install.php | 45 ++ _prepend.php | 50 +++ icon-big.png | Bin 0 -> 6088 bytes icon.png | Bin 0 -> 1049 bytes inc/class.dc.advanced.cleaner.php | 395 ++++++++++++++++++ inc/class.dc.uninstaller.php | 354 ++++++++++++++++ ...lib.dc.advanced.cleaner.activityreport.php | 37 ++ inc/lib.dc.advanced.cleaner.behaviors.php | 224 ++++++++++ index.php | 282 +++++++++++++ locales/en/help/dcAdvancedCleaner.html | 16 + locales/en/resources.php | 16 + locales/fr/help/dcAdvancedCleaner.html | 16 + locales/fr/main.lang.php | 192 +++++++++ locales/fr/main.po | 261 ++++++++++++ locales/fr/resources.php | 16 + release.txt | 51 +++ style.css | 10 + 19 files changed, 2028 insertions(+) create mode 100644 _admin.php create mode 100644 _define.php create mode 100644 _install.php create mode 100644 _prepend.php create mode 100644 icon-big.png create mode 100644 icon.png create mode 100644 inc/class.dc.advanced.cleaner.php create mode 100644 inc/class.dc.uninstaller.php create mode 100644 inc/lib.dc.advanced.cleaner.activityreport.php create mode 100644 inc/lib.dc.advanced.cleaner.behaviors.php create mode 100644 index.php create mode 100644 locales/en/help/dcAdvancedCleaner.html create mode 100644 locales/en/resources.php create mode 100644 locales/fr/help/dcAdvancedCleaner.html create mode 100644 locales/fr/main.lang.php create mode 100644 locales/fr/main.po create mode 100644 locales/fr/resources.php create mode 100644 release.txt create mode 100644 style.css diff --git a/_admin.php b/_admin.php new file mode 100644 index 0000000..126ada5 --- /dev/null +++ b/_admin.php @@ -0,0 +1,34 @@ +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() +); + +$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' + )); +} \ No newline at end of file diff --git a/_define.php b/_define.php new file mode 100644 index 0000000..f7c4cfd --- /dev/null +++ b/_define.php @@ -0,0 +1,29 @@ +registerModule( + /* Name */ "Advanced cleaner", + /* Description*/ "Make a huge cleaning of dotclear", + /* Author */ "JC Denis", + /* Version */ '0.7.2', + /* 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 \ No newline at end of file diff --git a/_install.php b/_install.php new file mode 100644 index 0000000..4d6dccb --- /dev/null +++ b/_install.php @@ -0,0 +1,45 @@ +plugins->moduleInfo('dcAdvancedCleaner','version'); +$old_version = $core->getVersion('dcAdvancedCleaner'); + +# Compare versions +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; +} +catch (Exception $e) +{ + $core->error->add($e->getMessage()); + return false; +} \ No newline at end of file diff --git a/_prepend.php b/_prepend.php new file mode 100644 index 0000000..91d7d4e --- /dev/null +++ b/_prepend.php @@ -0,0 +1,50 @@ +blog->settings->addNamespace('dcAdvancedCleaner'); + +# Main class +$__autoload['dcAdvancedCleaner'] = + dirname(__FILE__).'/inc/class.dc.advanced.cleaner.php'; + +# Behaviors class +$__autoload['behaviorsDcAdvancedCleaner'] = + dirname(__FILE__).'/inc/lib.dc.advanced.cleaner.behaviors.php'; + +# Unsintaller class +$__autoload['dcUninstaller'] = + dirname(__FILE__).'/inc/class.dc.uninstaller.php'; + +# Add tab on plugin admin page +$core->addBehavior('pluginsToolsTabs', + array('behaviorsDcAdvancedCleaner','pluginsToolsTabs')); + +# Action on plugin deletion +$core->addBehavior('pluginsBeforeDelete', + array('behaviorsDcAdvancedCleaner','pluginsBeforeDelete')); + +# Action on theme deletion +$core->addBehavior('themeBeforeDelete', + array('behaviorsDcAdvancedCleaner','themeBeforeDelete')); + +# Tabs of dcAvdancedCleaner admin page +$core->addBehavior('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'; +} \ No newline at end of file diff --git a/icon-big.png b/icon-big.png new file mode 100644 index 0000000000000000000000000000000000000000..44a55150dadca919dbe94f13498287712db82ae1 GIT binary patch literal 6088 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 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', + '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' + ) + ); + + 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'); + + $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; + } + + 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 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(); + + $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 deleteTable($core,$entry) + { + self::emptyTable($core,$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'); + + $rs = array(); + $i = 0; + while ($res->fetch()) { + + $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)."' " + ); + } + + 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 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); + } + + 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); + } + + 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 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"); + + # BEHAVIOR dcAdvancedCleanerBeforeAction + $core->callBehavior('dcAdvancedCleanerBeforeAction',$type,$action,$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 all settings + if ($type == 'settings' && $action == 'delete_all') + self::deleteAllSettings($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 versions + if ($type == 'versions' && $action == 'delete') + self::deleteVersion($core,$ns); + + # Empty plugins + if ($type == 'plugins' && $action == 'empty') + self::emptyPlugin($core,$ns); + + # Delete plugins + if ($type == 'plugins' && $action == 'delete') + self::deletePlugin($core,$ns); + + # Empty themes + if ($type == 'themes' && $action == 'empty') + self::emptyTheme($core,$ns); + + # Delete themes + if ($type == 'themes' && $action == 'delete') + self::deleteTheme($core,$ns); + + # Empty caches + if ($type == 'caches' && $action == 'empty') + self::emptyCache($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; + } + } + + protected static function getDirs($roots) + { + if (!is_array($roots)) + $roots = array($roots); + + $rs = array(); + $i = 0; + foreach ($roots as $root) { + + $dirs = files::scanDir($root); + foreach($dirs as $k) { + + if ('.' == $k || '..' == $k || !is_dir($root.'/'.$k)) continue; + + $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; + + if (!is_array($roots)) + $roots = array($roots); + + 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; + + $path = path::real($path); + if (!is_dir($path) || !is_readable($path)) return array(); + + $files = files::scandir($path); + + foreach($files AS $file) { + if (in_array($file,$exclude)) continue; + + if (is_dir($path.'/'.$file)) { + + $res[] = $file; + $res = self::scanDir($path.'/'.$file,$dir.'/'.$file,$res); + } else { + + $res[] = empty($dir) ? $file : $dir.'/'.$file; + } + } + return $res; + } + + protected static function delTree($dir,$delroot=true) + { + if (!is_dir($dir) || !is_readable($dir)) return false; + + if (substr($dir,-1) != '/') $dir .= '/'; + + 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(); + + if ($delroot) + return @rmdir($dir); + else + return true; + } +} \ No newline at end of file diff --git a/inc/class.dc.uninstaller.php b/inc/class.dc.uninstaller.php new file mode 100644 index 0000000..e32cbc8 --- /dev/null +++ b/inc/class.dc.uninstaller.php @@ -0,0 +1,354 @@ +array Modules informations array + protected $actions = array('user'=>array(),'callback'=>array()); + protected $callbacks = array('user'=>array(),'callback'=>array()); + + 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' + ) + ); + + protected static $priority_properties = array( + 'versions','settings','tables','themes','plugins','caches' + ); + + public $core; ///< dcCore dcCore instance + + /** + Object constructor. + + @param core dcCore dcCore instance + */ + public function __construct($core) + { + $this->core =& $core; + } + + 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 string Separated list of paths + */ + public function loadModules($path) + { + $this->path = explode(PATH_SEPARATOR,$path); + + foreach ($this->path as $root) + { + if (!is_dir($root) || !is_readable($root)) continue; + + if (substr($root,-1) != '/') $root .= '/'; + + if (($d = @dir($root)) === false) continue; + + while (($entry = $d->read()) !== false) + { + $full_entry = $root.'/'.$entry; + + if ($entry != '.' && $entry != '..' && is_dir($full_entry)) + { + $this->loadModule($full_entry); + } + } + $d->close(); + } + + # 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 string path of module + */ + public function loadModule($root) + { + if (file_exists($root.'/_define.php') + && file_exists($root.'/_uninstall.php')) { + + $this->id = basename($root); + $this->mroot = $root; + + require $root.'/_define.php'; + require $root.'/_uninstall.php'; + + $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 string Module name + @param desc string Module description + @param author string Module author name + @param version string 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 $id + is present. + + @param id string Optionnal module ID + @return array + */ + 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 $id exists. + + @param id string Module ID + @return boolean + */ + public function moduleExists($id) + { + return isset($this->modules[$id]); + } + + /** + Add a predefined action to unsintall features. + This action is set in _uninstall.php. + + @param type string Type of action (from $allowed_properties) + @param action string Action (from $allowed_properties) + @param ns string Name of setting related to module. + @param desc string Description of action + */ + protected function addUserAction($type,$action,$ns,$desc='') + { + $this->addAction('user',$type,$action,$ns,$desc); + } + + protected function addDirectAction($type,$action,$ns,$desc='') + { + $this->addAction('direct',$type,$action,$ns,$desc); + } + + private function addAction($group,$type,$action,$ns,$desc) + { + $group = self::group($group); + + if (null === $this->id) return; + + if (empty($type) || empty($ns)) return; + + if (!isset(self::$allowed_properties[$type][$action])) return; + + if (empty($desc)) $desc = __($action); + + $this->actions[$group][$this->id][$type][] = array( + 'ns' => $ns, + 'action' => $action, + 'desc' => $desc + ); + } + + /** + Returns modules $id predefined actions associative array + ordered by priority + + @param id string Optionnal module ID + @return array + */ + public function getUserActions($id) + { + return $this->getActions('user',$id); + } + + public function getDirectActions($id) + { + return $this->getActions('direct',$id); + } + + protected function getActions($group,$id) + { + $group = self::group($group); + + if (!isset($this->actions[$group][$id])) return array(); + + $res = array(); + foreach(self::$priority_properties as $k => $v) + { + if (!isset($this->actions[$group][$id][$v])) continue; + $res[$v] = $this->actions[$group][$id][$v]; + } + + return $res; + } + + /** + Add a callable function for unsintall features. + This action is set in _uninstall.php. + + @param func string Callable function + @param desc string 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 $id callback actions associative array + + @param id string Optionnal module ID + @return array + */ + 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 string Type of action (from $allowed_properties) + @param action string Action (from $allowed_properties) + @param ns string Name of setting related to module. + @return array + */ + 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; + } +} \ No newline at end of file diff --git a/inc/lib.dc.advanced.cleaner.activityreport.php b/inc/lib.dc.advanced.cleaner.activityreport.php new file mode 100644 index 0000000..52ffe36 --- /dev/null +++ b/inc/lib.dc.advanced.cleaner.activityreport.php @@ -0,0 +1,37 @@ +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') +); + +class dcAdvancedCleanerActivityReportBehaviors +{ + public static function maintenance($type,$action,$ns) + { + $logs = array($type,$action,$ns); + + $GLOBALS['core']->activityReport->addLog('dcadvancedcleaner','maintenance',$logs); + } +} \ No newline at end of file diff --git a/inc/lib.dc.advanced.cleaner.behaviors.php b/inc/lib.dc.advanced.cleaner.behaviors.php new file mode 100644 index 0000000..e276ae6 --- /dev/null +++ b/inc/lib.dc.advanced.cleaner.behaviors.php @@ -0,0 +1,224 @@ +blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) return; + + $uninstaller = new dcUninstaller($core); + $uninstaller->loadModule($module['root']); + + $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; + + 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; + } + } + + 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 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; + + $err = ''; + $title = empty($title) ? __('Advanced uninstall') : $title; + + $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']))) { + + 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; + + 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; + + $uninstaller->execute($action['type'],$action['action'],$action['ns']); + } + } + } + http::redirect($redir.'&msg=1'); + } + catch(Exception $e) { + $err = $e->getMessage(); + } + } + + echo + '
'; + + if($err) + echo '

'.$err.'

'; + + if(!count($modules)) { + echo '

'.__('There is no module with uninstall features').'

'; + return; + } + + echo + '

'.__('List of modules with advanced uninstall features').'

'. + '
'. + ''. + ''. + ''; + + foreach($props as $pro_id => $prop) { + echo ''; + } + + echo + ''. + ''; + + $i = 0; + foreach($modules as $module_id => $module) { + + echo + ''. + ''. + ''; + + $actions = $uninstaller->getUserActions($module_id); + + foreach($props as $prop_id => $prop) { + echo ''; + continue; + } + + $j = 0; + foreach($actions[$prop_id] as $action_id => $action) { + + if (!isset($props[$prop_id][$action['action']])) continue; + + $ret = base64_encode(serialize(array( + 'type' => $prop_id, + 'action'=>$action['action'], + 'ns'=>$action['ns'] + ))); + + echo '
'; + + $j++; + } + echo ''; + } + + echo ''; + } + echo + '
'.__('id').''.__('n°').''.__($pro_id).''.__('extra').'
'.$module_id.''.$module['version'].''; + + if (!isset($actions[$prop_id])) { + echo '--'; + + $callbacks = $uninstaller->getUserCallbacks($module_id); + + if (empty($callbacks)) { + echo '--'; + } + + $k = 0; + foreach($callbacks as $callback_id => $callback) { + + $ret = base64_encode(serialize($callback['func'])); + + echo '
'; + } + + echo '
'. + '

'. + $core->formNonce(). + form::hidden(array('redir'),$redir). + form::hidden(array('action'),'uninstall'). + ' '. + '

'. + '
'. + ''; + } +} \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..c5cd569 --- /dev/null +++ b/index.php @@ -0,0 +1,282 @@ +auth->isSuperAdmin()){return;} + +$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') + ); + + if (!isset($combo_funcs[$type])) return ''; + + $rs = call_user_func($combo_funcs[$type],$core); + + echo + '
'. + '

'.$combo_help[$type].'

'; + + if (empty($rs)) { + echo + '

'.sprintf(__('There is no %s'),__(substr($type,0,-1))).'

'; + } else { + + echo + '

'.sprintf(__('There are %s %s'),count($rs),__($type)).'

'. + '
'. + ''. + ''. + ''; + + foreach($rs as $k => $v) + { + $offline = in_array($v['key'],dcAdvancedCleaner::$dotclear[$type]); + + if ($core->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_dcproperty_hide && $offline) continue; + + echo + ''. + ''. + ''. + ''; + } + + echo + '
'.__('Name').''.__('Objects').'
'.$v['value'].'
'. + '

'.__('Action on selected rows:').'
'. + form::combo(array('action'),$combo_actions[$type]). + ''. + form::hidden(array('p'),'dcAdvancedCleaner'). + form::hidden(array('tab'),'lists'). + form::hidden(array('part'),$type). + form::hidden(array('type'),$type). + $core->formNonce().'

'. + '
'; + } + echo + '
'; +} + +# Localized l10n +__('Settings'); __('settings'); __('setting'); +__('Tables'); __('tables'); __('table'); +__('Plugins'); __('plugins'); __('plugin'); +__('Themes'); __('themes'); __('theme'); +__('Caches'); __('caches'); __('cache'); +__('Versions'); __('versions'); __('version'); +__('delete table'); +__('delete cache files'); +__('delete plugin files'); +__('delete theme files'); +__('delete the version number'); +__('Uninstall extensions'); +__('delete %s blog settings'); +__('delete %s global settings'); +__('delete all %s settings'); +__('delete %s table'); +__('delete %s version number'); +__('delete %s plugin files'); +__('delete %s theme file'); +__('delete %s cache files'); + +# vars +$msg = isset($_GET['msg']) ? true : false; +$tab = isset($_REQUEST['tab']) ? $_REQUEST['tab'] : 'dcac'; +$part = isset($_REQUEST['part']) ? $_REQUEST['part'] : 'caches'; +$entries = isset($_POST['entries']) ? $_POST['entries'] : ''; +$action = isset($_POST['action']) ? $_POST['action'] : ''; +$type = isset($_POST['type']) ? $_POST['type'] : ''; +$s = $core->blog->settings->dcAdvancedCleaner; + +# Combos +$combo_title = array( + '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') +); + +# 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'); + + http::redirect($p_url.'&tab=dcac&part=dcac&part=&msg=done'); + } + catch(Exception $e) { + $core->error->add($e->getMessage()); + } +} + +# Actions +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); + } + + http::redirect($p_url.'&tab=lists&part='.$part.'&msg=done'); + } + catch(Exception $e) { + $core->error->add($e->getMessage()); + } +} + +echo ' + +'.$page_title.' +'. +dcPage::jsToolBar(). +dcPage::jsPageTabs($tab).' +'; + +# --BEHAVIOR-- dcAdvancedCleanerAdminHeader +$core->callBehavior('dcAdvancedCleanerAdminHeader',$core,$p_url,$tab); + +echo ' +'. + dcPage::breadcrumb( + array( + html::escapeHTML($core->blog->name) => '', + ''.$page_title.'' => '' + )); +echo +'

'.__('Beware: All actions done here are irreversible and are directly applied').'

'; + +# Information message +if (!empty($msg)) { + dcPage::success(__('Action successfully done')); +} + +echo '
'. +'

'; +foreach($combo_title as $k => $v) +{ + echo ''.$v.' '; +} +echo '

'; + +# Load "part" page +if (isset($combo_title[$part])) +{ + echo '
'.$combo_title[$part].''; + drawDcAdvancedCleanerLists($core,$part); + echo '
'; +} +if ($s->dcAdvancedCleaner_dcproperty_hide) +{ + echo '

'.__('Default values of Dotclear are hidden. You can change this in settings tab').'

'; +} +echo '
'; + +# --BEHAVIOR-- dcAdvancedCleanerAdminTabs +$core->callBehavior('dcAdvancedCleanerAdminTabs',$core,$p_url); + +echo ' +
+
'.__('This plugin settings').' +
+

+

'.__('Enable actions set in _uninstall.php files.').'

+

+

'.__('Prevent from deleting Dotclear important properties.').'

+

'. +form::hidden(array('p'),'dcAdvancedCleaner'). +form::hidden(array('tab'),'dcac'). +form::hidden(array('part'),''). +form::hidden(array('action'),'dcadvancedcleaner_settings'). +$core->formNonce().'

+
+
+
'; + +dcPage::helpBlock('dcAdvancedCleaner'); +echo ' +
+

+'.__('settings').' - +dcAdvancedCleaner - '.$core->plugins->moduleInfo('dcAdvancedCleaner','version').'  +dcMiniUrl +

+'; +?> \ No newline at end of file diff --git a/locales/en/help/dcAdvancedCleaner.html b/locales/en/help/dcAdvancedCleaner.html new file mode 100644 index 0000000..cde640b --- /dev/null +++ b/locales/en/help/dcAdvancedCleaner.html @@ -0,0 +1,16 @@ + + + + Help for dcAdvancedCleaner + + + +

If you want some help or contribute to the plugin dcAdvancedCleaner, follow these links.

+ + + + \ No newline at end of file diff --git a/locales/en/resources.php b/locales/en/resources.php new file mode 100644 index 0000000..21a5735 --- /dev/null +++ b/locales/en/resources.php @@ -0,0 +1,16 @@ + + + + Aide for dcAdvancedCleaner + + + +

Si vous souhaitez plus d'aide ou apporter votre contribution au plugin dcAdvancedCleaner, voici quelques liens utiles.

+ + + + \ No newline at end of file diff --git a/locales/fr/main.lang.php b/locales/fr/main.lang.php new file mode 100644 index 0000000..2997420 --- /dev/null +++ b/locales/fr/main.lang.php @@ -0,0 +1,192 @@ + \ No newline at end of file diff --git a/locales/fr/main.po b/locales/fr/main.po new file mode 100644 index 0000000..e0db5e8 --- /dev/null +++ b/locales/fr/main.po @@ -0,0 +1,261 @@ +# Language: Français +# Module: dcAdvancedCleaner - 0.6.1 +# Date: 2018-01-24 16:01:10 +# Translated with translater 2017.05.10 + +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: dcAdvancedCleaner 0.6.1\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2018-01-24T16:01:10+00:00\n" +"Last-Translator: brol\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: _admin.php:16 +#: _admin.php:28 +#: index.php:17 +msgid "Advanced cleaner" +msgstr "Nettoyeur avancé" + +#: inc/class.dc.advanced.cleaner.php:297 +msgid "Cannot execute \"%s\" of type \"%s\"" +msgstr "Impossible d'exécuter \"%s\" de type \"%s\"" + +#: inc/class.dc.uninstaller.php:292 +msgid "extra action" +msgstr "Action additionnelle" + +#: inc/lib.dc.advanced.cleaner.activityreport.php:16 +msgid "Plugin dcAdvancedCleaner" +msgstr "Plugin dcAdvancedCleaner" + +#: inc/lib.dc.advanced.cleaner.activityreport.php:24 +msgid "New action from dcAdvancedCleaner has been made with type=\"%s\", action=\"%s\", ns=\"%s\"." +msgstr "Une nouvelle action depuis dcAdvancedCleaner a été effectuée avec : type=\"%s\", action=\"%s\", ns=\"%s\"" + +#: inc/lib.dc.advanced.cleaner.behaviors.php:79 +msgid "Advanced uninstall" +msgstr "Désinstallation avancée" + +#: inc/lib.dc.advanced.cleaner.behaviors.php:136 +msgid "There is no module with uninstall features" +msgstr "Il n'y a pas de module avec des fonctions de désinstallation avancée" + +#: inc/lib.dc.advanced.cleaner.behaviors.php:141 +msgid "List of modules with advanced uninstall features" +msgstr "Liste des modules avec des fonctions de désinstallation avancée" + +#: inc/lib.dc.advanced.cleaner.behaviors.php:144 +msgid "id" +msgstr "id" + +#: inc/lib.dc.advanced.cleaner.behaviors.php:145 +msgid "n°" +msgstr "n°" + +#: inc/lib.dc.advanced.cleaner.behaviors.php:152 +msgid "extra" +msgstr "extra" + +#: inc/lib.dc.advanced.cleaner.behaviors.php:219 +msgid "Perform selected actions" +msgstr "Effectuer les actions sélectionnées" + +#: index.php:32 +msgid "delete global settings" +msgstr "effacer les paramètres globaux" + +#: index.php:33 +msgid "delete blog settings" +msgstr "effacer les paramètres du blog" + +#: index.php:34 +msgid "delete all settings" +msgstr "effacer tous les paramètres" + +#: index.php:38 +#: index.php:42 +#: index.php:46 +#: index.php:50 +msgid "empty" +msgstr "vider" + +#: index.php:57 +msgid "Namespaces registered in dcSettings" +msgstr "Espaces de nom (namespaces) enregistrés dans dcSettings" + +#: index.php:58 +msgid "All database tables of Dotclear" +msgstr "Toutes les tables Dotclear de la base de données" + +#: index.php:59 +msgid "Folders from plugins directories" +msgstr "Dossiers des répertoires des plugins" + +#: index.php:60 +msgid "Folders from blog themes directory" +msgstr "Dossiers du répertoire des thèmes du blog" + +#: index.php:61 +msgid "Folders from cache directory" +msgstr "Dossiers du répertoire de cache" + +#: index.php:62 +msgid "Versions registered in table \"version\" of Dotclear" +msgstr "Versions enregistrées dans la table \"version\" de Dotclear" + +#: index.php:75 +msgid "There is no %s" +msgstr "Il n'y a pas de %s" + +#: index.php:79 +msgid "There are %s %s" +msgstr "Il y a %s %s" + +#: index.php:82 +msgid "Objects" +msgstr "Objets" + +#: index.php:103 +msgid "Action on selected rows:" +msgstr "Action sur les lignes sélectionnées :" + +#: index.php:118 +#: index.php:150 +msgid "Settings" +msgstr "Paramètres" + +#: index.php:118 +#: index.php:277 +msgid "settings" +msgstr "paramètres" + +#: index.php:118 +msgid "setting" +msgstr "paramètre" + +#: index.php:120 +msgid "plugins" +msgstr "plugins" + +#: index.php:120 +msgid "plugin" +msgstr "plugin" + +#: index.php:121 +#: index.php:153 +msgid "Themes" +msgstr "Thèmes" + +#: index.php:121 +msgid "themes" +msgstr "thèmes" + +#: index.php:121 +msgid "theme" +msgstr "thème" + +#: index.php:124 +msgid "delete table" +msgstr "effacer la table" + +#: index.php:125 +msgid "delete cache files" +msgstr "effacer les fichiers de cache" + +#: index.php:126 +msgid "delete plugin files" +msgstr "effacer les fichiers du plugin" + +#: index.php:127 +msgid "delete theme files" +msgstr "effacer les fichiers du thème" + +#: index.php:128 +msgid "delete the version number" +msgstr "effacer le n° de version" + +#: index.php:129 +msgid "Uninstall extensions" +msgstr "Désinstaller des plugins" + +#: index.php:130 +msgid "delete %s blog settings" +msgstr "effacer les paramètres de %s pour ce blog" + +#: index.php:131 +msgid "delete %s global settings" +msgstr "effacer les paramètres globaux de %s" + +#: index.php:132 +msgid "delete all %s settings" +msgstr "effacer tous les paramètres de %s" + +#: index.php:133 +msgid "delete %s table" +msgstr "effacer la table %s" + +#: index.php:134 +msgid "delete %s version number" +msgstr "effacer la version de %s" + +#: index.php:135 +msgid "delete %s plugin files" +msgstr "effacer les fichiers du plugin %s" + +#: index.php:136 +msgid "delete %s theme file" +msgstr "effacer les fichiers de thème de %s" + +#: index.php:137 +msgid "delete %s cache files" +msgstr "effacer le cache de %s" + +#: index.php:152 +msgid "Extensions" +msgstr "Plugins" + +#: index.php:217 +msgid "Beware: All actions done here are irreversible and are directly applied" +msgstr "Attention : toutes les actions menées ici sont irréversibles et sont directement appliquées" + +#: index.php:221 +msgid "Action successfully done" +msgstr "Action effectuée avec succès" + +#: index.php:224 +msgid "Records and folders" +msgstr "Enregistrements et dossiers" + +#: index.php:241 +msgid "Default values of Dotclear are hidden. You can change this in settings tab" +msgstr "Les valeurs par défaut de Dotclear sont cachées. Vous pouvez changer cela dans l'onglet des paramètres." + +#: index.php:249 +#: index.php:250 +msgid "This plugin settings" +msgstr "Paramètres de ce plugin" + +#: index.php:255 +msgid "Activate behaviors" +msgstr "Activer les behaviors" + +#: index.php:256 +msgid "Enable actions set in _uninstall.php files." +msgstr "Lit les actions demandées dans les fichiers _uninstall.php." + +#: index.php:260 +msgid "Hide Dotclear default properties in actions tabs" +msgstr "Cacher les propriétés par défaut dans les onglets d'action" + +#: index.php:262 +msgid "Prevent from deleting Dotclear important properties." +msgstr "Évite de supprimer des propriétés importantes de Dotclear." + +msgid "Make a huge cleaning of dotclear" +msgstr "Faites un énorme nettoyage de dotclear" + diff --git a/locales/fr/resources.php b/locales/fr/resources.php new file mode 100644 index 0000000..21a5735 --- /dev/null +++ b/locales/fr/resources.php @@ -0,0 +1,16 @@ +