mirror of
https://github.com/kharonsec/garage.git
synced 2026-04-25 20:44:55 +02:00
tests: check request signatures with 'badly-encoded' uri
test related to issue #1155 and #1255
This commit is contained in:
@@ -2,6 +2,7 @@ mod list;
|
||||
mod multipart;
|
||||
mod objects;
|
||||
mod presigned;
|
||||
mod signature_encoding;
|
||||
mod simple;
|
||||
mod ssec;
|
||||
mod streaming_signature;
|
||||
|
||||
72
src/garage/tests/s3/signature_encoding.rs
Normal file
72
src/garage/tests/s3/signature_encoding.rs
Normal file
@@ -0,0 +1,72 @@
|
||||
use crate::common;
|
||||
|
||||
use aws_sdk_s3::presigning::PresigningConfig;
|
||||
use bytes::Bytes;
|
||||
use http::{Request, StatusCode};
|
||||
use http_body_util::Full;
|
||||
use std::time::Duration;
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_signature_encoding() {
|
||||
let ctx = common::context();
|
||||
let bucket = ctx.create_bucket("signature-encoding");
|
||||
|
||||
let obj_key = "key@good~.txt";
|
||||
let obj_content = "hello world of special characters";
|
||||
|
||||
let _put_obj_info = ctx
|
||||
.client
|
||||
.put_object()
|
||||
.bucket(&bucket)
|
||||
.key(obj_key)
|
||||
.body(obj_content.as_bytes().to_vec().into())
|
||||
.send()
|
||||
.await
|
||||
.expect("failed to put object");
|
||||
|
||||
let _get_obj = ctx
|
||||
.client
|
||||
.get_object()
|
||||
.bucket(&bucket)
|
||||
.key(obj_key)
|
||||
.send()
|
||||
.await
|
||||
.expect("failed to get object");
|
||||
|
||||
let presign_config = PresigningConfig::builder()
|
||||
.expires_in(Duration::from_secs(10))
|
||||
.build()
|
||||
.expect("failed to build presigning config");
|
||||
let presigned_request = ctx
|
||||
.client
|
||||
.get_object()
|
||||
.bucket(&bucket)
|
||||
.key(obj_key)
|
||||
.presigned(presign_config)
|
||||
.await
|
||||
.expect("failed to construct presigned request");
|
||||
|
||||
let altered_url = presigned_request
|
||||
.uri()
|
||||
.replace("%40", "@")
|
||||
.replace("~", "%7E");
|
||||
|
||||
let client = ctx.custom_request.client();
|
||||
let req_builder = Request::builder()
|
||||
.method(presigned_request.method())
|
||||
.uri(altered_url);
|
||||
let req = presigned_request
|
||||
.headers()
|
||||
.fold(req_builder, |req_builder, (key, value)| {
|
||||
req_builder.header(key, value)
|
||||
})
|
||||
.body(Full::new(Bytes::new()))
|
||||
.expect("failed to construct request from presigned_request");
|
||||
|
||||
let res = client
|
||||
.request(req)
|
||||
.await
|
||||
.expect("failed to execute presigned request");
|
||||
|
||||
assert_eq!(res.status(), StatusCode::OK);
|
||||
}
|
||||
Reference in New Issue
Block a user