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 11a823bf3eeba30132858cfe9e178989680ed3e8..4e4b7397c6521005870f35548f6a6c1b448dce6b 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 e86643074720052acc8c2c0bd321842917a4e498..d51a3d8c164619ebf259a8a9f0c3e90d89af3a92 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 7a7ca29108ca02d0852ea76304a7b1a61935aff1..bb8340173837640c53e5bede2fbb4ef19aa45fbf 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;