From fdb1df2bfd357fb77d1df299f6a1f697b18bc730 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Mon, 13 Mar 2023 21:07:10 +0800 Subject: [PATCH] MDL-76867 core: Add plugintype_supports_disabling to plugininfo --- .../tool/log/classes/plugininfo/logstore.php | 4 + lib/classes/plugininfo/antivirus.php | 5 ++ lib/classes/plugininfo/auth.php | 5 ++ lib/classes/plugininfo/availability.php | 5 ++ lib/classes/plugininfo/base.php | 9 +++ lib/classes/plugininfo/block.php | 5 ++ lib/classes/plugininfo/contenttype.php | 3 + lib/classes/plugininfo/customfield.php | 4 + lib/classes/plugininfo/dataformat.php | 4 + lib/classes/plugininfo/editor.php | 5 ++ lib/classes/plugininfo/enrol.php | 5 ++ lib/classes/plugininfo/fileconverter.php | 4 + lib/classes/plugininfo/filter.php | 4 + lib/classes/plugininfo/media.php | 4 + lib/classes/plugininfo/message.php | 5 ++ lib/classes/plugininfo/mod.php | 5 ++ lib/classes/plugininfo/paygw.php | 5 ++ lib/classes/plugininfo/portfolio.php | 5 ++ lib/classes/plugininfo/qbank.php | 4 + lib/classes/plugininfo/qbehaviour.php | 5 ++ lib/classes/plugininfo/qtype.php | 5 ++ lib/classes/plugininfo/repository.php | 4 + lib/classes/plugininfo/webservice.php | 5 ++ lib/editor/tiny/classes/plugininfo/tiny.php | 51 +++++++++++++ .../tiny/tests/plugininfo/tiny_test.php | 74 +++++++++++++++++++ .../classes/plugininfo/assignfeedback.php | 3 + .../classes/plugininfo/assignsubmission.php | 3 + 27 files changed, 240 insertions(+) create mode 100644 lib/editor/tiny/tests/plugininfo/tiny_test.php diff --git a/admin/tool/log/classes/plugininfo/logstore.php b/admin/tool/log/classes/plugininfo/logstore.php index cb7bb647fe0..28ae96e6061 100644 --- a/admin/tool/log/classes/plugininfo/logstore.php +++ b/admin/tool/log/classes/plugininfo/logstore.php @@ -33,6 +33,10 @@ use part_of_admin_tree; */ class logstore extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } + public function is_enabled() { $enabled = get_config('tool_log', 'enabled_stores'); if (!$enabled) { diff --git a/lib/classes/plugininfo/antivirus.php b/lib/classes/plugininfo/antivirus.php index 93bdd72fab5..398f5fd9dfd 100644 --- a/lib/classes/plugininfo/antivirus.php +++ b/lib/classes/plugininfo/antivirus.php @@ -35,6 +35,11 @@ use part_of_admin_tree; * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class antivirus extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/auth.php b/lib/classes/plugininfo/auth.php index 1ea8eb10213..f5bfe897e38 100644 --- a/lib/classes/plugininfo/auth.php +++ b/lib/classes/plugininfo/auth.php @@ -31,6 +31,11 @@ use part_of_admin_tree; * Class for authentication plugins */ class auth extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + public function is_uninstall_allowed() { global $DB; diff --git a/lib/classes/plugininfo/availability.php b/lib/classes/plugininfo/availability.php index c89ead9af01..bd5715265d0 100644 --- a/lib/classes/plugininfo/availability.php +++ b/lib/classes/plugininfo/availability.php @@ -33,6 +33,11 @@ use admin_settingpage; * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class availability extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + public static function get_enabled_plugins() { global $DB; diff --git a/lib/classes/plugininfo/base.php b/lib/classes/plugininfo/base.php index 4eb39a1b188..ba9cc56d42c 100644 --- a/lib/classes/plugininfo/base.php +++ b/lib/classes/plugininfo/base.php @@ -71,6 +71,15 @@ abstract class base { /** @var array|null array of {@link \core\update\info} for this plugin */ protected $availableupdates; + /** + * Whether this plugintype supports its plugins being disabled. + * + * @return bool + */ + public static function plugintype_supports_disabling(): bool { + return false; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/block.php b/lib/classes/plugininfo/block.php index 5f7e1ce1368..c8b2e8aa060 100644 --- a/lib/classes/plugininfo/block.php +++ b/lib/classes/plugininfo/block.php @@ -31,6 +31,11 @@ use part_of_admin_tree; * Class for page side blocks */ class block extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/contenttype.php b/lib/classes/plugininfo/contenttype.php index ec4a581a33e..57ff81f1590 100644 --- a/lib/classes/plugininfo/contenttype.php +++ b/lib/classes/plugininfo/contenttype.php @@ -32,6 +32,9 @@ namespace core\plugininfo; */ class contenttype extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } /** * Defines if there should be a way to uninstall the plugin via the administration UI. diff --git a/lib/classes/plugininfo/customfield.php b/lib/classes/plugininfo/customfield.php index e3a481eb087..c63279e8457 100644 --- a/lib/classes/plugininfo/customfield.php +++ b/lib/classes/plugininfo/customfield.php @@ -35,6 +35,10 @@ use moodle_url; */ class customfield extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Allow uninstall * @return bool diff --git a/lib/classes/plugininfo/dataformat.php b/lib/classes/plugininfo/dataformat.php index 9b605d13b8b..fbad4fdafa2 100644 --- a/lib/classes/plugininfo/dataformat.php +++ b/lib/classes/plugininfo/dataformat.php @@ -37,6 +37,10 @@ use part_of_admin_tree; */ class dataformat extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Display name */ diff --git a/lib/classes/plugininfo/editor.php b/lib/classes/plugininfo/editor.php index 3abdb076b8e..2d19b0c8d09 100644 --- a/lib/classes/plugininfo/editor.php +++ b/lib/classes/plugininfo/editor.php @@ -32,6 +32,11 @@ defined('MOODLE_INTERNAL') || die(); * Class for HTML editors */ class editor extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/enrol.php b/lib/classes/plugininfo/enrol.php index 311b8dc9fd0..3832bc6c486 100644 --- a/lib/classes/plugininfo/enrol.php +++ b/lib/classes/plugininfo/enrol.php @@ -31,6 +31,11 @@ use part_of_admin_tree; * Class for enrolment plugins */ class enrol extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * * Finds all enabled plugins, the result may include missing plugins. diff --git a/lib/classes/plugininfo/fileconverter.php b/lib/classes/plugininfo/fileconverter.php index 5b1c20a3143..90af54e64e0 100644 --- a/lib/classes/plugininfo/fileconverter.php +++ b/lib/classes/plugininfo/fileconverter.php @@ -32,6 +32,10 @@ namespace core\plugininfo; */ class fileconverter extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Should there be a way to uninstall the plugin via the administration UI. * diff --git a/lib/classes/plugininfo/filter.php b/lib/classes/plugininfo/filter.php index d3e39a25043..14a8ad85472 100644 --- a/lib/classes/plugininfo/filter.php +++ b/lib/classes/plugininfo/filter.php @@ -32,6 +32,10 @@ use part_of_admin_tree; */ class filter extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } + public function init_display_name() { if (!get_string_manager()->string_exists('filtername', $this->component)) { $this->displayname = '[filtername,' . $this->component . ']'; diff --git a/lib/classes/plugininfo/media.php b/lib/classes/plugininfo/media.php index bc3a8a10be2..7f58a7dc96d 100644 --- a/lib/classes/plugininfo/media.php +++ b/lib/classes/plugininfo/media.php @@ -32,6 +32,10 @@ namespace core\plugininfo; */ class media extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } + public function is_uninstall_allowed() { return true; } diff --git a/lib/classes/plugininfo/message.php b/lib/classes/plugininfo/message.php index add8c12bb94..d2e348f42f2 100644 --- a/lib/classes/plugininfo/message.php +++ b/lib/classes/plugininfo/message.php @@ -31,6 +31,11 @@ use part_of_admin_tree; * Class for messaging processors */ class message extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/mod.php b/lib/classes/plugininfo/mod.php index 4756f6da6be..fe2d34f247f 100644 --- a/lib/classes/plugininfo/mod.php +++ b/lib/classes/plugininfo/mod.php @@ -31,6 +31,11 @@ use part_of_admin_tree; * Class for activity modules */ class mod extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/paygw.php b/lib/classes/plugininfo/paygw.php index 83c63cc9c4a..f3708f1d4c5 100644 --- a/lib/classes/plugininfo/paygw.php +++ b/lib/classes/plugininfo/paygw.php @@ -31,6 +31,11 @@ namespace core\plugininfo; * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class paygw extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + public function is_uninstall_allowed() { return true; } diff --git a/lib/classes/plugininfo/portfolio.php b/lib/classes/plugininfo/portfolio.php index 4ae4f3da0ce..a8ef6d890c7 100644 --- a/lib/classes/plugininfo/portfolio.php +++ b/lib/classes/plugininfo/portfolio.php @@ -29,6 +29,11 @@ use moodle_url; * Class for portfolios */ class portfolio extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/qbank.php b/lib/classes/plugininfo/qbank.php index 9a7556b5cb4..3d2dff03944 100644 --- a/lib/classes/plugininfo/qbank.php +++ b/lib/classes/plugininfo/qbank.php @@ -35,6 +35,10 @@ namespace core\plugininfo; */ class qbank extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } + public function is_uninstall_allowed(): bool { if (in_array($this->name, \core_plugin_manager::standard_plugins_list('qbank'))) { return false; diff --git a/lib/classes/plugininfo/qbehaviour.php b/lib/classes/plugininfo/qbehaviour.php index 00f08bf144a..2b1fdf2316f 100644 --- a/lib/classes/plugininfo/qbehaviour.php +++ b/lib/classes/plugininfo/qbehaviour.php @@ -30,6 +30,11 @@ use moodle_url; * Class for question behaviours. */ class qbehaviour extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/qtype.php b/lib/classes/plugininfo/qtype.php index 4f42e09a4d9..25abdd96df0 100644 --- a/lib/classes/plugininfo/qtype.php +++ b/lib/classes/plugininfo/qtype.php @@ -32,6 +32,11 @@ use part_of_admin_tree; * Class for question types */ class qtype extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/repository.php b/lib/classes/plugininfo/repository.php index 58ef3a624b2..cc5283539a7 100644 --- a/lib/classes/plugininfo/repository.php +++ b/lib/classes/plugininfo/repository.php @@ -44,6 +44,10 @@ class repository extends base { /** @var int Repository state, when it's disabled. */ public const REPOSITORY_DISABLED = -1; + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown diff --git a/lib/classes/plugininfo/webservice.php b/lib/classes/plugininfo/webservice.php index 8eb60a243e2..259a04fa112 100644 --- a/lib/classes/plugininfo/webservice.php +++ b/lib/classes/plugininfo/webservice.php @@ -30,6 +30,11 @@ use part_of_admin_tree; * Class for webservice protocols */ class webservice extends base { + + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * Finds all enabled plugins, the result may include missing plugins. * @return array of enabled plugins $pluginname => $pluginname diff --git a/lib/editor/tiny/classes/plugininfo/tiny.php b/lib/editor/tiny/classes/plugininfo/tiny.php index 7bc332b7bad..b09f51cf62d 100644 --- a/lib/editor/tiny/classes/plugininfo/tiny.php +++ b/lib/editor/tiny/classes/plugininfo/tiny.php @@ -27,6 +27,10 @@ use moodle_url; */ class tiny extends \core\plugininfo\base { + public static function plugintype_supports_disabling(): bool { + return true; + } + /** * These subplugins can be uninstalled. * @@ -94,6 +98,53 @@ class tiny extends \core\plugininfo\base { * @return null|string the settings section name. */ public function get_settings_section_name(): ?string { + if (!file_exists($this->full_path('settings.php'))) { + return null; + } + return "tiny_{$this->name}_settings"; } + + public static function get_enabled_plugins(): array { + $pluginmanager = \core_plugin_manager::instance(); + $plugins = $pluginmanager->get_installed_plugins('tiny'); + + if (!$plugins) { + return []; + } + + // Filter to return only enabled plugins. + $enabled = []; + foreach (array_keys($plugins) as $pluginname) { + $disabled = get_config("tiny_{$pluginname}", 'disabled'); + if (empty($disabled)) { + $enabled[$pluginname] = $pluginname; + } + } + return $enabled; + } + + public static function enable_plugin(string $plugin, int $enabled): bool { + $pluginname = "tiny_{$plugin}"; + + $oldvalue = !empty(get_config($pluginname, 'disabled')); + $disabled = empty($enabled); + $haschanged = false; + + // Only set value if there is no config setting or if the value is different from the previous one. + if (!$oldvalue && $disabled) { + set_config('disabled', $disabled, $pluginname); + $haschanged = true; + } else if ($oldvalue && !$disabled) { + unset_config('disabled', $pluginname); + $haschanged = true; + } + + if ($haschanged) { + add_to_config_log('disabled', $oldvalue, $disabled, $pluginname); + \core_plugin_manager::reset_caches(); + } + + return $haschanged; + } } diff --git a/lib/editor/tiny/tests/plugininfo/tiny_test.php b/lib/editor/tiny/tests/plugininfo/tiny_test.php new file mode 100644 index 00000000000..778a6816740 --- /dev/null +++ b/lib/editor/tiny/tests/plugininfo/tiny_test.php @@ -0,0 +1,74 @@ +. + +declare(strict_types=1); + +namespace editor_tiny\plugininfo; + +use advanced_testcase; + +/** + * Unit tests for the editor_tiny\tiny plugininfo class. + * + * @package editor_tiny + * @covers \editor_tiny\plugininfo\tiny + * @copyright 2023 Andrew Lyons + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class tiny_test extends advanced_testcase { + /** + * Uninstall is allowed of TinyMCE plugins. + * + * @covers ::is_uninstall_allowed + */ + public function test_is_uninstall_allowed(): void { + $instance = new tiny(); + $this->assertTrue($instance->is_uninstall_allowed()); + } + + /** + * Check the manage URL. + * + * @covers ::get_manage_url + */ + public function test_get_manage_url(): void { + $this->assertInstanceOf(\moodle_url::class, tiny::get_manage_url()); + } + + /** + * Test the get_enabled_plugins method. + * + * @covers ::get_enabled_plugin + */ + public function test_get_enabled_plugins(): void { + $this->resetAfterTest(); + + $plugins = tiny::get_enabled_plugins(); + $this->assertArrayHasKey('recordrtc', $plugins); + $this->assertArrayHasKey('media', $plugins); + $this->assertArrayHasKey('autosave', $plugins); + $this->assertArrayHasKey('h5p', $plugins); + + // Disable a plugin. + tiny::enable_plugin('h5p', 0); + + $plugins = tiny::get_enabled_plugins(); + $this->assertArrayHasKey('recordrtc', $plugins); + $this->assertArrayHasKey('media', $plugins); + $this->assertArrayHasKey('autosave', $plugins); + $this->assertArrayNotHasKey('h5p', $plugins); + } +} diff --git a/mod/assign/classes/plugininfo/assignfeedback.php b/mod/assign/classes/plugininfo/assignfeedback.php index 6fad64e9793..e7732d259b5 100644 --- a/mod/assign/classes/plugininfo/assignfeedback.php +++ b/mod/assign/classes/plugininfo/assignfeedback.php @@ -29,6 +29,9 @@ use moodle_url; */ class assignfeedback extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } /** * Finds all enabled plugins, the result may include missing plugins. diff --git a/mod/assign/classes/plugininfo/assignsubmission.php b/mod/assign/classes/plugininfo/assignsubmission.php index 4a31be0bb73..480ba6fd5dc 100644 --- a/mod/assign/classes/plugininfo/assignsubmission.php +++ b/mod/assign/classes/plugininfo/assignsubmission.php @@ -29,6 +29,9 @@ use moodle_url; */ class assignsubmission extends base { + public static function plugintype_supports_disabling(): bool { + return true; + } /** * Finds all enabled plugins, the result may include missing plugins.