From 737535c61ebf4d2c5aa8e40b23d01f4c26423586 Mon Sep 17 00:00:00 2001
From: Stian Thorgersen <stianst@gmail.com>
Date: Wed, 19 Oct 2016 16:41:43 +0000
Subject: [PATCH] KEYCLOAK-3364 Fix for dns that ends with digit
---
src/main/java/org/keycloak/protocol/cas/utils/RedirectUtils.java | 28 ++++++++++++++--------------
1 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/src/main/java/org/keycloak/protocol/cas/utils/RedirectUtils.java b/src/main/java/org/keycloak/protocol/cas/utils/RedirectUtils.java
index 441cd57..f00b2a7 100644
--- a/src/main/java/org/keycloak/protocol/cas/utils/RedirectUtils.java
+++ b/src/main/java/org/keycloak/protocol/cas/utils/RedirectUtils.java
@@ -17,11 +17,12 @@
package org.keycloak.protocol.oidc.utils;
+import org.jboss.logging.Logger;
+import org.keycloak.common.util.UriUtils;
import org.keycloak.models.ClientModel;
import org.keycloak.models.Constants;
import org.keycloak.models.RealmModel;
import org.keycloak.services.Urls;
-import org.keycloak.services.ServicesLogger;
import javax.ws.rs.core.UriInfo;
import java.net.URI;
@@ -33,7 +34,7 @@
*/
public class RedirectUtils {
- private static final ServicesLogger logger = ServicesLogger.ROOT_LOGGER;
+ private static final Logger logger = Logger.getLogger(RedirectUtils.class);
public static String verifyRealmRedirectUri(UriInfo uriInfo, String redirectUri, RealmModel realm) {
Set<String> validRedirects = getValidateRedirectUris(uriInfo, realm);
@@ -77,7 +78,7 @@
} else {
redirectUri = lowerCaseHostname(redirectUri);
- String r = redirectUri.indexOf('?') != -1 ? redirectUri.substring(0, redirectUri.indexOf('?')) : redirectUri;
+ String r = redirectUri;
Set<String> resolveValidRedirects = resolveValidRedirects(uriInfo, rootUrl, validRedirects);
boolean valid = matchesRedirects(resolveValidRedirects, r);
@@ -121,28 +122,27 @@
private static String relativeToAbsoluteURI(UriInfo uriInfo, String rootUrl, String relative) {
if (rootUrl == null || rootUrl.isEmpty()) {
- URI baseUri = uriInfo.getBaseUri();
- String uri = baseUri.getScheme() + "://" + baseUri.getHost();
- if (baseUri.getPort() != -1) {
- uri += ":" + baseUri.getPort();
- }
- rootUrl = uri;
+ rootUrl = UriUtils.getOrigin(uriInfo.getBaseUri());
}
- relative = rootUrl + relative;
- return relative;
+ StringBuilder sb = new StringBuilder();
+ sb.append(rootUrl);
+ sb.append(relative);
+ return sb.toString();
}
private static boolean matchesRedirects(Set<String> validRedirects, String redirect) {
for (String validRedirect : validRedirects) {
- if (validRedirect.endsWith("*")) {
+ if (validRedirect.endsWith("*") && !validRedirect.contains("?")) {
+ // strip off the query component - we don't check them when wildcards are effective
+ String r = redirect.contains("?") ? redirect.substring(0, redirect.indexOf("?")) : redirect;
// strip off *
int length = validRedirect.length() - 1;
validRedirect = validRedirect.substring(0, length);
- if (redirect.startsWith(validRedirect)) return true;
+ if (r.startsWith(validRedirect)) return true;
// strip off trailing '/'
if (length - 1 > 0 && validRedirect.charAt(length - 1) == '/') length--;
validRedirect = validRedirect.substring(0, length);
- if (validRedirect.equals(redirect)) return true;
+ if (validRedirect.equals(r)) return true;
} else if (validRedirect.equals(redirect)) return true;
}
return false;
--
Gitblit v1.10.0