@@ -23,6 +23,7 @@ class ServerController extends Controller
2323{
2424 use DpopFactoryTrait;
2525
26+ public const ERROR_UNREGISTERED_URI = 'Provided redirect URI "%s" does not match any registered URIs ' ;
2627 private $ userId ;
2728
2829 /* @var IUserManager */
@@ -227,10 +228,28 @@ public function authorize() {
227228 return $ result ; // ->addHeader('Access-Control-Allow-Origin', '*');
228229 }
229230
230- $ parsedOrigin = parse_url ($ clientRegistration ['redirect_uris ' ][0 ]);
231+ if (isset ($ getVars ['redirect_uri ' ])) {
232+ $ redirectUri = $ getVars ['redirect_uri ' ];
233+ if (! isset ($ clientRegistration ['redirect_uris ' ]) || ! is_array ($ clientRegistration ['redirect_uris ' ])) {
234+ return new JSONResponse ('Invalid client registration, no redirect URIs found ' , Http::STATUS_BAD_REQUEST );
235+ }
236+
237+ $ redirectUris = $ clientRegistration ['redirect_uris ' ];
238+
239+ $ validRedirectUris = array_filter ($ redirectUris , function ($ uri ) use ($ redirectUri ) {
240+ return $ uri === $ redirectUri ;
241+ });
242+
243+ if (count ($ validRedirectUris ) === 0 ) {
244+ $ message = vsprintf (self ::ERROR_UNREGISTERED_URI , [$ redirectUri ]);
245+ return new JSONResponse ($ message , Http::STATUS_BAD_REQUEST );
246+ }
247+ }
248+
249+ $ parsedOrigin = parse_url ($ redirectUri );
231250 if (
232- $ parsedOrigin ['scheme ' ] != "https " &&
233- $ parsedOrigin ['scheme ' ] != "http " &&
251+ $ parsedOrigin ['scheme ' ] !== "https " &&
252+ $ parsedOrigin ['scheme ' ] !== "http " &&
234253 !isset ($ _GET ['customscheme ' ])
235254 ) {
236255 $ result = new JSONResponse ('Custom schema ' );
@@ -372,8 +391,8 @@ public function logout() {
372391 public function register () {
373392 $ clientData = file_get_contents ('php://input ' );
374393 $ clientData = json_decode ($ clientData , true );
375- if (!$ clientData ['redirect_uris ' ]) {
376- return new JSONResponse ("Missing redirect URIs " );
394+ if (! isset ( $ clientData ['redirect_uris ' ]) ) {
395+ return new JSONResponse ("Missing redirect URIs " , Http:: STATUS_BAD_REQUEST );
377396 }
378397 $ clientData ['client_id_issued_at ' ] = time ();
379398 $ parsedOrigin = parse_url ($ clientData ['redirect_uris ' ][0 ]);
0 commit comments