@@ -92,28 +92,27 @@ public function handle(Request $request): ResponseInterface
92
92
$ actor = RequestUtil::getActor ($ request );
93
93
$ base = $ this ->url ->to ('forum ' )->base ();
94
94
95
- $ sanitizedUrl = $ this ->sanitizeReturnUrl ((string ) Arr::get ($ request ->getQueryParams (), 'return ' , $ base ));
95
+ $ rurl = (string ) Arr::get ($ request ->getQueryParams (), 'return ' );
96
+ $ return = $ this ->sanitizeReturnUrl ($ rurl , $ base );
96
97
97
- // If there is no user logged in, return to the index.
98
+ // If there is no user logged in, return to the index or the return url if it's set .
98
99
if ($ actor ->isGuest ()) {
99
- return new RedirectResponse (empty ( $ sanitizedUrl ) ? $ base : $ sanitizedUrl );
100
+ return new RedirectResponse ($ return );
100
101
}
101
102
102
103
// If a valid CSRF token hasn't been provided, show a view which will
103
104
// allow the user to press a button to complete the log out process.
104
105
$ csrfToken = $ session ->token ();
105
106
106
107
if (Arr::get ($ request ->getQueryParams (), 'token ' ) !== $ csrfToken ) {
107
- $ return = $ this ->sanitizeReturnUrl ($ request ->getQueryParams ()['return ' ] ?? $ base );
108
-
109
108
$ view = $ this ->view ->make ('flarum.forum::log-out ' )
110
109
->with ('url ' , $ this ->url ->to ('forum ' )->route ('logout ' ) . '?token= ' . $ csrfToken . ($ return ? '&return= ' . urlencode ($ return ) : '' ));
111
110
112
111
return new HtmlResponse ($ view ->render ());
113
112
}
114
113
115
114
$ accessToken = $ session ->get ('access_token ' );
116
- $ response = new RedirectResponse ($ sanitizedUrl );
115
+ $ response = new RedirectResponse ($ return );
117
116
118
117
$ this ->authenticator ->logOut ($ session );
119
118
@@ -124,12 +123,16 @@ public function handle(Request $request): ResponseInterface
124
123
return $ this ->rememberer ->forget ($ response );
125
124
}
126
125
127
- protected function sanitizeReturnUrl (string $ url ): string
126
+ protected function sanitizeReturnUrl (string $ url, string $ base ): string
128
127
{
128
+ if (empty ($ url )) {
129
+ return $ base ; // Return base URL for empty return URL
130
+ }
131
+
129
132
$ parsed = parse_url ($ url );
130
133
131
134
if (!$ parsed || !isset ($ parsed ['host ' ])) {
132
- return '' ; // Return early for invalid URLs
135
+ return $ base ; // Return early for invalid URLs
133
136
}
134
137
135
138
$ host = $ parsed ['host ' ];
@@ -138,13 +141,19 @@ protected function sanitizeReturnUrl(string $url): string
138
141
return $ url ;
139
142
}
140
143
141
- return '' ; // Return empty string for non-whitelisted domains
144
+ return $ base ; // Return base url for non-whitelisted domains
142
145
}
143
146
144
147
protected function getWhitelistedRedirectDomains (): array
145
148
{
149
+ $ forumUrl = $ this ->config ->url ();
150
+ $ parsedForumUrl = parse_url ($ forumUrl );
151
+
152
+ // Extract the host from the parsed forum URL
153
+ $ forumHost = isset ($ parsedForumUrl ['host ' ]) ? $ parsedForumUrl ['host ' ] : '' ;
154
+
146
155
return array_merge (
147
- [$ this -> config -> url () ],
156
+ [$ forumHost ],
148
157
$ this ->config ->offsetGet ('redirectDomains ' ) ?? []
149
158
);
150
159
}
0 commit comments