. /** * Standalone Adobe Connect connection test page. * * @package mod_meetletacbfree * @copyright 2026 MeetLet * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('../../config.php'); use mod_meetletacbfree\api\client; use mod_meetletacbfree\api\service; use mod_meetletacbfree\local\config; require_login(); require_capability('moodle/site:config', context_system::instance()); \mod_meetletacbfree\registration\manager::require_registered(); global $OUTPUT, $PAGE; $PAGE->set_context(context_system::instance()); $PAGE->set_url(new moodle_url('/mod/meetletacbfree/conntest.php')); $PAGE->set_title(get_string('conntesttitle', 'meetletacbfree')); $PAGE->set_pagelayout('admin'); $results = []; $push = static function(string $label, bool $ok, string $detail = '') use (&$results): void { $results[] = ['label' => $label, 'ok' => $ok, 'detail' => $detail]; }; $logo = $OUTPUT->image_url('adobeconnect', 'meetletacbfree'); echo $OUTPUT->header(); echo html_writer::start_div('meetlet-conntest'); echo html_writer::start_div('meetlet-conntest__hero'); echo html_writer::img($logo, 'Adobe Connect', ['class' => 'meetlet-conntest__logo']); echo html_writer::tag('h2', get_string('conntesttitle', 'meetletacbfree'), ['class' => 'meetlet-conntest__title']); echo html_writer::tag('p', get_string('conntestintro', 'meetletacbfree'), ['class' => 'meetlet-conntest__intro']); echo html_writer::end_div(); if (!config::is_configured()) { echo html_writer::div(get_string('notconfigured', 'meetletacbfree'), 'meetlet-alert'); } else { try { $service = new service(); $client = $service->get_client(); $service->login_admin(); $push(get_string('testlogin', 'meetletacbfree'), true); $content = $service->get_folder_scoid('content'); $archives = $service->get_folder_scoid('forced-archives'); $meetings = $service->get_folder_scoid('meetings'); $push(get_string('testfolders', 'meetletacbfree'), ($content && $archives && $meetings), "content={$content} · archives={$archives} · meetings={$meetings}"); $meeting = (object)[ 'name' => 'meetlet_test_' . time(), 'starttime' => time(), 'endtime' => time() + HOURSECS, 'meeturl' => '', 'templatescoid' => 0, ]; $scoid = $service->create_meeting($meeting, $meetings); $user = (object)[ 'id' => random_int(900000000, 999999999), 'firstname' => 'MeetLet', 'lastname' => 'Test', 'username' => 'meetlettest' . random_int(1000, 9999), 'email' => 'meetlet.test.' . random_int(1000, 9999) . '@example.com', ]; $principal = $service->ensure_user($user); $assigned = $service->assign_permission($principal->principalid, $scoid, service::ROLE_PRESENTER); $push(get_string('testuser', 'meetletacbfree'), $assigned); // SSO: prefer admin (known good), then disposable created login/ext-login. $ssook = false; $ssodetail = ''; try { $sso = new client(); $cookie = $sso->login_external(config::get_admin_login()); $ssook = ($cookie !== ''); $ssodetail = get_string('testsso_adminok', 'meetletacbfree'); } catch (Throwable $e) { $ssodetail = $e->getMessage(); } if ($ssook) { try { $sso2 = new client(); $cookie2 = $sso2->login_external($principal->login); $ssodetail .= ' · ' . get_string('testsso_userok', 'meetletacbfree'); } catch (Throwable $e) { // Admin SSO is enough for infrastructure health. $ssodetail .= ' · ' . get_string('testsso_userwarn', 'meetletacbfree'); } } $push(get_string('testsso', 'meetletacbfree'), $ssook, $ssodetail); $service->delete_sco($scoid); $client->request(['action' => 'principals-delete', 'principal-id' => $principal->principalid]); $push(get_string('testmeeting', 'meetletacbfree'), true); $service->logout(); } catch (Throwable $e) { $push(get_string('error', 'meetletacbfree'), false, $e->getMessage()); } echo html_writer::start_div('meetlet-conntest__grid'); foreach ($results as $row) { $state = $row['ok'] ? 'ok' : 'fail'; $badge = html_writer::span( $row['ok'] ? get_string('testok', 'meetletacbfree') : get_string('testfail', 'meetletacbfree'), 'meetlet-pill meetlet-pill--' . $state ); echo html_writer::div( html_writer::div( html_writer::span('', 'meetlet-dot meetlet-dot--' . $state) . html_writer::span(s($row['label']), 'meetlet-conntest__label') . $badge, 'meetlet-conntest__rowtop' ) . ($row['detail'] !== '' ? html_writer::div(s($row['detail']), 'meetlet-conntest__detail') : ''), 'meetlet-conntest__card meetlet-conntest__card--' . $state ); } echo html_writer::end_div(); } echo html_writer::div( html_writer::link( new moodle_url('/admin/settings.php', ['section' => 'modsettingmeetletacbfree']), get_string('pluginadministration', 'meetletacbfree'), ['class' => 'meetlet-admin-testbtn meetlet-admin-testbtn--ghost'] ), 'meetlet-conntest__footer' ); echo html_writer::end_div(); echo $OUTPUT->footer();