Files
meetletacbfree/conntest.php
T
mrxzamani be252e49e2 Address Moodle Marketplace review for mod_meetletacbfree 1.1.3.
Migrate legacy ajax/JS to external services and AMD, enable TLS verification, scope admin CSS with RTLCSS-safe rules, and fix README/lang/boilerplate gaps.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-20 12:41:47 +03:30

153 lines
6.1 KiB
PHP

<?php
// 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 <http://www.gnu.org/licenses/>.
/**
* Standalone Adobe Connect connection test page.
*
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @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();