summaryrefslogtreecommitdiff
path: root/src/util.rs
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-11-10 10:34:05 +0200
committerLars Wirzenius <liw@liw.fi>2021-11-10 10:34:05 +0200
commit22cc382f9e9aa38f3adad18acd426bf0292bbf00 (patch)
tree96a392797b77e98d3ce2b26358b9c250db65e1e2 /src/util.rs
parent96c3606757750dadfcf31ec5ccd7787292da9273 (diff)
downloadvmadm-22cc382f9e9aa38f3adad18acd426bf0292bbf00.tar.gz
feat: check that virtual network names are syntactically correct
Sponsored-by: author
Diffstat (limited to 'src/util.rs')
-rw-r--r--src/util.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/util.rs b/src/util.rs
index c3565e0..cf60bf9 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -2,7 +2,9 @@
use home_dir::HomeDirExt;
+use lazy_static::lazy_static;
use log::debug;
+use regex::Regex;
use std::net::TcpStream;
use std::path::{Path, PathBuf};
@@ -43,3 +45,49 @@ pub fn expand_optional_pathbufs(
}
Ok(())
}
+
+pub fn check_network_names(networks: &[String]) -> Result<(), NetworkNameError> {
+ lazy_static! {
+ static ref RE: Regex = Regex::new("^(network|bridge)=[a-z0-9-]*$").unwrap();
+ }
+ for name in networks.iter() {
+ if !RE.is_match(name) {
+ return Err(NetworkNameError::BadNetworkName(name.to_string()));
+ }
+ }
+ Ok(())
+}
+
+#[derive(Debug, thiserror::Error)]
+pub enum NetworkNameError {
+ /// Bad network name.
+ #[error("Network name should be network=foo or bridge=bar, not: {0}")]
+ BadNetworkName(String),
+}
+
+#[cfg(test)]
+mod test {
+ use super::check_network_names;
+
+ fn networks(names: &[&str]) -> Vec<String> {
+ names.iter().map(|s| s.to_string()).collect()
+ }
+
+ #[test]
+ fn accepts_network_name() {
+ let names = networks(&["network=foo"]);
+ assert!(check_network_names(&names).is_ok());
+ }
+
+ #[test]
+ fn accepts_bridge_name() {
+ let names = networks(&["bridge=foo"]);
+ assert!(check_network_names(&names).is_ok());
+ }
+
+ #[test]
+ fn rejects_plain_name() {
+ let names = networks(&["foo"]);
+ assert!(check_network_names(&names).is_err());
+ }
+}