Skip to content

Commit e881474

Browse files
committed
Embeds the detections in the bin
1 parent d1e4883 commit e881474

6 files changed

Lines changed: 182 additions & 19 deletions

File tree

Cargo.lock

Lines changed: 146 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ xargo = false
1313
[dependencies]
1414
clap = { version = "4.5.8", features = ["derive"] }
1515
regex = "1.10.5"
16+
rust-embed = "8.4.0"
1617
serde = { version = "1.0.203", features = ["derive"] }
1718
thiserror = "1.0.61"
1819
toml = "0.8.14"

examples/basic_usage.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ fn main() {
88
}
99

1010
fn run() -> Result<(), MinosCodexError> {
11-
let mut scanner = create_scanner("detections")?;
11+
let mut scanner = create_scanner()?;
1212

1313
let input = "My email is example@email.com and my AWS access key is AKIAIOSFODNN7EXAMPLE";
1414

src/bin/minos-codex.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use clap::Parser;
22
use minos_codex::{create_scanner, MinosCodexError};
3+
use rust_embed::RustEmbed;
34

45
#[derive(Parser)]
56
#[clap(
@@ -13,10 +14,13 @@ struct Opts {
1314
input: String,
1415
}
1516

17+
#[derive(RustEmbed)]
18+
#[folder = "detections/"]
19+
struct Assets;
20+
1621
fn main() -> Result<(), MinosCodexError> {
1722
let opts: Opts = Opts::parse();
18-
19-
let mut scanner = create_scanner("detections")?;
23+
let mut scanner = create_scanner()?;
2024

2125
let found_secrets = scanner.scan(&opts.input)?;
2226

src/config/mod.rs

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
use crate::secret_type::SecretType;
22
use crate::MinosCodexError;
3+
use rust_embed::RustEmbed;
34
use serde::Deserialize;
45
use std::collections::HashMap;
5-
use std::fs;
6-
use std::path::{Path, PathBuf};
6+
use std::str::Utf8Error;
7+
8+
impl From<Utf8Error> for MinosCodexError {
9+
fn from(err: Utf8Error) -> Self {
10+
MinosCodexError::ConfigLoadError(std::io::Error::new(std::io::ErrorKind::InvalidData, err))
11+
}
12+
}
713

814
#[derive(Deserialize)]
915
struct SecretTypeWrapper {
1016
secret_type: SecretType,
1117
}
1218

19+
#[derive(RustEmbed)]
20+
#[folder = "detections/"]
21+
struct ConfigAssets;
22+
1323
pub struct Config {
1424
secret_types: HashMap<String, SecretType>,
1525
}
@@ -21,15 +31,19 @@ impl Config {
2131
}
2232
}
2333

24-
pub fn load_from_directory<P: AsRef<Path>>(dir_path: P) -> Result<Self, MinosCodexError> {
34+
pub fn load_from_embedded() -> Result<Self, MinosCodexError> {
2535
let mut config = Config::new();
26-
let dir = fs::read_dir(dir_path)?;
2736

28-
for entry in dir {
29-
let entry = entry?;
30-
let path = entry.path();
31-
if path.is_file() && path.extension().map_or(false, |ext| ext == "toml") {
32-
let secret_type = Config::load_secret_type_from_file(&path)?;
37+
for file in ConfigAssets::iter() {
38+
if file.ends_with(".toml") {
39+
let file_data = ConfigAssets::get(&file).ok_or_else(|| {
40+
MinosCodexError::ConfigLoadError(std::io::Error::new(
41+
std::io::ErrorKind::NotFound,
42+
"File not found",
43+
))
44+
})?;
45+
let contents = std::str::from_utf8(file_data.data.as_ref())?;
46+
let secret_type = Config::load_secret_type_from_data(contents)?;
3347
config
3448
.secret_types
3549
.insert(secret_type.name.clone(), secret_type);
@@ -39,13 +53,12 @@ impl Config {
3953
Ok(config)
4054
}
4155

42-
fn load_secret_type_from_file(file_path: &PathBuf) -> Result<SecretType, MinosCodexError> {
43-
let contents = fs::read_to_string(file_path)?;
44-
let wrapper: SecretTypeWrapper = toml::from_str(&contents)?;
56+
fn load_secret_type_from_data(data: &str) -> Result<SecretType, MinosCodexError> {
57+
let wrapper: SecretTypeWrapper = toml::from_str(data)?;
4558
wrapper
4659
.secret_type
4760
.validate()
48-
.map_err(|e| MinosCodexError::ValidationError(e))?;
61+
.map_err(MinosCodexError::ValidationError)?;
4962
Ok(wrapper.secret_type)
5063
}
5164

src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,10 @@ pub enum MinosCodexError {
2424
ValidationError(String),
2525
}
2626

27-
pub fn create_scanner(config_dir: &str) -> Result<Scanner, MinosCodexError> {
28-
let config = Config::load_from_directory(config_dir)?;
27+
pub fn create_scanner() -> Result<Scanner, MinosCodexError> {
28+
let config = Config::load_from_embedded()?;
2929
Ok(Scanner::new(config))
3030
}
31-
3231
impl From<extern_regex::Error> for MinosCodexError {
3332
fn from(err: extern_regex::Error) -> Self {
3433
match err {

0 commit comments

Comments
 (0)