diff --git a/admin/modules.php b/admin/modules.php
index 3a17cf5b780..795e0bcfd7a 100644
--- a/admin/modules.php
+++ b/admin/modules.php
@@ -31,29 +31,20 @@
if (!empty($hide) and confirm_sesskey()) {
$class = \core_plugin_manager::resolve_plugininfo_class('mod');
- $class::enable_plugin($hide, false);
-
- admin_get_root(true, false); // settings not required - only pages
+ if ($class::enable_plugin($hide, false)) {
+ // Settings not required - only pages.
+ admin_get_root(true, false);
+ }
redirect(new moodle_url('/admin/modules.php'));
}
- if (!empty($show) and confirm_sesskey()) {
- $canenablemodule = true;
- $modulename = $show;
-
- // Invoking a callback function that enables plugins to force additional actions (e.g. displaying notifications,
- // modals, etc.) and also specify through its returned value (bool) whether the process of enabling the plugin
- // should continue after these actions or not.
- if (component_callback_exists("mod_{$modulename}", 'pre_enable_plugin_actions')) {
- $canenablemodule = component_callback("mod_{$modulename}", 'pre_enable_plugin_actions');
- }
-
- if ($canenablemodule) {
- $class = \core_plugin_manager::resolve_plugininfo_class('mod');
- $class::enable_plugin($show, true);
- admin_get_root(true, false); // Settings not required - only pages.
- redirect(new moodle_url('/admin/modules.php'));
+ if (!empty($show) && confirm_sesskey()) {
+ $class = \core_plugin_manager::resolve_plugininfo_class('mod');
+ if ($class::enable_plugin($show, true)) {
+ // Settings not required - only pages.
+ admin_get_root(true, false);
}
+ redirect(new moodle_url('/admin/modules.php'));
}
echo $OUTPUT->header();
diff --git a/lib/classes/plugininfo/mod.php b/lib/classes/plugininfo/mod.php
index ce8ebccf1dd..8e67f415b72 100644
--- a/lib/classes/plugininfo/mod.php
+++ b/lib/classes/plugininfo/mod.php
@@ -51,6 +51,14 @@ class mod extends base {
// Only set visibility if it's different from the current value.
if ($module->visible != $enabled) {
+ if ($enabled && component_callback_exists("mod_{$pluginname}", 'pre_enable_plugin_actions')) {
+ // Invoking a callback function that enables plugins to force additional actions (e.g. displaying notifications,
+ // modals, etc.) and also specify through its returned value (bool) whether the process of enabling the plugin
+ // should continue after these actions or not.
+ if (!component_callback("mod_{$pluginname}", 'pre_enable_plugin_actions')) {
+ return false;
+ }
+ }
// Set module visibility.
$DB->set_field('modules', 'visible', $enabled, ['id' => $module->id]);
$haschanged = true;
diff --git a/mod/bigbluebuttonbn/classes/settings.php b/mod/bigbluebuttonbn/classes/settings.php
index 7f42d8c5f49..554449060ec 100644
--- a/mod/bigbluebuttonbn/classes/settings.php
+++ b/mod/bigbluebuttonbn/classes/settings.php
@@ -135,6 +135,8 @@ class settings {
* @throws \coding_exception
*/
protected function add_general_settings(): admin_settingpage {
+ global $CFG;
+
$settingsgeneral = new admin_settingpage(
$this->section,
get_string('config_general', 'bigbluebuttonbn'),
@@ -145,7 +147,17 @@ class settings {
// Configuration for BigBlueButton.
$item = new admin_setting_heading('bigbluebuttonbn_config_general',
'',
- get_string('config_general_description', 'bigbluebuttonbn'));
+ get_string('config_general_description', 'bigbluebuttonbn')
+ );
+
+ if (empty($CFG->bigbluebuttonbn_default_dpa_accepted)) {
+ $settingsgeneral->add(new admin_setting_configcheckbox(
+ 'bigbluebuttonbn_default_dpa_accepted',
+ get_string('acceptdpa', 'mod_bigbluebuttonbn'),
+ get_string('enablingbigbluebuttondpainfo', 'mod_bigbluebuttonbn', config::DEFAULT_DPA_URL),
+ 0
+ ));
+ }
$settingsgeneral->add($item);
$item = new admin_setting_configtext(
diff --git a/mod/bigbluebuttonbn/lang/en/bigbluebuttonbn.php b/mod/bigbluebuttonbn/lang/en/bigbluebuttonbn.php
index 95f33ff3495..ec68c60e413 100644
--- a/mod/bigbluebuttonbn/lang/en/bigbluebuttonbn.php
+++ b/mod/bigbluebuttonbn/lang/en/bigbluebuttonbn.php
@@ -49,6 +49,7 @@ $string['bigbluebuttondisablednotification'] = 'The BigBlueButton activity modul
$string['cannotperformaction'] = 'Cannot perform action {$a} on this recording';
$string['enablingbigbluebutton'] = 'Enabling BigBlueButton activity';
$string['enablingbigbluebuttondpainfo'] = 'In order to meet your data protection obligations, before enabling this plugin, you must confirm that you have read and accepted the Blindside Networks data processing agreement. Please consult with your own privacy professionals for advice.';
+$string['dpainfonotsigned'] = 'Before enabling this plugin, you must confirm that you have read and accepted the Blindside Networks data processing agreement.';
$string['indicator:cognitivedepth'] = 'BigBlueButton cognitive';
$string['indicator:cognitivedepth_help'] = 'This indicator is based on the cognitive depth reached by the student in a BigBlueButton activity.';
$string['indicator:socialbreadth'] = 'BigBlueButton social';
diff --git a/mod/bigbluebuttonbn/lib.php b/mod/bigbluebuttonbn/lib.php
index 002d69b792f..a60ead21045 100644
--- a/mod/bigbluebuttonbn/lib.php
+++ b/mod/bigbluebuttonbn/lib.php
@@ -712,7 +712,11 @@ function bigbluebuttonbn_pre_enable_plugin_actions(): bool {
// agreement, do not enable the plugin. Instead, display a dynamic form where the administrator can confirm that he
// accepts the DPA prior to enabling the plugin.
if (config::get('server_url') === config::DEFAULT_SERVER_URL && !config::get('default_dpa_accepted')) {
- $PAGE->requires->js_call_amd('mod_bigbluebuttonbn/accept_dpa', 'init', []);
+ $url = new moodle_url('/admin/category.php', ['category' => 'modbigbluebuttonbnfolder']);
+ \core\notification::add(
+ get_string('dpainfonotsigned', 'mod_bigbluebuttonbn', $url->out(false)),
+ \core\notification::ERROR
+ );
return false;
}
// Otherwise, continue and enable the plugin.
diff --git a/mod/bigbluebuttonbn/tests/lib_test.php b/mod/bigbluebuttonbn/tests/lib_test.php
index f86477b504a..00bf0eb4593 100644
--- a/mod/bigbluebuttonbn/tests/lib_test.php
+++ b/mod/bigbluebuttonbn/tests/lib_test.php
@@ -625,4 +625,72 @@ class lib_test extends \advanced_testcase {
$event->instance = 0;
$this->assertFalse(mod_bigbluebuttonbn_core_calendar_is_event_visible($event));
}
+
+ /**
+ * Check the bigbluebuttonbn_pre_enable_plugin_actions function.
+ *
+ * @covers ::bigbluebuttonbn_pre_enable_plugin_actions
+ * @dataProvider bigbluebuttonbn_pre_enable_plugin_actions_provider
+ * @param bool $initialstate
+ * @param bool $expected
+ * @param int $notificationcount
+ */
+ public function test_bigbluebuttonbn_pre_enable_plugin_actions(
+ ?bool $initialstate,
+ bool $expected,
+ int $notificationcount
+ ): void {
+ $this->resetAfterTest(true);
+
+ set_config('bigbluebuttonbn_default_dpa_accepted', $initialstate);
+
+ $this->assertEquals($expected, bigbluebuttonbn_pre_enable_plugin_actions());
+ $this->assertCount($notificationcount, \core\notification::fetch());
+ }
+
+ /**
+ * Check the bigbluebuttonbn_pre_enable_plugin_actions function.
+ *
+ * @covers ::bigbluebuttonbn_pre_enable_plugin_actions
+ * @dataProvider bigbluebuttonbn_pre_enable_plugin_actions_provider
+ * @param bool $initialstate
+ * @param bool $expected
+ * @param int $notificationcount
+ */
+ public function test_enable_plugin(
+ ?bool $initialstate,
+ bool $expected,
+ int $notificationcount
+ ): void {
+ $this->resetAfterTest(true);
+
+ set_config('bigbluebuttonbn_default_dpa_accepted', $initialstate);
+ $this->assertEquals($expected, \core\plugininfo\mod::enable_plugin('bigbluebuttonbn', 1));
+ $this->assertCount($notificationcount, \core\notification::fetch());
+ }
+
+ /**
+ * Data provider for bigbluebuttonbn_pre_enable_plugin_actions tests.
+ *
+ * @return array
+ */
+ public function bigbluebuttonbn_pre_enable_plugin_actions_provider(): array {
+ return [
+ 'Initially unset' => [
+ null,
+ false,
+ 1,
+ ],
+ 'Set to false' => [
+ false,
+ false,
+ 1,
+ ],
+ 'Initially set' => [
+ true,
+ true,
+ 0,
+ ],
+ ];
+ }
}