This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch xuanwo/sts-session-policy
in repository https://gitbox.apache.org/repos/asf/opendal-reqsign.git


The following commit(s) were added to refs/heads/xuanwo/sts-session-policy by 
this push:
     new 1982013  fix(ci): satisfy fmt and clippy
1982013 is described below

commit 1982013c37ec86796d671fda4fc57d592b2840be
Author: Xuanwo <[email protected]>
AuthorDate: Fri Dec 26 19:12:28 2025 +0800

    fix(ci): satisfy fmt and clippy
---
 .../aws-v4/src/provide_credential/assume_role.rs   | 92 ++++++++++++----------
 1 file changed, 49 insertions(+), 43 deletions(-)

diff --git a/services/aws-v4/src/provide_credential/assume_role.rs 
b/services/aws-v4/src/provide_credential/assume_role.rs
index 89b5e1e..9a47212 100644
--- a/services/aws-v4/src/provide_credential/assume_role.rs
+++ b/services/aws-v4/src/provide_credential/assume_role.rs
@@ -162,17 +162,17 @@ impl ProvideCredential for AssumeRoleCredentialProvider {
         let endpoint = sts_endpoint(self.region.as_deref(), 
self.use_regional_sts_endpoint)
             .map_err(|e| e.with_context(format!("role_arn: {}", 
self.role_arn)))?;
 
-        let query = build_assume_role_query(
-            &self.role_arn,
-            &self.role_session_name,
-            self.external_id.as_deref(),
-            self.duration_seconds,
-            self.tags.as_deref(),
-            self.policy.as_deref(),
-            self.policy_arns.as_deref(),
-            self.serial_number.as_deref(),
-            self.token_code.as_deref(),
-        );
+        let query = build_assume_role_query(AssumeRoleQueryInput {
+            role_arn: &self.role_arn,
+            role_session_name: &self.role_session_name,
+            external_id: self.external_id.as_deref(),
+            duration_seconds: self.duration_seconds,
+            tags: self.tags.as_deref(),
+            policy: self.policy.as_deref(),
+            policy_arns: self.policy_arns.as_deref(),
+            serial_number: self.serial_number.as_deref(),
+            token_code: self.token_code.as_deref(),
+        });
         let url = format!("https://{endpoint}/?{query}";);
 
         let req = http::request::Request::builder()
@@ -246,40 +246,42 @@ impl ProvideCredential for AssumeRoleCredentialProvider {
     }
 }
 
-fn build_assume_role_query(
-    role_arn: &str,
-    role_session_name: &str,
-    external_id: Option<&str>,
+struct AssumeRoleQueryInput<'a> {
+    role_arn: &'a str,
+    role_session_name: &'a str,
+    external_id: Option<&'a str>,
     duration_seconds: Option<u32>,
-    tags: Option<&[(String, String)]>,
-    policy: Option<&str>,
-    policy_arns: Option<&[String]>,
-    serial_number: Option<&str>,
-    token_code: Option<&str>,
-) -> String {
+    tags: Option<&'a [(String, String)]>,
+    policy: Option<&'a str>,
+    policy_arns: Option<&'a [String]>,
+    serial_number: Option<&'a str>,
+    token_code: Option<&'a str>,
+}
+
+fn build_assume_role_query(input: AssumeRoleQueryInput<'_>) -> String {
     let mut serializer = Serializer::new(String::new());
     serializer
         .append_pair("Action", "AssumeRole")
-        .append_pair("RoleArn", role_arn)
+        .append_pair("RoleArn", input.role_arn)
         .append_pair("Version", "2011-06-15")
-        .append_pair("RoleSessionName", role_session_name);
+        .append_pair("RoleSessionName", input.role_session_name);
 
-    if let Some(external_id) = external_id {
+    if let Some(external_id) = input.external_id {
         serializer.append_pair("ExternalId", external_id);
     }
-    if let Some(duration_seconds) = duration_seconds {
+    if let Some(duration_seconds) = input.duration_seconds {
         serializer.append_pair("DurationSeconds", 
&duration_seconds.to_string());
     }
-    if let Some(policy) = policy {
+    if let Some(policy) = input.policy {
         serializer.append_pair("Policy", policy);
     }
-    if let Some(policy_arns) = policy_arns {
+    if let Some(policy_arns) = input.policy_arns {
         for (idx, arn) in policy_arns.iter().enumerate() {
             let key = format!("PolicyArns.member.{}.arn", idx + 1);
             serializer.append_pair(&key, arn);
         }
     }
-    if let Some(tags) = tags {
+    if let Some(tags) = input.tags {
         for (idx, (key, value)) in tags.iter().enumerate() {
             let tag_index = idx + 1;
             serializer
@@ -287,10 +289,10 @@ fn build_assume_role_query(
                 .append_pair(&format!("Tags.member.{tag_index}.Value"), value);
         }
     }
-    if let Some(serial_number) = serial_number {
+    if let Some(serial_number) = input.serial_number {
         serializer.append_pair("SerialNumber", serial_number);
     }
-    if let Some(token_code) = token_code {
+    if let Some(token_code) = input.token_code {
         serializer.append_pair("TokenCode", token_code);
     }
 
@@ -384,22 +386,26 @@ mod tests {
             "arn:aws:iam::aws:policy/ReadOnlyAccess".to_string(),
             "arn:aws:iam::123456789012:policy/ExamplePolicy".to_string(),
         ];
-        let query = build_assume_role_query(
-            "arn:aws:iam::123456789012:role/test-role",
-            "reqsign",
-            None,
-            Some(3600),
-            None,
-            Some(policy),
-            Some(policy_arns.as_slice()),
-            None,
-            None,
-        );
+        let query = build_assume_role_query(AssumeRoleQueryInput {
+            role_arn: "arn:aws:iam::123456789012:role/test-role",
+            role_session_name: "reqsign",
+            external_id: None,
+            duration_seconds: Some(3600),
+            tags: None,
+            policy: Some(policy),
+            policy_arns: Some(policy_arns.as_slice()),
+            serial_number: None,
+            token_code: None,
+        });
 
         assert!(
             
query.contains("Policy=%7B%22Version%22%3A%222012-10-17%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%22s3%3AListBucket%22%2C%22Resource%22%3A%22*%22%2C%22Condition%22%3A%7B%22StringEquals%22%3A%7B%22s3%3Aprefix%22%3A%22a+b%22%7D%7D%7D%5D%7D")
         );
-        
assert!(query.contains("PolicyArns.member.1.arn=arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FReadOnlyAccess"));
-        
assert!(query.contains("PolicyArns.member.2.arn=arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2FExamplePolicy"));
+        assert!(query.contains(
+            
"PolicyArns.member.1.arn=arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FReadOnlyAccess"
+        ));
+        assert!(query.contains(
+            
"PolicyArns.member.2.arn=arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2FExamplePolicy"
+        ));
     }
 }

Reply via email to