From c547fa4093792e5a64eeb74800311f3ccce03aa7 Mon Sep 17 00:00:00 2001 From: Adis Date: Wed, 3 Jun 2026 17:50:56 +0200 Subject: [PATCH] 2026060300 release code --- .github/workflows/moodle-ci.yml | 22 +++++-------- contentitem.php | 5 ++- contentitem_return.php | 4 ++- lang/en/tiny_panoptoltibutton.php | 1 + locallib.php | 55 +++++++++++++++++++++++++++++++ version.php | 2 +- view.php | 11 +++++-- 7 files changed, 80 insertions(+), 20 deletions(-) create mode 100644 locallib.php diff --git a/.github/workflows/moodle-ci.yml b/.github/workflows/moodle-ci.yml index 9fe5a35..df19656 100644 --- a/.github/workflows/moodle-ci.yml +++ b/.github/workflows/moodle-ci.yml @@ -21,7 +21,7 @@ jobs: # DB services you need for testing. services: postgres: - image: postgres:13 + image: postgres:16 env: POSTGRES_USER: 'postgres' POSTGRES_HOST_AUTH_METHOD: 'trust' @@ -30,7 +30,7 @@ jobs: options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 3 mariadb: - image: mariadb:10 + image: mariadb:10.11 env: MYSQL_USER: 'root' MYSQL_ALLOW_EMPTY_PASSWORD: "true" @@ -50,10 +50,13 @@ jobs: matrix: include: - php: '8.4' - moodle-branch: 'main' - database: 'pgsql' + moodle-branch: 'MOODLE_501_STABLE' + database: 'mariadb' - php: '8.4' moodle-branch: 'MOODLE_501_STABLE' + database: 'pgsql' + - php: '8.3' + moodle-branch: 'MOODLE_500_STABLE' database: 'mariadb' - php: '8.3' moodle-branch: 'MOODLE_500_STABLE' @@ -62,17 +65,8 @@ jobs: moodle-branch: 'MOODLE_405_STABLE' database: 'mariadb' - php: '8.3' - moodle-branch: 'MOODLE_404_STABLE' - database: 'pgsql' - - php: '8.2' - moodle-branch: 'MOODLE_403_STABLE' - database: 'mariadb' - - php: '8.1' - moodle-branch: 'MOODLE_402_STABLE' + moodle-branch: 'MOODLE_405_STABLE' database: 'pgsql' - - php: '8.1' - moodle-branch: 'MOODLE_401_STABLE' - database: 'mariadb' steps: # Check out this repository code in ./plugin directory diff --git a/contentitem.php b/contentitem.php index ae01763..ec87dcf 100644 --- a/contentitem.php +++ b/contentitem.php @@ -39,7 +39,6 @@ // Check access and capabilities. $course = get_course($courseid); -require_login($course); // LTI 1.3 login request. $config = lti_get_type_type_config($id); @@ -61,9 +60,13 @@ if (!isset($SESSION->lti_initiatelogin_status)) { echo lti_initiate_login($courseid, "tiny_panoptoltibutton, {$callback}", $lti, $config); exit; + } else { + unset($SESSION->lti_initiatelogin_status); } } +require_login($course); + $context = context_course::instance($courseid); // Set the return URL. We send the launch container along to help us avoid diff --git a/contentitem_return.php b/contentitem_return.php index d82f23a..ff409ed 100644 --- a/contentitem_return.php +++ b/contentitem_return.php @@ -26,7 +26,9 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ +// phpcs:ignore moodle.Files.RequireLogin.Missing -- Login is enforced via tiny_panoptoltibutton_require_login_or_repost() below. require_once(dirname(__FILE__) . '/../../../../../config.php'); +require_once(dirname(__FILE__) . '/locallib.php'); require_once($CFG->dirroot . '/blocks/panopto/lib/panopto_data.php'); require_once($CFG->dirroot . '/blocks/panopto/lib/lti/panoptoblock_lti_utility.php'); require_once($CFG->dirroot . '/mod/lti/lib.php'); @@ -37,7 +39,7 @@ $callback = required_param('callback', PARAM_ALPHANUMEXT); $jwt = optional_param('JWT', '', PARAM_RAW); -require_login($courseid); +tiny_panoptoltibutton_require_login_or_repost($courseid); $context = context_course::instance($courseid); diff --git a/lang/en/tiny_panoptoltibutton.php b/lang/en/tiny_panoptoltibutton.php index dec4f73..82b6847 100644 --- a/lang/en/tiny_panoptoltibutton.php +++ b/lang/en/tiny_panoptoltibutton.php @@ -28,5 +28,6 @@ $string['panopto_button_description'] = 'Add Panopto Video'; $string['panopto_button_long_description'] = 'Add Panopto Video Content to TinyMCE'; $string['panopto_button_unprovisioned_error'] = 'Error: Please use the Panopto Block to provision this course before using this tool'; +$string['panoptoltibutton:use'] = 'Use Panopto button'; $string['pluginname'] = 'Add Panopto Video'; $string['privacy:metadata'] = 'No user data is stored by this plugin'; diff --git a/locallib.php b/locallib.php new file mode 100644 index 0000000..17f1982 --- /dev/null +++ b/locallib.php @@ -0,0 +1,55 @@ +. + +/** + * Local library functions for the Panopto TinyMCE LTI button. + * + * @package tiny_panoptoltibutton + * @copyright 2026 Panopto + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +/** + * Ensure the user is logged in, or perform a cross-site repost if cookies were blocked. + * + * @param int $courseid Course to require login for after repost succeeds. + */ +function tiny_panoptoltibutton_require_login_or_repost(int $courseid): void { + global $PAGE, $_POST; + + $context = context_course::instance($courseid); + $PAGE->set_pagelayout('popup'); + $PAGE->set_context($context); + + if (method_exists('panoptoblock_lti_utility', 'require_login_or_repost')) { + panoptoblock_lti_utility::require_login_or_repost($courseid, $context); + return; + } + + if (!empty($_POST['repost'])) { + unset($_POST['repost']); + } else if (!isloggedin()) { + header_remove('Set-Cookie'); + $output = $PAGE->get_renderer('mod_lti'); + $page = new \mod_lti\output\repost_crosssite_page($_SERVER['REQUEST_URI'], $_POST); + echo $output->header(); + echo $output->render($page); + echo $output->footer(); + exit; + } + + require_login($courseid); +} diff --git a/version.php b/version.php index 189286e..45d8d13 100644 --- a/version.php +++ b/version.php @@ -25,7 +25,7 @@ defined('MOODLE_INTERNAL') || die(); // The current plugin version (Date: YYYYMMDDXX). -$plugin->version = 2025112600; +$plugin->version = 2026060300; // Requires this Moodle version - 4.1.0. $plugin->requires = 2022112800; diff --git a/view.php b/view.php index 852a512..28c7e7c 100644 --- a/view.php +++ b/view.php @@ -29,8 +29,6 @@ require_once(dirname(__FILE__) . '/../../../../../config.php'); } -require_login(); - require_once($CFG->dirroot . '/blocks/panopto/lib/block_panopto_lib.php'); require_once($CFG->libdir . '/accesslib.php'); // Access control functions. require_once($CFG->dirroot . '/mod/lti/lib.php'); @@ -83,7 +81,6 @@ $courseid = $course->id; $context = context_course::instance($cleancourseid); $PAGE->set_context($context); - require_login($course, true); } } } @@ -114,9 +111,17 @@ $config ); exit; + } else { + unset($SESSION->lti_initiatelogin_status); } } + if (!empty($courseid)) { + require_login($course, true); + } else { + require_login(); + } + echo \panoptoblock_lti_utility::launch_tool($lti); } else { echo get_string('invalid_content_host', 'tiny_panoptoltibutton');