diff --git a/module/finc/src/finc/Role/PermissionProvider/IpRangeFoFor.php b/module/finc/src/finc/Role/PermissionProvider/IpRangeFoFor.php index 134d1a0dad6f9a6697eeb6f36ff4217bb1188263..37106e439210a6b3eae83e5838085b769c1fbf15 100644 --- a/module/finc/src/finc/Role/PermissionProvider/IpRangeFoFor.php +++ b/module/finc/src/finc/Role/PermissionProvider/IpRangeFoFor.php @@ -45,6 +45,28 @@ namespace finc\Role\PermissionProvider; */ class IpRangeFoFor extends \VuFind\Role\PermissionProvider\IpRange { + + /** + * returns remote address based on eventual proxy headers + * + * @return string + */ + private function getRemoteAddr() { + // a list of ips the request is forwarded for - first is latest + $HttpXForwardedForList = explode(',', $this->request->getServer()->get('HTTP_X_FORWARDED_FOR')); + + if ($ip = array_shift($HttpXForwardedForList)) { + return $ip; + } + + // often provided by nginx-reverse-proxies, should be used since its the nature of the value + if ($ip = $this->request->getServer()->get('HTTP_X_REAL_IP')) { + return $ip; + } + + return $this->request->getServer()->get('REMOTE_ADDR'); + } + /** * Return an array of roles which may be granted the permission based on * the options. @@ -57,11 +79,10 @@ class IpRangeFoFor extends \VuFind\Role\PermissionProvider\IpRange */ public function getPermissions($options) { + + // Check if any regex matches.... - $ip = $this->request->getServer()->get('HTTP_X_FORWARDED_FOR') != null - ? $this->request->getServer()->get('HTTP_X_FORWARDED_FOR') - : $this->request->getServer()->get('REMOTE_ADDR'); - if ($this->ipAddressUtils->isInRange($ip, (array)$options)) { + if ($this->ipAddressUtils->isInRange($this->getRemoteAddr(), (array)$options)) { // Match? Grant to all users (guest or logged in). return ['guest', 'loggedin']; } diff --git a/module/finc/src/finc/Role/PermissionProvider/IpRegExFoFor.php b/module/finc/src/finc/Role/PermissionProvider/IpRegExFoFor.php index 07afb30d8f1717f736087d265ef6876b677b042d..c54b27513668296471c0f9843f86463f15f772ac 100644 --- a/module/finc/src/finc/Role/PermissionProvider/IpRegExFoFor.php +++ b/module/finc/src/finc/Role/PermissionProvider/IpRegExFoFor.php @@ -22,6 +22,7 @@ * @category VuFind * @package Authorization * @author Gregor Gawol <gawol@ub.uni-leipzig.de> + * @author Ulf Seltmann <ulf.seltmann@hmt-leipzig.de> * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @link https://vufind.org Main Page */ @@ -33,11 +34,33 @@ namespace finc\Role\PermissionProvider; * @category VuFind * @package Authorization * @author Gregor Gawol <gawol@ub.uni-leipzig.de> + * @author Ulf Seltmann <ulf.seltmann@hmt-leipzig.de> * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @link https://vufind.org Main Page */ class IpRegExFoFor extends \VuFind\Role\PermissionProvider\IpRegEx { + /** + * returns remote address based on eventual proxy headers + * + * @return string + */ + private function getRemoteAddr() { + // a list of ips the request is forwarded for - first is latest + $HttpXForwardedForList = explode(',', $this->request->getServer()->get('HTTP_X_FORWARDED_FOR')); + + if ($ip = array_shift($HttpXForwardedForList)) { + return $ip; + } + + // often provided by nginx-reverse-proxies, should be used since its the nature of the value + if ($ip = $this->request->getServer()->get('HTTP_X_REAL_IP')) { + return $ip; + } + + return $this->request->getServer()->get('REMOTE_ADDR'); + } + /** * Return an array of roles which may be granted the permission based on * the options. @@ -51,9 +74,7 @@ class IpRegExFoFor extends \VuFind\Role\PermissionProvider\IpRegEx public function getPermissions($options) { // Check if any regex matches.... - $ip = $this->request->getServer()->get('HTTP_X_FORWARDED_FOR') != null - ? $this->request->getServer()->get('HTTP_X_FORWARDED_FOR') - : $this->request->getServer()->get('REMOTE_ADDR'); + $ip = $this->getRemoteAddr(); foreach ((array)$options as $current) { if (preg_match($current, $ip)) { // Match? Grant to all users (guest or logged in).