xref: /webtrees/app/Http/Middleware/ClientIp.php (revision 24f2a3af38709f9bf0a739b30264240d20ba34e8)
14874f72dSGreg Roach<?php
24874f72dSGreg Roach
34874f72dSGreg Roach/**
44874f72dSGreg Roach * webtrees: online genealogy
589f7189bSGreg Roach * Copyright (C) 2021 webtrees development team
64874f72dSGreg Roach * This program is free software: you can redistribute it and/or modify
74874f72dSGreg Roach * it under the terms of the GNU General Public License as published by
84874f72dSGreg Roach * the Free Software Foundation, either version 3 of the License, or
94874f72dSGreg Roach * (at your option) any later version.
104874f72dSGreg Roach * This program is distributed in the hope that it will be useful,
114874f72dSGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
124874f72dSGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
134874f72dSGreg Roach * GNU General Public License for more details.
144874f72dSGreg Roach * You should have received a copy of the GNU General Public License
1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
164874f72dSGreg Roach */
17fcfa147eSGreg Roach
184874f72dSGreg Roachdeclare(strict_types=1);
194874f72dSGreg Roach
204874f72dSGreg Roachnamespace Fisharebest\Webtrees\Http\Middleware;
214874f72dSGreg Roach
224874f72dSGreg Roachuse Psr\Http\Message\ResponseInterface;
234874f72dSGreg Roachuse Psr\Http\Message\ServerRequestInterface;
244874f72dSGreg Roachuse Psr\Http\Server\RequestHandlerInterface;
254874f72dSGreg Roach
264874f72dSGreg Roachuse function explode;
274874f72dSGreg Roach
284874f72dSGreg Roach/**
294874f72dSGreg Roach * Middleware to detect the client's IP address.
304874f72dSGreg Roach */
314874f72dSGreg Roachclass ClientIp extends \Middlewares\ClientIp
324874f72dSGreg Roach{
334874f72dSGreg Roach    /**
344874f72dSGreg Roach     * @param ServerRequestInterface  $request
354874f72dSGreg Roach     * @param RequestHandlerInterface $handler
364874f72dSGreg Roach     *
374874f72dSGreg Roach     * @return ResponseInterface
384874f72dSGreg Roach     */
394874f72dSGreg Roach    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
404874f72dSGreg Roach    {
414874f72dSGreg Roach        // The configuration comes from config.ini.php, via request attributes.
424874f72dSGreg Roach        $trusted_headers = $this->getCommaSeparatedAttribute($request, 'trusted_headers');
434874f72dSGreg Roach        $trusted_proxies = $this->getCommaSeparatedAttribute($request, 'trusted_proxies');
444874f72dSGreg Roach
454874f72dSGreg Roach        $this->proxy($trusted_proxies, $trusted_headers);
464874f72dSGreg Roach
474874f72dSGreg Roach        return parent::process($request, $handler);
484874f72dSGreg Roach    }
494874f72dSGreg Roach
504874f72dSGreg Roach    /**
514874f72dSGreg Roach     * @param ServerRequestInterface $request
524874f72dSGreg Roach     * @param string                 $attribute
534874f72dSGreg Roach     *
54*24f2a3afSGreg Roach     * @return array<string>
554874f72dSGreg Roach     */
564874f72dSGreg Roach    private function getCommaSeparatedAttribute(ServerRequestInterface $request, string $attribute): array
574874f72dSGreg Roach    {
584874f72dSGreg Roach        $value = $request->getAttribute($attribute);
594874f72dSGreg Roach
604874f72dSGreg Roach        if ($value === null) {
614874f72dSGreg Roach            return [];
624874f72dSGreg Roach        }
634874f72dSGreg Roach
644874f72dSGreg Roach        return explode(',', $value);
654874f72dSGreg Roach    }
664874f72dSGreg Roach}
67