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 0000000..44a5515 Binary files /dev/null and b/icon-big.png differ diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..f91820b Binary files /dev/null and b/icon.png differ diff --git a/inc/class.dc.advanced.cleaner.php b/inc/class.dc.advanced.cleaner.php new file mode 100644 index 0000000..49abb21 --- /dev/null +++ b/inc/class.dc.advanced.cleaner.php @@ -0,0 +1,395 @@ + 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 + '
'.$err.'
'; + + if(!count($modules)) { + echo ''.__('There is no module with uninstall features').'
'.__('List of modules with advanced uninstall features').'
'. + ''. + ''; + } +} \ 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)).'
'. + ''; + } + 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 ''; +} +if ($s->dcAdvancedCleaner_dcproperty_hide) +{ + echo ''.__('Default values of Dotclear are hidden. You can change this in settings tab').'
'; +} +echo '+'.__('settings').' - +dcAdvancedCleaner - '.$core->plugins->moduleInfo('dcAdvancedCleaner','version').' + +
+'; +?> \ 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 @@ + + + +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 @@ + + + +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 @@ +