Skip to content

Commit 5447938

Browse files
authored
Don't overwrite target field with SetSecurityUserProcessor (#51454) (#51507)
* Don't overwrite target field with SetSecurityUserProcessor This change fix problem with `SetSecurityUserProcessor` which was overwriting whole target field and not only fields really filled by the processor. Closes #51428 * Unused imports removed
1 parent ab5a9a9 commit 5447938

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/ingest/SetSecurityUserProcessor.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ public IngestDocument execute(IngestDocument ingestDocument) throws Exception {
5353
throw new IllegalStateException("No user for authentication");
5454
}
5555

56-
Map<String, Object> userObject = new HashMap<>();
56+
Object fieldValue = ingestDocument.getFieldValue(field, Object.class, true);
57+
58+
@SuppressWarnings("unchecked")
59+
Map<String, Object> userObject = fieldValue instanceof Map ? (Map<String, Object>) fieldValue : new HashMap<>();
60+
5761
for (Property property : properties) {
5862
switch (property) {
5963
case USERNAME:

x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/ingest/SetSecurityUserProcessorTests.java

+32-7
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import org.elasticsearch.xpack.security.ingest.SetSecurityUserProcessor.Property;
1616

1717
import java.util.Collections;
18+
import java.util.Arrays;
1819
import java.util.EnumSet;
1920
import java.util.HashMap;
20-
import java.util.List;
2121
import java.util.Map;
2222

2323
import static org.hamcrest.Matchers.equalTo;
@@ -38,9 +38,7 @@ public void testProcessor() throws Exception {
3838
Map<String, Object> result = ingestDocument.getFieldValue("_field", Map.class);
3939
assertThat(result.size(), equalTo(5));
4040
assertThat(result.get("username"), equalTo("_username"));
41-
assertThat(((List) result.get("roles")).size(), equalTo(2));
42-
assertThat(((List) result.get("roles")).get(0), equalTo("role1"));
43-
assertThat(((List) result.get("roles")).get(1), equalTo("role2"));
41+
assertThat(result.get("roles"), equalTo(Arrays.asList("role1", "role2")));
4442
assertThat(result.get("full_name"), equalTo("firstname lastname"));
4543
assertThat(result.get("email"), equalTo("_email"));
4644
assertThat(((Map) result.get("metadata")).size(), equalTo(1));
@@ -94,9 +92,7 @@ public void testRolesProperties() throws Exception {
9492
@SuppressWarnings("unchecked")
9593
Map<String, Object> result = ingestDocument.getFieldValue("_field", Map.class);
9694
assertThat(result.size(), equalTo(1));
97-
assertThat(((List) result.get("roles")).size(), equalTo(2));
98-
assertThat(((List) result.get("roles")).get(0), equalTo("role1"));
99-
assertThat(((List) result.get("roles")).get(1), equalTo("role2"));
95+
assertThat(result.get("roles"), equalTo(Arrays.asList("role1", "role2")));
10096
}
10197

10298
public void testFullNameProperties() throws Exception {
@@ -148,4 +144,33 @@ public void testMetadataProperties() throws Exception {
148144
assertThat(((Map) result.get("metadata")).get("key"), equalTo("value"));
149145
}
150146

147+
public void testOverwriteExistingField() throws Exception {
148+
ThreadContext threadContext = new ThreadContext(Settings.EMPTY);
149+
User user = new User("_username", null, null);
150+
Authentication.RealmRef realmRef = new Authentication.RealmRef("_name", "_type", "_node_name");
151+
threadContext.putTransient(AuthenticationField.AUTHENTICATION_KEY, new Authentication(user, realmRef, null));
152+
153+
SetSecurityUserProcessor processor = new SetSecurityUserProcessor("_tag", threadContext, "_field", EnumSet.of(Property.USERNAME));
154+
155+
IngestDocument ingestDocument = new IngestDocument(new HashMap<>(), new HashMap<>());
156+
ingestDocument.setFieldValue("_field", "test");
157+
processor.execute(ingestDocument);
158+
159+
@SuppressWarnings("unchecked")
160+
Map<String, Object> result = ingestDocument.getFieldValue("_field", Map.class);
161+
assertThat(result.size(), equalTo(1));
162+
assertThat(result.get("username"), equalTo("_username"));
163+
164+
ingestDocument = new IngestDocument(new HashMap<>(), new HashMap<>());
165+
ingestDocument.setFieldValue("_field.other", "test");
166+
ingestDocument.setFieldValue("_field.username", "test");
167+
processor.execute(ingestDocument);
168+
169+
@SuppressWarnings("unchecked")
170+
Map<String, Object> result2 = ingestDocument.getFieldValue("_field", Map.class);
171+
assertThat(result2.size(), equalTo(2));
172+
assertThat(result2.get("username"), equalTo("_username"));
173+
assertThat(result2.get("other"), equalTo("test"));
174+
}
175+
151176
}

0 commit comments

Comments
 (0)