mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-23 20:59:05 +00:00
fix: resolve release-blocking integration failures (#6320)
* fix: resolve release-blocking integration failures * fix: satisfy stable clippy lints * fix: satisfy Rust 1.98 CI lints
This commit is contained in:
@@ -643,7 +643,7 @@ mod tests {
|
||||
fn decode_hex_fixture(value: &str) -> Vec<u8> {
|
||||
value
|
||||
.split_ascii_whitespace()
|
||||
.flat_map(|line| line.as_bytes().chunks_exact(2))
|
||||
.flat_map(|line| line.as_bytes().as_chunks::<2>().0.iter())
|
||||
.map(|pair| {
|
||||
let pair = std::str::from_utf8(pair).expect("fixture contains ASCII hex");
|
||||
u8::from_str_radix(pair, 16).expect("fixture contains valid hex")
|
||||
|
||||
@@ -2694,7 +2694,7 @@ async fn ssec_passthrough_probe_object(
|
||||
let head = target_client
|
||||
.head_object(target_bucket, probe_key, head_version)
|
||||
.await
|
||||
.map_err(S3ClientError::from)?;
|
||||
.map_err(|err| S3ClientError::from(*err))?;
|
||||
|
||||
Ok(ReplicationSsecProbeOutcome {
|
||||
evidence_present: head.sse_customer_algorithm().is_some_and(|algorithm| !algorithm.is_empty()),
|
||||
|
||||
@@ -3683,6 +3683,13 @@ where
|
||||
|
||||
let authorization_headers = pax_headers.clone();
|
||||
|
||||
if let Some(value) = pax_headers.remove("x-amz-tagging") {
|
||||
let value = value
|
||||
.to_str()
|
||||
.map_err(|_| s3_error!(InvalidArgument, "Invalid Snowball object tagging value"))?;
|
||||
metadata.insert(AMZ_OBJECT_TAGGING.to_owned(), value.to_owned());
|
||||
}
|
||||
|
||||
let object_lock_mode = pax_headers
|
||||
.remove(AMZ_OBJECT_LOCK_MODE_LOWER)
|
||||
.map(|value| {
|
||||
@@ -10740,6 +10747,7 @@ mod tests {
|
||||
let mut record = pax_record("minio.metadata.Content-Type", b"text/plain");
|
||||
record.extend(pax_record("minio.metadata.X-Amz-Meta-Owner", b"alice"));
|
||||
record.extend(pax_record("minio.metadata.project", b"alpha-demo"));
|
||||
record.extend(pax_record("minio.metadata.x-amz-tagging", b"classification=public"));
|
||||
record.extend(pax_record("minio.versionId", Uuid::nil().to_string().as_bytes()));
|
||||
record.extend(pax_record("minio.metadata.x-amz-replication-status", b"REPLICA"));
|
||||
record.extend(pax_record("minio.metadata.X-Amz-Object-Lock-Mode", b"GOVERNANCE"));
|
||||
@@ -10778,6 +10786,8 @@ mod tests {
|
||||
assert_eq!(metadata.get("content-type").map(String::as_str), Some("text/plain"));
|
||||
assert_eq!(metadata.get("owner").map(String::as_str), Some("alice"));
|
||||
assert_eq!(metadata.get("project").map(String::as_str), Some("alpha-demo"));
|
||||
assert_eq!(metadata.get(AMZ_OBJECT_TAGGING).map(String::as_str), Some("classification=public"));
|
||||
assert!(!metadata.contains_key("x-amz-tagging"));
|
||||
assert_eq!(metadata.get(AMZ_OBJECT_LOCK_MODE_LOWER).map(String::as_str), Some("GOVERNANCE"));
|
||||
assert_eq!(
|
||||
metadata.get(AMZ_OBJECT_LOCK_RETAIN_UNTIL_DATE_LOWER).map(String::as_str),
|
||||
|
||||
@@ -1500,7 +1500,7 @@ where
|
||||
return write_body_chunks_to_writer(body, writer).await;
|
||||
};
|
||||
|
||||
let expected_size = (!query.append && query.size >= 0)
|
||||
let expected_size = (!query.append && query.size > 0)
|
||||
.then(|| {
|
||||
u64::try_from(query.size)
|
||||
.map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "put_file auth size cannot be represented"))
|
||||
@@ -2325,6 +2325,39 @@ mod tests {
|
||||
assert_eq!(writer, b"append-data");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn put_file_auth_zero_size_create_uses_trailing_auth_record() {
|
||||
let _ = rustfs_credentials::set_global_rpc_secret("put-file-auth-body-test-secret".to_string());
|
||||
let nonce = uuid::Uuid::parse_str("43434343-4444-4555-8666-777777777777").expect("nonce");
|
||||
let url = concat!(
|
||||
"/rustfs/rpc/put_file_stream?disk=disk-a&volume=bucket&path=object%2Fpart.1",
|
||||
"&append=false&size=0&put_file_auth=digest-trailer-v1&put_file_nonce=43434343-4444-4555-8666-777777777777"
|
||||
);
|
||||
let digest = hex_simd::encode_to_string(sha2::Sha256::digest(b"unknown-size-data"), hex_simd::AsciiCase::Lower);
|
||||
let trailer = build_put_file_auth_trailer(url, &Method::PUT, nonce, &digest).expect("trailer should build");
|
||||
let query = PutFileQuery {
|
||||
disk: "disk-a".to_string(),
|
||||
volume: "bucket".to_string(),
|
||||
path: "object/part.1".to_string(),
|
||||
append: false,
|
||||
size: 0,
|
||||
put_file_auth: Some("digest-trailer-v1".to_string()),
|
||||
put_file_nonce: Some(nonce),
|
||||
put_file_server_epoch: Some(*super::PUT_FILE_CAPABILITY_SERVER_EPOCH),
|
||||
};
|
||||
let mut payload = b"unknown-size-data".to_vec();
|
||||
payload.extend_from_slice(&trailer);
|
||||
let body = iter(vec![Ok::<Bytes, io::Error>(Bytes::from(payload))]);
|
||||
let mut writer = Vec::new();
|
||||
|
||||
let copied = write_put_file_body_chunks_to_writer(body, &mut writer, &query, Some(nonce), url)
|
||||
.await
|
||||
.expect("zero-size create body should verify");
|
||||
|
||||
assert_eq!(copied, 17);
|
||||
assert_eq!(writer, b"unknown-size-data");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn put_file_auth_append_body_rejects_missing_trailer() {
|
||||
let nonce = uuid::Uuid::parse_str("44444444-5555-4666-8777-888888888888").expect("nonce");
|
||||
|
||||
@@ -25,7 +25,9 @@ fn decode_hex(source: &str) -> Vec<u8> {
|
||||
.collect::<String>();
|
||||
digits
|
||||
.as_bytes()
|
||||
.chunks_exact(2)
|
||||
.as_chunks::<2>()
|
||||
.0
|
||||
.iter()
|
||||
.map(|pair| u8::from_str_radix(std::str::from_utf8(pair).expect("hex pair"), 16).expect("fixture hex byte"))
|
||||
.collect()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user