diff --git a/mod/bigbluebuttonbn/amd/build/accept_dpa.min.js b/mod/bigbluebuttonbn/amd/build/accept_dpa.min.js new file mode 100644 index 00000000000..52b5e8e4020 --- /dev/null +++ b/mod/bigbluebuttonbn/amd/build/accept_dpa.min.js @@ -0,0 +1,11 @@ +define("mod_bigbluebuttonbn/accept_dpa",["exports","core_form/modalform","core/notification","core/str"],(function(_exports,_modalform,_notification,_str){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +/** + * Javascript module for confirming the acceptance of the current data processing agreement before enabling + * the BigBlueButton activity module. + * + * @module mod_bigbluebuttonbn/accept_dpa + * @copyright 2022 Mihail Geshoski + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_modalform=_interopRequireDefault(_modalform),_notification=_interopRequireDefault(_notification);_exports.init=()=>{const modalForm=new _modalform.default({modalConfig:{title:(0,_str.get_string)("enablingbigbluebutton","mod_bigbluebuttonbn"),large:!1},formClass:"mod_bigbluebuttonbn\\form\\accept_dpa",saveButtonText:(0,_str.get_string)("enable")});modalForm.addEventListener(modalForm.events.FORM_SUBMITTED,(event=>{event.detail.result?window.location.reload():_notification.default.addNotification({type:"error",message:event.detail.errors.join("
")})})),modalForm.show()}})); + +//# sourceMappingURL=accept_dpa.min.js.map \ No newline at end of file diff --git a/mod/bigbluebuttonbn/amd/build/accept_dpa.min.js.map b/mod/bigbluebuttonbn/amd/build/accept_dpa.min.js.map new file mode 100644 index 00000000000..59c6d74dd45 --- /dev/null +++ b/mod/bigbluebuttonbn/amd/build/accept_dpa.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"accept_dpa.min.js","sources":["../src/accept_dpa.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Javascript module for confirming the acceptance of the current data processing agreement before enabling\n * the BigBlueButton activity module.\n *\n * @module mod_bigbluebuttonbn/accept_dpa\n * @copyright 2022 Mihail Geshoski \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport {get_string as getString} from 'core/str';\n\n/**\n * Initialize module.\n */\nexport const init = () => {\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: getString('enablingbigbluebutton', 'mod_bigbluebuttonbn'),\n large: false,\n },\n formClass: 'mod_bigbluebuttonbn\\\\form\\\\accept_dpa',\n saveButtonText: getString('enable'),\n });\n\n // Once the form has been submitted and successfully processed, reload the page to enable the activity module.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n type: 'error',\n message: event.detail.errors.join('
')\n });\n }\n });\n\n modalForm.show();\n};\n"],"names":["modalForm","ModalForm","modalConfig","title","large","formClass","saveButtonText","addEventListener","events","FORM_SUBMITTED","event","detail","result","window","location","reload","addNotification","type","message","errors","join","show"],"mappings":";;;;;;;;kMA+BoB,WAEVA,UAAY,IAAIC,mBAAU,CAC5BC,YAAa,CACTC,OAAO,mBAAU,wBAAyB,uBAC1CC,OAAO,GAEXC,UAAW,wCACXC,gBAAgB,mBAAU,YAI9BN,UAAUO,iBAAiBP,UAAUQ,OAAOC,gBAAgBC,QACpDA,MAAMC,OAAOC,OACbC,OAAOC,SAASC,+BAEHC,gBAAgB,CACzBC,KAAM,QACNC,QAAUR,MAAMC,OAAOQ,OAAOC,KAAK,aAK/CpB,UAAUqB"} \ No newline at end of file diff --git a/mod/bigbluebuttonbn/amd/src/accept_dpa.js b/mod/bigbluebuttonbn/amd/src/accept_dpa.js new file mode 100644 index 00000000000..4fd5fc868cd --- /dev/null +++ b/mod/bigbluebuttonbn/amd/src/accept_dpa.js @@ -0,0 +1,56 @@ +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see . + +/** + * Javascript module for confirming the acceptance of the current data processing agreement before enabling + * the BigBlueButton activity module. + * + * @module mod_bigbluebuttonbn/accept_dpa + * @copyright 2022 Mihail Geshoski + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +import ModalForm from 'core_form/modalform'; +import Notification from 'core/notification'; +import {get_string as getString} from 'core/str'; + +/** + * Initialize module. + */ +export const init = () => { + + const modalForm = new ModalForm({ + modalConfig: { + title: getString('enablingbigbluebutton', 'mod_bigbluebuttonbn'), + large: false, + }, + formClass: 'mod_bigbluebuttonbn\\form\\accept_dpa', + saveButtonText: getString('enable'), + }); + + // Once the form has been submitted and successfully processed, reload the page to enable the activity module. + modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => { + if (event.detail.result) { + window.location.reload(); + } else { + Notification.addNotification({ + type: 'error', + message: event.detail.errors.join('
') + }); + } + }); + + modalForm.show(); +}; diff --git a/mod/bigbluebuttonbn/classes/form/accept_dpa.php b/mod/bigbluebuttonbn/classes/form/accept_dpa.php new file mode 100644 index 00000000000..9caf1cf3646 --- /dev/null +++ b/mod/bigbluebuttonbn/classes/form/accept_dpa.php @@ -0,0 +1,104 @@ +. + +namespace mod_bigbluebuttonbn\form; + +use context; +use moodle_exception; +use moodle_url; +use core_form\dynamic_form; +use mod_bigbluebuttonbn\local\config; + +/** + * Accept data processing agreement form presented before enabling the BigBlueButton activity module. + * + * @package mod_bigbluebuttonbn + * @copyright 2022 Mihail Geshoski + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class accept_dpa extends dynamic_form { + + /** + * Form definition + */ + protected function definition() { + $this->_form->addElement('html', \html_writer::tag('p', + get_string('enablingbigbluebuttondpainfo', 'mod_bigbluebuttonbn', config::DEFAULT_DPA_URL))); + $this->_form->addElement('checkbox', 'acceptdefaultdpa', false, get_string('acceptdpa', 'mod_bigbluebuttonbn'), + ['class' => 'bold']); + $this->_form->addRule('acceptdefaultdpa', get_string('required'), 'required', null, 'client'); + } + + /** + * Return form context + * + * @return context + */ + protected function get_context_for_dynamic_submission(): context { + return \context_system::instance(); + } + + /** + * Check if current user has access to this form, otherwise throw exception. + * + * @return void + * @throws moodle_exception + */ + protected function check_access_for_dynamic_submission(): void { + require_capability('moodle/site:config', $this->get_context_for_dynamic_submission()); + } + + /** + * Process the form submission, used if form was submitted via AJAX. + * + * @return array + */ + public function process_dynamic_submission(): array { + $result = false; + $errors = []; + + if ($this->get_data()->acceptdefaultdpa) { + try { + set_config('bigbluebuttonbn_default_dpa_accepted', true); + $result = true; + } catch (\Exception $e) { + $errors[] = $e->getMessage(); + } + } + + return [ + 'result' => $result, + 'errors' => $errors, + ]; + } + + /** + * Load in existing data as form defaults (not applicable). + * + * @return void + */ + public function set_data_for_dynamic_submission(): void { + } + + /** + * Returns url to set in $PAGE->set_url() when form is being rendered or submitted via AJAX. + * + * @return moodle_url + */ + protected function get_page_url_for_dynamic_submission(): moodle_url { + return new moodle_url('/admin/modules.php', ['show' => 'bigbluebuttonbn', 'sesskey' => sesskey()]); + } +} diff --git a/mod/bigbluebuttonbn/classes/local/config.php b/mod/bigbluebuttonbn/classes/local/config.php index 1dc42507534..0c74c8d2cfa 100644 --- a/mod/bigbluebuttonbn/classes/local/config.php +++ b/mod/bigbluebuttonbn/classes/local/config.php @@ -35,6 +35,9 @@ class config { /** @var string Default bigbluebutton server shared secret */ public const DEFAULT_SHARED_SECRET = '0b21fcaf34673a8c3ec8ed877d76ae34'; + /** @var string Default bigbluebutton data processing agreement url */ + public const DEFAULT_DPA_URL = 'https://blindsidenetworks.com/dpa-moodle-free-tier'; + /** * Returns moodle version. * @@ -108,6 +111,7 @@ class config { 'lockonjoin_default' => true, 'lockonjoin_editable' => false, 'welcome_default' => '', + 'default_dpa_accepted' => false, ]; } diff --git a/mod/bigbluebuttonbn/lang/en/bigbluebuttonbn.php b/mod/bigbluebuttonbn/lang/en/bigbluebuttonbn.php index fd5db7e8282..ed13adb290d 100644 --- a/mod/bigbluebuttonbn/lang/en/bigbluebuttonbn.php +++ b/mod/bigbluebuttonbn/lang/en/bigbluebuttonbn.php @@ -26,6 +26,7 @@ defined('MOODLE_INTERNAL') || die(); $string['activityoverview'] = 'You have upcoming BigBlueButton sessions'; +$string['acceptdpa'] = 'I understand and accept the data processing agreement'; $string['bbbduetimeoverstartingtime'] = 'The close time must be later than the open time.'; $string['bbbdurationwarning'] = 'The maximum duration for this session is %duration% minutes.'; $string['bbbrecordwarning'] = 'This session may be recorded.'; @@ -44,6 +45,9 @@ $string['bigbluebuttonbn:deleterecordings'] = 'Delete recordings'; $string['bigbluebuttonbn:importrecordings'] = 'Import recordings'; $string['bigbluebuttonbn'] = 'BigBlueButton'; $string['cannotperformaction'] = 'Cannot perform action {$a} on this recording'; +$string['enablingbigbluebutton'] = 'Enabling BigBlueButton activity'; +$string['enablingbigbluebuttondpainfo'] = 'In order to meet your data protection obligations, prior to enabling this plugin, you may need to ensure that you have read and accepted the data processing agreement with Blindside Networks Inc.
+Please consult with your own privacy professionals for advice.'; $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 3eaf1ece371..00c25cd3d26 100644 --- a/mod/bigbluebuttonbn/lib.php +++ b/mod/bigbluebuttonbn/lib.php @@ -36,6 +36,7 @@ use mod_bigbluebuttonbn\local\helpers\reset; use mod_bigbluebuttonbn\logger; use mod_bigbluebuttonbn\meeting; use mod_bigbluebuttonbn\recording; +use mod_bigbluebuttonbn\local\config; global $CFG; @@ -691,3 +692,22 @@ function bigbluebuttonbn_print_recent_activity(object $course, bool $viewfullnam } return true; } + +/** + * Callback method executed prior to enabling the activity module. + * + * @return bool Whether to proceed and enable the plugin or not. + */ +function bigbluebuttonbn_pre_enable_plugin_actions(): bool { + global $PAGE; + + // If the default server configuration is used and the administrator has not accepted the default data processing + // 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', []); + return false; + } + // Otherwise, continue and enable the plugin. + return true; +}