-
Notifications
You must be signed in to change notification settings - Fork 104
Expand file tree
/
Copy pathDefaultUrlChecker.php
More file actions
119 lines (102 loc) · 3.16 KB
/
DefaultUrlChecker.php
File metadata and controls
119 lines (102 loc) · 3.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php
declare(strict_types=1);
/**
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
* @link https://cakephp.org CakePHP(tm) Project
* @since 1.0.0
* @license https://opensource.org/licenses/mit-license.php MIT License
*/
namespace Authentication\UrlChecker;
use Psr\Http\Message\ServerRequestInterface;
/**
* Checks if a request object contains a valid URL
*/
class DefaultUrlChecker implements UrlCheckerInterface
{
/**
* Default Options
*
* - `urlChecker` Whether or not to use `loginUrl` as regular expression(s).
* - `checkFullUrl` Whether or not to check the full request URI.
*
* @var array
*/
protected array $_defaultOptions = [
'useRegex' => false,
'checkFullUrl' => false,
];
/**
* @inheritDoc
*/
public function check(ServerRequestInterface $request, $loginUrls, array $options = []): bool
{
$options = $this->_mergeDefaultOptions($options);
$urls = (array)$loginUrls;
if (empty($urls)) {
return true;
}
$checker = $this->_getChecker($options);
$url = $this->_getUrlFromRequest($request, $options['checkFullUrl']);
foreach ($urls as $validUrl) {
if ($checker($validUrl, $url)) {
return true;
}
}
return false;
}
/**
* Merges given options with the defaults.
*
* The reason this method exists is that it makes it easy to override the
* method and inject additional options without the need to use the
* MergeVarsTrait.
*
* @param array $options Options to merge in
* @return array
*/
protected function _mergeDefaultOptions(array $options): array
{
return $options + $this->_defaultOptions;
}
/**
* Gets the checker function name or a callback
*
* @param array $options Array of options
* @return callable
*/
protected function _getChecker(array $options): callable
{
if (!empty($options['useRegex'])) {
return 'preg_match';
}
return function ($validUrl, $url) {
return $validUrl === $url;
};
}
/**
* Returns current url.
*
* @param \Psr\Http\Message\ServerRequestInterface $request Server Request
* @param bool $getFullUrl Get the full URL or just the path
* @return string
*/
protected function _getUrlFromRequest(ServerRequestInterface $request, bool $getFullUrl = false): string
{
$uri = $request->getUri();
$requestBase = $request->getAttribute('base');
if ($requestBase) {
$uri = $uri->withPath($requestBase . $uri->getPath());
}
if ($getFullUrl) {
return (string)$uri;
}
return $uri->getPath();
}
}