| | |
| | | logger.debug("No Redirect URIs supplied"); |
| | | redirectUri = null; |
| | | } else { |
| | | URI originalRedirect = toUri(redirectUri); |
| | | if (originalRedirect == null) { |
| | | // invalid URI passed as redirectUri |
| | | return null; |
| | | } |
| | | |
| | | // Make the validations against fully decoded and normalized redirect-url. This also allows wildcards (case when client configured "Valid redirect-urls" contain wildcards) |
| | | String decodedRedirectUri = decodeRedirectUri(redirectUri); |
| | | URI decodedRedirect = toUri(decodedRedirectUri); |
| | |
| | | } |
| | | |
| | | // Return the original redirectUri, which can be partially encoded - for example http://localhost:8280/foo/bar%20bar%2092%2F72/3 . Just make sure it is normalized |
| | | URI redirect = toUri(redirectUri); |
| | | redirectUri = getNormalizedRedirectUri(redirect); |
| | | redirectUri = getNormalizedRedirectUri(originalRedirect); |
| | | |
| | | // We try to check validity also for original (encoded) redirectUrl, but just in case it exactly matches some "Valid Redirect URL" specified for client (not wildcards allowed) |
| | | if (valid == null) { |
| | |
| | | int MAX_DECODING_COUNT = 5; // Max count of attempts for decoding URL (in case it was encoded multiple times) |
| | | |
| | | try { |
| | | KeycloakUriBuilder uriBuilder = KeycloakUriBuilder.fromUri(redirectUri).preserveDefaultPort(); |
| | | KeycloakUriBuilder uriBuilder = KeycloakUriBuilder.fromUri(redirectUri, false).preserveDefaultPort(); |
| | | String origQuery = uriBuilder.getQuery(); |
| | | String origFragment = uriBuilder.getFragment(); |
| | | String encodedRedirectUri = uriBuilder |
| | |
| | | decodedRedirectUri = Encode.decode(encodedRedirectUri); |
| | | if (decodedRedirectUri.equals(encodedRedirectUri)) { |
| | | // URL is decoded. We can return it (after attach original query and fragment) |
| | | return KeycloakUriBuilder.fromUri(decodedRedirectUri).preserveDefaultPort() |
| | | return KeycloakUriBuilder.fromUri(decodedRedirectUri, false).preserveDefaultPort() |
| | | .replaceQuery(origQuery) |
| | | .fragment(origFragment) |
| | | .buildAsString(); |