Skip to content

Commit c6e53f6

Browse files
committed
Chore: validation on the number of max-keys in GetBucket
Signed-off-by: RichardLea <chigix@zoho.com>
1 parent 807b808 commit c6e53f6

File tree

2 files changed

+69
-4
lines changed

2 files changed

+69
-4
lines changed

src/main/java/com/chigix/resserver/endpoint/GetBucket/ResourceListHandler.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.chigix.resserver.endpoint.GetBucket;
22

33
import com.chigix.resserver.config.ApplicationContext;
4+
import com.chigix.resserver.domain.error.InvalidArgument;
45
import com.chigix.resserver.domain.model.bucket.Bucket;
56
import com.chigix.resserver.domain.model.resource.Resource;
67
import com.chigix.resserver.domain.error.NoSuchBucket;
@@ -187,16 +188,35 @@ public int read() throws IOException {
187188
ctx.writeAndFlush(new HttpChunkedInput(new ChunkedStream(result))).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
188189
}
189190

190-
private ListResponseContext buildListResponseContext(QueryStringDecoder query, Bucket bucket) {
191+
private ListResponseContext buildListResponseContext(
192+
QueryStringDecoder query, Bucket bucket)
193+
throws InvalidArgument {
191194
ListResponseContext resp = new ListResponseContext(bucket);
192195
resp.delimiter = decodeQueryParamString(query, "delimiter");
193196
resp.startAfter = decodeQueryParamString(query, "start-after");
194197
resp.encodingType = decodeQueryParamString(query, "encoding-type");
195198
resp.prefix = decodeQueryParamString(query, "prefix");
196-
String max_keys = decodeQueryParamString(query, "max-keys");
199+
final String max_keys = decodeQueryParamString(query, "max-keys");
197200
if (max_keys != null) {
198-
// @TODO Check exception for invalid format of integer number.
199-
int max_keys_int = Integer.valueOf(max_keys);
201+
final int max_keys_int;
202+
try {
203+
max_keys_int = Integer.valueOf(max_keys);
204+
} catch (NumberFormatException numberFormatException) {
205+
throw new InvalidMaxKeys() {
206+
@Override
207+
public String getArgumentValue() {
208+
return max_keys;
209+
}
210+
};
211+
}
212+
if (max_keys_int < 0 || max_keys_int > 2147483647) {
213+
throw new InvalidMaxKeys() {
214+
@Override
215+
public String getArgumentValue() {
216+
return max_keys_int + "";
217+
}
218+
};
219+
}
200220
resp.maxKeys = max_keys_int;
201221
}
202222
resp.continuationToken = decodeQueryParamString(query, "continuation-token");
@@ -369,4 +389,21 @@ public ListResponseContext(Bucket bucket) {
369389

370390
}
371391

392+
private static abstract class InvalidMaxKeys extends InvalidArgument implements
393+
InvalidArgument.ArgumentNameInclude,
394+
InvalidArgument.ArgumentValueInclude {
395+
396+
@Override
397+
public String getMessage() {
398+
return "Argument maxKeys must be an integer "
399+
+ "between 0 and 2147483647";
400+
}
401+
402+
@Override
403+
public String getArgumentName() {
404+
return "maxKeys";
405+
}
406+
407+
}
408+
372409
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
> GET /?delimiter=%2F&fetch-owner=true&list-type=2&max-keys=-1 HTTP/1.1
2+
> Host: oos-for-learning.s3-ap-northeast-1.amazonaws.com
3+
> Authorization: AWS4-HMAC-SHA256 ####
4+
> X-Amz-Content-Sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
5+
> X-Amz-Date: 20180102T151435Z
6+
> User-Agent: Minio (windows; amd64) minio-go/2.0.2 mc/2016-12-09T18:23:19Z
7+
> Expect: 100-continue
8+
> Accept: */*
9+
10+
< HTTP/1.1 400 Bad Request
11+
< x-amz-bucket-region: ap-northeast-1
12+
< x-amz-request-id: FAB3F6AAFB6870C9
13+
< x-amz-id-2: 8W2ZWqDON7sX8h33WKQLIqjFJ7uLCScp88dopBNCwLYDwzRzi47qhaQvw8uqmZg7ZYpqx/XJnr0=
14+
< Content-Type: application/xml
15+
< Transfer-Encoding: chunked
16+
< Date: Tue, 02 Jan 2018 15:14:49 GMT
17+
< Connection: close
18+
< Server: AmazonS3
19+
20+
<?xml version="1.0" encoding="UTF-8"?>
21+
<Error>
22+
<Code>InvalidArgument</Code>
23+
<Message>Argument maxKeys must be an integer between 0 and 2147483647</Message>
24+
<ArgumentName>maxKeys</ArgumentName>
25+
<ArgumentValue>-1</ArgumentValue>
26+
<RequestId>FAB3F6AAFB6870C9</RequestId>
27+
<HostId>8W2ZWqDON7sX8h33WKQLIqjFJ7uLCScp88dopBNCwLYDwzRzi47qhaQvw8uqmZg7ZYpqx/XJnr0=</HostId>
28+
</Error>

0 commit comments

Comments
 (0)