Skip to content

Commit 9651207

Browse files
committed
refactored set_bucket_encrypion
1 parent 7ce9ad3 commit 9651207

15 files changed

+300
-105
lines changed

Cargo.toml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,33 @@ rustls-tls = ["reqwest/rustls-tls"]
2323

2424
[dependencies]
2525
async-recursion = "1.1.1"
26-
async-trait = "0.1.83"
26+
async-trait = "0.1.86"
2727
base64 = "0.22.1"
2828
byteorder = "1.5.0"
29-
bytes = "1.8.0"
29+
bytes = "1.9.0"
3030
chrono = "0.4.39"
3131
crc = "3.2.1"
3232
dashmap = "6.1.0"
3333
derivative = "2.2.0"
34-
env_logger = "0.11.5"
34+
env_logger = "0.11.6"
3535
futures-util = "0.3.31"
3636
hex = "0.4.3"
3737
hmac = "0.12.1"
3838
home = "0.5.9"
3939
http = "1.2.0"
40-
hyper = { version = "1.5.1", features = ["full"] }
40+
hyper = { version = "1.6.0", features = ["full"] }
4141
lazy_static = "1.5.0"
42-
log = "0.4.22"
42+
log = "0.4.25"
4343
md5 = "0.7.0"
4444
multimap = "0.10.0"
45-
os_info = "3.9.0"
45+
os_info = "3.9.2"
4646
percent-encoding = "2.3.1"
4747
rand = { version = "0.8.5", features = ["small_rng"] }
4848
regex = "1.11.1"
49-
serde = { version = "1.0.216", features = ["derive"] }
50-
serde_json = "1.0.133"
49+
serde = { version = "1.0.217", features = ["derive"] }
50+
serde_json = "1.0.138"
5151
sha2 = "0.10.8"
52-
tokio = { version = "1.42.0", features = ["full"] }
52+
tokio = { version = "1.43.0", features = ["full"] }
5353
tokio-stream = "0.1.17"
5454
tokio-util = { version = "0.7.13", features = ["io"] }
5555
urlencoding = "2.1.3"

examples/common.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ pub async fn create_bucket_if_not_exists(
2727
// Check 'bucket_name' bucket exist or not.
2828
let exists: bool = client
2929
.bucket_exists(&BucketExistsArgs::new(bucket_name).unwrap())
30-
.await
31-
.unwrap();
30+
.await?;
3231

3332
// Make 'bucket_name' bucket if not exist.
3433
if !exists {

examples/get_bucket_encryption.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@
1313
// See the License for the specific language governing permissions and
1414
// limitations under the License.
1515

16+
mod common;
17+
1618
use crate::common::{create_bucket_if_not_exists, create_client_on_play};
17-
use minio::s3::builders::GetBucketEncryption;
19+
use minio::s3::response::{GetBucketEncryptionResponse, SetBucketEncryptionResponse};
20+
use minio::s3::types::{S3Api, SseConfig};
1821
use minio::s3::Client;
1922

20-
mod common;
21-
2223
#[tokio::main]
2324
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
2425
env_logger::init(); // Note: set environment variable RUST_LOG="INFO" to log info and higher
@@ -27,9 +28,19 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
2728
let bucket_name: &str = "encryption-rust-bucket";
2829
create_bucket_if_not_exists(bucket_name, &client).await?;
2930

30-
let be: GetBucketEncryption = client.get_bucket_encryption(bucket_name);
31+
let resp: GetBucketEncryptionResponse =
32+
client.get_bucket_encryption(bucket_name).send().await?;
33+
log::info!("encryption before: config={:?}", resp.config,);
34+
35+
let _resp: SetBucketEncryptionResponse = client
36+
.set_bucket_encryption(bucket_name)
37+
.config(SseConfig::default())
38+
.send()
39+
.await?;
3140

32-
log::info!("{:?}", be);
41+
let resp: GetBucketEncryptionResponse =
42+
client.get_bucket_encryption(bucket_name).send().await?;
43+
log::info!("encryption after: config={:?}", resp.config,);
3344

3445
Ok(())
3546
}

examples/get_bucket_versioning.rs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
mod common;
1717

1818
use crate::common::{create_bucket_if_not_exists, create_client_on_play};
19-
use minio::s3::builders::GetBucketVersioning;
19+
use minio::s3::args::SetBucketVersioningArgs;
20+
use minio::s3::response::{GetBucketVersioningResponse, SetBucketVersioningResponse};
21+
use minio::s3::types::S3Api;
2022
use minio::s3::Client;
2123

2224
#[tokio::main]
@@ -27,9 +29,39 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
2729
let bucket_name: &str = "versioning-rust-bucket";
2830
create_bucket_if_not_exists(bucket_name, &client).await?;
2931

30-
let bv: GetBucketVersioning = client.get_bucket_versioning(bucket_name);
32+
let resp: GetBucketVersioningResponse =
33+
client.get_bucket_versioning(bucket_name).send().await?;
34+
log::info!(
35+
"versioning before: status={:?}, mfa_delete={:?}",
36+
resp.status,
37+
resp.mfa_delete
38+
);
3139

32-
log::info!("{:?}", bv);
40+
let _resp: SetBucketVersioningResponse = client
41+
.set_bucket_versioning(&SetBucketVersioningArgs::new(bucket_name, true).unwrap())
42+
.await?;
43+
44+
let resp: GetBucketVersioningResponse =
45+
client.get_bucket_versioning(bucket_name).send().await?;
46+
47+
log::info!(
48+
"versioning after setting to true: status={:?}, mfa_delete={:?}",
49+
resp.status,
50+
resp.mfa_delete
51+
);
52+
53+
let _resp: SetBucketVersioningResponse = client
54+
.set_bucket_versioning(&SetBucketVersioningArgs::new(bucket_name, false).unwrap())
55+
.await?;
56+
57+
let resp: GetBucketVersioningResponse =
58+
client.get_bucket_versioning(bucket_name).send().await?;
59+
60+
log::info!(
61+
"versioning after setting to false: status={:?}, mfa_delete={:?}",
62+
resp.status,
63+
resp.mfa_delete
64+
);
3365

3466
Ok(())
3567
}

