Skip to content

Commit d63ae0b

Browse files
committed
Merge branch 'FME-8434-sanitizer-fix' into FME-9687-integration
2 parents 93ae329 + 03165b8 commit d63ae0b

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

src/main/java/io/split/android/client/fallback/FallbacksSanitizerImpl.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import java.util.HashMap;
66
import java.util.Map;
7+
import java.util.regex.Pattern;
78

89
import io.split.android.client.utils.logger.Logger;
910

@@ -15,6 +16,8 @@ class FallbacksSanitizerImpl implements FallbacksSanitizer {
1516

1617
private static final int MAX_FLAG_NAME_LENGTH = 100;
1718
private static final int MAX_TREATMENT_LENGTH = 100;
19+
private static final String TREATMENT_REGEXP = "^[0-9]+[.a-zA-Z0-9_-]*$|^[a-zA-Z]+[a-zA-Z0-9_-]*$";
20+
private static final Pattern TREATMENT_PATTERN = Pattern.compile(TREATMENT_REGEXP);
1821

1922
/**
2023
* Sanitizes the provided fallback configuration by applying validation rules.
@@ -93,6 +96,7 @@ private static boolean isValidTreatment(FallbackTreatment treatment) {
9396
if (treatment == null || treatment.getTreatment() == null) {
9497
return false;
9598
}
96-
return treatment.getTreatment().length() <= MAX_TREATMENT_LENGTH;
99+
String value = treatment.getTreatment();
100+
return value.length() <= MAX_TREATMENT_LENGTH && TREATMENT_PATTERN.matcher(value).matches();
97101
}
98102
}

src/test/java/io/split/android/client/fallback/FallbacksSanitizerImplTest.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.junit.Assert.assertEquals;
44
import static org.junit.Assert.assertNull;
5+
import static org.junit.Assert.assertTrue;
56

67
import org.junit.Before;
78
import org.junit.Test;
@@ -59,4 +60,63 @@ public void dropsInvalidGlobalTreatment() {
5960
assertNull(sanitized.getGlobal());
6061
assertEquals(0, sanitized.getByFlag().size());
6162
}
63+
64+
@Test
65+
public void byFlagTreatmentIsDroppedWhenInvalidFormat() {
66+
Map<String, FallbackTreatment> byFlag = new HashMap<>();
67+
byFlag.put(VALID_FLAG, new FallbackTreatment("on.off"));
68+
byFlag.put("valid_num_dot", new FallbackTreatment("123.on"));
69+
byFlag.put("null_treatment", new FallbackTreatment(null));
70+
71+
FallbackConfiguration config = FallbackConfiguration.builder()
72+
.global(null)
73+
.byFlag(byFlag)
74+
.build();
75+
76+
FallbackConfiguration sanitized = mSanitizer.sanitize(config);
77+
78+
// Only the valid one should remain
79+
assertEquals(1, sanitized.getByFlag().size());
80+
assertEquals("123.on", sanitized.getByFlag().get("valid_num_dot").getTreatment());
81+
}
82+
83+
@Test
84+
public void globalTreatmentIsDroppedWhenInvalidFormat() {
85+
Map<String, FallbackTreatment> byFlag = new HashMap<>();
86+
byFlag.put(VALID_FLAG, new FallbackTreatment("on_1-2"));
87+
byFlag.put("null_treatment", new FallbackTreatment(null));
88+
89+
FallbackConfiguration config = FallbackConfiguration.builder()
90+
// Global invalid due to regex (letters cannot be followed by '.')
91+
.global(new FallbackTreatment("on.off"))
92+
.byFlag(byFlag)
93+
.build();
94+
95+
FallbackConfiguration sanitized = mSanitizer.sanitize(config);
96+
97+
assertNull(sanitized.getGlobal());
98+
// Ensure only the valid by-flag entry is preserved
99+
assertEquals(1, sanitized.getByFlag().size());
100+
assertEquals("on_1-2", sanitized.getByFlag().get(VALID_FLAG).getTreatment());
101+
}
102+
103+
@Test
104+
public void validFormatTreatmentIsNotDropped() {
105+
Map<String, FallbackTreatment> byFlag = new HashMap<>();
106+
byFlag.put("numWithDot", new FallbackTreatment("123.on"));
107+
byFlag.put(VALID_FLAG, new FallbackTreatment("on_1-2"));
108+
109+
FallbackConfiguration config = FallbackConfiguration.builder()
110+
.global(new FallbackTreatment("on"))
111+
.byFlag(byFlag)
112+
.build();
113+
114+
FallbackConfiguration sanitized = mSanitizer.sanitize(config);
115+
116+
assertEquals(2, sanitized.getByFlag().size());
117+
assertTrue(sanitized.getByFlag().containsKey("numWithDot"));
118+
assertEquals("123.on", sanitized.getByFlag().get("numWithDot").getTreatment());
119+
assertEquals("on_1-2", sanitized.getByFlag().get(VALID_FLAG).getTreatment());
120+
assertEquals("on", sanitized.getGlobal().getTreatment());
121+
}
62122
}

0 commit comments

Comments
 (0)