From c61534601a7ec94325d47b2f07fa3eeaa0ff5bdf Mon Sep 17 00:00:00 2001
From: Dominik Frantisek Bucik <bucik@ics.muni.cz>
Date: Tue, 9 Apr 2024 15:04:58 +0200
Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20allow=20claimModifier=20?=
 =?UTF-8?q?to=20replace=20old=20value=20(configurable)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../cz/muni/ics/oidc/server/claims/ClaimModifier.java     | 5 +++++
 .../ics/oidc/server/claims/ClaimModifierInitContext.java  | 3 ++-
 .../oidc/server/userInfo/PerunUserInfoCacheLoader.java    | 8 ++++++--
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/claims/ClaimModifier.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/claims/ClaimModifier.java
index 11a823bf3..4e4b7397c 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/claims/ClaimModifier.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/claims/ClaimModifier.java
@@ -1,5 +1,6 @@
 package cz.muni.ics.oidc.server.claims;
 
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -15,9 +16,13 @@ public abstract class ClaimModifier {
 	private final String claimName;
 	private final String modifierName;
 
+	@Getter
+	private final boolean replaceOldValue;
+
 	public ClaimModifier(ClaimModifierInitContext ctx) {
 		this.claimName = ctx.getClaimName();
 		this.modifierName = ctx.getModifierName();
+		this.replaceOldValue = ctx.isReplaceOldValue();
 		log.debug("{} - claim modifier initialized", ctx.getClaimName());
 	}
 
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/claims/ClaimModifierInitContext.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/claims/ClaimModifierInitContext.java
index e86643074..d51a3d8c1 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/claims/ClaimModifierInitContext.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/claims/ClaimModifierInitContext.java
@@ -15,12 +15,13 @@ import java.util.Properties;
 public class ClaimModifierInitContext extends ClaimInitContext {
 
 	private final String modifierName;
+	private final boolean replaceOldValue;
 
 	public ClaimModifierInitContext(String propertyPrefix, Properties properties, String claimName, String modifierName) {
 		super(propertyPrefix, properties, claimName);
 
 		this.modifierName = modifierName;
-
+		this.replaceOldValue = Boolean.parseBoolean(getProperty("replaceOldValue", "true"));
 		log.debug("{}:{} - context: property prefix for modifier configured to '{}'",
 				claimName, modifierName, propertyPrefix);
 	}
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 7a7ca2910..bb8340173 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,15 +303,19 @@ 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();
             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);
-                    arrayNode.set(i, TextNode.valueOf(modified));
+                    if (!modifier.isReplaceOldValue()) {
+                        newArrayNode.add(TextNode.valueOf(original));
+                    }
+                    newArrayNode.add(TextNode.valueOf(modified));
                 }
             }
-            return arrayNode;
+            return newArrayNode;
         } else {
             log.warn("Original value is neither string nor array of strings - cannot modify values");
             return orig;
-- 
GitLab