diff --git a/_admin.php b/_admin.php index 9b390c8..95a6ea3 100644 --- a/_admin.php +++ b/_admin.php @@ -26,3 +26,216 @@ dcCore::app()->menu[dcAdmin::MENU_PLUGINS]->addItem( ), dcCore::app()->auth->isSuperAdmin() ); + +dcCore::app()->addBehavior('adminDashboardFavoritesV2', function ($favs) { + $favs->register('dcAdvancedCleaner', [ + 'title' => __('Advanced cleaner'), + 'url' => dcCore::app()->adminurl->get('admin.plugin.dcAdvancedCleaner'), + 'small-icon' => dcPage::getPF('dcAdvancedCleaner/icon.png'), + 'large-icon' => dcPage::getPF('dcAdvancedCleaner/icon-big.png'), + //'permissions' => dcCore::app()->auth->isSuperAdmin(), + ]); +}); + +dcCore::app()->addBehavior('pluginsToolsTabsV2', function () { + $path = DC_PLUGINS_ROOT; + $redir = dcCore::app()->adminurl->get('admin.plugins', [], '#uninstaller'); + $title = ''; + + if (!dcCore::app()->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) { + return null; + } + $title = empty($title) ? __('Advanced uninstall') : $title; + + $uninstaller = new dcUninstaller(); + $uninstaller->loadModules($path); + $modules = $uninstaller->getModules(); + $props = $uninstaller->getAllowedActions(); + + echo '

' . __($title) . '

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

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

'; + + return null; + } + + 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([ + 'type' => $prop_id, + 'action' => $action['action'], + 'ns' => $action['ns'], + ])); + + echo '
'; + + $j++; + } + echo ''; + } + + echo ''; + } + echo + '
' . __('module') . '' . __($pro_id) . '' . __('other') . '
' . $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 '
' . + '

' . + dcCore::app()->formNonce() . + form::hidden(['path'], $path) . + form::hidden(['redir'], $redir) . + form::hidden(['action'], 'uninstall') . + ' ' . + '

' . + '
'; + + echo ''; +}); + +dcCore::app()->addBehavior('adminModulesListDoActions', function ($list, $modules, $type) { + if (!dcCore::app()->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) { + return null; + } + + if (!isset($_POST['action']) || $_POST['action'] != 'uninstall' + || (empty($_POST['extras']) && empty($_POST['actions'])) + ) { + return null; + } + + $uninstaller = new dcUninstaller(); + $uninstaller->loadModules($_POST['path']); + $modules = $uninstaller->getModules(); + $props = $uninstaller->getAllowedActions(); + + 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, $module_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']); + } + } + } + dcAdminNotices::addSuccessNotice(__('Action successfuly excecuted')); + http::redirect($_POST['redir']); + } catch (Exception $e) { + dcCore::app()->error->add($e->getMessage()); + } +}); + +dcCore::app()->addBehavior('pluginsBeforeDelete', function ($plugin) { + dcAdvancedCleanerModuleBeforeDelete($plugin); +}); + +dcCore::app()->addBehavior('themeBeforeDelete', function ($theme) { + dcAdvancedCleanerModuleBeforeDelete($theme); +}); + +function dcAdvancedCleanerModuleBeforeDelete($module) +{ + $done = false; + + if (!dcCore::app()->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) { + return null; + } + $uninstaller = new dcUninstaller(); + $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) { + if ('theme' == $module['type']) { + dcCore::app()->adminurl->redirect('admin.blog.theme', ['del' => 1]); + } else { + dcCore::app()->adminurl->redirect('admin.plugins', ['removed' => 1]); + } + } +} diff --git a/_prepend.php b/_prepend.php index f5fd192..a1c1a88 100644 --- a/_prepend.php +++ b/_prepend.php @@ -10,9 +10,6 @@ * @copyright Jean-Christian Denis * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html */ -if (!defined('DC_RC_PATH')) { - return null; -} if (!defined('DC_CONTEXT_ADMIN')) { return null; } @@ -45,13 +42,6 @@ dcCore::app()->addBehavior('advancedCleanerAdd', ['advancedCleanerPlugins', 'cre dcCore::app()->addBehavior('advancedCleanerAdd', ['advancedCleanerCaches', 'create']); dcCore::app()->addBehavior('advancedCleanerAdd', ['advancedCleanerVars', 'create']); -# dcac behaviors -dcCore::app()->addBehavior('adminDashboardFavoritesV2', ['behaviorsDcAdvancedCleaner', 'adminDashboardFavorites']); -dcCore::app()->addBehavior('pluginsToolsTabsV2', ['behaviorsDcAdvancedCleaner', 'pluginsToolsTabs']); -dcCore::app()->addBehavior('adminModulesListDoActions', ['behaviorsDcAdvancedCleaner', 'adminModulesListDoActions']); -dcCore::app()->addBehavior('pluginsBeforeDelete', ['behaviorsDcAdvancedCleaner', 'pluginsBeforeDelete']); -dcCore::app()->addBehavior('themeBeforeDelete', ['behaviorsDcAdvancedCleaner', 'themeBeforeDelete']); - if (defined('ACTIVITY_REPORT_V2')) { dcAdvancedCleanerActivityReportBehaviors::add(); } diff --git a/inc/lib.dc.advanced.cleaner.behaviors.php b/inc/lib.dc.advanced.cleaner.behaviors.php deleted file mode 100644 index aca0973..0000000 --- a/inc/lib.dc.advanced.cleaner.behaviors.php +++ /dev/null @@ -1,234 +0,0 @@ -register('dcAdvancedCleaner', [ - 'title' => __('Advanced cleaner'), - 'url' => dcCore::app()->adminurl->get('admin.plugin.dcAdvancedCleaner'), - 'small-icon' => dcPage::getPF('dcAdvancedCleaner/icon.png'), - 'large-icon' => dcPage::getPF('dcAdvancedCleaner/icon-big.png'), - //'permissions' => dcCore::app()->auth->isSuperAdmin(), - ]); - } - - 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'); - } - - // Generic module before delete - public static function moduleBeforeDelete($module, $redir) - { - $done = false; - - if (!dcCore::app()->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) { - return null; - } - $uninstaller = new dcUninstaller(); - $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 pluginsToolsTabs() - { - self::modulesTabs(DC_PLUGINS_ROOT, dcCore::app()->adminurl->get('admin.plugins') . '#uninstaller'); - } - - public static function modulesTabs($path, $redir, $title = '') - { - if (!dcCore::app()->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) { - return null; - } - $title = empty($title) ? __('Advanced uninstall') : $title; - - $uninstaller = new dcUninstaller(); - $uninstaller->loadModules($path); - $modules = $uninstaller->getModules(); - $props = $uninstaller->getAllowedActions(); - - echo '

