Saltar para o conteúdo principal
LMS Plugin Hub
Voltar ao catálogo
Plugin localValidado

MoodleMCP

Baixar

MCP 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).

20 downloads
Baixar

Ver repositório

Reportar um problema

Versões

  • Validado10 de ago. de 2026
    1.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.2

    Baixar

    Relatório de validação

    Concluído

    Integração contínua (moodle-plugin-ci)

    • AprovadoMoodle 5.2

    28 cumprem · 0 avisos · 0 não cumprem

    Metadatos y publicación

    • CumpreNombre sigue convención frankenstyle (`plugintype_pluginname`): El plugin se llama `local_mcpconnector` (version.php línea 32).
    • CumpreDescripció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).
    • CumpreAl 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.
    • CumpreDeclara repositorio de código e incidencias: README.md contiene URLs de source (github.com/studiolxd/moodle-local_mcpconnector) y issues.

    Licencia y autoría

    • CumpreLicencia GPLv3 declarada explícitamente: version.php línea 23 y README.md línea 51 declaran GNU GPL v3 o later.
    • CumpreBoilerplate 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.
    • CumpreTags `@copyright` con autoría real identificable: Todos los archivos examinados contienen `@copyright 2026 Studio LXD <[email protected]>`.
    • CumpreSin 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

    • Cumpre`version.php` presente y con formato correcto: version.php contiene $plugin->component, $plugin->version, $plugin->requires, $plugin->supported, $plugin->maturity.
    • CumprePasa PHPCS con estándar de código de Moodle: CI pipeline reporta "Moodle 5.2: success", lo que incluye validación de estilo.
    • CumprePHPDoc presente en archivos, clases y funciones públicas: Todas las funciones examinadas tienen PHPDoc (lib.php, classes/external/*.php, classes/privacy/provider.php).
    • CumpreTodo 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.
    • CumpreSin cadenas hardcodeadas: Uso consistente de `get_string()` en todas las páginas UI (index.php, keys.php). Configuraciones en `get_config('local_mcpconnector', ...)`.
    • CumprePrefijo frankenstyle aplicado: Tablas (`local_mcpconnector_keys`), funciones (`local_mcpconnector_*`), constantes (`mcpconnector_admin`, etc.).
    • CumpreConfiguración en `config_plugins`: settings.php usa `admin_externalpage`, `set_config('...', 'local_mcpconnector')`, todo dentro de contexto de site admin.

    Seguridad

    • CumpreConsultas 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.
    • CumpreVerificación de `sesskey` antes de modificar datos: index.php línea 68 (`confirm_sesskey()`), keys.php línea 48 (`confirm_sesskey()`).
    • CumpreComprobació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).
    • CumpreSin 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).
    • CumpreValidació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).
    • CumpreSin 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

    • CumpreImplementa 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.
    • Não aplicávelBackup/restore API: No aplica — este no es un módulo de actividad, es un plugin local de conectividad.
    • CumpreFunciona sin errores visibles: CI pipeline reporta "success" en Moodle 5.2.
    • CumpreNo requiere `composer install` manual: No hay composer.json en el árbol de archivos; todas las dependencias son core de Moodle.
    • CumpreCompatible 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

    • CumpreSin 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).
    • CumpreSin código ofuscado/minificado: Todo el código es fuente PHP legible con PHPDoc completo.
    • CumpreSin 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.
  • Validado com avisos10 de ago. de 2026
    1.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.2

    Baixar

    Relatório de validação

    Concluído

    Integração contínua (moodle-plugin-ci)

    • AprovadoMoodle 5.2

    26 cumprem · 2 avisos · 0 não cumprem

    Metadatos y publicación

    • CumpreNombre sigue convención frankenstyle (`plugintype_pluginname`): `$plugin->component = 'local_mcpconnector'` en `version.php:26`, coherente con la ruta `local/mcpconnector`.
    • CumpreDescripción clara del plugin: README.md describe extensamente qué hace, cómo se relaciona con el panel MoodleMCP y qué datos envía.
    • CumpreAl 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).
    • CumpreDeclara repositorio e issue tracker: README.md sección "Support & source" enlaza a GitHub (repo e Issues).

    Licencia y autoría

    • CumpreLicencia GPLv3 declarada explícitamente: `version.php` y README.md indican "GNU GPL v3 or later".
    • CumpreBoilerplate 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.
    • CumpreTags `@copyright` con autoría identificable: consistentemente `@copyright 2026 Studio LXD <[email protected]>` en todos los ficheros revisados.
    • CumpreSin 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

    • Cumpre`version.php` presente y con formato correcto: verificado, incluye `component`, `version`, `requires`, `supported`, `maturity`.
    • CumprePasa PHPCS (moodle-plugin-ci): el pipeline de CI reporta éxito en Moodle 5.2, lo que incluye la comprobación de estilo.
    • Não aplicávelPasa comprobación de estilo JS/CSS si aplica: no se detectaron ficheros JS/CSS en el árbol del plugin; no aplica.
    • CumprePHPDoc presente en archivos, clases y funciones públicas: comprobado extensamente en `create_scorm.php`, `url_file.php`, `provider.php`, `lib.php`, etc.
    • AvisoTodo 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.
    • CumpreSin cadenas hardcodeadas, uso de `get_string()`: uso consistente de `get_string()`/`string_exists()` en todas las páginas admin revisadas (`index.php`, `keys.php`).
    • CumprePrefijo frankenstyle en tablas/funciones/constantes: tabla `local_mcpconnector_keys`, funciones `local_mcpconnector_*`, capability `local/mcpconnector:manage`.
    • CumpreConfiguració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

    • CumpreConsultas 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`).
    • CumpreVerificació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`).
    • CumpreComprobació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`).
    • AvisoSin 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.
    • CumpreValidación/sanitización de entrada de usuario: uso sistemático de `external_value`/`PARAM_*` y `validate_parameters()` en las clases `external/*` revisadas.
    • CumpreSin 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

    • CumpreImplementa Privacy API: `classes/privacy/provider.php` implementa metadata, export, delete por usuario/lista y contextos de forma completa.
    • Não aplicávelImplementa 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).
    • CumpreFunciona 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.
    • CumpreNo requiere `composer install` ni pasos de compilación manuales: no se encontró `composer.json` ni artefactos de build en el árbol de ficheros.
    • CumpreCompatible 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

    • CumpreSin 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.
    • CumpreSin código ofuscado/minificado sin fuente: todo el código PHP revisado es legible, comentado extensamente, sin minificación ni cifrado.
    • CumpreSin 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.
  • Não validado10 de ago. de 2026
    1.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.2

    Baixar

    Relatório de validação

    Concluído

    Integração contínua (moodle-plugin-ci)

    • FalhouMoodle 5.2ci (pgsql), ci (mysqli)
      Ver saída do job
      …(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 cumprem · 4 avisos · 2 não cumprem

    • CumpreNombre sigue convención frankenstyle: `local_mcpconnector` en version.php ($plugin->component) y en todos los `@package`.
    • CumpreDescripción clara del plugin: README.md explica extensamente qué hace y para qué sirve.
    • CumpreVersión de Moodle soportada y mantenida declarada: `version.php` — `$plugin->requires = 2023042400` (4.2), `$plugin->supported = [402, 502]`.
    • CumpreDeclara repositorio e incidencias: README.md — "Source: https://github.com/studiolxd/moodle-local_mcpconnector" e "Issues: .../issues".
    • CumpreLicencia 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").
    • CumpreBoilerplate de licencia en cabeceras: confirmado en todos los ficheros leídos (version.php, lib.php, keys.php, authorize.php, index.php, db/*, classes/*).
    • CumpreTags `@copyright` con autoría identificable: `@copyright 2026 Studio LXD <[email protected]>` presente en prácticamente todos los ficheros (grep confirma decenas de coincidencias).
    • AvisoSin 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.
    • Cumpre`version.php` presente y con formato correcto: comprobado, incluye component, release, version, requires, supported, maturity.
    • Não cumprePasa 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`).
    • Não aplicávelPasa comprobación de estilo JS/CSS: no se han encontrado ficheros JS/CSS en el árbol listado; no aplica.
    • AvisoPHPDoc 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.
    • Não cumpreTodo 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.
    • CumpreSin cadenas hardcodeadas, uso de `get_string()`: todas las salidas de texto revisadas (index.php, keys.php, settings.php, etc.) usan `get_string()`.
    • CumprePrefijo 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.
    • CumpreConfiguració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

    • AvisoSQL 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).
    • CumpreVerificació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.
    • CumpreComprobació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()`.
    • CumpreSin `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\(`.
    • CumpreValidació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.
    • CumpreSin 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

    • CumpreImplementa Privacy API: `classes/privacy/provider.php` completo, implementa metadata, contextlist, userlist, export y delete, incluyendo revocación remota best-effort.
    • Não aplicávelBackup/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).
    • AvisoFunciona 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.
    • CumpreNo 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).
    • CumpreCompatible 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

    • CumpreSin 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.
    • CumpreSin código ofuscado/minificado sin fuente disponible: no se encontró minificación ni ofuscación; el código es legible con comentarios extensos.
    • CumpreSin 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.

Avaliações

Ainda não há avaliações.