litellm/litellm-rust/crates/secrets/tests/handler.rs

107 lines
3.8 KiB
Rust

#[cfg(feature = "aws")]
#[tokio::test]
async fn aws_handler_reads_ciphertext_decodes_trims_and_redacts() {
use aws_sdk_kms::{
Client,
config::{BehaviorVersion, Credentials, Region},
};
use base64::{Engine, engine::general_purpose::STANDARD};
use litellm_secrets::{
Error, KeyManagementSettings, SecretManager, aws::AwsKms, get_secret_from_manager,
};
use wiremock::{Mock, MockServer, ResponseTemplate, matchers::body_json};
let server = MockServer::start().await;
Mock::given(body_json(
serde_json::json!({"CiphertextBlob": STANDARD.encode("encrypted")}),
))
.respond_with(
ResponseTemplate::new(200)
.set_body_json(serde_json::json!({"Plaintext":STANDARD.encode(" value\n")})),
)
.expect(1)
.mount(&server)
.await;
let client = Client::from_conf(
aws_sdk_kms::Config::builder()
.behavior_version(BehaviorVersion::latest())
.region(Region::new("us-east-1"))
.credentials_provider(Credentials::new("test", "test", None, None, "test"))
.endpoint_url(server.uri())
.build(),
);
let manager = SecretManager::AwsKms(AwsKms::new(client));
let settings = KeyManagementSettings::default();
let value = get_secret_from_manager(&manager, "KEY", &settings, &|name: &str| {
assert_eq!(name, "KEY");
Some(format!(" {}\n", STANDARD.encode("encrypted")))
})
.await
.unwrap()
.unwrap();
assert_eq!(value.as_str(), Some("value"));
assert!(!format!("{value:?}").contains("value"));
assert!(matches!(
get_secret_from_manager(&manager, "KEY", &settings, &|_: &str| None).await,
Err(Error::MissingCiphertext)
));
assert!(matches!(
get_secret_from_manager(&manager, "KEY", &settings, &|_: &str| Some("abc".into())).await,
Err(Error::InvalidCiphertext)
));
}
#[cfg(feature = "google")]
#[tokio::test]
async fn google_handler_requires_canonical_base64_and_preserves_plaintext_whitespace() {
use base64::{Engine, engine::general_purpose::STANDARD};
use google_cloud_kms_v1::client::KeyManagementService;
use litellm_secrets::{
Error, KeyManagementSettings, SecretManager, get_secret_from_manager, google::GoogleKms,
};
use wiremock::{
Mock, MockServer, ResponseTemplate,
matchers::{body_json, path},
};
let server = MockServer::start().await;
let resource = "projects/project/locations/global/keyRings/ring/cryptoKeys/key";
Mock::given(path(format!("/v1/{resource}:decrypt")))
.and(body_json(
serde_json::json!({"ciphertext":STANDARD.encode("encrypted")}),
))
.respond_with(
ResponseTemplate::new(200)
.set_body_json(serde_json::json!({"plaintext":STANDARD.encode(" value\n")})),
)
.expect(1)
.mount(&server)
.await;
let client = KeyManagementService::builder()
.with_endpoint(server.uri())
.with_credentials(google_cloud_auth::credentials::anonymous::Builder::new().build())
.build()
.await
.unwrap();
let manager = SecretManager::GoogleKms(GoogleKms::new(client, resource.into()));
let settings = KeyManagementSettings::default();
let value = get_secret_from_manager(&manager, "KEY", &settings, &|_: &str| {
Some(STANDARD.encode("encrypted"))
})
.await
.unwrap()
.unwrap();
assert_eq!(value.as_str(), Some(" value\n"));
assert!(matches!(
get_secret_from_manager(&manager, "KEY", &settings, &|_: &str| Some(format!(
" {}",
STANDARD.encode("encrypted")
)))
.await,
Err(Error::InvalidCiphertext)
));
assert!(matches!(
get_secret_from_manager(&manager, "KEY", &settings, &|_: &str| None).await,
Err(Error::MissingCiphertext)
));
}