From 38ca44d10d6d87a3d18fafff84322d77e1d5fd89 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 21 Feb 2016 19:18:38 +0100 Subject: [PATCH] Add is_tag() checks --- libimagtag/src/error.rs | 8 +++++--- libimagtag/src/tagable.rs | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/libimagtag/src/error.rs b/libimagtag/src/error.rs index dcd36426..ed15e283 100644 --- a/libimagtag/src/error.rs +++ b/libimagtag/src/error.rs @@ -9,13 +9,15 @@ pub enum TagErrorKind { TagTypeError, HeaderReadError, HeaderWriteError, + NotATag, } fn tag_error_type_as_str(e: &TagErrorKind) -> &'static str { match e { - &TagErrorKind::TagTypeError => "Entry Header Tag Type wrong", - &TagErrorKind::HeaderReadError => "Error while reading entry header", - &TagErrorKind::HeaderWriteError=> "Error while writing entry header", + &TagErrorKind::TagTypeError => "Entry Header Tag Type wrong", + &TagErrorKind::HeaderReadError => "Error while reading entry header", + &TagErrorKind::HeaderWriteError => "Error while writing entry header", + &TagErrorKind::NotATag => "String is not a tag", } } diff --git a/libimagtag/src/tagable.rs b/libimagtag/src/tagable.rs index 3eca3856..f38f49d6 100644 --- a/libimagtag/src/tagable.rs +++ b/libimagtag/src/tagable.rs @@ -3,6 +3,7 @@ use libimagstore::store::{Entry, EntryHeader}; use error::{TagError, TagErrorKind}; use result::Result; use tag::Tag; +use util::is_tag; use toml::Value; @@ -34,6 +35,12 @@ impl Tagable for EntryHeader { if !tags.iter().all(|t| match t { &Value::String(_) => true, _ => false }) { return Err(TagError::new(TagErrorKind::TagTypeError, None)); } + if tags.iter().any(|t| match t { + &Value::String(ref s) => !is_tag(&s), + _ => unreachable!()}) + { + return Err(TagError::new(TagErrorKind::NotATag, None)); + } Ok(tags.iter() .cloned() @@ -51,6 +58,11 @@ impl Tagable for EntryHeader { } fn set_tags(&mut self, ts: Vec) -> Result<()> { + if ts.iter().any(|tag| !is_tag(tag)) { + debug!("Not a tag: '{}'", ts.iter().filter(|t| !is_tag(t)).next().unwrap()); + return Err(TagError::new(TagErrorKind::NotATag, None)); + } + let a = ts.iter().map(|t| Value::String(t.clone())).collect(); self.set("imag.tags", Value::Array(a)) .map(|_| ()) @@ -58,6 +70,11 @@ impl Tagable for EntryHeader { } fn add_tag(&mut self, t: Tag) -> Result<()> { + if !is_tag(&t) { + debug!("Not a tag: '{}'", t); + return Err(TagError::new(TagErrorKind::NotATag, None)); + } + self.get_tags() .map(|mut tags| { tags.push(t); @@ -67,6 +84,11 @@ impl Tagable for EntryHeader { } fn remove_tag(&mut self, t: Tag) -> Result<()> { + if !is_tag(&t) { + debug!("Not a tag: '{}'", t); + return Err(TagError::new(TagErrorKind::NotATag, None)); + } + self.get_tags() .map(|mut tags| { tags.retain(|tag| tag.clone() != t);