From 5f256249f4260ed405f2bf008253fe3928443d33 Mon Sep 17 00:00:00 2001 From: tennisleng <83838474+tennisleng@users.noreply.github.com> Date: Sat, 6 Dec 2025 10:12:58 -0500 Subject: [PATCH] fix: correct ARN parsing for notification targets (#1010) Co-authored-by: Andrew Leng Co-authored-by: houseme --- rustfs/src/main.rs | 21 ++++++++++++++++----- rustfs/src/storage/ecfs.rs | 28 ++++++++++++++++------------ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index 559aead5..efa10584 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -60,12 +60,11 @@ use rustfs_ecstore::{ use rustfs_iam::init_iam_sys; use rustfs_notify::notifier_global; use rustfs_obs::{init_obs, set_global_guard}; -use rustfs_targets::arn::TargetID; +use rustfs_targets::arn::{ARN, TargetIDError}; use rustfs_utils::net::parse_and_resolve_address; use s3s::s3_error; use std::env; use std::io::{Error, Result}; -use std::str::FromStr; use std::sync::Arc; use tokio_util::sync::CancellationToken; use tracing::{debug, error, info, instrument, warn}; @@ -516,9 +515,21 @@ async fn add_bucket_notification_configuration(buckets: Vec) { "Bucket '{}' has existing notification configuration: {:?}", bucket, cfg); let mut event_rules = Vec::new(); - process_queue_configurations(&mut event_rules, cfg.queue_configurations.clone(), TargetID::from_str); - process_topic_configurations(&mut event_rules, cfg.topic_configurations.clone(), TargetID::from_str); - process_lambda_configurations(&mut event_rules, cfg.lambda_function_configurations.clone(), TargetID::from_str); + process_queue_configurations(&mut event_rules, cfg.queue_configurations.clone(), |arn_str| { + ARN::parse(arn_str) + .map(|arn| arn.target_id) + .map_err(|e| TargetIDError::InvalidFormat(e.to_string())) + }); + process_topic_configurations(&mut event_rules, cfg.topic_configurations.clone(), |arn_str| { + ARN::parse(arn_str) + .map(|arn| arn.target_id) + .map_err(|e| TargetIDError::InvalidFormat(e.to_string())) + }); + process_lambda_configurations(&mut event_rules, cfg.lambda_function_configurations.clone(), |arn_str| { + ARN::parse(arn_str) + .map(|arn| arn.target_id) + .map_err(|e| TargetIDError::InvalidFormat(e.to_string())) + }); if let Err(e) = notifier_global::add_event_specific_rules(bucket, region, &event_rules) .await diff --git a/rustfs/src/storage/ecfs.rs b/rustfs/src/storage/ecfs.rs index 8828fec2..29a78816 100644 --- a/rustfs/src/storage/ecfs.rs +++ b/rustfs/src/storage/ecfs.rs @@ -108,7 +108,7 @@ use rustfs_s3select_api::{ use rustfs_s3select_query::get_global_db; use rustfs_targets::{ EventName, - arn::{TargetID, TargetIDError}, + arn::{ARN, TargetID, TargetIDError}, }; use rustfs_utils::{ CompressionAlgorithm, extract_req_params_header, extract_resp_elements, get_request_host, get_request_user_agent, @@ -4869,20 +4869,24 @@ impl S3 for FS { let parse_rules = async { let mut event_rules = Vec::new(); - process_queue_configurations( - &mut event_rules, - notification_configuration.queue_configurations.clone(), - TargetID::from_str, - ); - process_topic_configurations( - &mut event_rules, - notification_configuration.topic_configurations.clone(), - TargetID::from_str, - ); + process_queue_configurations(&mut event_rules, notification_configuration.queue_configurations.clone(), |arn_str| { + ARN::parse(arn_str) + .map(|arn| arn.target_id) + .map_err(|e| TargetIDError::InvalidFormat(e.to_string())) + }); + process_topic_configurations(&mut event_rules, notification_configuration.topic_configurations.clone(), |arn_str| { + ARN::parse(arn_str) + .map(|arn| arn.target_id) + .map_err(|e| TargetIDError::InvalidFormat(e.to_string())) + }); process_lambda_configurations( &mut event_rules, notification_configuration.lambda_function_configurations.clone(), - TargetID::from_str, + |arn_str| { + ARN::parse(arn_str) + .map(|arn| arn.target_id) + .map_err(|e| TargetIDError::InvalidFormat(e.to_string())) + }, ); event_rules