From 5d2750d55c0acf3f7fb76f4b549de5e45d789300 Mon Sep 17 00:00:00 2001
From: Dominik Frantisek Bucik <bucik@ics.muni.cz>
Date: Wed, 15 May 2024 17:50:25 +0200
Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20claim=20modifiers=20in=20?=
 =?UTF-8?q?arrays=20retain=20only=20unique=20values?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../oidc/server/userInfo/PerunUserInfoCacheLoader.java | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/userInfo/PerunUserInfoCacheLoader.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/userInfo/PerunUserInfoCacheLoader.java
index bb8340173..faff1d902 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/userInfo/PerunUserInfoCacheLoader.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/userInfo/PerunUserInfoCacheLoader.java
@@ -303,18 +303,22 @@ public class PerunUserInfoCacheLoader extends CacheLoader<UserInfoCacheKey, User
             return TextNode.valueOf(modifier.modify(claimInJson.asText()));
         } else if (claimInJson.isArray()) {
             ArrayNode arrayNode = (ArrayNode) claimInJson;
-            ArrayNode newArrayNode = JsonNodeFactory.instance.arrayNode();
+            Set<TextNode> uniqueValues = new HashSet<>();
             for (int i = 0; i < arrayNode.size(); i++) {
                 JsonNode item = arrayNode.get(i);
                 if (item.isTextual()) {
                     String original = item.asText();
                     String modified = modifier.modify(original);
                     if (!modifier.isReplaceOldValue()) {
-                        newArrayNode.add(TextNode.valueOf(original));
+                        uniqueValues.add(TextNode.valueOf(original));
                     }
-                    newArrayNode.add(TextNode.valueOf(modified));
+                    uniqueValues.add(TextNode.valueOf(modified));
                 }
             }
+            ArrayNode newArrayNode = JsonNodeFactory.instance.arrayNode();
+            for (TextNode child : uniqueValues) {
+                newArrayNode.add(child);
+            }
             return newArrayNode;
         } else {
             log.warn("Original value is neither string nor array of strings - cannot modify values");
-- 
GitLab