Skip to content

Commit a467a81

Browse files
Fix DeleteRequest / GetRequest / UpdateRequest / ExplainRequest validation for null and/or empty id/type (elastic#35314)
Closes elastic#35297
1 parent 42dcdd0 commit a467a81

File tree

8 files changed

+160
-14
lines changed

8 files changed

+160
-14
lines changed

server/src/main/java/org/elasticsearch/action/delete/DeleteRequest.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.elasticsearch.action.DocWriteRequest;
2626
import org.elasticsearch.action.support.replication.ReplicatedWriteRequest;
2727
import org.elasticsearch.common.Nullable;
28+
import org.elasticsearch.common.Strings;
2829
import org.elasticsearch.common.io.stream.StreamInput;
2930
import org.elasticsearch.common.io.stream.StreamOutput;
3031
import org.elasticsearch.common.lucene.uid.Versions;
@@ -83,13 +84,13 @@ public DeleteRequest(String index, String type, String id) {
8384
@Override
8485
public ActionRequestValidationException validate() {
8586
ActionRequestValidationException validationException = super.validate();
86-
if (type == null) {
87+
if (Strings.isEmpty(type)) {
8788
validationException = addValidationError("type is missing", validationException);
8889
}
89-
if (id == null) {
90+
if (Strings.isEmpty(id)) {
9091
validationException = addValidationError("id is missing", validationException);
9192
}
92-
if (!versionType.validateVersionForWrites(version)) {
93+
if (versionType.validateVersionForWrites(version) == false) {
9394
validationException = addValidationError("illegal version value [" + version + "] for version type ["
9495
+ versionType.name() + "]", validationException);
9596
}

server/src/main/java/org/elasticsearch/action/explain/ExplainRequest.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434

3535
import java.io.IOException;
3636

37+
import static org.elasticsearch.action.ValidateActions.addValidationError;
38+
3739
/**
3840
* Explain request encapsulating the explain query and document identifier to get an explanation for.
3941
*/
@@ -152,11 +154,11 @@ public ExplainRequest filteringAlias(AliasFilter filteringAlias) {
152154
@Override
153155
public ActionRequestValidationException validate() {
154156
ActionRequestValidationException validationException = super.validateNonNullIndex();
155-
if (type == null) {
156-
validationException = ValidateActions.addValidationError("type is missing", validationException);
157+
if (Strings.isEmpty(type)) {
158+
validationException = addValidationError("type is missing", validationException);
157159
}
158-
if (id == null) {
159-
validationException = ValidateActions.addValidationError("id is missing", validationException);
160+
if (Strings.isEmpty(id)) {
161+
validationException = addValidationError("id is missing", validationException);
160162
}
161163
if (query == null) {
162164
validationException = ValidateActions.addValidationError("query is missing", validationException);

server/src/main/java/org/elasticsearch/action/get/GetRequest.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.elasticsearch.action.ValidateActions;
2626
import org.elasticsearch.action.support.single.shard.SingleShardRequest;
2727
import org.elasticsearch.common.Nullable;
28+
import org.elasticsearch.common.Strings;
2829
import org.elasticsearch.common.io.stream.StreamInput;
2930
import org.elasticsearch.common.io.stream.StreamOutput;
3031
import org.elasticsearch.common.lucene.uid.Versions;
@@ -33,6 +34,8 @@
3334

3435
import java.io.IOException;
3536

37+
import static org.elasticsearch.action.ValidateActions.addValidationError;
38+
3639
/**
3740
* A request to get a document (its source) from an index based on its type (optional) and id. Best created using
3841
* {@link org.elasticsearch.client.Requests#getRequest(String)}.
@@ -91,13 +94,13 @@ public GetRequest(String index, String type, String id) {
9194
@Override
9295
public ActionRequestValidationException validate() {
9396
ActionRequestValidationException validationException = super.validateNonNullIndex();
94-
if (type == null) {
95-
validationException = ValidateActions.addValidationError("type is missing", validationException);
97+
if (Strings.isEmpty(type)) {
98+
validationException = addValidationError("type is missing", validationException);
9699
}
97-
if (id == null) {
98-
validationException = ValidateActions.addValidationError("id is missing", validationException);
100+
if (Strings.isEmpty(id)) {
101+
validationException = addValidationError("id is missing", validationException);
99102
}
100-
if (!versionType.validateVersionForReads(version)) {
103+
if (versionType.validateVersionForReads(version) == false) {
101104
validationException = ValidateActions.addValidationError("illegal version value [" + version + "] for version type ["
102105
+ versionType.name() + "]", validationException);
103106
}

server/src/main/java/org/elasticsearch/action/update/UpdateRequest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@ public ActionRequestValidationException validate() {
136136
if(upsertRequest != null && upsertRequest.version() != Versions.MATCH_ANY) {
137137
validationException = addValidationError("can't provide version in upsert request", validationException);
138138
}
139-
if (type == null) {
139+
if (Strings.isEmpty(type)) {
140140
validationException = addValidationError("type is missing", validationException);
141141
}
142-
if (id == null) {
142+
if (Strings.isEmpty(id)) {
143143
validationException = addValidationError("id is missing", validationException);
144144
}
145145

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Licensed to Elasticsearch under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.elasticsearch.action.delete;
20+
21+
import org.elasticsearch.action.ActionRequestValidationException;
22+
import org.elasticsearch.test.ESTestCase;
23+
24+
import static org.hamcrest.CoreMatchers.hasItems;
25+
import static org.hamcrest.CoreMatchers.not;
26+
import static org.hamcrest.CoreMatchers.nullValue;
27+
28+
public class DeleteRequestTests extends ESTestCase {
29+
30+
public void testValidation() {
31+
{
32+
final DeleteRequest request = new DeleteRequest("index4", "_doc", "0");
33+
final ActionRequestValidationException validate = request.validate();
34+
35+
assertThat(validate, nullValue());
36+
}
37+
38+
{
39+
final DeleteRequest request = new DeleteRequest("index4", randomBoolean() ? "" : null, randomBoolean() ? "" : null);
40+
final ActionRequestValidationException validate = request.validate();
41+
42+
assertThat(validate, not(nullValue()));
43+
assertThat(validate.validationErrors(), hasItems("type is missing", "id is missing"));
44+
}
45+
}
46+
}

server/src/test/java/org/elasticsearch/action/explain/ExplainRequestTests.java

+25
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.elasticsearch.action.explain;
2020

21+
import org.elasticsearch.action.ActionRequestValidationException;
2122
import org.elasticsearch.common.io.stream.BytesStreamOutput;
2223
import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput;
2324
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
@@ -35,6 +36,10 @@
3536
import java.util.Collections;
3637
import java.util.List;
3738

39+
import static org.hamcrest.CoreMatchers.hasItems;
40+
import static org.hamcrest.CoreMatchers.not;
41+
import static org.hamcrest.CoreMatchers.nullValue;
42+
3843
public class ExplainRequestTests extends ESTestCase {
3944
private NamedWriteableRegistry namedWriteableRegistry;
4045

@@ -70,4 +75,24 @@ public void testSerialize() throws IOException {
7075
}
7176
}
7277
}
78+
79+
public void testValidation() {
80+
{
81+
final ExplainRequest request = new ExplainRequest("index4", "_doc", "0");
82+
request.query(QueryBuilders.termQuery("field", "value"));
83+
84+
final ActionRequestValidationException validate = request.validate();
85+
86+
assertThat(validate, nullValue());
87+
}
88+
89+
{
90+
final ExplainRequest request = new ExplainRequest("index4", randomBoolean() ? "" : null, randomBoolean() ? "" : null);
91+
request.query(QueryBuilders.termQuery("field", "value"));
92+
final ActionRequestValidationException validate = request.validate();
93+
94+
assertThat(validate, not(nullValue()));
95+
assertThat(validate.validationErrors(), hasItems("type is missing", "id is missing"));
96+
}
97+
}
7398
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Licensed to Elasticsearch under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.elasticsearch.action.get;
20+
21+
import org.elasticsearch.action.ActionRequestValidationException;
22+
import org.elasticsearch.test.ESTestCase;
23+
24+
import static org.hamcrest.CoreMatchers.hasItems;
25+
import static org.hamcrest.CoreMatchers.not;
26+
import static org.hamcrest.CoreMatchers.nullValue;
27+
28+
public class GetRequestTests extends ESTestCase {
29+
30+
public void testValidation() {
31+
{
32+
final GetRequest request = new GetRequest("index4", "_doc", "0");
33+
final ActionRequestValidationException validate = request.validate();
34+
35+
assertThat(validate, nullValue());
36+
}
37+
38+
{
39+
final GetRequest request = new GetRequest("index4", randomBoolean() ? "" : null, randomBoolean() ? "" : null);
40+
final ActionRequestValidationException validate = request.validate();
41+
42+
assertThat(validate, not(nullValue()));
43+
assertThat(validate.validationErrors(), hasItems("type is missing", "id is missing"));
44+
}
45+
}
46+
}

server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java

+23
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.action.update;
2121

22+
import org.elasticsearch.action.ActionRequestValidationException;
2223
import org.elasticsearch.action.DocWriteResponse;
2324
import org.elasticsearch.action.delete.DeleteRequest;
2425
import org.elasticsearch.action.index.IndexRequest;
@@ -61,6 +62,9 @@
6162
import static org.elasticsearch.common.xcontent.XContentHelper.toXContent;
6263
import static org.elasticsearch.script.MockScriptEngine.mockInlineScript;
6364
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertToXContentEquivalent;
65+
import static org.hamcrest.CoreMatchers.hasItems;
66+
import static org.hamcrest.CoreMatchers.not;
67+
import static org.hamcrest.CoreMatchers.nullValue;
6468
import static org.hamcrest.Matchers.contains;
6569
import static org.hamcrest.Matchers.equalTo;
6670
import static org.hamcrest.Matchers.instanceOf;
@@ -511,6 +515,25 @@ public void testToValidateUpsertRequestWithVersion() {
511515
assertThat(updateRequest.validate().validationErrors(), contains("can't provide version in upsert request"));
512516
}
513517

518+
public void testValidate() {
519+
{
520+
UpdateRequest request = new UpdateRequest("index", "type", "id");
521+
request.doc("{}", XContentType.JSON);
522+
ActionRequestValidationException validate = request.validate();
523+
524+
assertThat(validate, nullValue());
525+
}
526+
527+
{
528+
UpdateRequest request = new UpdateRequest("index", randomBoolean() ? "" : null, randomBoolean() ? "" : null);
529+
request.doc("{}", XContentType.JSON);
530+
ActionRequestValidationException validate = request.validate();
531+
532+
assertThat(validate, not(nullValue()));
533+
assertThat(validate.validationErrors(), hasItems("type is missing", "id is missing"));
534+
}
535+
}
536+
514537
public void testRoutingExtraction() throws Exception {
515538
GetResult getResult = new GetResult("test", "type", "1", 0, false, null, null);
516539
IndexRequest indexRequest = new IndexRequest("test", "type", "1");

0 commit comments

Comments
 (0)