PluginProbe
User Access Manager / 2.2.13
User Access Manager v2.2.13
2.3.20 2.3.19 2.3.18 2.3.17 2.3.16 2.3.15 2.3.14 2.3.13 trunk 0.6 0.6.1 0.6.2 0.7 0.7 Beta 0.7.0.1 0.8 0.8.0.1 0.8.0.2 0.9 0.9.1 0.9.1.1 0.9.1.2 0.9.1.3 0.9.1.4 1.0 All 136 releases
← All changes | src/Controller/Frontend/RedirectController.php +153 -36 2.3.152.2.13 View file →
@@ -1,11 +1,23 @@
1 1 <?php
2 +/**
3 + * FrontendRedirectController.php
4 + *
5 + * The FrontendRedirectController class file.
6 + *
7 + * PHP versions 5
8 + *
9 + * @author Alexander Schneider <alexanderschneider85@gmail.com>
10 + * @copyright 2008-2017 Alexander Schneider
11 + * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2
12 + * @version SVN: $id$
13 + * @link http://wordpress.org/extend/plugins/user-access-manager/
14 + */
2 15
3 16 declare(strict_types=1);
4 17
5 18 namespace UserAccessManager\Controller\Frontend;
6 19
7 -use JetBrains\PhpStorm\NoReturn;
8 20 use UserAccessManager\Access\AccessHandler;
9 21 use UserAccessManager\Cache\Cache;
10 22 use UserAccessManager\Config\MainConfig;
11 23 use UserAccessManager\Config\WordpressConfig;
@@ -19,36 +31,110 @@
19 31 use UserAccessManager\Util\Util;
20 32 use UserAccessManager\Wrapper\Php;
21 33 use UserAccessManager\Wrapper\Wordpress;
22 34
35 +/**
36 + * Class FrontendRedirectController
37 + *
38 + * @package UserAccessManager\Controller
39 + */
23 40 class RedirectController extends Controller
24 41 {
25 42 use LoginControllerTrait;
26 43
27 - public const POST_URL_CACHE_KEY = 'PostUrls';
28 - public const REDIRECT_TO_PARAMETER = 'redirect_to';
44 + const POST_URL_CACHE_KEY = 'PostUrls';
29 45
46 + /**
47 + * @var MainConfig
48 + */
49 + private $mainConfig;
50 +
51 + /**
52 + * @var Database
53 + */
54 + private $database;
55 +
56 + /**
57 + * @var Cache
58 + */
59 + private $cache;
60 +
61 + /**
62 + * @var Util
63 + */
64 + private $util;
65 +
66 + /**
67 + * @var ObjectHandler
68 + */
69 + private $objectHandler;
70 +
71 + /**
72 + * @var AccessHandler
73 + */
74 + private $accessHandler;
75 +
76 + /**
77 + * @var FileHandler
78 + */
79 + private $fileHandler;
80 +
81 + /**
82 + * @var FileObjectFactory
83 + */
84 + private $fileObjectFactory;
85 +
86 + /**
87 + * RedirectController constructor.
88 + * @param Php $php
89 + * @param Wordpress $wordpress
90 + * @param WordpressConfig $wordpressConfig
91 + * @param MainConfig $mainConfig
92 + * @param Database $database
93 + * @param Util $util
94 + * @param Cache $cache
95 + * @param ObjectHandler $objectHandler
96 + * @param AccessHandler $accessHandler
97 + * @param FileHandler $fileHandler
98 + * @param FileObjectFactory $fileObjectFactory
99 + */
30 100 public function __construct(
31 101 Php $php,
32 102 Wordpress $wordpress,
33 103 WordpressConfig $wordpressConfig,
34 - private MainConfig $mainConfig,
35 - private Database $database,
36 - private Util $util,
37 - private Cache $cache,
38 - private ObjectHandler $objectHandler,
39 - private AccessHandler $accessHandler,
40 - private FileHandler $fileHandler,
41 - private FileObjectFactory $fileObjectFactory
104 + MainConfig $mainConfig,
105 + Database $database,
106 + Util $util,
107 + Cache $cache,
108 + ObjectHandler $objectHandler,
109 + AccessHandler $accessHandler,
110 + FileHandler $fileHandler,
111 + FileObjectFactory $fileObjectFactory
42 112 ) {
43 113 parent::__construct($php, $wordpress, $wordpressConfig);
114 + $this->mainConfig = $mainConfig;
115 + $this->database = $database;
116 + $this->util = $util;
117 + $this->cache = $cache;
118 + $this->objectHandler = $objectHandler;
119 + $this->accessHandler = $accessHandler;
120 + $this->fileHandler = $fileHandler;
121 + $this->fileObjectFactory = $fileObjectFactory;
44 122 }
45 123
124 + /**
125 + * @return Wordpress
126 + */
46 127 protected function getWordpress(): Wordpress
47 128 {
48 129 return $this->wordpress;
49 130 }
50 131
132 + /**
133 + * Returns the post by the given url.
134 + * @param string $url The url of the post(attachment).
135 + * @return int
136 + */
51 137 public function getPostIdByUrl(string $url): int
52 138 {
53 139 $postUrls = (array)$this->cache->getFromRuntimeCache(self::POST_URL_CACHE_KEY);
54 140
@@ -60,21 +146,20 @@
60 146 $newUrlPieces = preg_split('/-[0-9]+x[0-9]+(_[a-z])?/', $url);
61 147 $newUrl = (count($newUrlPieces) === 2) ? $newUrlPieces[0] . $newUrlPieces[1] : $newUrlPieces[0];
62 148 $newUrl = preg_replace('/-pdf\.jpg$/', '.pdf', $newUrl);
63 149
64 - $postId = $this->wordpress->attachmentUrlToPostId($newUrl);
65 -
66 - if ($postId === 0) {
67 - $newUrl = preg_replace('/(\\.[^.\\s]{3,4})$/', '-scaled$1', $newUrl);
68 - $postId = $this->wordpress->attachmentUrlToPostId($newUrl);
69 - }
70 -
71 - $postUrls[$url] = $postId;
150 + $postUrls[$url] = $this->wordpress->attachmentUrlToPostId($newUrl);
72 151 $this->cache->addToRuntimeCache(self::POST_URL_CACHE_KEY, $postUrls);
73 152
74 153 return $postUrls[$url];
75 154 }
76 155
156 + /**
157 + * Returns the file object by the given type and url.
158 + * @param string $objectType The type of the requested file.
159 + * @param string $objectUrl The file url.
160 + * @return null|FileObject
161 + */
77 162 private function getFileSettingsByType(string $objectType, string $objectUrl): ?FileObject
78 163 {
79 164 $fileObject = null;
80 165
@@ -114,11 +199,14 @@
114 199 return $fileObject;
115 200 }
116 201
117 202 /**
203 + * Delivers the content of the requested file.
204 + * @param string $objectType The type of the requested file.
205 + * @param string $objectUrl The file url.
118 206 * @throws UserGroupTypeException
119 207 */
120 - public function getFile(string $objectType, string $objectUrl): void
208 + public function getFile(string $objectType, string $objectUrl)
121 209 {
122 210 $fileObject = $this->getFileSettingsByType($objectType, $objectUrl);
123 211
124 212 if ($fileObject === null) {
@@ -141,8 +229,13 @@
141 229
142 230 $this->fileHandler->getFile($file, $fileObject->isImage());
143 231 }
144 232
233 + /**
234 + * Returns the redirect url and the permalink of the post if exists.
235 + * @param null|string $permalink
236 + * @return null|string
237 + */
145 238 private function getRedirectUrlAndPermalink(?string &$permalink): ?string
146 239 {
147 240 $permalink = null;
148 241 $redirect = $this->mainConfig->getRedirect();
@@ -159,11 +252,8 @@
159 252 } elseif ($redirect === 'custom_url') {
160 253 $url = $this->mainConfig->getRedirectCustomUrl();
161 254 } elseif ($redirect === 'login') {
162 255 $url = $this->getLoginUrl();
163 - } elseif ($redirect === 'origin') {
164 - $referer = $this->wordpress->getReferer();
165 - $url = $referer !== false ? $referer : $this->wordpress->getHomeUrl('/');
166 256 } else {
167 257 $url = $this->wordpress->getHomeUrl('/');
168 258 }
169 259
@@ -170,14 +260,16 @@
170 260 return $url;
171 261 }
172 262
173 263 /**
264 + * Redirects the user to his destination.
265 + * @param bool $checkPosts
174 266 * @throws UserGroupTypeException
175 267 */
176 - public function redirectUser(bool $checkPosts = true): void
268 + public function redirectUser($checkPosts = true)
177 269 {
178 270 if ($checkPosts === true) {
179 - $posts = $this->wordpress->getWpQuery()->get_posts();
271 + $posts = (array)$this->wordpress->getWpQuery()->get_posts();
180 272
181 273 foreach ($posts as $post) {
182 274 if ($this->accessHandler->checkObjectAccess($post->post_type, $post->ID)) {
183 275 return;
@@ -188,17 +280,18 @@
188 280 $url = $this->getRedirectUrlAndPermalink($permalink);
189 281 $currentUrl = $this->util->getCurrentUrl();
190 282
191 283 if ($url !== null && $url !== $currentUrl && $permalink !== $currentUrl) {
192 - if ($this->mainConfig->appendRedirectToParameter() === true) {
193 - $url = $this->wordpress->addQueryArg([self::REDIRECT_TO_PARAMETER => $currentUrl], $url);
194 - }
195 -
196 284 $this->wordpress->wpRedirect($url);
197 285 $this->php->callExit();
198 286 }
199 287 }
200 288
289 + /**
290 + * Returns the post id by the post name.
291 + * @param string $name
292 + * @return int
293 + */
201 294 private function getPostIdByName(string $name): int
202 295 {
203 296 $postableTypes = implode('\',\'', $this->objectHandler->getPostTypes());
204 297
@@ -205,9 +298,9 @@
205 298 $query = $this->database->prepare(
206 299 "SELECT ID
207 300 FROM {$this->database->getPostsTable()}
208 301 WHERE post_name = %s
209 - AND post_type IN ('$postableTypes')",
302 + AND post_type IN ('{$postableTypes}')",
210 303 $name
211 304 );
212 305
213 306 return (int) $this->database->getVariable($query);
@@ -212,9 +305,15 @@
212 305
213 306 return (int) $this->database->getVariable($query);
214 307 }
215 308
216 - private function extractObjectTypeAndId(mixed $pageParams, ?string &$objectType, int|string|null &$objectId): void
309 + /**
310 + * Extracts the object type and id.
311 + * @param object $pageParams
312 + * @param null|string $objectType
313 + * @param null|int|string $objectId
314 + */
315 + private function extractObjectTypeAndId(object $pageParams, ?string &$objectType, ?string &$objectId)
217 316 {
218 317 $objectType = null;
219 318 $objectId = null;
220 319
@@ -244,11 +343,15 @@
244 343 }
245 344 }
246 345
247 346 /**
347 + * Redirects to a page or to content.
348 + * @param array $headers The headers which are given from wordpress.
349 + * @param object $pageParams The params of the current page.
350 + * @return array
248 351 * @throws UserGroupTypeException
249 352 */
250 - public function redirect(?array $headers, mixed $pageParams): ?array
353 + public function redirect(array $headers, object $pageParams): array
251 354 {
252 355 $fileUrl = $this->getRequestParameter('uamgetfile');
253 356 $fileType = $this->getRequestParameter('uamfiletype');
254 357
@@ -266,9 +369,15 @@
266 369
267 370 return $headers;
268 371 }
269 372
270 - public function getFileUrl(string $url, int|string|null $id): string
373 + /**
374 + * Returns the url for a locked file.
375 + * @param string $url The base url.
376 + * @param int|string $id The id of the file.
377 + * @return string
378 + */
379 + public function getFileUrl(string $url, $id): string
271 380 {
272 381 // Nginx always supports real urls so we need the new urls only
273 382 // if we don't use nginx and mod_rewrite is disabled
274 383 if ($this->mainConfig->lockFile() === true
@@ -276,9 +385,9 @@
276 385 && $this->wordpress->gotModRewrite() === false
277 386 ) {
278 387 $post = $this->objectHandler->getPost($id);
279 388
280 - if ($post !== false) {
389 + if ($post !== null) {
281 390 $type = explode('/', $post->post_mime_type);
282 391 $type = $type[1] ?? $type[0];
283 392
284 393 $lockedFileTypes = $this->mainConfig->getLockedFiles();
@@ -292,8 +401,14 @@
292 401
293 402 return $url;
294 403 }
295 404
405 + /**
406 + * Caches the urls for the post for a later lookup.
407 + * @param string $url The url of the post.
408 + * @param object $post The post object.
409 + * @return string
410 + */
296 411 public function cachePostLinks(string $url, object $post): string
297 412 {
298 413 $postUrls = (array) $this->cache->getFromRuntimeCache(self::POST_URL_CACHE_KEY);
299 414 $postUrls[$url] = $post->ID;
@@ -300,10 +415,12 @@
300 415 $this->cache->addToRuntimeCache(self::POST_URL_CACHE_KEY, $postUrls);
301 416 return $url;
302 417 }
303 418
304 - #[NoReturn]
305 - public function testXSendFile(): void
419 + /**
420 + * Tries to load the file via x send file
421 + */
422 + public function testXSendFile()
306 423 {
307 424 $this->fileHandler->deliverXSendFileTestFile();
308 425 }
309 426 }