Skip to content

Commit d97bd89

Browse files
committed
Add validation for duplicate SAML attribute keys
This commit enhances the SAML attributes implementation by adding validation for duplicate attribute keys. When the same attribute key appears multiple times in a request, the validation will now fail with a clear error message. Signed-off-by: lloydmeta <lloydmeta@gmail.com>
1 parent b764689 commit d97bd89

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

x-pack/plugin/identity-provider/src/main/java/org/elasticsearch/xpack/idp/action/SamlInitiateSingleSignOnRequest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import org.elasticsearch.xpack.idp.saml.support.SamlInitiateSingleSignOnAttributes;
1616

1717
import java.io.IOException;
18+
import java.util.HashSet;
19+
import java.util.Set;
1820

1921
import static org.elasticsearch.action.ValidateActions.addValidationError;
2022

@@ -44,6 +46,20 @@ public ActionRequestValidationException validate() {
4446
if (Strings.isNullOrEmpty(assertionConsumerService)) {
4547
validationException = addValidationError("acs is missing", validationException);
4648
}
49+
50+
// Check for duplicate attribute keys
51+
if (attributes != null && attributes.getAttributes().isEmpty() == false) {
52+
Set<String> keys = new HashSet<>();
53+
for (SamlInitiateSingleSignOnAttributes.Attribute attribute : attributes.getAttributes()) {
54+
if (keys.add(attribute.getKey()) == false) {
55+
validationException = addValidationError(
56+
"duplicate attribute key [" + attribute.getKey() + "] found",
57+
validationException
58+
);
59+
}
60+
}
61+
}
62+
4763
return validationException;
4864
}
4965

x-pack/plugin/identity-provider/src/test/java/org/elasticsearch/xpack/idp/action/SamlInitiateSingleSignOnRequestTests.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
import org.elasticsearch.action.ActionRequestValidationException;
1010
import org.elasticsearch.common.io.stream.BytesStreamOutput;
1111
import org.elasticsearch.test.ESTestCase;
12+
import org.elasticsearch.xpack.idp.saml.support.SamlInitiateSingleSignOnAttributes;
13+
14+
import java.util.ArrayList;
15+
import java.util.Arrays;
16+
import java.util.Collections;
17+
import java.util.List;
1218

1319
import static org.hamcrest.CoreMatchers.containsString;
1420
import static org.hamcrest.CoreMatchers.equalTo;
@@ -39,4 +45,38 @@ public void testValidation() {
3945
assertThat(validationException.validationErrors().get(0), containsString("entity_id is missing"));
4046
assertThat(validationException.validationErrors().get(1), containsString("acs is missing"));
4147
}
48+
49+
public void testDuplicateAttributeKeysValidation() {
50+
// Create request with valid required fields
51+
final SamlInitiateSingleSignOnRequest request = new SamlInitiateSingleSignOnRequest();
52+
request.setSpEntityId("https://kibana_url");
53+
request.setAssertionConsumerService("https://kibana_url/acs");
54+
55+
// Test with unique attribute keys - should be valid
56+
SamlInitiateSingleSignOnAttributes attributes = new SamlInitiateSingleSignOnAttributes();
57+
List<SamlInitiateSingleSignOnAttributes.Attribute> attributeList = new ArrayList<>();
58+
attributeList.add(new SamlInitiateSingleSignOnAttributes.Attribute("key1", Collections.singletonList("value1")));
59+
attributeList.add(new SamlInitiateSingleSignOnAttributes.Attribute("key2", Arrays.asList("value2A", "value2B")));
60+
attributes.setAttributes(attributeList);
61+
request.setAttributes(attributes);
62+
63+
// Should pass validation
64+
ActionRequestValidationException validationException = request.validate();
65+
assertNull("Request with unique attribute keys should pass validation", validationException);
66+
67+
// Test with duplicate attribute keys - should be invalid
68+
attributes = new SamlInitiateSingleSignOnAttributes();
69+
attributeList = new ArrayList<>();
70+
attributeList.add(new SamlInitiateSingleSignOnAttributes.Attribute("duplicate_key", Collections.singletonList("value1")));
71+
attributeList.add(new SamlInitiateSingleSignOnAttributes.Attribute("unique_key", Collections.singletonList("value2")));
72+
attributeList.add(new SamlInitiateSingleSignOnAttributes.Attribute("duplicate_key", Arrays.asList("value3", "value4")));
73+
attributes.setAttributes(attributeList);
74+
request.setAttributes(attributes);
75+
76+
// Should fail validation with appropriate error message
77+
validationException = request.validate();
78+
assertNotNull("Request with duplicate attribute keys should fail validation", validationException);
79+
assertThat(validationException.validationErrors().size(), equalTo(1));
80+
assertThat(validationException.validationErrors().get(0), containsString("duplicate attribute key [duplicate_key] found"));
81+
}
4282
}

0 commit comments

Comments
 (0)