This is an automated email from the ASF dual-hosted git repository.
dgriffon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/unomi.git
The following commit(s) were added to refs/heads/master by this push:
new d0f37fb95 UNOMI-825: add concealed profile properties (#656)
d0f37fb95 is described below
commit d0f37fb951676075718f5cb8cf0cc97a1cc9f4cb
Author: David Griffon <[email protected]>
AuthorDate: Wed Apr 17 09:05:36 2024 +0200
UNOMI-825: add concealed profile properties (#656)
---
.../org/apache/unomi/itests/ContextServletIT.java | 48 ++++++++++++++++++++++
.../unomi/rest/endpoints/ContextJsonEndpoint.java | 17 ++++----
2 files changed, 58 insertions(+), 7 deletions(-)
diff --git a/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
b/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
index 10ed9e137..dfaaa6641 100644
--- a/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
@@ -854,6 +854,54 @@ public class ContextServletIT extends BaseIT {
DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES);
}
+ @Test
+ public void testConcealedProperties() throws Exception {
+ String sessionId = "test-concealed-property-session-id";
+ // Add custom profile property type
+ PropertyType customPropertyType = new PropertyType(new
Metadata("customProperty"));
+ customPropertyType.setValueTypeId("text");
+ profileService.setPropertyType(customPropertyType);
+ // New profile with the custom property type
+ Profile profile = new Profile("test-profile-id" +
System.currentTimeMillis());
+ profile.setProperty("customProperty", "concealedValue");
+ profileService.save(profile);
+
+ Thread.sleep(2000);
+ // Get it from all properties
+ ContextRequest contextRequest = new ContextRequest();
+ contextRequest.setRequiredProfileProperties(Arrays.asList("*"));
+ contextRequest.setProfileId(profile.getItemId());
+ contextRequest.setSessionId(sessionId);
+ HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
+ request.setEntity(new
StringEntity(objectMapper.writeValueAsString(contextRequest),
ContentType.APPLICATION_JSON));
+ assertEquals(TestUtils.executeContextJSONRequest(request,
sessionId).getContextResponse().getProfileProperties().get("customProperty"),
("concealedValue"));
+ // set the property as concealed
+ customPropertyType.getMetadata().getSystemTags().add("concealed");
+ profileService.deletePropertyType(customPropertyType.getItemId());
+ profileService.setPropertyType(customPropertyType);
+ // Not in all properties
+ request.setEntity(new
StringEntity(objectMapper.writeValueAsString(contextRequest),
ContentType.APPLICATION_JSON));
+ assertNull(TestUtils.executeContextJSONRequest(request,
sessionId).getContextResponse().getProfileProperties().get("customProperty"));
+ // Got it explicitly
+
contextRequest.setRequiredProfileProperties(Arrays.asList("customProperty"));
+ request.setEntity(new
StringEntity(objectMapper.writeValueAsString(contextRequest),
ContentType.APPLICATION_JSON));
+ assertEquals(TestUtils.executeContextJSONRequest(request,
sessionId).getContextResponse().getProfileProperties().get("customProperty"),
("concealedValue"));
+ // Got it with all
+ contextRequest.setRequiredProfileProperties(Arrays.asList("*",
"customProperty"));
+ request.setEntity(new
StringEntity(objectMapper.writeValueAsString(contextRequest),
ContentType.APPLICATION_JSON));
+ assertEquals(TestUtils.executeContextJSONRequest(request,
sessionId).getContextResponse().getProfileProperties().get("customProperty"),
("concealedValue"));
+
+ // remove the concealed tag on the property type
+ customPropertyType.getMetadata().getSystemTags().remove("concealed");
+ profileService.deletePropertyType(customPropertyType.getItemId());
+ profileService.setPropertyType(customPropertyType);
+
+ // Got it from all properties
+ contextRequest.setRequiredProfileProperties(Arrays.asList("*"));
+ request.setEntity(new
StringEntity(objectMapper.writeValueAsString(contextRequest),
ContentType.APPLICATION_JSON));
+ assertEquals(TestUtils.executeContextJSONRequest(request,
sessionId).getContextResponse().getProfileProperties().get("customProperty"),
("concealedValue"));
+ }
+
private Boolean getPersistedControlGroupStatus(SystemPropertiesItem
systemPropertiesItem, String personalizationId) {
if(systemPropertiesItem.getSystemProperties() != null &&
systemPropertiesItem.getSystemProperties().containsKey("personalizationStrategyStatus"))
{
List<Map<String, Object>> personalizationStrategyStatus =
(List<Map<String, Object>>)
systemPropertiesItem.getSystemProperties().get("personalizationStrategyStatus");
diff --git
a/rest/src/main/java/org/apache/unomi/rest/endpoints/ContextJsonEndpoint.java
b/rest/src/main/java/org/apache/unomi/rest/endpoints/ContextJsonEndpoint.java
index 407eb5f87..df04e6d6c 100644
---
a/rest/src/main/java/org/apache/unomi/rest/endpoints/ContextJsonEndpoint.java
+++
b/rest/src/main/java/org/apache/unomi/rest/endpoints/ContextJsonEndpoint.java
@@ -42,13 +42,8 @@ import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
@WebService
@Consumes(MediaType.APPLICATION_JSON)
@@ -78,6 +73,8 @@ public class ContextJsonEndpoint {
private RestServiceUtils restServiceUtils;
@Reference
private SchemaService schemaService;
+ @Reference
+ private ProfileService profileService;
@OPTIONS
@Path("/context.js")
@@ -224,6 +221,12 @@ public class ContextJsonEndpoint {
Map<String, Object> profileProperties = new
HashMap<>(eventsRequestContext.getProfile().getProperties());
if (!contextRequest.getRequiredProfileProperties().contains("*")) {
profileProperties.keySet().retainAll(contextRequest.getRequiredProfileProperties());
+ } else {
+ // get public properties + explicit properties
+ Set<String> concealedProperties =
profileService.getPropertyTypeBySystemTag("concealed").stream().map(Item::getItemId).collect(Collectors.toSet());
+ // remove requested properties from the filtered properties
+
concealedProperties.removeAll(contextRequest.getRequiredProfileProperties().stream().filter(p
-> !p.equals("*")).collect(Collectors.toList()));
+ profileProperties.keySet().removeAll(concealedProperties);
}
data.setProfileProperties(profileProperties);
}