| Current Path : /var/www/v3.cesa.co.za/src/MemberBundle/Http/ |
| Current File : /var/www/v3.cesa.co.za/src/MemberBundle/Http/CesaMainExternalCaller.php |
<?php
namespace App\MemberBundle\Http;
use Symfony\Component\HttpFoundation\Request;
/**
* IP whitelist checks for server-to-server calls from cesa-main / WordPress host.
* Mirrors {@see \App\ContentBundle\Controller\ExternalFormApiController}.
*/
final class CesaMainExternalCaller
{
public static function getAllowedIpsCsv(Request $request): string
{
return (string) (
$_ENV['CESA_MAIN_ALLOWED_IPS']
?? $_SERVER['CESA_MAIN_ALLOWED_IPS']
?? getenv('CESA_MAIN_ALLOWED_IPS')
?? ''
);
}
public static function isAuthorised(Request $request, ?string $allowedIpsCsv = null): bool
{
$allowedIpsCsv ??= self::getAllowedIpsCsv($request);
if (trim($allowedIpsCsv) === '') {
return false;
}
$allowedIps = [];
foreach (explode(',', $allowedIpsCsv) as $ip) {
$ip = trim((string) $ip);
if ($ip !== '') {
$allowedIps[] = $ip;
}
}
$remoteAddr = (string) $request->server->get('REMOTE_ADDR', '');
$forwardedFor = (string) $request->server->get('HTTP_X_FORWARDED_FOR', '');
$candidateIps = [];
if ($forwardedFor !== '') {
foreach (explode(',', $forwardedFor) as $forwardedIp) {
$forwardedIp = trim((string) $forwardedIp);
if ($forwardedIp !== '') {
$candidateIps[] = $forwardedIp;
}
}
}
if ($remoteAddr !== '') {
$candidateIps[] = $remoteAddr;
}
foreach ($candidateIps as $candidateIp) {
if (\in_array($candidateIp, $allowedIps, true)) {
return true;
}
}
return false;
}
}