Proyectos de Subversion LeadersLinked - Services

Rev

Rev 210 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php

/**
 * Controlador para manejar todo lo relacionado con las empresas
 * 
 */

declare(strict_types=1);

namespace LeadersLinked\Controller;

use Laminas\Db\Adapter\AdapterInterface;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\JsonModel;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Library\Rsa;

class MoodleController extends AbstractActionController
{
    /**
     *
     * @var \Laminas\Db\Adapter\AdapterInterface
     */
    private $adapter;

    /**
     *
     * @var \LeadersLinked\Cache\CacheInterface
     */
    private $cache;


    /**
     *
     * @var \Laminas\Log\LoggerInterface
     */
    private $logger;

    /**
     *
     * @var array
     */
    private $config;


    /**
     *
     * @var \Laminas\Mvc\I18n\Translator
     */
    private $translator;


    /**
     *
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
     * @param \LeadersLinked\Cache\CacheInterface $cache
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
     * @param array $config
     * @param \Laminas\Mvc\I18n\Translator $translator
     */
    public function __construct($adapter, $cache, $logger, $config, $translator)
    {
        $this->adapter      = $adapter;
        $this->cache        = $cache;
        $this->logger       = $logger;
        $this->config       = $config;
        $this->translator   = $translator;
    }

    /**
     * Maneja la integración con la plataforma Moodle.
     * 
     * Este método procesa las peticiones POST para generar datos de autenticación para la integración con Moodle.
     * Recupera la información del usuario y la red actual, prepara los datos del usuario (nombre, email, imagen),
     * y genera parámetros de autenticación seguros que incluyen:
     * - URL de Moodle (desde la configuración de la red o configuración del entorno)
     * - Datos del usuario encriptados usando RSA
     * - Credenciales de autenticación con marca de tiempo y semilla aleatoria
     * 
     * @return \Laminas\View\Model\JsonModel Retorna una respuesta JSON con:
     *         - success: booleano que indica el estado de la operación
     *         - data: array que contiene los parámetros de integración con Moodle
     *         - En caso de error: retorna ERROR_METHOD_NOT_ALLOWED para peticiones que no son POST
     */
    public function indexAction()
    {
        // Obtener la petición HTTP
        $request = $this->getRequest();
        if ($request->isPost()) {

            // Obtener información del usuario actual
            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();

            // Obtener información de la red actual
            $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
            $currentNetwork = $currentNetworkPlugin->getNetwork();

            // Determinar la URL de Moodle según la configuración
            if ($currentNetwork->moodle_url) {
                $url = $currentNetwork->moodle_url;
            } else {
                $sandbox = $this->config['leaderslinked.runmode.sandbox'];

                if ($sandbox) {
                    $url = $this->config['leaderslinked.moodle.url_sandbox'];
                } else {
                    $url = $this->config['leaderslinked.moodle.url_production'];
                }
            }

            // Obtener credenciales y configuración RSA
            $username = $this->config['leaderslinked.moodle.username'];
            $password = $this->config['leaderslinked.moodle.password'];
            $rsa_n = $this->config['leaderslinked.moodle.rsa_n'];
            $rsa_e = $this->config['leaderslinked.moodle.rsa_e'];

            // Obtener información detallada del usuario
            $userMapper = UserMapper::getInstance($this->adapter);
            $user = $userMapper->fetchOne($currentUser->id);

            // Procesar la imagen del usuario si existe
            if ($user->image) {
                $image = file_get_contents($this->config['leaderslinked.fullpath.user'] . $user->uuid .  DIRECTORY_SEPARATOR . '/' . $user->image);
            } else {
                $image = '';
            }

            // Preparar datos del usuario para la integración
            $data = new \stdClass();
            $data->first_name = $user->first_name;
            $data->last_name = $user->last_name;
            $data->email = $user->email;
            $data->image_filename = '';
            $data->image_content = '';

            $data = json_encode($data);

            // Generar semilla aleatoria y timestamp para la autenticación
            list($usec, $sec) = explode(' ', microtime());
            $seed = intval($sec + ((float) $usec * 100000));

            $timestamp  = date('Y-m-d\TH:i:s');
            mt_srand($seed, MT_RAND_MT19937);
            $rand =  mt_rand();

            // Generar contraseña segura para la autenticación
            $password  = password_hash($username . '-' . $password . '-' . $rand . '-' . $timestamp, PASSWORD_DEFAULT);

            // Encriptar datos usando RSA
            $rsa = Rsa::getInstance();
            $data = $rsa->encrypt($data, $rsa_e, $rsa_n);

            // Preparar respuesta exitosa
            $response = [
                'success' => true,
                'data' => [
                    'url' => $url,
                    'username' => $username,
                    'password' => $password,
                    'rand' => $rand,
                    'timestamp' => $timestamp,
                    'data' => base64_encode($data),
                ]
            ];

            return new JsonModel($response);
        } else {
            // Preparar respuesta de error para métodos no permitidos
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];

            return new JsonModel($data);
        }

        return new JsonModel($data);
    }
}