use anyhow::Result;
use minijinja::Environment;
const MAX_TEMPLATE_SIZE: usize = 1_000_000;
pub fn validate_template_syntax(content: &str) -> Result<()> {
let mut env = Environment::new();
env.add_template("_validation", content)
.map_err(|e| anyhow::anyhow!("Template syntax error: {e}"))?;
Ok(())
}
pub fn validate_prompt_file(content: &str) -> Result<()> {
if content.len() > MAX_TEMPLATE_SIZE {
anyhow::bail!(
"Template too large ({} bytes). Maximum size is {} bytes (1MB).",
content.len(),
MAX_TEMPLATE_SIZE
);
}
let template = super::template::parse_template("_validation", content)?;
validate_template_syntax(&template.content)?;
validate_no_dangerous_operations(&template.content)?;
Ok(())
}
fn validate_no_dangerous_operations(content: &str) -> Result<()> {
if content.contains("{% include") || content.contains("{%- include") {
anyhow::bail!(
"Template contains forbidden 'include' directive. \
File inclusion is not allowed for security reasons."
);
}
if content.contains("{% extends") || content.contains("{%- extends") {
anyhow::bail!(
"Template contains forbidden 'extends' directive. \
Template inheritance is not supported."
);
}
if content.contains("{% import") || content.contains("{%- import") {
anyhow::bail!(
"Template contains forbidden 'import' directive. \
Module imports are not allowed."
);
}
Ok(())
}