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