So, based on my findings on field encryption(see previous threads and issue OFBIZ-5659), I decided that doing in-place encryption in EntityExpr, against rhs, and in-place encryption on GenericEntity, really wasn't the correct approach. The following code patterns break when this is done:

==
condition = makeCondition("socialSecurityNumber", EntityOperator.EQUALS, "1234")
people = findByCondition("Person", condition)
// this second line fails, because the rhs above will get doubly encrypted.
people = findByCondition("Person", condition)

person = makeValue("Person", [partyId: "1234"])
person.firstName = "Adam"
person.socialSecurityNumber = "1234"
// this first store encrypts 1234 in-place
person.store()

person.lastName = "Heath"
// this second store encrypts the already encrypted value
person.store()
==

The first code pattern above is extremely troubling; the encryption logic, as it stood, would *modify* the incoming condition. This is so extremely bad. It could even pollute the entity caching system(!).

This fix will changes the encryptFields() and decryptFields() in delegator to be no-ops(deprecates them as well), removes all encryptConditionFields() from all conditions, and makes SqlJdbcUtil do the encrypt/decrypt phases as it's interfacing with PreparedStatement and ResultSet.

And, as a bonus, the code size is reduced.

ps: Note, that the findByCondition pattern does not work with current trunk, due to the problems outlined in OFBIZ-5659. I have it working locally, and with test cases as well.

Reply via email to