diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java index be113e7a5..36b0260d0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java @@ -3,6 +3,7 @@ package io.ebeaninternal.server.expression; import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; +import io.ebeaninternal.server.el.ElPropertyValue; import java.io.IOException; @@ -34,13 +35,24 @@ final class BetweenExpression extends AbstractExpression { @Override public void addBindValues(SpiExpressionRequest request) { + ElPropertyValue prop = getElProp(request); + if (prop != null && prop.isDbEncrypted()) { + // bind the key as well as the value + String encryptKey = prop.beanProperty().encryptKey().getStringValue(); + request.addBindEncryptKey(encryptKey); + } request.addBindValue(low()); request.addBindValue(high()); } @Override public void addSql(SpiExpressionRequest request) { - request.append(propName).append(_BETWEEN); + String pname = propName; + ElPropertyValue prop = getElProp(request); + if (prop != null && prop.isDbEncrypted()) { + pname = prop.beanProperty().decryptProperty(propName); + } + request.append(pname).append(_BETWEEN); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java index 8bcdb12a8..b0d2522c4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java @@ -3,6 +3,7 @@ package io.ebeaninternal.server.expression; import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; +import io.ebeaninternal.server.el.ElPropertyValue; import java.io.IOException; @@ -32,13 +33,29 @@ final class InRangeExpression extends AbstractExpression { @Override public void addBindValues(SpiExpressionRequest request) { + ElPropertyValue prop = getElProp(request); + if (prop != null && prop.isDbEncrypted()) { + // bind the key twice, for both values + String encryptKey = prop.beanProperty().encryptKey().getStringValue(); + request.addBindEncryptKey(encryptKey); + request.addBindValue(low()); + request.addBindEncryptKey(encryptKey); + request.addBindValue(high()); + return; + } request.addBindValue(low()); request.addBindValue(high()); + } @Override public void addSql(SpiExpressionRequest request) { - request.append("(").append(propName).append(" >= ? and ").append(propName).append(" < ?)"); + String pname = propName; + ElPropertyValue prop = getElProp(request); + if (prop != null && prop.isDbEncrypted()) { + pname = prop.beanProperty().decryptProperty(propName); + } + request.append("(").append(pname).append(" >= ? and ").append(pname).append(" < ?)"); } @Override diff --git a/ebean-test/src/test/java/org/tests/basic/encrypt/TestEncrypt.java b/ebean-test/src/test/java/org/tests/basic/encrypt/TestEncrypt.java index a0f48a5ed..d9bf77e48 100644 --- a/ebean-test/src/test/java/org/tests/basic/encrypt/TestEncrypt.java +++ b/ebean-test/src/test/java/org/tests/basic/encrypt/TestEncrypt.java @@ -1,13 +1,13 @@ package org.tests.basic.encrypt; -import io.ebean.xtest.BaseTestCase; import io.ebean.DB; import io.ebean.SqlRow; -import io.ebean.xtest.ForPlatform; -import io.ebean.xtest.IgnorePlatform; import io.ebean.annotation.Platform; import io.ebean.config.dbplatform.DbEncrypt; import io.ebean.test.LoggedSql; +import io.ebean.xtest.BaseTestCase; +import io.ebean.xtest.ForPlatform; +import io.ebean.xtest.IgnorePlatform; import io.ebeaninternal.api.SpiEbeanServer; import org.junit.jupiter.api.Test; import org.tests.model.basic.EBasicEncrypt; @@ -109,7 +109,8 @@ public class TestEncrypt extends BaseTestCase { EBasicEncrypt e = new EBasicEncrypt(); e.setName("testname"); e.setDescription("testdesc"); - e.setDob(new Date(System.currentTimeMillis() - 100000)); + long refTime = System.currentTimeMillis() - 100000; + e.setDob(new Date(refTime)); DB.save(e); @@ -152,6 +153,32 @@ public class TestEncrypt extends BaseTestCase { list = DB.find(EBasicEncrypt.class).where().startsWith("description", "modde").findList(); assertEquals(1, list.size()); + + // Note, we only have "date" precision (See #2878) + list = DB.find(EBasicEncrypt.class).where().between("dob", + new Date(refTime - 2 * 86400000), new Date(refTime - 1 * 86400000)).findList(); + + assertEquals(0, list.size()); + + list = DB.find(EBasicEncrypt.class).where().inRange("dob", + new Date(refTime - 2 * 86400000), new Date(refTime - 1 * 86400000)).findList(); + + assertEquals(0, list.size()); + + list = DB.find(EBasicEncrypt.class).where().between("dob", + new Date(refTime - 2 * 86400000), new Date(refTime + 1 * 86400000)).findList(); + + assertEquals(1, list.size()); + + list = DB.find(EBasicEncrypt.class).where().inRange("dob", + new Date(refTime - 2 * 86400000), new Date(refTime + 1 * 86400000)).findList(); + + assertEquals(1, list.size()); + + + //list = DB.find(EBasicEncrypt.class).where().inRange("dob", new Date(refTime), new Date(refTime+1)).findList(); + + //assertEquals(1, list.size()); } }