' . __($title) . '

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

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

'; - - return null; - } - - 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([ - 'type' => $prop_id, - 'action' => $action['action'], - 'ns' => $action['ns'], - ])); - - echo '
'; - - $j++; - } - echo ''; - } - - echo ''; - } - echo - '
' . __('module') . '' . __($pro_id) . '' . __('other') . '
' . $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 '
' . - '

' . - dcCore::app()->formNonce() . - form::hidden(['path'], $path) . - form::hidden(['redir'], $redir) . - form::hidden(['action'], 'uninstall') . - ' ' . - '

' . - '
'; - - echo ''; - } - - public static function adminModulesListDoActions($list, $modules, $type) - { - if (!dcCore::app()->blog->settings->dcAdvancedCleaner->dcAdvancedCleaner_behavior_active) { - return null; - } - - if (!isset($_POST['action']) || $_POST['action'] != 'uninstall' - || (empty($_POST['extras']) && empty($_POST['actions'])) - ) { - return null; - } - - $uninstaller = new dcUninstaller(); - $uninstaller->loadModules($_POST['path']); - $modules = $uninstaller->getModules(); - $props = $uninstaller->getAllowedActions(); - - 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, $module_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']); - } - } - } - dcAdminNotices::addSuccessNotice(__('Action successfuly excecuted')); - http::redirect($_POST['redir']); - } catch (Exception $e) { - dcCore::app()->error->add($e->getMessage()); - } - } -}