Línea 135... |
Línea 135... |
135 |
public function onBootstrap(MvcEvent $event)
|
135 |
public function onBootstrap(MvcEvent $event)
|
136 |
{
|
136 |
{
|
137 |
$timezone = $this->config['leaderslinked.runmode.timezone'];
|
137 |
$timezone = $this->config['leaderslinked.runmode.timezone'];
|
138 |
date_default_timezone_set($timezone);
|
138 |
date_default_timezone_set($timezone);
|
Línea 139... |
Línea -... |
139 |
|
- |
|
140 |
// Add CORS headers
|
- |
|
141 |
header('Access-Control-Allow-Origin: *');
|
- |
|
142 |
header('Access-Control-Allow-Headers: *');
|
- |
|
143 |
header('Access-Control-Allow-Method: POST, GET, HEAD, OPTIONS');
|
- |
|
144 |
header('Access-Control-Max-Age: 86400');
|
- |
|
145 |
|
139 |
|
146 |
$response = $event->getResponse();
|
- |
|
147 |
Functions::addCrossSiteToResponse($response);
|
140 |
$response = $event->getResponse();
|
148 |
$event->setResponse($response);
|
- |
|
149 |
|
141 |
$request = $event->getRequest();
|
Línea -... |
Línea 142... |
- |
|
142 |
$serviceManager = $event->getApplication()->getServiceManager();
|
- |
|
143 |
|
- |
|
144 |
// --- Inicio de la lógica de la whitelist de CORS ---
|
- |
|
145 |
// Obtener los orígenes permitidos desde la configuración. Si no está definido, es una cadena vacía.
|
- |
|
146 |
$whitelistString = $this->config['leaderslinked.cors.allowed_origins'] ?? '';
|
- |
|
147 |
$allowedOrigins = array_map('trim', explode(',', $whitelistString));
|
- |
|
148 |
|
- |
|
149 |
$originHeader = $request->getHeader('Origin');
|
- |
|
150 |
|
- |
|
151 |
// Comprobar si la solicitud tiene una cabecera 'Origin'.
|
- |
|
152 |
if ($originHeader) {
|
- |
|
153 |
$origin = $originHeader->getUri();
|
- |
|
154 |
|
- |
|
155 |
// Si el origen de la solicitud está en nuestra lista blanca, configuramos las cabeceras CORS.
|
- |
|
156 |
if (in_array($origin, $allowedOrigins)) {
|
- |
|
157 |
$headers = $response->getHeaders();
|
- |
|
158 |
$headers->addHeaderLine('Access-Control-Allow-Origin', $origin);
|
- |
|
159 |
$headers->addHeaderLine('Access-Control-Allow-Credentials', 'true');
|
- |
|
160 |
$headers->addHeaderLine('Access-Control-Allow-Headers', 'Authorization, Content-Type, token, secret, rand, created');
|
- |
|
161 |
$headers->addHeaderLine('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
|
- |
|
162 |
$headers->addHeaderLine('Access-Control-Max-Age', '86400');
|
- |
|
163 |
}
|
- |
|
164 |
// Si el origen no está en la lista blanca, no añadimos ninguna cabecera.
|
- |
|
165 |
// El navegador aplicará la política del mismo origen y bloqueará la solicitud.
|
- |
|
166 |
}
|
- |
|
167 |
|
- |
|
168 |
// Las solicitudes de pre-vuelo (pre-flight) usan el método OPTIONS.
|
- |
|
169 |
// Deben devolver las cabeceras CORS y una respuesta 200 OK inmediatamente.
|
- |
|
170 |
if ($request->isOptions() && $originHeader) {
|
- |
|
171 |
$response->setStatusCode(200);
|
- |
|
172 |
// Detenemos la ejecución para las solicitudes de pre-vuelo y devolvemos la respuesta.
|
- |
|
173 |
return $response;
|
- |
|
174 |
}
|
- |
|
175 |
// --- Fin de la lógica de la whitelist de CORS ---
|
- |
|
176 |
|
150 |
$serviceManager = $event->getApplication()->getServiceManager();
|
177 |
$event->setResponse($response);
|
151 |
|
178 |
|
152 |
$eventManager = $event->getApplication()->getEventManager();
|
179 |
$eventManager = $event->getApplication()->getEventManager();
|
153 |
$eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [
|
180 |
$eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [
|
154 |
$this,
|
181 |
$this,
|