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ónif ($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 existeif ($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ónlist($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);}}