From 7895d0f3008498457afe2684bcf7966c91bf51ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LELEU?= Date: Thu, 23 May 2024 18:18:11 +0200 Subject: [PATCH] - De-duplicate user profile attribute values (avoid memory overconsumption) --- documentation/docs/release-notes.md | 3 ++ .../pac4j/core/profile/BasicUserProfile.java | 2 +- .../core/profile/CommonProfileTests.java | 32 +++++++++++++++---- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/documentation/docs/release-notes.md b/documentation/docs/release-notes.md index 079602352b..15e21e66fd 100644 --- a/documentation/docs/release-notes.md +++ b/documentation/docs/release-notes.md @@ -3,6 +3,9 @@ layout: doc title: Release notes: --- +**v5.7.6**: +- De-duplicate user profile attribute values (avoid memory overconsumption) + **v5.7.5**: - Add the `oidc.withState` config property diff --git a/pac4j-core/src/main/java/org/pac4j/core/profile/BasicUserProfile.java b/pac4j-core/src/main/java/org/pac4j/core/profile/BasicUserProfile.java index 244cfaf0fe..3f1dc0550b 100644 --- a/pac4j-core/src/main/java/org/pac4j/core/profile/BasicUserProfile.java +++ b/pac4j-core/src/main/java/org/pac4j/core/profile/BasicUserProfile.java @@ -150,7 +150,7 @@ private boolean canMergeAttributes(final Map map, final String k private Collection mergeCollectionAttributes(final Collection existingCollection, final Collection newCollection) { - return Streams.concat(existingCollection.stream(), newCollection.stream()).collect(Collectors.toList()); + return Streams.concat(existingCollection.stream(), newCollection.stream()).distinct().collect(Collectors.toList()); } /** diff --git a/pac4j-core/src/test/java/org/pac4j/core/profile/CommonProfileTests.java b/pac4j-core/src/test/java/org/pac4j/core/profile/CommonProfileTests.java index 3058a0d9cf..6f055eddad 100644 --- a/pac4j-core/src/test/java/org/pac4j/core/profile/CommonProfileTests.java +++ b/pac4j-core/src/test/java/org/pac4j/core/profile/CommonProfileTests.java @@ -1,16 +1,18 @@ package org.pac4j.core.profile; -import static org.junit.Assert.*; - -import java.net.URISyntaxException; -import java.util.*; - import org.junit.Test; import org.pac4j.core.exception.TechnicalException; import org.pac4j.core.profile.definition.CommonProfileDefinition; -import org.pac4j.core.util.*; +import org.pac4j.core.util.Pac4jConstants; +import org.pac4j.core.util.TestsConstants; +import org.pac4j.core.util.TestsHelper; import org.pac4j.core.util.serializer.JavaSerializer; +import java.net.URISyntaxException; +import java.util.*; + +import static org.junit.Assert.*; + /** * This class tests the {@link CommonProfile} class. * @author Jerome Leleu @@ -140,6 +142,24 @@ public void testAddAttributeMultipleValuesOldBehaviour() { assertEquals(Arrays.asList("Value2", "Value3"), userProfile.getAttribute(KEY)); } + @Test + public void testAddAttributeDuplicateValues() { + UserProfile userProfile = new CommonProfile(true); + userProfile.addAttribute(KEY, List.of(VALUE)); + userProfile.addAttribute(KEY, List.of(VALUE)); + assertEquals(1, userProfile.getAttributes().size()); + assertEquals(Arrays.asList(VALUE), userProfile.getAttribute(KEY)); + } + + @Test + public void testAddAttributeDeDuplicateValues() { + UserProfile userProfile = new CommonProfile(true); + userProfile.addAttribute(KEY, List.of(VALUE, "Value2")); + userProfile.addAttribute(KEY, List.of(VALUE, "Value3")); + assertEquals(1, userProfile.getAttributes().size()); + assertEquals(Arrays.asList(VALUE, "Value2", "Value3"), userProfile.getAttribute(KEY)); + } + @Test public void testAddAuthenticationAttribute() { final var userProfile = new CommonProfile();