sintonia/legacy/application/common/CORSHelper.php

61 lines
2.0 KiB
PHP
Raw Normal View History

2014-07-03 18:26:09 +02:00
<?php
class CORSHelper
{
public static function enableCrossOriginRequests(&$request, &$response)
2014-07-03 18:26:09 +02:00
{
//Chrome sends the Origin header for all requests, so we whitelist the webserver's hostname as well.
$origin = $request->getHeader('Origin');
2021-10-07 19:05:56 +02:00
$allowedOrigins = self::getAllowedOrigins($request);
2021-10-11 16:10:47 +02:00
if ((!(preg_match("/https?:\/\/localhost/", $origin) === 1)) && ($origin != '')
&& (!in_array($origin, $allowedOrigins))
2021-10-07 19:05:56 +02:00
) {
2014-07-03 18:26:09 +02:00
//Don't allow CORS from other domains to prevent XSS.
2021-10-07 19:05:56 +02:00
Logging::error("request origin '{$origin}' is not in allowed '" . implode(', ', $allowedOrigins) . "'!");
2021-10-11 16:10:47 +02:00
2014-07-03 18:26:09 +02:00
throw new Zend_Controller_Action_Exception('Forbidden', 403);
}
//Allow AJAX requests from configured websites. We use this to allow other pages to use LibreTimes API.
if ($origin) {
$response = $response->setHeader('Access-Control-Allow-Origin', $origin);
}
2014-07-03 18:26:09 +02:00
}
/**
2021-10-11 16:10:47 +02:00
* Get all allowed origins.
*
* @param Request $request request object
*/
public static function getAllowedOrigins($request)
{
$allowedCorsUrls = array_map(
2021-10-11 16:10:47 +02:00
function ($v) { return trim($v); },
explode(PHP_EOL, Application_Model_Preference::GetAllowedCorsUrls())
);
// always allow the configured server in (as reported by the server and not what is i baseUrl)
$scheme = $request->getServer('REQUEST_SCHEME');
$host = $request->getServer('SERVER_NAME');
$port = $request->getServer('SERVER_PORT');
$portString = '';
if (
2021-10-11 16:10:47 +02:00
$scheme == 'https' && $port != 443
|| $scheme == 'http' && $port != 80
) {
$portString = sprintf(':%s', $port);
}
$requestedUrl = sprintf(
'%s://%s%s',
$scheme,
$host,
$portString
);
2021-10-11 16:10:47 +02:00
return array_merge($allowedCorsUrls, [
$requestedUrl,
]);
}
}