PluginProbe
User Access Manager / 2.3.2
User Access Manager v2.3.2
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 +33 -117 2.3.182.3.2 View file →
@@ -9,13 +9,12 @@
9 9 use UserAccessManager\Cache\Cache;
10 10 use UserAccessManager\Config\MainConfig;
11 11 use UserAccessManager\Config\WordpressConfig;
12 12 use UserAccessManager\Controller\Controller;
13 -use UserAccessManager\Controller\Frontend\Authentication\LoginControllerTrait;
14 13 use UserAccessManager\Database\Database;
15 14 use UserAccessManager\File\FileHandler;
16 -use UserAccessManager\File\Delivery\FileObject;
17 -use UserAccessManager\File\Delivery\FileObjectFactory;
15 +use UserAccessManager\File\FileObject;
16 +use UserAccessManager\File\FileObjectFactory;
18 17 use UserAccessManager\Object\ObjectHandler;
19 18 use UserAccessManager\UserGroup\UserGroupTypeException;
20 19 use UserAccessManager\Util\Util;
21 20 use UserAccessManager\Wrapper\Php;
@@ -25,9 +24,8 @@
25 24 {
26 25 use LoginControllerTrait;
27 26
28 27 public const POST_URL_CACHE_KEY = 'PostUrls';
29 - public const REDIRECT_TO_PARAMETER = 'redirect_to';
30 28
31 29 public function __construct(
32 30 Php $php,
33 31 Wordpress $wordpress,
@@ -74,123 +72,48 @@
74 72
75 73 return $postUrls[$url];
76 74 }
77 75
78 - private function normalizeAttachmentUrl(array $uploadDirs, string $objectUrl): string
76 + private function getFileSettingsByType(string $objectType, string $objectUrl): ?FileObject
79 77 {
80 - $uploadDir = str_replace(ABSPATH, '/', $uploadDirs['basedir']);
81 - $regex = '/.*' . str_replace('/', '\/', $uploadDir) . '\//i';
82 - $cleanObjectUrl = preg_replace($regex, '', $objectUrl);
83 - $uploadUrl = str_replace('/files', $uploadDir, $uploadDirs['baseurl']);
78 + $fileObject = null;
84 79
85 - return rtrim($uploadUrl, '/') . '/' . ltrim($cleanObjectUrl, '/');
86 - }
80 + if ($objectType === ObjectHandler::ATTACHMENT_OBJECT_TYPE) {
81 + $uploadDirs = $this->wordpress->getUploadDir();
82 + $uploadDir = str_replace(ABSPATH, '/', $uploadDirs['basedir']);
83 + $regex = '/.*' . str_replace('/', '\/', $uploadDir) . '\//i';
84 + $cleanObjectUrl = preg_replace($regex, '', $objectUrl);
85 + $uploadUrl = str_replace('/files', $uploadDir, $uploadDirs['baseurl']);
86 + $objectUrl = rtrim($uploadUrl, '/') . '/' . ltrim($cleanObjectUrl, '/');
87 87
88 - private function isRegisteredSize(int $attachmentId, string $fileName): bool
89 - {
90 - $metaData = $this->wordpress->getAttachmentMetadata($attachmentId);
91 - $sizes = is_array($metaData) === true ? (array) ($metaData['sizes'] ?? []) : [];
88 + $post = $this->objectHandler->getPost($this->getPostIdByUrl($objectUrl));
89 + $postType = $post->post_type ?? '';
92 90
93 - return in_array($fileName, array_column($sizes, 'file'), true);
94 - }
91 + if ($postType === ObjectHandler::ATTACHMENT_OBJECT_TYPE) {
92 + $multiPath = str_replace('/files', $uploadDir, $uploadDirs['baseurl']);
95 93
96 - /**
97 - * Returns the file the request asks for and tells through $isImage whether it can be shown as image.
98 - * A requested generated size is only used if it is registered at the attachment and stored inside the
99 - * upload directory, so no arbitrary and no missing file becomes reachable. Generated sizes are always
100 - * images, also for documents like PDFs, where they are the preview images shown in the media library.
101 - */
102 - private function getAttachmentFile(
103 - int $attachmentId,
104 - string $attachedFile,
105 - string $requestedUrl,
106 - string $uploadBaseDir,
107 - ?bool &$isImage
108 - ): string {
109 - $requestedFileName = basename((string) parse_url($requestedUrl, PHP_URL_PATH));
110 - $sizeFile = dirname($attachedFile) . DIRECTORY_SEPARATOR . $requestedFileName;
94 + $fileObject = $this->fileObjectFactory->createFileObject(
95 + $post->ID,
96 + $objectType,
97 + $uploadDirs['basedir'] . str_replace($multiPath, '', $objectUrl),
98 + $this->wordpress->attachmentIsImage($post->ID)
99 + );
100 + }
101 + } else {
102 + $extraParameter = $this->getRequestParameter('uamextra');
111 103
112 - if ($requestedFileName !== basename($attachedFile)
113 - && $this->isRegisteredSize($attachmentId, $requestedFileName) === true
114 - && $this->isInsideUploadDirectory($sizeFile, $uploadBaseDir) === true
115 - ) {
116 - $isImage = true;
117 -
118 - return $sizeFile;
104 + $fileObject = $this->wordpress->applyFilters(
105 + 'uam_get_file_settings_by_type',
106 + $fileObject,
107 + $objectType,
108 + $objectUrl,
109 + $extraParameter
110 + );
119 111 }
120 112
121 - $isImage = $this->wordpress->attachmentIsImage($attachmentId);
122 -
123 - return $attachedFile;
113 + return $fileObject;
124 114 }
125 115
126 - private function getAttachmentFileObject(string $objectUrl): ?FileObject
127 - {
128 - $uploadDirs = $this->wordpress->getUploadDir();
129 - $requestedUrl = $this->normalizeAttachmentUrl($uploadDirs, $objectUrl);
130 - $postId = $this->getPostIdByUrl($requestedUrl);
131 -
132 - if ($postId < 1) {
133 - return null;
134 - }
135 -
136 - $post = $this->objectHandler->getPost($postId);
137 -
138 - if (($post->post_type ?? '') !== ObjectHandler::ATTACHMENT_OBJECT_TYPE) {
139 - return null;
140 - }
141 -
142 - $attachedFile = $this->wordpress->getAttachedFile($post->ID);
143 -
144 - if ($attachedFile === false
145 - || $this->isInsideUploadDirectory($attachedFile, $uploadDirs['basedir']) === false
146 - ) {
147 - return null;
148 - }
149 -
150 - $file = $this->getAttachmentFile(
151 - $post->ID,
152 - $attachedFile,
153 - $requestedUrl,
154 - $uploadDirs['basedir'],
155 - $isImage
156 - );
157 -
158 - return $this->fileObjectFactory->createFileObject(
159 - $post->ID,
160 - ObjectHandler::ATTACHMENT_OBJECT_TYPE,
161 - $file,
162 - $isImage
163 - );
164 - }
165 -
166 - private function isInsideUploadDirectory(string $file, string $uploadBaseDir): bool
167 - {
168 - $realFile = $this->php->realpath($file);
169 - $realUploadBaseDir = $this->php->realpath($uploadBaseDir);
170 -
171 - return $realFile !== false
172 - && $realUploadBaseDir !== false
173 - && str_starts_with($realFile, $realUploadBaseDir . DIRECTORY_SEPARATOR);
174 - }
175 -
176 - private function getFileSettingsByType(string $objectType, string $objectUrl): ?FileObject
177 - {
178 - if ($objectType === ObjectHandler::ATTACHMENT_OBJECT_TYPE) {
179 - return $this->getAttachmentFileObject($objectUrl);
180 - }
181 -
182 - $extraParameter = $this->getRequestParameter('uamextra');
183 -
184 - return $this->wordpress->applyFilters(
185 - 'uam_get_file_settings_by_type',
186 - null,
187 - $objectType,
188 - $objectUrl,
189 - $extraParameter
190 - );
191 - }
192 -
193 116 /**
194 117 * @throws UserGroupTypeException
195 118 */
196 119 public function getFile(string $objectType, string $objectUrl): void
@@ -235,11 +158,8 @@
235 158 } elseif ($redirect === 'custom_url') {
236 159 $url = $this->mainConfig->getRedirectCustomUrl();
237 160 } elseif ($redirect === 'login') {
238 161 $url = $this->getLoginUrl();
239 - } elseif ($redirect === 'origin') {
240 - $referer = $this->wordpress->getReferer();
241 - $url = $referer !== false ? $referer : $this->wordpress->getHomeUrl('/');
242 162 } else {
243 163 $url = $this->wordpress->getHomeUrl('/');
244 164 }
245 165
@@ -264,12 +184,8 @@
264 184 $url = $this->getRedirectUrlAndPermalink($permalink);
265 185 $currentUrl = $this->util->getCurrentUrl();
266 186
267 187 if ($url !== null && $url !== $currentUrl && $permalink !== $currentUrl) {
268 - if ($this->mainConfig->appendRedirectToParameter() === true) {
269 - $url = $this->wordpress->addQueryArg([self::REDIRECT_TO_PARAMETER => $currentUrl], $url);
270 - }
271 -
272 188 $this->wordpress->wpRedirect($url);
273 189 $this->php->callExit();
274 190 }
275 191 }
@@ -342,9 +258,9 @@
342 258
343 259 return $headers;
344 260 }
345 261
346 - public function getFileUrl(string $url, int|string|null $id): string
262 + public function getFileUrl(string $url, int|string $id): string
347 263 {
348 264 // Nginx always supports real urls so we need the new urls only
349 265 // if we don't use nginx and mod_rewrite is disabled
350 266 if ($this->mainConfig->lockFile() === true