MoodleMCP
HerunterladenMCP Connector links your Moodle site to AI assistants such as ChatGPT and Claude through the Model Context Protocol (MCP). Once connected, teachers and administrators can manage their day-to-day Moodle work conversationally: create and edit courses and sections, upload resources and SCORM packages (including replacing a package without losing attempts or tracking), manage enrolments, grade assignments and pull reports — all through their AI assistant, always within the limits of their Moodle roles and permissions. The plugin is the Moodle-side client of the MoodleMCP hosted panel, a separate commercial service that provides the MCP server the assistants connect to. An active MoodleMCP account is required for the plugin to work. Key features: - Role-scoped access: six web-service definitions (from admin to student) provisioned and managed from Moodle administration, with per-function control over what each role's MCP keys may call. - Full key lifecycle from Moodle: assign users, deliver their MCP key by email, suspend, activate, revoke, regenerate, and reconcile status with the panel at any time. - Security first: every plugin-to-panel request is signed with HMAC-SHA256 (±5-minute replay window); web-service tokens and key values are never written to Moodle logs, and revoking a key takes effect on the next call. - Privacy API provider declaring exactly what is stored locally (key metadata only — never key values or tokens) and what is sent to the panel. - More than 750 Moodle web-service functions reachable through the MCP gateway, plus purpose-built tools for course creation, file upload and SCORM management. Common use cases: course authors building and restructuring courses from a chat; teachers grading and following up on assignments conversationally; administrators auditing enrolments and generating reports; L&D teams bulk- uploading SCORM content through an assistant. Requirements: Moodle 4.2 – 5.2 and a MoodleMCP panel account (the commercial service this plugin connects to).
Versionen
- Validiert10.08.20261.0.2
Hardening release. No functional changes and no database changes — updating from 1.0.1 is safe and requires no action. * Page display options are no longer read with unserialize(). When updating a page, the plugin reads mod_page's stored display options in order to preserve them. That column is not inherently trustworthy — mod_page's restore step inserts the record verbatim, so a restored backup decides its contents — and plain unserialize() would instantiate whatever objects the data describes, running their __wakeup(). The read now goes through core's unserialize_array(), which parses arrays only and rejects objects, exactly as core itself reads this field. Covered by a regression test. * Four development comments that were still in Spanish, missed by the 1.0.1 sweep, are now in English.
5.2Validierungsbericht
Abgeschlossen
Continuous Integration (moodle-plugin-ci)
- BestandenMoodle 5.2
28 erfüllt · 0 Hinweise · 0 nicht erfüllt
Metadatos y publicación
- ErfülltNombre sigue convención frankenstyle (`plugintype_pluginname`): El plugin se llama `local_mcpconnector` (version.php línea 32).
- ErfülltDescripción clara del plugin: README.md proporciona descripción clara de qué es (conector MCP para Moodle) y para qué sirve (provisionar tokens web-service y claves MCP).
- ErfülltAl menos una versión de Moodle soportada y mantenida: version.php declara Moodle 4.2 a 5.2 (`$plugin->supported = [402, 502]`), con maturity STABLE.
- ErfülltDeclara repositorio de código e incidencias: README.md contiene URLs de source (github.com/studiolxd/moodle-local_mcpconnector) y issues.
Licencia y autoría
- ErfülltLicencia GPLv3 declarada explícitamente: version.php línea 23 y README.md línea 51 declaran GNU GPL v3 o later.
- ErfülltBoilerplate de licencia en cabeceras: Todos los archivos examinados (version.php, authorize.php, index.php, lib.php, db/access.php, etc.) contienen el boilerplate completo de GNU GPL.
- ErfülltTags `@copyright` con autoría real identificable: Todos los archivos examinados contienen `@copyright 2026 Studio LXD <[email protected]>`.
- ErfülltSin indicios de código copiado sin atribución: Las clases externas heredan de `core_external\external_api` (Moodle core), pero con implementaciones propias y documentadas. El patrón de validación de parámetros es estándar de Moodle.
Estructura y estilo de código
- Erfüllt`version.php` presente y con formato correcto: version.php contiene $plugin->component, $plugin->version, $plugin->requires, $plugin->supported, $plugin->maturity.
- ErfülltPasa PHPCS con estándar de código de Moodle: CI pipeline reporta "Moodle 5.2: success", lo que incluye validación de estilo.
- ErfülltPHPDoc presente en archivos, clases y funciones públicas: Todas las funciones examinadas tienen PHPDoc (lib.php, classes/external/*.php, classes/privacy/provider.php).
- ErfülltTodo código, comentarios y strings en inglés: Código en inglés, strings en lang/en/local_mcpconnector.php y lang/es/local_mcpconnector.php.
- ErfülltSin cadenas hardcodeadas: Uso consistente de `get_string()` en todas las páginas UI (index.php, keys.php). Configuraciones en `get_config('local_mcpconnector', ...)`.
- ErfülltPrefijo frankenstyle aplicado: Tablas (`local_mcpconnector_keys`), funciones (`local_mcpconnector_*`), constantes (`mcpconnector_admin`, etc.).
- ErfülltConfiguración en `config_plugins`: settings.php usa `admin_externalpage`, `set_config('...', 'local_mcpconnector')`, todo dentro de contexto de site admin.
Seguridad
- ErfülltConsultas SQL con placeholders: Todas las consultas examinadas usan `$DB->get_records()`, `$DB->get_in_or_equal()` con parámetros nombrados (SQL_PARAMS_NAMED), nunca concatenación. Ejemplo: lib.php línea 385-390.
- ErfülltVerificación de `sesskey` antes de modificar datos: index.php línea 68 (`confirm_sesskey()`), keys.php línea 48 (`confirm_sesskey()`).
- ErfülltComprobación de `capabilities`/permisos: Todas las funciones externas usan `self::validate_context()` + `require_capability()`. Ejemplo: create_module.php línea 197-198, update_module.php línea 213-214. authorize.php valida roles antes de emitir token (línea 49).
- ErfülltSin uso de `eval()`, `unserialize()`, `call_user_func()`: grep confirma ausencia de estos patrones peligrosos. Única excepción documentada es `base64_decode()` en lib.php línea 89, usado SOLO dentro de `local_mcpconnector_verify_oauth_state()` para decodificar JWT payload firmado con HMAC-SHA256 (línea 86 verifica firma antes de decodificar).
- ErfülltValidación/sanitización de entrada de usuario: Todos los parámetros pasan por `self::validate_parameters()` de external_api (ejemplo: import_questions.php línea 137-148), con tipos PARAM_INT, PARAM_ALPHA, PARAM_RAW, PARAM_URL. Pages web usan `optional_param()` con tipos (index.php línea 48-51).
- ErfülltSin credenciales hardcodeadas: License key, panel secret, MCP URL se almacenan en `config_plugins`, no en código. authorize.php línea 52 obtiene del config. Única URL hardcodeada es `https://moodlemcp.com` (lib.php línea 41) como DEFAULT si no está configurada — es el servicio legítimo documentado en README.
Privacidad y compatibilidad
- ErfülltImplementa Privacy API: classes/privacy/provider.php implementa `provider`, `core_userlist_provider`, `plugin\provider` con métodos get_metadata, export_user_data, delete_data_for_user, etc.
- Nicht zutreffendBackup/restore API: No aplica — este no es un módulo de actividad, es un plugin local de conectividad.
- ErfülltFunciona sin errores visibles: CI pipeline reporta "success" en Moodle 5.2.
- ErfülltNo requiere `composer install` manual: No hay composer.json en el árbol de archivos; todas las dependencias son core de Moodle.
- ErfülltCompatible con motores de BD soportados: Usa `$DB->get_records()`, `$DB->get_in_or_equal()`, etc. sin SQL dialecto específico (standard Moodle abstraction). db/install.xml es XMLDB estándar.
Malware / abuso
- ErfülltSin llamadas de red a dominios sospechosos no declarados: Únicamente llama a `moodlemcp.com` (lib.php línea 41) que es el servicio legítimo documentado en README. Firma todas las llamadas con HMAC-SHA256 (lib.php línea 1370-1380).
- ErfülltSin código ofuscado/minificado: Todo el código es fuente PHP legible con PHPDoc completo.
- ErfülltSin auto-modificación o descarga de código ejecutable: No hay `eval()`, no hay descarga dinámica de código. Las funciones externas se definen estáticamente en db/services.php y db/service_functions.php.
- Validiert mit Warnungen10.08.20261.0.1
Maintenance release. No functional changes and no database changes — updating from 1.0.0 is safe and requires no action. This release brings the plugin in line with the Moodle coding standards and adds continuous integration: * Coding style: the plugin is now clean under moodle-cs, including the alphabetical ordering of language files. The English and Spanish packs keep exactly the same 178 strings with the same values; only their order changed. * Continuous integration: a moodle-plugin-ci workflow now runs on every push across both ends of the supported range — Moodle 4.2 on PHP 8.1 and Moodle 5.2 on PHP 8.3 — against PostgreSQL and MariaDB, covering lint, coding style, PHPDoc, validation, upgrade savepoints and the PHPUnit suite. All jobs pass. * PHPDoc: two undocumented function parameters are now documented. * Development comments left in Spanish are now in English. * The header of db/service_functions.php referenced a generator script that no longer exists; it now describes where the service whitelists actually come from.
5.2Validierungsbericht
Abgeschlossen
Continuous Integration (moodle-plugin-ci)
- BestandenMoodle 5.2
26 erfüllt · 2 Hinweise · 0 nicht erfüllt
Metadatos y publicación
- ErfülltNombre sigue convención frankenstyle (`plugintype_pluginname`): `$plugin->component = 'local_mcpconnector'` en `version.php:26`, coherente con la ruta `local/mcpconnector`.
- ErfülltDescripción clara del plugin: README.md describe extensamente qué hace, cómo se relaciona con el panel MoodleMCP y qué datos envía.
- ErfülltAl menos una versión de Moodle soportada y mantenida declarada: `version.php` declara `$plugin->requires = 2023042400` (4.2) y `$plugin->supported = [402, 502]`, incluyendo 5.2 (vigente).
- ErfülltDeclara repositorio e issue tracker: README.md sección "Support & source" enlaza a GitHub (repo e Issues).
Licencia y autoría
- ErfülltLicencia GPLv3 declarada explícitamente: `version.php` y README.md indican "GNU GPL v3 or later".
- ErfülltBoilerplate de licencia en cabeceras: todos los ficheros leídos (`version.php`, `db/access.php`, `index.php`, `keys.php`, `lib.php`, `classes/...`) llevan el bloque estándar de licencia de Moodle.
- ErfülltTags `@copyright` con autoría identificable: consistentemente `@copyright 2026 Studio LXD <[email protected]>` en todos los ficheros revisados.
- ErfülltSin indicios de código copiado sin atribución: estilo, comentarios y estructura son coherentes y propios en todos los ficheros inspeccionados; no se detectaron restos de autoría ajena.
Estructura y estilo de código
- Erfüllt`version.php` presente y con formato correcto: verificado, incluye `component`, `version`, `requires`, `supported`, `maturity`.
- ErfülltPasa PHPCS (moodle-plugin-ci): el pipeline de CI reporta éxito en Moodle 5.2, lo que incluye la comprobación de estilo.
- Nicht zutreffendPasa comprobación de estilo JS/CSS si aplica: no se detectaron ficheros JS/CSS en el árbol del plugin; no aplica.
- ErfülltPHPDoc presente en archivos, clases y funciones públicas: comprobado extensamente en `create_scorm.php`, `url_file.php`, `provider.php`, `lib.php`, etc.
- HinweisTodo el código, comentarios y strings de desarrollo en inglés: el código y comentarios son mayoritariamente ingleses, pero `settings.php` contiene comentarios en español ("// Servicios.", "// Usuarios.", "// Claves.", "// Salud.") mezclados con el resto en inglés.
- ErfülltSin cadenas hardcodeadas, uso de `get_string()`: uso consistente de `get_string()`/`string_exists()` en todas las páginas admin revisadas (`index.php`, `keys.php`).
- ErfülltPrefijo frankenstyle en tablas/funciones/constantes: tabla `local_mcpconnector_keys`, funciones `local_mcpconnector_*`, capability `local/mcpconnector:manage`.
- ErfülltConfiguración en `config_plugins`, no en `config` global: todo uso de `set_config()`/`get_config()` pasa explícitamente `'local_mcpconnector'` como componente (verificado en `index.php`, `lib.php`).
Seguridad
- ErfülltConsultas SQL usan siempre placeholders: no se encontró concatenación de SQL crudo (`$DB->execute`/`get_records_sql` no usados); el código usa `get_records`, `get_record`, `delete_records_select` con parámetros nombrados (`keys.php`, `privacy/provider.php`).
- ErfülltVerificación de `sesskey` antes de acciones que modifican datos: `confirm_sesskey()` presente en todas las acciones de escritura revisadas (`index.php:54`, `keys.php:48`, `services.php`, `settings_page.php:44`, `users.php:75,127,162`, `health.php:33`).
- ErfülltComprobación de capabilities antes de funcionalidad sensible: páginas admin registradas con `$managecap` en `settings.php`; funciones externas declaran `capabilities` en `db/services.php` y además hacen `require_capability()`/`validate_context()` explícitos (p. ej. `create_scorm.php`).
- HinweisSin uso de funciones peligrosas sobre datos no confiables: se localizó `@unserialize($data->displayoptions ?? '')` en `classes/external/update_module.php:496`; el dato proviene de `get_moduleinfo_data()` (capa interna de Moodle) y no directamente de un parámetro externo, pero no se pudo trazar exhaustivamente toda la cadena de origen para descartar riesgo con certeza.
- ErfülltValidación/sanitización de entrada de usuario: uso sistemático de `external_value`/`PARAM_*` y `validate_parameters()` en las clases `external/*` revisadas.
- ErfülltSin credenciales hardcodeadas: secretos (`panel_secret`, `license_key`) se gestionan vía `set_config()`/`get_config()`, nunca como literales en el código (verificado en `lib.php`, `index.php`).
Privacidad y compatibilidad
- ErfülltImplementa Privacy API: `classes/privacy/provider.php` implementa metadata, export, delete por usuario/lista y contextos de forma completa.
- Nicht zutreffendImplementa backup/restore API si es módulo de actividad: `local_mcpconnector` es un plugin `local`, no un módulo de actividad; no aplica (las clases `backup_course`/`restore_course` son wrappers de webservice sobre las APIs core de backup, no implementación de la Activity Backup API).
- ErfülltFunciona sin errores/warnings visibles en instalación normal: el pipeline CI (moodle-plugin-ci) reporta éxito en Moodle 5.2, lo que cubre la instalación.
- ErfülltNo requiere `composer install` ni pasos de compilación manuales: no se encontró `composer.json` ni artefactos de build en el árbol de ficheros.
- ErfülltCompatible con motores de BD soportados: `db/install.xml` usa tipos XMLDB estándar (`int`, `char`) sin SQL específico de motor, compatible con MySQL/MariaDB y PostgreSQL según convención Moodle.
Malware / abuso
- ErfülltSin llamadas de red ofuscadas o a dominios no declarados: todas las llamadas HTTP van al panel configurable (`local_mcpconnector_api_base_url()`, por defecto `https://moodlemcp.com`), documentado explícitamente en README.md con detalle de los datos enviados.
- ErfülltSin código ofuscado/minificado sin fuente: todo el código PHP revisado es legible, comentado extensamente, sin minificación ni cifrado.
- ErfülltSin comportamiento de auto-modificación o descarga de código remoto ejecutable: las descargas HTTPS (`url_file.php`) traen paquetes de contenido (SCORM/H5P/recursos) validados y protegidos por `curl_security_helper` (SSRF) y límites de tamaño; no se ejecuta código PHP descargado dinámicamente. No se detectaron intentos de manipulación del revisor en comentarios/strings.
- Nicht validiert10.08.20261.0.0
First stable release of the MCP Connector for Moodle. Role-scoped web-service provisioning managed from Moodle administration: six service definitions with per-function control. Full MCP key lifecycle from the plugin: assign users, deliver keys by email, suspend, activate, revoke, regenerate, and reconcile status with the panel. Every plugin↔panel request signed with HMAC-SHA256 (±5-minute replay window); web-service tokens and key values are never written to Moodle logs. Privacy API provider covering locally stored key metadata and the data sent to the panel. Course, content and SCORM management endpoints, including package replacement without losing attempts or tracking. Compatible with Moodle 4.2 – 5.2.
5.2Validierungsbericht
Abgeschlossen
Continuous Integration (moodle-plugin-ci)
- FehlgeschlagenMoodle 5.2ci (pgsql), ci (mysqli)
Job-Ausgabe ansehen
…(recortado) | | (moodle.Files.LangFilesOrdering.UnexpectedComment) 234 | WARNING | [ ] The string key "errordetail" is not in the correct order, it should be before "key_lifetime_days_desc" | | (moodle.Files.LangFilesOrdering.IncorrectOrder) ------------------------------------------------------------------------------------------------------------------------------------ PHPCBF CAN FIX THE 81 MARKED SNIFF VIOLATIONS AUTOMATICALLY ------------------------------------------------------------------------------------------------------------------------------------ Time: 1.72 secs; Memory: 28MB ❌ Failure - Main Moodle coding style exitcode '1': failure expression '${{ steps.target.outputs.node }}' rewritten to 'format('{0}', steps.target.outputs.node)' evaluating expression 'format('{0}', steps.target.outputs.node)' expression 'format('{0}', steps.target.outputs.node)' evaluated to '%!t(string=22)' evaluating expression 'success()' expression 'success()' evaluated to 'false' Skipping step 'Set up Node' due to 'success()' evaluating expression 'always()' expression 'always()' evaluated to 'true' ⭐ Run Post Checkout plugin Writing entry to tarball workflow/outputcmd.txt len:0 Writing entry to tarball workflow/statecmd.txt len:0 Writing entry to tarball workflow/pathcmd.txt len:0 Writing entry to tarball workflow/envs.txt len:0 Writing entry to tarball workflow/SUMMARY.md len:0 Extracting content to '/var/run/act' run post step for 'Checkout plugin' executing remote job container: [node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js] 🐳 docker exec cmd=[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js] user= workdir= Exec command '[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]' Working directory '/workspace/mirrors/cmsmi1z3g000027lfadykolzk-cmsmlgtel000026lcca4xw6wk' [command]/usr/bin/git version git version 2.54.0 *** Temporarily overriding HOME='/tmp/19fcb36e-fadf-4690-bea4-bf1e799ea711' before making global git config changes Adding repository directory to the temporary git global config as a safe directory [command]/usr/bin/git config --global --add safe.directory /workspace/mirrors/cmsmi1z3g000027lfadykolzk-cmsmlgtel000026lcca4xw6wk/plugin [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" [command]/usr/bin/git config --local --name-only --get-regexp http\.http\:\/\/gitea\:3000\/\.extraheader http.http://gitea:3000/.extraheader [command]/usr/bin/git config --local --unset-all http.http://gitea:3000/.extraheader [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/gitea\:3000\/\.extraheader' && git config --local --unset-all 'http.http://gitea:3000/.extraheader' || :" [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url ✅ Success - Post Checkout plugin Cleaning up container for job ci (pgsql) Removed container: 61d51098a5ce9b99927bca124e204851328698f56156ea9390891930630c3ec9 🐳 docker volume rm GITEA-ACTIONS-TASK-15-WORKFLOW-moodle-plugin-ci-JOB-ci-pgsql-e775350533e4c9abf132dba284e2a13b0721b16adb64ca267e643c1d321ca2f4 🐳 docker volume rm GITEA-ACTIONS-TASK-15-WORKFLOW-moodle-plugin-ci-JOB-ci-pgsql-e775350533e4c9abf132dba284e2a13b0721b16adb64ca267e643c1d321ca2f4-env Cleaning up services for job ci (pgsql) Removed container: 253b8ecd9b0ade13bb9bfb29f6748bfcb16687ebeb617e8e2f2e29f595c80273 Removed container: e70ab6d84b9e34881ecade42a0437cdcf5627755867e9d31b17fc54eba6bf92d 🏁 Job failed Job 'ci (pgsql)' failed
22 erfüllt · 4 Hinweise · 2 nicht erfüllt
- ErfülltNombre sigue convención frankenstyle: `local_mcpconnector` en version.php ($plugin->component) y en todos los `@package`.
- ErfülltDescripción clara del plugin: README.md explica extensamente qué hace y para qué sirve.
- ErfülltVersión de Moodle soportada y mantenida declarada: `version.php` — `$plugin->requires = 2023042400` (4.2), `$plugin->supported = [402, 502]`.
- ErfülltDeclara repositorio e incidencias: README.md — "Source: https://github.com/studiolxd/moodle-local_mcpconnector" e "Issues: .../issues".
- ErfülltLicencia GPLv3 declarada explícitamente: version.php y cabeceras (`@license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later`) y README ("GNU GPL v3 or later").
- ErfülltBoilerplate de licencia en cabeceras: confirmado en todos los ficheros leídos (version.php, lib.php, keys.php, authorize.php, index.php, db/*, classes/*).
- ErfülltTags `@copyright` con autoría identificable: `@copyright 2026 Studio LXD <[email protected]>` presente en prácticamente todos los ficheros (grep confirma decenas de coincidencias).
- HinweisSin indicios de código copiado sin atribución: no se detectó evidencia directa de copia, pero `db/service_functions.php` es "GENERATED CODE" a partir de un proceso externo (`server/scripts/export-functions.ts`) que no forma parte del repo del plugin; no puedo verificar la procedencia original de esa lista de funciones ni de otros bloques grandes no leídos en detalle.
- Erfüllt`version.php` presente y con formato correcto: comprobado, incluye component, release, version, requires, supported, maturity.
- Nicht erfülltPasa PHPCS con el estándar de código de Moodle: el pipeline de CI reporta explícitamente fallo — "❌ Failure - Main Moodle coding style", 81 violaciones de sniff, además de problemas de orden en ficheros de idioma (`moodle.Files.LangFilesOrdering`).
- Nicht zutreffendPasa comprobación de estilo JS/CSS: no se han encontrado ficheros JS/CSS en el árbol listado; no aplica.
- HinweisPHPDoc presente en archivos/clases/funciones públicas: se observa PHPDoc consistente en los ficheros muestreados (lib.php, keys.php, privacy/provider.php, external/*), pero no se ha podido revisar la totalidad de ~30 clases `external/*` y el archivo gigante `db/service_functions.php` (180KB) función por función.
- Nicht erfülltTodo el código/comentarios/strings de desarrollo en inglés: se detectaron comentarios en español en `settings.php` líneas 31 y 77 ("Categoría "Moodle MCP" (título sin link)." y "Configuración.") y también en `lib.php:1277` un ejemplo con nombre español, aunque este último es solo un ejemplo, no instrucción de desarrollo.
- ErfülltSin cadenas hardcodeadas, uso de `get_string()`: todas las salidas de texto revisadas (index.php, keys.php, settings.php, etc.) usan `get_string()`.
- ErfülltPrefijo frankenstyle en tablas/funciones/constantes: tabla `local_mcpconnector_keys` (db/install.xml), funciones `local_mcpconnector_*` en lib.php, capacidad `local/mcpconnector:manage` en db/access.php.
- ErfülltConfiguración en `config_plugins`, no en `config` global: todas las llamadas usan `set_config(..., 'local_mcpconnector')` / `get_config('local_mcpconnector', ...)` (grep confirma en db/install.php, db/upgrade.php, index.php, settings_page.php).
Seguridad
- HinweisSQL siempre con placeholders: los usos de SQL directo encontrados (`classes/selector/existing_users.php`, `potential_users.php`, `health.php`) usan `get_records_sql` con parámetros aparentemente vinculados, pero no se ha inspeccionado línea por línea la construcción completa de cada consulta para descartar concatenación parcial de algún fragmento dinámico (p. ej. `$insql` de `get_in_or_equal` sí se usó correctamente en keys.php, pero no se auditaron todos los ficheros con SQL).
- ErfülltVerificación de `sesskey` antes de acciones que modifican datos: `confirm_sesskey()` presente en keys.php, services.php, index.php, settings_page.php, users.php, health.php antes de cualquier acción de escritura.
- ErfülltComprobación de capabilities/permisos: `admin_externalpage_setup` gatea todas las páginas admin con capability `local/mcpconnector:manage`; todas las funciones `external/*` revisadas llaman `require_capability` (ej. `create_module.php:191`, `backup_course.php:78/80`, `restore_course.php:87/88`, etc.); `authorize.php` usa `require_login()`.
- ErfülltSin `eval()`, `unserialize()`, `call_user_func()`, etc. sobre entrada no confiable: grep sin coincidencias en todo el árbol para `eval\(`, `base64_decode`, `unserialize`, `call_user_func`, `exec\(`, `shell_exec`, `system\(`.
- ErfülltValidación/sanitización de entradas: uso extenso y correcto de `optional_param`/`required_param` con tipos PARAM_ adecuados (PARAM_ALPHANUMEXT, PARAM_BOOL, PARAM_INT, PARAM_URL, PARAM_RAW_TRIMMED, etc.) en index.php, keys.php, services.php, settings_page.php, users.php, authorize.php, service.php.
- ErfülltSin credenciales/tokens/claves API hardcodeadas: `panel_secret`, `license_key` se gestionan vía `set_config`/formularios de admin (campos password, "write-only"), sin valores por defecto embebidos; `local_mcpconnector_api_base_url()` usa un default público (`https://moodlemcp.com`) que no es un secreto.
Privacidad y compatibilidad
- ErfülltImplementa Privacy API: `classes/privacy/provider.php` completo, implementa metadata, contextlist, userlist, export y delete, incluyendo revocación remota best-effort.
- Nicht zutreffendBackup/restore API: es un plugin `local`, no un módulo de actividad; no aplica (aunque curiosamente existe `classes/external/backup_course.php`/`restore_course.php`, son funciones webservice que invocan el backup/restore de core, no implementación de la API de backup del propio plugin).
- HinweisFunciona sin errores/warnings/notices en instalación normal: el pipeline CI de moodle-plugin-ci falla (jobs `ci (pgsql)` y `ci (mysqli)` en fallo), lo cual indica al menos el fallo de PHPCS; no hay evidencia de que la instalación en sí falle, pero el job global "failure" no permite confirmar una instalación limpia sin advertencias.
- ErfülltNo requiere `composer install` ni pasos de compilación manuales: no se han encontrado `composer.json` ni referencias a build steps para el propio plugin Moodle (el `db/service_functions.php` menciona un script generador `server/scripts/export-functions.ts`, pero es del lado del panel/desarrollo, no un requisito para el usuario final que instala el plugin).
- ErfülltCompatible con motores de BD soportados (MySQL/MariaDB y PostgreSQL): `db/install.xml` usa tipos XMLDB estándar y portables (`int`, `char`), sin SQL específico de motor; además el propio CI ejecuta explícitamente jobs `ci (pgsql)` y `ci (mysqli)`.
Malware / abuso
- ErfülltSin llamadas de red ofuscadas o a dominios sospechosos no declarados: única comunicación de red es hacia el dominio `moodlemcp.com` (configurable), declarado explícitamente en README y firmado con HMAC-SHA256 (`lib.php` uso de clase `curl` nativa de Moodle, con `curl_security_helper` aplicado según comentarios en `classes/local/url_file.php`); no se hallaron otros dominios ni llamadas ocultas.
- ErfülltSin código ofuscado/minificado sin fuente disponible: no se encontró minificación ni ofuscación; el código es legible con comentarios extensos.
- ErfülltSin auto-modificación o descarga de código remoto ejecutable: no hay `eval`, `include` de URLs remotas, ni descarga/ejecución de código; las respuestas del panel se tratan como datos (JSON) y no se ejecutan.
Nota adicional: no se detectó ningún intento de manipulación tipo prompt-injection en comentarios, README o strings del plugin.
- FehlgeschlagenMoodle 5.2ci (pgsql), ci (mysqli)
Bewertungen
Noch keine Bewertungen.