From c4affb23dd6f4ea0ebe57dbe634a7457b32d1fdb Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 21 Feb 2017 17:37:01 +0100 Subject: [PATCH] Added confirmation dialog functionality when disabling hub. Refactored server setup check into check and var updates. Moved bytes string parsing out of server setup check and fixed naming convention. Fixed indentation to match library core instead of Moodle style. --- h5p.classes.php | 161 ++++++++++++++++++--------------- js/settings/h5p-disable-hub.js | 66 ++++++++++++++ 2 files changed, 155 insertions(+), 72 deletions(-) create mode 100644 js/settings/h5p-disable-hub.js diff --git a/h5p.classes.php b/h5p.classes.php index 3deda1e..1d0c5d9 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2759,82 +2759,99 @@ class H5PCore { $token === substr(hash('md5', $action . ($time_factor - 1) . $_SESSION['h5p_token']), -16, 13); // Between 12-24 hours } - /** - * Check that all H5P requirements for the server setup is met. - */ + /** + * Check if the current server setup is valid and set error messages + * + * @return bool True if errors was found + */ + public function checkSetupErrorMessage() { + $disable_hub = FALSE; + + if (!class_exists('ZipArchive')) { + $this->h5pF->setErrorMessage('Your PHP version does not support ZipArchive.'); + $disable_hub = TRUE; + } + + if (!extension_loaded('mbstring')) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('The mbstring PHP extension is not loaded. H5P need this to function properly') + ); + $disable_hub = TRUE; + } + + // Check php version >= 5.2 + $php_version = explode('.', phpversion()); + if ($php_version[0] < 5 || ($php_version[0] === 5 && $php_version[1] < 2)) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your PHP version is too old. H5P needs at least version 5.2 to function properly') + ); + $disable_hub = TRUE; + } + + $max_upload_size = ini_get('upload_max_filesize'); + $max_post_size = ini_get('post_max_size'); + $byte_threshold = 5000000; // 5MB + if (self::returnBytes($max_upload_size) < $byte_threshold) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.') + ); + } + + if (self::returnBytes($max_post_size) < $byte_threshold) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.') + ); + } + + // Check SSL + if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your server does not have SSL enabled. SSL should be enabled to ensure a secure connection with the H5P hub.') + ); + $disable_hub = TRUE; + } + + return $disable_hub; + } + + /** + * Check that all H5P requirements for the server setup is met. + */ public function checkSetupForRequirements() { - $disable_hub = FALSE; + $disable_hub = $this->checkSetupErrorMessage(); - if (!class_exists('ZipArchive')) { - $this->h5pF->setErrorMessage('Your PHP version does not support ZipArchive.'); - $disable_hub = TRUE; - } + // Disable hub, and inform how to re-enable it + $this->h5pF->setOption('disable_hub', $disable_hub); + if ($disable_hub) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('H5P hub communication has been disabled because one or more H5P requirements failed.') + ); + $this->h5pF->setErrorMessage( + $this->h5pF->t('When you have revised your server setup you may re-enable H5P hub communication in H5P Settings.') + ); + } + } - if (!extension_loaded('mbstring')) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('The mbstring PHP extension is not loaded. H5P need this to function properly') - ); - $disable_hub = TRUE; - } + /** + * Return bytes from php_ini string value + * + * @param string $val + * + * @return int|string + */ + public static function returnBytes($val) { + $val = trim($val); + $last = strtolower($val[strlen($val) - 1]); + switch ($last) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } - // Check php version >= 5.2 - $php_version = explode('.', phpversion()); - if ($php_version[0] < 5 || ($php_version[0] === 5 && $php_version[1] < 2)) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your PHP version is too old. H5P needs at least version 5.2 to function properly') - ); - $disable_hub = TRUE; - } - - // Check max upload and post size - function return_bytes($val) { - $val = trim($val); - $last = strtolower($val[strlen($val)-1]); - switch($last) { - case 'g': - $val *= 1024; - case 'm': - $val *= 1024; - case 'k': - $val *= 1024; - } - - return $val; - } - - $max_upload_size = ini_get('upload_max_filesize'); - $max_post_size = ini_get('post_max_size'); - $byte_threshold = 5000000; // 5MB - if (return_bytes($max_upload_size) < $byte_threshold) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.') - ); - } - - if (return_bytes($max_post_size) < $byte_threshold) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.') - ); - } - - // Check SSL - if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your server does not have SSL enabled. SSL should be enabled to ensure a secure connection with the H5P hub.') - ); - $disable_hub = TRUE; - } - - // Disable hub, and inform how to re-enable it - $this->h5pF->setOption('disable_hub', $disable_hub); - if ($disable_hub) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('H5P hub communication has been disabled because one or more H5P requirements failed.') - ); - $this->h5pF->setErrorMessage( - $this->h5pF->t('When you have revised your server setup you may re-enable H5P hub communication in H5P Settings.') - ); - } + return $val; } } diff --git a/js/settings/h5p-disable-hub.js b/js/settings/h5p-disable-hub.js new file mode 100644 index 0000000..b525bd4 --- /dev/null +++ b/js/settings/h5p-disable-hub.js @@ -0,0 +1,66 @@ +/* global H5PDisableHubData */ + +/** + * Global data for disable hub functionality + * + * @typedef {object} H5PDisableHubData Data passed in from the backend + * + * @property {string} selector Selector for the disable hub check-button + * @property {string} overlaySelector Selector for the element that the confirmation dialog will mask + * @property {Array} errors Errors found with the current server setup + * + * @property {string} header Header of the confirmation dialog + * @property {string} confirmationDialogMsg Body of the confirmation dialog + * @property {string} cancelLabel Cancel label of the confirmation dialog + * @property {string} confirmLabel Confirm button label of the confirmation dialog + * + */ +/** + * Utility that makes it possible to force the user to confirm that he really + * wants to use the H5P hub without proper server settings. + */ +(function ($) { + + + + $(document).on('ready', function () { + + // No data found + if (!H5PDisableHubData) { + return; + } + + // No errors found, no need for confirmation dialog + if (!H5PDisableHubData.errors || !H5PDisableHubData.errors.length) { + return; + } + + var selector = H5PDisableHubData.selector; + var dialogHtml = '
' + + '

' + H5PDisableHubData.errors.join('

') + '

' + + '

' + H5PDisableHubData.confirmationDialogMsg + '

'; + + // Create confirmation dialog, make sure to include translations + var confirmationDialog = new H5P.ConfirmationDialog({ + headerText: H5PDisableHubData.header, + dialogText: dialogHtml, + cancelText: H5PDisableHubData.cancelLabel, + confirmText: H5PDisableHubData.confirmLabel + }).appendTo($(H5PDisableHubData.overlaySelector).get(0)); + + confirmationDialog.on('confirmed', function () { + disableButton.get(0).checked = false; + }); + + confirmationDialog.on('canceled', function () { + disableButton.get(0).checked = true; + }); + + var disableButton = $(selector); + disableButton.change(function () { + if (!$(this).is(':checked')) { + confirmationDialog.show(disableButton.offset().top); + } + }); + }); +})(H5P.jQuery);