Ensure that all LDAP conditions escape attribute values

Closes https://github.com/keycloak/keycloak/issues/24767

Signed-off-by: rmartinc <rmartinc@redhat.com>
This commit is contained in:
rmartinc 2023-11-14 10:12:10 +01:00 committed by Bruno Oliveira da Silva
parent 860978b15a
commit c8009b4627
7 changed files with 20 additions and 68 deletions

View file

@ -17,10 +17,6 @@
package org.keycloak.storage.ldap.idm.query.internal; package org.keycloak.storage.ldap.idm.query.internal;
import org.keycloak.storage.ldap.idm.store.ldap.LDAPUtil;
import java.util.Date;
/** /**
* @author Pedro Igor * @author Pedro Igor
*/ */
@ -37,17 +33,6 @@ class BetweenCondition extends NamedParameterCondition {
@Override @Override
public void applyCondition(StringBuilder filter) { public void applyCondition(StringBuilder filter) {
Comparable x = this.x; filter.append("(").append(escapeValue(x)).append("<=").append(getParameterName()).append("<=").append(escapeValue(y)).append(")");
Comparable y = this.y;
if (Date.class.isInstance(x)) {
x = LDAPUtil.formatDate((Date) x);
}
if (Date.class.isInstance(y)) {
y = LDAPUtil.formatDate((Date) y);
}
filter.append("(").append(x).append("<=").append(getParameterName()).append("<=").append(y).append(")");
} }
} }

View file

@ -19,9 +19,6 @@ package org.keycloak.storage.ldap.idm.query.internal;
import org.keycloak.models.LDAPConstants; import org.keycloak.models.LDAPConstants;
import org.keycloak.storage.ldap.idm.query.EscapeStrategy; import org.keycloak.storage.ldap.idm.query.EscapeStrategy;
import org.keycloak.storage.ldap.idm.store.ldap.LDAPUtil;
import java.util.Date;
/** /**
* @author Pedro Igor * @author Pedro Igor
@ -51,14 +48,7 @@ public class EqualCondition extends NamedParameterCondition {
@Override @Override
public void applyCondition(StringBuilder filter) { public void applyCondition(StringBuilder filter) {
Object parameterValue = value; filter.append("(").append(getParameterName()).append(LDAPConstants.EQUAL).append(escapeValue(value, escapeStrategy)).append(")");
if (Date.class.isInstance(value)) {
parameterValue = LDAPUtil.formatDate((Date) parameterValue);
}
String escaped = new OctetStringEncoder(escapeStrategy).encode(parameterValue, isBinary());
filter.append("(").append(getParameterName()).append(LDAPConstants.EQUAL).append(escaped).append(")");
} }
@Override @Override

View file

@ -17,10 +17,6 @@
package org.keycloak.storage.ldap.idm.query.internal; package org.keycloak.storage.ldap.idm.query.internal;
import org.keycloak.storage.ldap.idm.store.ldap.LDAPUtil;
import java.util.Date;
/** /**
* @author Pedro Igor * @author Pedro Igor
*/ */
@ -38,17 +34,7 @@ class GreaterThanCondition extends NamedParameterCondition {
@Override @Override
public void applyCondition(StringBuilder filter) { public void applyCondition(StringBuilder filter) {
Comparable parameterValue = value; filter.append("(").append(getParameterName()).append(orEqual? ">=" : ">").append(escapeValue(value)).append(")");
if (Date.class.isInstance(parameterValue)) {
parameterValue = LDAPUtil.formatDate((Date) parameterValue);
}
if (orEqual) {
filter.append("(").append(getParameterName()).append(">=").append(parameterValue).append(")");
} else {
filter.append("(").append(getParameterName()).append(">").append(parameterValue).append(")");
}
} }
@Override @Override

View file

@ -36,10 +36,8 @@ class InCondition extends NamedParameterCondition {
filter.append("(&("); filter.append("(&(");
for (int i = 0; i< valuesToCompare.length; i++) { for (Object value : valuesToCompare) {
Object value = new OctetStringEncoder().encode(valuesToCompare[i], isBinary()); filter.append("(").append(getParameterName()).append(LDAPConstants.EQUAL).append(escapeValue(value)).append(")");
filter.append("(").append(getParameterName()).append(LDAPConstants.EQUAL).append(value).append(")");
} }
filter.append("))"); filter.append("))");

View file

@ -17,10 +17,6 @@
package org.keycloak.storage.ldap.idm.query.internal; package org.keycloak.storage.ldap.idm.query.internal;
import org.keycloak.storage.ldap.idm.store.ldap.LDAPUtil;
import java.util.Date;
/** /**
* @author Pedro Igor * @author Pedro Igor
*/ */
@ -38,16 +34,6 @@ class LessThanCondition extends NamedParameterCondition {
@Override @Override
public void applyCondition(StringBuilder filter) { public void applyCondition(StringBuilder filter) {
Comparable parameterValue = value; filter.append("(").append(getParameterName()).append(orEqual? "<=" : "<").append(escapeValue(value)).append(")");
if (Date.class.isInstance(parameterValue)) {
parameterValue = LDAPUtil.formatDate((Date) parameterValue);
}
if (orEqual) {
filter.append("(").append(getParameterName()).append("<=").append(parameterValue).append(")");
} else {
filter.append("(").append(getParameterName()).append("<").append(parameterValue).append(")");
}
} }
} }

View file

@ -17,7 +17,10 @@
package org.keycloak.storage.ldap.idm.query.internal; package org.keycloak.storage.ldap.idm.query.internal;
import java.util.Date;
import org.keycloak.storage.ldap.idm.query.Condition; import org.keycloak.storage.ldap.idm.query.Condition;
import org.keycloak.storage.ldap.idm.query.EscapeStrategy;
import org.keycloak.storage.ldap.idm.store.ldap.LDAPUtil;
/** /**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@ -58,4 +61,15 @@ public abstract class NamedParameterCondition implements Condition {
public boolean isBinary() { public boolean isBinary() {
return binary; return binary;
} }
public String escapeValue(Object value) {
return escapeValue(value, EscapeStrategy.DEFAULT);
}
public String escapeValue(Object value, EscapeStrategy strategy) {
if (Date.class.isInstance(value)) {
value = LDAPUtil.formatDate((Date) value);
}
return new OctetStringEncoder(strategy).encode(value, isBinary());
}
} }

View file

@ -6,15 +6,10 @@ class OctetStringEncoder {
private final EscapeStrategy fallback; private final EscapeStrategy fallback;
OctetStringEncoder() {
this(null);
}
OctetStringEncoder(EscapeStrategy fallback) { OctetStringEncoder(EscapeStrategy fallback) {
this.fallback = fallback; this.fallback = fallback;
} }
public String encode(Object parameterValue, boolean isBinary) { public String encode(Object parameterValue, boolean isBinary) {
String escaped; String escaped;
if (parameterValue instanceof byte[]) { if (parameterValue instanceof byte[]) {
@ -30,8 +25,6 @@ class OctetStringEncoder {
String stringValue = parameterValue.toString(); String stringValue = parameterValue.toString();
if (isBinary) { if (isBinary) {
escaped = EscapeStrategy.OCTET_STRING.escape(stringValue); escaped = EscapeStrategy.OCTET_STRING.escape(stringValue);
} else if (fallback == null){
escaped = stringValue;
} else { } else {
escaped = fallback.escape(stringValue); escaped = fallback.escape(stringValue);
} }