Proyectos de Subversion LeadersLinked - Services

Rev

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

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
604 ariadna 2
 
1 efrain 3
/**
4
 * Controlador para manejar todo lo relacionado con las empresas
5
 *
6
 */
604 ariadna 7
 
1 efrain 8
declare(strict_types=1);
9
 
10
namespace LeadersLinked\Controller;
11
 
12
use Laminas\Db\Adapter\AdapterInterface;
13
 
14
use Laminas\Mvc\Controller\AbstractActionController;
15
use Laminas\Log\LoggerInterface;
16
use Laminas\View\Model\JsonModel;
17
use LeadersLinked\Mapper\UserMapper;
18
use LeadersLinked\Library\Rsa;
19
 
20
class MoodleController extends AbstractActionController
21
{
22
    /**
23
     *
24
     * @var \Laminas\Db\Adapter\AdapterInterface
25
     */
26
    private $adapter;
604 ariadna 27
 
1 efrain 28
    /**
29
     *
30
     * @var \LeadersLinked\Cache\CacheInterface
31
     */
32
    private $cache;
604 ariadna 33
 
34
 
1 efrain 35
    /**
36
     *
37
     * @var \Laminas\Log\LoggerInterface
38
     */
39
    private $logger;
604 ariadna 40
 
1 efrain 41
    /**
42
     *
43
     * @var array
44
     */
45
    private $config;
604 ariadna 46
 
47
 
1 efrain 48
    /**
49
     *
50
     * @var \Laminas\Mvc\I18n\Translator
51
     */
52
    private $translator;
604 ariadna 53
 
54
 
1 efrain 55
    /**
56
     *
57
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
58
     * @param \LeadersLinked\Cache\CacheInterface $cache
59
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
60
     * @param array $config
61
     * @param \Laminas\Mvc\I18n\Translator $translator
62
     */
63
    public function __construct($adapter, $cache, $logger, $config, $translator)
64
    {
65
        $this->adapter      = $adapter;
66
        $this->cache        = $cache;
67
        $this->logger       = $logger;
68
        $this->config       = $config;
69
        $this->translator   = $translator;
70
    }
604 ariadna 71
 
72
    /**
73
     * Maneja la integración con la plataforma Moodle.
74
     *
75
     * Este método procesa las peticiones POST para generar datos de autenticación para la integración con Moodle.
76
     * Recupera la información del usuario y la red actual, prepara los datos del usuario (nombre, email, imagen),
77
     * y genera parámetros de autenticación seguros que incluyen:
78
     * - URL de Moodle (desde la configuración de la red o configuración del entorno)
79
     * - Datos del usuario encriptados usando RSA
80
     * - Credenciales de autenticación con marca de tiempo y semilla aleatoria
81
     *
82
     * @return \Laminas\View\Model\JsonModel Retorna una respuesta JSON con:
83
     *         - success: booleano que indica el estado de la operación
84
     *         - data: array que contiene los parámetros de integración con Moodle
85
     *         - En caso de error: retorna ERROR_METHOD_NOT_ALLOWED para peticiones que no son POST
86
     */
1 efrain 87
    public function indexAction()
88
    {
604 ariadna 89
        // Obtener la petición HTTP
1 efrain 90
        $request = $this->getRequest();
604 ariadna 91
        if ($request->isPost()) {
92
 
93
            // Obtener información del usuario actual
1 efrain 94
            $currentUserPlugin = $this->plugin('currentUserPlugin');
95
            $currentUser = $currentUserPlugin->getUser();
604 ariadna 96
 
97
            // Obtener información de la red actual
1 efrain 98
            $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
99
            $currentNetwork = $currentNetworkPlugin->getNetwork();
604 ariadna 100
 
101
            // Determinar la URL de Moodle según la configuración
102
            if ($currentNetwork->moodle_url) {
103
                $url = $currentNetwork->moodle_url;
1 efrain 104
            } else {
105
                $sandbox = $this->config['leaderslinked.runmode.sandbox'];
604 ariadna 106
 
107
                if ($sandbox) {
1 efrain 108
                    $url = $this->config['leaderslinked.moodle.url_sandbox'];
109
                } else {
110
                    $url = $this->config['leaderslinked.moodle.url_production'];
111
                }
112
            }
604 ariadna 113
 
114
            // Obtener credenciales y configuración RSA
1 efrain 115
            $username = $this->config['leaderslinked.moodle.username'];
116
            $password = $this->config['leaderslinked.moodle.password'];
117
            $rsa_n = $this->config['leaderslinked.moodle.rsa_n'];
118
            $rsa_e = $this->config['leaderslinked.moodle.rsa_e'];
604 ariadna 119
 
120
            // Obtener información detallada del usuario
1 efrain 121
            $userMapper = UserMapper::getInstance($this->adapter);
122
            $user = $userMapper->fetchOne($currentUser->id);
604 ariadna 123
 
124
            // Procesar la imagen del usuario si existe
125
            if ($user->image) {
126
                $image = file_get_contents($this->config['leaderslinked.fullpath.user'] . $user->uuid .  DIRECTORY_SEPARATOR . '/' . $user->image);
1 efrain 127
            } else {
128
                $image = '';
129
            }
604 ariadna 130
 
131
            // Preparar datos del usuario para la integración
1 efrain 132
            $data = new \stdClass();
133
            $data->first_name = $user->first_name;
134
            $data->last_name = $user->last_name;
135
            $data->email = $user->email;
210 efrain 136
            $data->image_filename = '';
137
            $data->image_content = '';
604 ariadna 138
 
1 efrain 139
            $data = json_encode($data);
604 ariadna 140
 
141
            // Generar semilla aleatoria y timestamp para la autenticación
1 efrain 142
            list($usec, $sec) = explode(' ', microtime());
143
            $seed = intval($sec + ((float) $usec * 100000));
604 ariadna 144
 
1 efrain 145
            $timestamp  = date('Y-m-d\TH:i:s');
146
            mt_srand($seed, MT_RAND_MT19937);
147
            $rand =  mt_rand();
148
 
604 ariadna 149
            // Generar contraseña segura para la autenticación
150
            $password  = password_hash($username . '-' . $password . '-' . $rand . '-' . $timestamp, PASSWORD_DEFAULT);
151
 
152
            // Encriptar datos usando RSA
1 efrain 153
            $rsa = Rsa::getInstance();
154
            $data = $rsa->encrypt($data, $rsa_e, $rsa_n);
155
 
604 ariadna 156
            // Preparar respuesta exitosa
1 efrain 157
            $response = [
158
                'success' => true,
159
                'data' => [
160
                    'url' => $url,
161
                    'username' => $username,
162
                    'password' => $password,
163
                    'rand' => $rand,
164
                    'timestamp' => $timestamp,
165
                    'data' => base64_encode($data),
166
                ]
167
            ];
168
 
169
            return new JsonModel($response);
170
        } else {
604 ariadna 171
            // Preparar respuesta de error para métodos no permitidos
1 efrain 172
            $data = [
173
                'success' => false,
174
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
175
            ];
604 ariadna 176
 
1 efrain 177
            return new JsonModel($data);
178
        }
604 ariadna 179
 
1 efrain 180
        return new JsonModel($data);
181
    }
182
}