From 81794e4ec712807eecd0fd2bb4fa249917008d5e Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Wed, 15 Nov 2023 10:10:40 +0000 Subject: [PATCH] MDL-80124 admin: prevent deletion of pre-installed preset definitions. --- admin/presets/classes/manager.php | 4 ++-- admin/presets/tests/manager_test.php | 21 ++++++++++++++++++- .../classes/local/action/delete.php | 5 +++-- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/admin/presets/classes/manager.php b/admin/presets/classes/manager.php index 95321541c9f..5b353ed0258 100644 --- a/admin/presets/classes/manager.php +++ b/admin/presets/classes/manager.php @@ -761,8 +761,8 @@ class manager { public function delete_preset(int $presetid): void { global $DB; - // Check the preset exists. - $preset = $DB->get_record('adminpresets', ['id' => $presetid]); + // Check the preset exists (cannot delete the pre-installed core "Starter" and "Full" presets). + $preset = $DB->get_record('adminpresets', ['id' => $presetid, 'iscore' => self::NONCORE_PRESET]); if (!$preset) { throw new moodle_exception('errordeleting', 'core_adminpresets'); } diff --git a/admin/presets/tests/manager_test.php b/admin/presets/tests/manager_test.php index 456320a1e5e..cd4878f0e5c 100644 --- a/admin/presets/tests/manager_test.php +++ b/admin/presets/tests/manager_test.php @@ -16,6 +16,7 @@ namespace core_adminpresets; +use moodle_exception; use stdClass; /** @@ -599,10 +600,28 @@ class manager_test extends \advanced_testcase { $manager = new manager(); - $this->expectException(\moodle_exception::class); + $this->expectException(moodle_exception::class); + $this->expectExceptionMessage('Error deleting from database'); $manager->delete_preset($unexistingid); } + /** + * Test trying to delete the core/pre-defined presets + * + * @covers ::delete_preset + */ + public function test_delete_preset_core(): void { + global $DB; + + $this->resetAfterTest(); + + $starterpreset = $DB->get_record('adminpresets', ['iscore' => manager::STARTER_PRESET]); + + $this->expectException(moodle_exception::class); + $this->expectExceptionMessage('Error deleting from database'); + (new manager())->delete_preset($starterpreset->id); + } + /** * Test the behaviour of delete_preset() method. * diff --git a/admin/tool/admin_presets/classes/local/action/delete.php b/admin/tool/admin_presets/classes/local/action/delete.php index 1ab72109531..3d9a2de060c 100644 --- a/admin/tool/admin_presets/classes/local/action/delete.php +++ b/admin/tool/admin_presets/classes/local/action/delete.php @@ -16,6 +16,7 @@ namespace tool_admin_presets\local\action; +use core_adminpresets\manager; use moodle_exception; /** @@ -34,8 +35,8 @@ class delete extends base { public function show(): void { global $DB, $OUTPUT; - // Getting the preset name. - $presetdata = $DB->get_record('adminpresets', ['id' => $this->id], 'name'); + // Check the preset exists (cannot delete the pre-installed core "Starter" and "Full" presets). + $presetdata = $DB->get_record('adminpresets', ['id' => $this->id, 'iscore' => manager::NONCORE_PRESET], 'name'); if ($presetdata) { $deletetext = get_string('deletepreset', 'tool_admin_presets', $presetdata->name);