diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/AbstractDbEncrypt.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/AbstractDbEncrypt.java index be2c0941e..6f8e27556 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/AbstractDbEncrypt.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/AbstractDbEncrypt.java @@ -9,9 +9,6 @@ import java.sql.Types; * functions for varchar, date and timestamp. If they are left null then that is * treated as though that data type can not be encrypted in the DB and will * instead use java client encryption. - *

- * - * @author rbygrave */ public abstract class AbstractDbEncrypt implements DbEncrypt { @@ -47,13 +44,10 @@ public abstract class AbstractDbEncrypt implements DbEncrypt { case Types.CHAR: case Types.LONGVARCHAR: return varcharEncryptFunction; - case Types.DATE: return dateEncryptFunction; - case Types.TIMESTAMP: return timestampEncryptFunction; - default: return null; } diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2DbEncrypt.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2DbEncrypt.java index ec7b1d9a7..f3eeeffa0 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2DbEncrypt.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2DbEncrypt.java @@ -5,8 +5,6 @@ import io.ebean.config.dbplatform.DbEncryptFunction; /** * H2 encryption support via encrypt decrypt function. - * - * @author rbygrave */ public class H2DbEncrypt extends AbstractDbEncrypt { diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/mysql/MySqlDbEncrypt.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/mysql/MySqlDbEncrypt.java index 2a22d8ab2..f8717936b 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/mysql/MySqlDbEncrypt.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/mysql/MySqlDbEncrypt.java @@ -5,8 +5,6 @@ import io.ebean.config.dbplatform.DbEncryptFunction; /** * MySql aes_encrypt aes_decrypt based encryption support. - * - * @author rbygrave */ public class MySqlDbEncrypt extends AbstractDbEncrypt { diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/OracleDbEncrypt.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/OracleDbEncrypt.java index e1194ac37..2eae251a9 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/OracleDbEncrypt.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/OracleDbEncrypt.java @@ -60,7 +60,6 @@ public class OracleDbEncrypt extends AbstractDbEncrypt { * @param decryptFunction the decrypt stored procedure */ public OracleDbEncrypt(String encryptFunction, String decryptFunction) { - this.varcharEncryptFunction = new OraVarcharFunction(encryptFunction, decryptFunction); this.dateEncryptFunction = new OraDateFunction(encryptFunction, decryptFunction); } diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerBasePlatform.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerBasePlatform.java index 8a9c5b4be..4490c148d 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerBasePlatform.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerBasePlatform.java @@ -25,6 +25,7 @@ abstract class SqlServerBasePlatform extends DatabasePlatform { this.platform = Platform.SQLSERVER; // disable persistBatchOnCascade mode for // SQL Server unless we are using sequences + this.dbEncrypt = new SqlServerDbEncrypt(); this.persistBatchOnCascade = PersistBatch.NONE; this.idInExpandedForm = true; this.selectCountWithAlias = true; diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerDbEncrypt.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerDbEncrypt.java new file mode 100644 index 000000000..5647483cd --- /dev/null +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerDbEncrypt.java @@ -0,0 +1,46 @@ +package io.ebean.config.dbplatform.sqlserver; + +import io.ebean.config.dbplatform.AbstractDbEncrypt; +import io.ebean.config.dbplatform.DbEncryptFunction; + +/** + * SQL Server EncryptByPassPhrase DecryptByPassPhrase based encryption support. + */ +public class SqlServerDbEncrypt extends AbstractDbEncrypt { + + public SqlServerDbEncrypt() { + this.varcharEncryptFunction = new VarcharFunction(); + this.dateEncryptFunction = new DateFunction(); + } + + @Override + public boolean isBindEncryptDataFirst() { + return false; + } + + private static class VarcharFunction implements DbEncryptFunction { + + @Override + public String getDecryptSql(String columnWithTableAlias) { + return "convert(nvarchar,DecryptByPassPhrase(?," + columnWithTableAlias + "))"; + } + + @Override + public String getEncryptBindSql() { + return "EncryptByPassPhrase(?,?)"; + } + } + + private static class DateFunction implements DbEncryptFunction { + + @Override + public String getDecryptSql(String columnWithTableAlias) { + return "cast(convert(nvarchar,DecryptByPassPhrase(?," + columnWithTableAlias + ")) as date)"; + } + + @Override + public String getEncryptBindSql() { + return "EncryptByPassPhrase(?,format(?,'yyyy-MM-dd'))"; + } + } +} diff --git a/ebean-core/src/test/java/org/tests/basic/encrypt/TestEncrypt.java b/ebean-core/src/test/java/org/tests/basic/encrypt/TestEncrypt.java index 80b4c9061..fb80fcabb 100644 --- a/ebean-core/src/test/java/org/tests/basic/encrypt/TestEncrypt.java +++ b/ebean-core/src/test/java/org/tests/basic/encrypt/TestEncrypt.java @@ -22,7 +22,7 @@ public class TestEncrypt extends BaseTestCase { @Test - @ForPlatform(Platform.H2) // only run this on H2 - PGCrypto not happy on CI server + @ForPlatform({Platform.H2, Platform.SQLSERVER}) // only run this on H2 - PGCrypto not happy on CI server public void testQueryBind() { LoggedSqlCollector.start(); @@ -36,7 +36,7 @@ public class TestEncrypt extends BaseTestCase { } @Test - @ForPlatform(Platform.H2) // only run this on H2 - PGCrypto not happy on CI server + @ForPlatform({Platform.H2, Platform.SQLSERVER}) // only run this on H2 - PGCrypto not happy on CI server public void testQueryJoin() { LoggedSqlCollector.start(); @@ -99,7 +99,7 @@ public class TestEncrypt extends BaseTestCase { } @Test - @ForPlatform(Platform.H2) + @ForPlatform({Platform.H2, Platform.SQLSERVER}) public void test() { DB.find(EBasicEncrypt.class).delete(); diff --git a/ebean-core/src/test/java/org/tests/model/basic/EBasicEncrypt.java b/ebean-core/src/test/java/org/tests/model/basic/EBasicEncrypt.java index 859212781..31cbcab7a 100644 --- a/ebean-core/src/test/java/org/tests/model/basic/EBasicEncrypt.java +++ b/ebean-core/src/test/java/org/tests/model/basic/EBasicEncrypt.java @@ -28,7 +28,7 @@ public class EBasicEncrypt { @Encrypted(dbLength = 80) String description; - @Encrypted(dbLength = 20) + @Encrypted(dbLength = 80) Date dob; @Enumerated(EnumType.ORDINAL)