use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "filesystem.plugins.WhitelistEntry")]
pub struct WhitelistEntry {
pub owner: String,
pub repository: String,
pub commit_sha: String,
pub version: String,
}
pub fn default_whitelist() -> Vec<WhitelistEntry> {
vec![WhitelistEntry {
owner: "(?i)ObjectiveAI".to_string(),
repository: ".*".to_string(),
commit_sha: ".*".to_string(),
version: ".*".to_string(),
}]
}
pub fn check_plugin_whitelist(
owner: &str,
repository: &str,
commit_sha: &str,
version: &str,
whitelist: &[WhitelistEntry],
) -> Result<bool, regex::Error> {
for entry in whitelist {
if anchored_match(&entry.owner, owner)?
&& anchored_match(&entry.repository, repository)?
&& anchored_match(&entry.commit_sha, commit_sha)?
&& anchored_match(&entry.version, version)?
{
return Ok(true);
}
}
Ok(false)
}
fn anchored_match(pattern: &str, value: &str) -> Result<bool, regex::Error> {
let anchored = format!("^(?:{pattern})$");
let re = regex::Regex::new(&anchored)?;
Ok(re.is_match(value))
}