src/s3/args.rs

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::s3::signer::post_presign_v4;
2020
use crate::s3::sse::{Sse, SseCustomerKey};
2121
use crate::s3::types::{
2222
Directive, LifecycleConfig, NotificationConfig, ObjectLockConfig, Part, ReplicationConfig,
23-
Retention, RetentionMode, SelectRequest, SseConfig,
23+
Retention, RetentionMode, SelectRequest,
2424
};
2525
use crate::s3::utils::{
2626
b64encode, check_bucket_name, merge, to_amz_date, to_http_header_value, to_iso8601utc,
@@ -1318,42 +1318,6 @@ impl<'a> ComposeObjectArgs<'a> {
13181318
/// Argument for [delete_bucket_encryption()](crate::s3::client::Client::delete_bucket_encryption) API
13191319
pub type DeleteBucketEncryptionArgs<'a> = BucketArgs<'a>;
13201320

1321-
#[derive(Clone, Debug)]
1322-
/// Argument for [set_bucket_encryption()](crate::s3::client::Client::set_bucket_encryption) API
1323-
pub struct SetBucketEncryptionArgs<'a> {
1324-
pub extra_headers: Option<&'a Multimap>,
1325-
pub extra_query_params: Option<&'a Multimap>,
1326-
pub region: Option<&'a str>,
1327-
pub bucket: &'a str,
1328-
pub config: &'a SseConfig,
1329-
}
1330-
1331-
impl<'a> SetBucketEncryptionArgs<'a> {
1332-
/// Returns argument for [set_bucket_encryption()](crate::s3::client::Client::set_bucket_encryption) API with given bucket name and configuration
1333-
///
1334-
/// # Examples
1335-
///
1336-
/// ```
1337-
/// use minio::s3::args::*;
1338-
/// use minio::s3::types::SseConfig;
1339-
/// let args = SetBucketEncryptionArgs::new("my-bucket", &SseConfig::s3()).unwrap();
1340-
/// ```
1341-
pub fn new(
1342-
bucket_name: &'a str,
1343-
config: &'a SseConfig,
1344-
) -> Result<SetBucketEncryptionArgs<'a>, Error> {
1345-
check_bucket_name(bucket_name, true)?;
1346-
1347-
Ok(SetBucketEncryptionArgs {
1348-
extra_headers: None,
1349-
extra_query_params: None,
1350-
region: None,
1351-
bucket: bucket_name,
1352-
config,
1353-
})
1354-
}
1355-
}
1356-
13571321
/// Argument for [enable_object_legal_hold()](crate::s3::client::Client::enable_object_legal_hold) API
13581322
pub type EnableObjectLegalHoldArgs<'a> = ObjectVersionArgs<'a>;
13591323

src/s3/builders.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ mod object_content;
2626
mod object_prompt;
2727
mod put_object;
2828
mod remove_objects;
29+
mod set_bucket_encryption;
2930

