From 559ba38ac8f13326028fa5c29fa4b33f6d9e1ba4 Mon Sep 17 00:00:00 2001 From: Michael Reiche <48999328+mikereiche@users.noreply.github.com> Date: Thu, 12 Jun 2025 15:50:23 -0700 Subject: [PATCH] Project mangled encrypted field names. (#2058) Closes #2057. --- .../core/convert/MappingCouchbaseConverter.java | 2 +- .../repository/query/StringBasedN1qlQueryParser.java | 9 ++++++++- ...seRepositoryFieldLevelEncryptionIntegrationTests.java | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java b/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java index c5afb887..9eadad7b 100644 --- a/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java +++ b/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java @@ -1130,7 +1130,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem } } - String maybeMangle(PersistentProperty property) { + public String maybeMangle(PersistentProperty property) { Assert.notNull(property, "property"); if (!conversions.hasValueConverter(property)) { return ((CouchbasePersistentProperty) property).getFieldName(); diff --git a/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java b/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java index 8d820b3b..6bbef9f2 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java +++ b/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java @@ -34,6 +34,7 @@ import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.couchbase.core.convert.CouchbaseConverter; +import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.mapping.CouchbaseDocument; import org.springframework.data.couchbase.core.mapping.CouchbaseList; import org.springframework.data.couchbase.core.mapping.CouchbasePersistentProperty; @@ -332,7 +333,13 @@ public class StringBasedN1qlQueryParser { if (fieldList == null || fieldList.contains(prop.getFieldName())) { PersistentPropertyPath path = couchbaseConverter.getMappingContext() .getPersistentPropertyPath(prop.getName(), persistentEntity.getTypeInformation().getType()); - projectField = N1qlQueryCreator.addMetaIfRequired(bucketName, path, prop, persistentEntity).toString(); + String unmangled = prop.getFieldName(); + String maybeMangled =((MappingCouchbaseConverter)couchbaseConverter).maybeMangle(prop); + if(maybeMangled.equals(unmangled)) { + projectField = N1qlQueryCreator.addMetaIfRequired(bucketName, path, prop, persistentEntity).toString(); + } else { + projectField = i(maybeMangled).toString(); + } if (sb.length() > 0) { sb.append(", "); } diff --git a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryFieldLevelEncryptionIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryFieldLevelEncryptionIntegrationTests.java index 727d6987..99774cfa 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryFieldLevelEncryptionIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryFieldLevelEncryptionIntegrationTests.java @@ -154,10 +154,14 @@ public class CouchbaseRepositoryFieldLevelEncryptionIntegrationTests extends Clu assertFalse(userEncryptedRepository.existsById(user.getId())); userEncryptedRepository.save(user); // read the user with Spring + Optional writeSpringReadSpring = userEncryptedRepository.findById(user.getId()); assertTrue(writeSpringReadSpring.isPresent()); writeSpringReadSpring.ifPresent(u -> assertEquals(user, u)); + List writeSpringReadSpring2 = userEncryptedRepository.findAll(); + assertEquals(user, writeSpringReadSpring2.stream().filter(u -> u.getId().equals(user.getId())).findFirst().get()); + if (cleanAfter) { try { couchbaseTemplate.removeById(UserEncrypted.class).one(user.getId());