forked from DGNum/colmena
36 lines
998 B
Rust
36 lines
998 B
Rust
|
use std::path::PathBuf;
|
||
|
|
||
|
use regex::Regex;
|
||
|
use serde::{Serialize, Deserialize};
|
||
|
use validator::{Validate, ValidationError};
|
||
|
|
||
|
#[derive(Debug, Clone, Validate, Serialize, Deserialize)]
|
||
|
pub struct Key {
|
||
|
pub(crate) text: String,
|
||
|
#[validate(custom = "validate_dest_dir")]
|
||
|
#[serde(rename = "destDir")]
|
||
|
pub(super) dest_dir: PathBuf,
|
||
|
#[validate(custom = "validate_unix_name")]
|
||
|
pub(super) user: String,
|
||
|
#[validate(custom = "validate_unix_name")]
|
||
|
pub(super) group: String,
|
||
|
pub(super) permissions: String,
|
||
|
}
|
||
|
|
||
|
fn validate_unix_name(name: &str) -> Result<(), ValidationError> {
|
||
|
let re = Regex::new(r"^[a-z][-a-z0-9]*$").unwrap();
|
||
|
if re.is_match(name) {
|
||
|
Ok(())
|
||
|
} else {
|
||
|
Err(ValidationError::new("Invalid user/group name"))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn validate_dest_dir(dir: &PathBuf) -> Result<(), ValidationError> {
|
||
|
if dir.has_root() {
|
||
|
Ok(())
|
||
|
} else {
|
||
|
Err(ValidationError::new("Secret key destination directory must be absolute"))
|
||
|
}
|
||
|
}
|