3031
pub use bucket_common::*;
3132
pub use get_bucket_encryption::*;
@@ -38,3 +39,4 @@ pub use object_content::*;
3839
pub use object_prompt::*;
3940
pub use put_object::*;
4041
pub use remove_objects::*;
42+
pub use set_bucket_encryption::*;
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
// MinIO Rust Library for Amazon S3 Compatible Cloud Storage
2+
// Copyright 2025 MinIO, Inc.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
use crate::s3::builders::SegmentedBytes;
17+
use crate::s3::error::Error;
18+
use crate::s3::response::SetBucketEncryptionResponse;
19+
use crate::s3::types::{S3Api, S3Request, SseConfig, ToS3Request};
20+
use crate::s3::utils::{check_bucket_name, merge, Multimap};
21+
use crate::s3::Client;
22+
use bytes::Bytes;
23+
use http::Method;
24+
25+
/// Argument builder for [set_bucket_encryption()](Client::set_bucket_encryption) API
26+
#[derive(Clone, Debug, Default)]
27+
pub struct SetBucketEncryption {
28+
client: Option<Client>,
29+
30+
extra_headers: Option<Multimap>,
31+
extra_query_params: Option<Multimap>,
32+
region: Option<String>,
33+
bucket: String,
34+
35+
config: SseConfig,
36+
}
37+
38+
impl SetBucketEncryption {
39+
pub fn new(bucket: &str) -> Self {
40+
Self {
41+
bucket: bucket.to_owned(),
42+
..Default::default()
43+
}
44+
}
45+
46+
pub fn client(mut self, client: &Client) -> Self {
47+
self.client = Some(client.clone());
48+
self
49+
}
50+
51+
pub fn extra_headers(mut self, extra_headers: Option<Multimap>) -> Self {
52+
self.extra_headers = extra_headers;
53+
self
54+
}
55+
56+
pub fn extra_query_params(mut self, extra_query_params: Option<Multimap>) -> Self {
57+
self.extra_query_params = extra_query_params;
58+
self
59+
}
60+
61+
pub fn region(mut self, region: Option<String>) -> Self {
62+
self.region = region;
63+
self
64+
}
65+
66+
pub fn config(mut self, config: SseConfig) -> Self {
67+
self.config = config;
68+
self
69+
}
70+
}
71+
72+
impl S3Api for SetBucketEncryption {
73+
type S3Response = SetBucketEncryptionResponse;
74+
}
75+
76+
impl ToS3Request for SetBucketEncryption {
77+
fn to_s3request(&self) -> Result<S3Request, Error> {
78+
check_bucket_name(&self.bucket, true)?;
79+
let mut headers = Multimap::new();
80+
if let Some(v) = &self.extra_headers {
81+
merge(&mut headers, v);
82+
}
83+
84+
let mut query_params = Multimap::new();
85+
if let Some(v) = &self.extra_query_params {
86+
merge(&mut query_params, v);
87+
}
88+
query_params.insert(String::from("encryption"), String::new());
89+
90+
let bytes: Bytes = self.config.to_xml().into();
91+
let body: Option<SegmentedBytes> = Some(SegmentedBytes::from(bytes));
92+
93+
let req = S3Request::new(
94+
self.client.as_ref().ok_or(Error::NoClientProvided)?,
95+
Method::GET,
96+
)
97+
.region(self.region.as_deref())
98+
.bucket(Some(&self.bucket))
99+
.query_params(query_params)
100+
.headers(headers)
101+
.body(body);
102+
103+
Ok(req)
104+
}
105+
}

src/s3/client.rs

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ mod listen_bucket_notification;
5555
mod object_prompt;
5656
mod put_object;
5757
mod remove_objects;
58+
mod set_bucket_encryption;
5859

5960
use super::builders::{ListBuckets, SegmentedBytes};
6061

@@ -650,7 +651,7 @@ impl Client {
650651
Ok(AbortMultipartUploadResponse {
651652
headers: resp.headers().clone(),
652653
region: region.clone(),
653-
bucket_name: args.bucket.to_string(),
654+
bucket: args.bucket.to_string(),
654655
object_name: args.object.to_string(),
655656
upload_id: args.upload_id.to_string(),
656657
})
@@ -1164,7 +1165,7 @@ impl Client {
11641165
Ok(CreateMultipartUploadResponse {
11651166
headers: header_map.clone(),
11661167
region: region.clone(),
1167-
bucket_name: args.bucket.to_string(),
1168+
bucket: args.bucket.to_string(),
11681169
object_name: args.object.to_string(),
11691170
upload_id: get_text(&root, "UploadId")?,
11701171
})
@@ -2523,42 +2524,6 @@ impl Client {
25232524
})
25242525
}
25252526

2526-
pub async fn set_bucket_encryption(
2527-
&self,
2528-
args: &SetBucketEncryptionArgs<'_>,
2529-
) -> Result<SetBucketEncryptionResponse, Error> {
2530-
let region = self.get_region(args.bucket, args.region).await?;
2531-
2532-
let mut headers = Multimap::new();
2533-
if let Some(v) = &args.extra_headers {
2534-
merge(&mut headers, v);
2535-
}
2536-
2537-
let mut query_params = Multimap::new();
2538-
if let Some(v) = &args.extra_query_params {
2539-
merge(&mut query_params, v);
2540-
}
2541-
query_params.insert(String::from("encryption"), String::new());
2542-
2543-
let resp = self
2544-
.execute(
2545-
Method::PUT,
2546-
&region,
2547-
&mut headers,
2548-
&query_params,
2549-
Some(args.bucket),
2550-
None,
2551-
Some(args.config.to_xml().into()),
2552-
)
2553-
.await?;
2554-
2555-
Ok(SetBucketEncryptionResponse {
2556-
headers: resp.headers().clone(),
2557-
region: region.clone(),
2558-
bucket_name: args.bucket.to_string(),
2559-
})
2560-
}
2561-
25622527
pub async fn set_bucket_lifecycle(
25632528
&self,
25642529
args: &SetBucketLifecycleArgs<'_>,

0 commit comments

Comments
 (0)