UNIMOODLE / p31_mod

GNU General Public License v3.0
0 stars 0 forks source link

Error en la implementación de validation_cmd #27

Open juacas opened 3 weeks ago

juacas commented 3 weeks ago

El subplugin CMD estaba especificado: Este proceso ha de permitir configurar un comando del sistema operativo del servidor de Moodle pasándole los parámetros que se requiera. Este comando recibirá el documento PDF del certificado por la entrada estándar y se obtendrá el documento modificado de la salida estándar.

Se flexibilizó la especificación para que en lugar de la entrada estándar se usara un fichero como argumento.

El comando que se ejecuta ahora en la implementación de la versión 2024081401 es (por ejemplo):

"bash comando.sh xese23432243.pdf '{"lang":"en","user_id":2956,"user_fullname":"RAQ MA ","courseid":28,"course_fullname":"curso NotificationsAgent","course_shortname":"NotificationsAgent"}'"

Problemas detectados: 1) El filename del pdf no sirve de nada pues no permite al script localizarlo. 2) La salida estándar del comando se interpreta como un HTML con el que generar un PDF nuevo desde cero.

La implementación debería:

Para ello es necesario hacer los siguientes ajustes:

Script validation/cmd/example/main.sh debe respetar el convenio del interfaz, por ejemplo un sh transparente sería:

#!/usr/bin/bash
filename=$1
user_json=$2

user_id=$(echo $user_json | jq -r '.user_id')
user_fullname=$(echo $user_json | jq -r '.user_fullname') 
course_fullname=$(echo $user_json | jq -r '.course_fullname')

## Devuelvo el contenido del documento sin tocar.
cat $filename

Implementación del plugin:

Alternativamente, se puede reformular el API CMD para que se usen como entrada y salida ficheros temporales, pero no como está ahora ya que así es incompatible con el contrato de validador de certificados cuyas entradas y salidas son PDFs.

juacas commented 3 weeks ago

Esta implementación me funciona:

  private function save_file_on_moodledata(certifygen_file $file, $content) :void {
           // Save pdf on moodledata.
        $fs = get_file_storage();
        $filerecord = self::get_filerecord_array(
            $file->get_metadata()['courseid'],
            $file->get_validationid(),
            $file->get_file()->get_filename());

        // Create a new temporary file.
        $tempdir = make_temp_directory('certifygen');
        $tempfile = tempnam($tempdir, 'certifygen');
        file_put_contents($tempfile, $content);

        $fs->create_file_from_pathname($filerecord, $tempfile);
    }
xpazv commented 2 weeks ago

En revisión.

xpazv commented 2 weeks ago

La salida de cat es binaria y la función de captura de salida estandar de php trata esa información como texto, por lo que el PDF, con el mismo contenido que el original, no es funcional.

xpazv commented 2 weeks ago

Para validar el requerimiento, se acuerda suministrar archivo temporal, con ruta, como salida del CMD

juacas commented 2 weeks ago

Creo que lo entiendo, pero hay cierta contradicción entre "suministrar" y "como salida". Por aclarar la idea: ¿La ruta temporal se suministra como parámetro de entrada desde Moodle o se obtiene como salida del CMD? Es decir, ¿el path lo elige Moodle o lo hace el CMD? ¿Qué rutas son accesibles por los procesos PHP? ¿Se puede asegurar mejor si el path se introduce como parámetro de entrada al CMD?

xpazv commented 1 week ago

Proponemos que lo elija el CMD, mediante un setting de la ruta de los ficheros temporales.