Skip to content

Commit 1cc631e

Browse files
committed
remove strict validation and add tests
1 parent e0e17c3 commit 1cc631e

File tree

2 files changed

+45
-42
lines changed

2 files changed

+45
-42
lines changed

bottlecap/src/bin/bottlecap/main.rs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ use dogstatsd::{
5050
dogstatsd::{DogStatsD, DogStatsDConfig},
5151
flusher::{build_fqdn_metrics, Flusher as MetricsFlusher},
5252
};
53-
use lazy_static::lazy_static;
5453
use reqwest::Client;
5554
use serde::Deserialize;
5655
use std::{
@@ -70,11 +69,6 @@ use tokio_util::sync::CancellationToken;
7069
use tracing::{debug, error};
7170
use tracing_subscriber::EnvFilter;
7271

73-
lazy_static! {
74-
static ref API_KEY_REGEX: regex::Regex =
75-
regex::Regex::new(r"^[a-f0-9]{32}$").expect("Invalid regex for DD API KEY");
76-
}
77-
7872
#[derive(Clone, Deserialize)]
7973
#[serde(rename_all = "camelCase")]
8074
struct RegisterResponse {
@@ -181,9 +175,7 @@ async fn main() -> Result<()> {
181175
.await
182176
.map_err(|e| Error::new(std::io::ErrorKind::InvalidData, e.to_string()))?;
183177

184-
if let Some(resolved_api_key) =
185-
clean_api_key(resolve_secrets(Arc::clone(&config), &aws_config).await)
186-
{
178+
if let Some(resolved_api_key) = resolve_secrets(Arc::clone(&config), &aws_config).await {
187179
match extension_loop_active(&aws_config, &config, &client, &r, resolved_api_key).await {
188180
Ok(()) => {
189181
debug!("Extension loop completed successfully");
@@ -202,17 +194,6 @@ async fn main() -> Result<()> {
202194
}
203195
}
204196

205-
fn clean_api_key(maybe_key: Option<String>) -> Option<String> {
206-
if let Some(key) = maybe_key {
207-
let clean_key = key.trim_end_matches('\n').replace(' ', "").to_string();
208-
if API_KEY_REGEX.is_match(&clean_key) {
209-
return Some(clean_key);
210-
}
211-
error!("API key has invalid format");
212-
}
213-
None
214-
}
215-
216197
fn load_configs() -> (AwsConfig, Arc<Config>) {
217198
// First load the configuration
218199
let aws_config = AwsConfig {

bottlecap/src/secrets/decrypt.rs

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,49 @@ use tracing::debug;
1313
use tracing::error;
1414

1515
pub async fn resolve_secrets(config: Arc<Config>, aws_config: &AwsConfig) -> Option<String> {
16-
if !config.api_key_secret_arn.is_empty() || !config.kms_api_key.is_empty() {
17-
let before_decrypt = Instant::now();
18-
19-
let client = match Client::builder().use_rustls_tls().build() {
20-
Ok(client) => client,
21-
Err(err) => {
22-
error!("Error creating reqwest client: {}", err);
23-
return None;
16+
let api_key_candidate =
17+
if !config.api_key_secret_arn.is_empty() || !config.kms_api_key.is_empty() {
18+
let before_decrypt = Instant::now();
19+
20+
let client = match Client::builder().use_rustls_tls().build() {
21+
Ok(client) => client,
22+
Err(err) => {
23+
error!("Error creating reqwest client: {}", err);
24+
return None;
25+
}
26+
};
27+
28+
let decrypted_key = if config.kms_api_key.is_empty() {
29+
decrypt_aws_sm(&client, config.api_key_secret_arn.clone(), aws_config).await
30+
} else {
31+
decrypt_aws_kms(&client, config.kms_api_key.clone(), aws_config).await
32+
};
33+
34+
debug!("Decrypt took {}ms", before_decrypt.elapsed().as_millis());
35+
36+
match decrypted_key {
37+
Ok(key) => Some(key),
38+
Err(err) => {
39+
error!("Error decrypting key: {}", err);
40+
None
41+
}
2442
}
25-
};
26-
27-
let decrypted_key = if config.kms_api_key.is_empty() {
28-
decrypt_aws_sm(&client, config.api_key_secret_arn.clone(), aws_config).await
2943
} else {
30-
decrypt_aws_kms(&client, config.kms_api_key.clone(), aws_config).await
44+
Some(config.api_key.clone())
3145
};
3246

33-
debug!("Decrypt took {}ms", before_decrypt.elapsed().as_millis());
47+
clean_api_key(api_key_candidate)
48+
}
3449

35-
match decrypted_key {
36-
Ok(key) => Some(key),
37-
Err(err) => {
38-
error!("Error decrypting key: {}", err);
39-
None
40-
}
50+
fn clean_api_key(maybe_key: Option<String>) -> Option<String> {
51+
if let Some(key) = maybe_key {
52+
let clean_key = key.trim_end_matches('\n').replace(' ', "").to_string();
53+
if !clean_key.is_empty() {
54+
return Some(clean_key);
4155
}
42-
} else {
43-
Some(config.api_key.clone())
56+
error!("API key has invalid format");
4457
}
58+
None
4559
}
4660

4761
struct RequestArgs<'a> {
@@ -250,6 +264,14 @@ mod tests {
250264
use super::*;
251265
use chrono::{NaiveDateTime, TimeZone};
252266

267+
#[test]
268+
fn key_cleanup() {
269+
let key = clean_api_key(Some(" 32alxcxf\n".to_string()));
270+
assert_eq!(key.unwrap(), "32alxcxf");
271+
let key = clean_api_key(Some(" \n".to_string()));
272+
assert_eq!(key, None);
273+
}
274+
253275
#[test]
254276
#[allow(clippy::unwrap_used)]
255277
fn test_build_get_secret_signed_headers() {

0 commit comments

Comments
 (0)