diff --git a/src/Control/Director.php b/src/Control/Director.php index 8c749d1f1..32e6fdf4e 100644 --- a/src/Control/Director.php +++ b/src/Control/Director.php @@ -345,7 +345,7 @@ class Director implements TemplateGlobalProvider $handler = function () use ($arguments) { // Redirection $response = new HTTPResponse(); - $response->redirect(static::absoluteURL($arguments['Redirect'])); + $response->redirect(static::absoluteUrl((string) $arguments['Redirect'])); return $response; }; break; diff --git a/src/Control/HTTP.php b/src/Control/HTTP.php index 1d3f25daa..4ccf5d7b7 100644 --- a/src/Control/HTTP.php +++ b/src/Control/HTTP.php @@ -70,7 +70,7 @@ class HTTP if (preg_match('/^\w+:/', $url ?? '')) { return $url; } - return Director::absoluteURL($url); + return Director::absoluteURL((string) $url); }); } @@ -87,8 +87,8 @@ class HTTP * As of 3.2 $code should be a callable which takes a single parameter and returns the rewritten, * for example: * - * function($url) { - * return Director::absoluteURL($url, true); + * function(string $url) { + * return Director::absoluteURL((string) $url, true); * } * * diff --git a/src/Control/HTTPResponse.php b/src/Control/HTTPResponse.php index 502d5fbaf..b4fd1e638 100644 --- a/src/Control/HTTPResponse.php +++ b/src/Control/HTTPResponse.php @@ -346,7 +346,7 @@ class HTTPResponse { $headersSent = headers_sent($file, $line); $location = $this->getHeader('location'); - $url = Director::absoluteURL($location); + $url = Director::absoluteURL((string) $location); $urlATT = Convert::raw2htmlatt($url); $urlJS = Convert::raw2js($url); $title = (Director::isDev() && $headersSent) diff --git a/src/Control/RSS/RSSFeed.php b/src/Control/RSS/RSSFeed.php index 5ab5eae9b..597a1f09a 100644 --- a/src/Control/RSS/RSSFeed.php +++ b/src/Control/RSS/RSSFeed.php @@ -199,7 +199,7 @@ class RSSFeed extends ViewableData */ public function Link($action = null) { - return Controller::join_links(Director::absoluteURL($this->link), $action); + return Controller::join_links(Director::absoluteURL((string) $this->link), $action); } /** diff --git a/src/Control/RSS/RSSFeed_Entry.php b/src/Control/RSS/RSSFeed_Entry.php index 2ae7099c2..5713b8402 100644 --- a/src/Control/RSS/RSSFeed_Entry.php +++ b/src/Control/RSS/RSSFeed_Entry.php @@ -125,7 +125,7 @@ class RSSFeed_Entry extends ViewableData return $this->failover->AbsoluteLink(); } else { if ($this->failover->hasMethod('Link')) { - return Director::absoluteURL($this->failover->Link()); + return Director::absoluteURL((string) $this->failover->Link()); } } diff --git a/src/Control/RequestHandler.php b/src/Control/RequestHandler.php index 76e3580ae..2052b01ba 100644 --- a/src/Control/RequestHandler.php +++ b/src/Control/RequestHandler.php @@ -658,7 +658,7 @@ class RequestHandler extends ViewableData ?: Director::baseURL(); // Only direct to absolute urls - $url = Director::absoluteURL($url); + $url = Director::absoluteURL((string) $url); return $this->redirect($url); } } diff --git a/src/Forms/HTMLEditor/TinyMCEConfig.php b/src/Forms/HTMLEditor/TinyMCEConfig.php index 2b893d367..80379fc50 100644 --- a/src/Forms/HTMLEditor/TinyMCEConfig.php +++ b/src/Forms/HTMLEditor/TinyMCEConfig.php @@ -675,7 +675,7 @@ class TinyMCEConfig extends HTMLEditorConfig implements i18nEntityProvider ); } elseif (!Director::is_absolute_url($path)) { // Non-absolute urls are made absolute - $path = Director::absoluteURL($path); + $path = Director::absoluteURL((string) $path); } $plugins[$plugin] = $path; } diff --git a/src/ORM/DatabaseAdmin.php b/src/ORM/DatabaseAdmin.php index 07bbce20c..698fe6d3f 100644 --- a/src/ORM/DatabaseAdmin.php +++ b/src/ORM/DatabaseAdmin.php @@ -167,7 +167,7 @@ class DatabaseAdmin extends Controller } // Convert to absolute URL - return Director::absoluteURL($url, true); + return Director::absoluteURL((string) $url, true); } /** diff --git a/src/Security/PasswordExpirationMiddleware.php b/src/Security/PasswordExpirationMiddleware.php index 6211c5706..3c6aad33d 100644 --- a/src/Security/PasswordExpirationMiddleware.php +++ b/src/Security/PasswordExpirationMiddleware.php @@ -135,7 +135,7 @@ class PasswordExpirationMiddleware implements HTTPMiddleware $defaultRedirectUrl = static::config()->get('default_redirect'); if ($sessionRedirectUrl || $defaultRedirectUrl) { - $redirectUrl = $this->absoluteUrl($sessionRedirectUrl ?? $defaultRedirectUrl); + $redirectUrl = $this->absoluteUrl((string) ($sessionRedirectUrl ?? $defaultRedirectUrl)); } else { $redirectUrl = null; } @@ -153,7 +153,7 @@ class PasswordExpirationMiddleware implements HTTPMiddleware $allowedStartswith = static::config()->get('whitelisted_url_startswith'); if (is_array($allowedStartswith)) { foreach ($allowedStartswith as $pattern) { - $startswith = $this->absoluteUrl($pattern); + $startswith = $this->absoluteUrl((string) $pattern); if (strncmp($currentUrl ?? '', $startswith ?? '', strlen($startswith ?? '')) === 0) { return null; @@ -178,7 +178,7 @@ class PasswordExpirationMiddleware implements HTTPMiddleware // add BASE_URL explicitly if not absolute $url = Controller::join_links(Director::absoluteBaseURL(), $url); } else { - $url = Director::absoluteURL($url) ?: Controller::join_links(Director::absoluteBaseURL(), $url); + $url = Director::absoluteURL((string) $url) ?: Controller::join_links(Director::absoluteBaseURL(), $url); } if (substr($url ?? '', -1) === '/') { diff --git a/tests/php/Security/SecurityTest.php b/tests/php/Security/SecurityTest.php index e094f5747..8ab99e0cc 100644 --- a/tests/php/Security/SecurityTest.php +++ b/tests/php/Security/SecurityTest.php @@ -447,7 +447,7 @@ class SecurityTest extends FunctionalTest $this->assertEquals(302, $expiredResponse->getStatusCode()); $this->assertEquals( Director::absoluteURL('Security/changepassword') . '?BackURL=test%2Flink', - Director::absoluteURL($expiredResponse->getHeader('Location')) + Director::absoluteURL((string) $expiredResponse->getHeader('Location')) ); $this->assertEquals( $this->idFromFixture(Member::class, 'expiredpassword'), @@ -517,9 +517,8 @@ class SecurityTest extends FunctionalTest $this->assertEquals(302, $response->getStatusCode()); $this->assertEquals( Director::absoluteURL('Security/changepassword'), - Director::absoluteURL($response->getHeader('Location')) + Director::absoluteURL((string) $response->getHeader('Location')) ); - // Follow redirection to form without hash in GET parameter $this->get('Security/changepassword'); $this->doTestChangepasswordForm('1nitialPassword', 'changedPassword#123');