summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-02-23 13:34:59 -0400
committerGravatar Joey Hess <joey@kitenet.net>2014-02-23 13:34:59 -0400
commit84884101e3c19b0db4c8c5975fc47575dc0782fb (patch)
tree34744e6eadb3405e8c31f9f67df57270eb2781ba
parent82b230213dc35f17ed26dbc5074cb8bc14444ba1 (diff)
metadata: Field names limited to alphanumerics and a few whitelisted punctuation characters to avoid issues with views, etc.
-rw-r--r--Types/MetaData.hs24
-rw-r--r--debian/changelog2
-rw-r--r--doc/metadata.mdwn2
3 files changed, 20 insertions, 8 deletions
diff --git a/Types/MetaData.hs b/Types/MetaData.hs
index b941cb59b..7c4028a2d 100644
--- a/Types/MetaData.hs
+++ b/Types/MetaData.hs
@@ -115,19 +115,29 @@ instance MetaSerializable CurrentlySet where
deserialize "-" = Just (CurrentlySet False)
deserialize _ = Nothing
-{- Fields cannot be empty, contain whitespace, or start with "+-" as
- - that would break the serialization. -}
toMetaField :: String -> Maybe MetaField
toMetaField f
| legalField f = Just $ MetaField f
| otherwise = Nothing
+{- Fields cannot be empty, contain whitespace, or start with "+-" as
+ - that would break the serialization.
+ -
+ - Additionally, fields should not contain any form of path separator, as
+ - that would break views.
+ -
+ - So, require they have an alphanumeric first letter, with the remainder
+ - being either alphanumeric or a small set of shitelisted common punctuation.
+ -}
legalField :: String -> Bool
-legalField f
- | null f = False
- | any isSpace f = False
- | any (`isPrefixOf` f) ["+", "-"] = False
- | otherwise = True
+legalField [] = False
+legalField (c1:cs)
+ | not (isAlphaNum c1) = False
+ | otherwise = all legalchars cs
+ where
+ legalchars c
+ | isAlphaNum c = True
+ | otherwise = c `elem` "_-."
toMetaValue :: String -> MetaValue
toMetaValue = MetaValue (CurrentlySet True)
diff --git a/debian/changelog b/debian/changelog
index edb203402..c336fc481 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -11,6 +11,8 @@ git-annex (5.20140222) UNRELEASED; urgency=medium
tag/showname.
* annex.genmetadata can be set to make git-annex automatically set
metadata (year and month) when adding files.
+ * metadata: Field names limited to alphanumerics and a few whitelisted
+ punctuation characters to avoid issues with views, etc.
-- Joey Hess <joeyh@debian.org> Fri, 21 Feb 2014 13:03:04 -0400
diff --git a/doc/metadata.mdwn b/doc/metadata.mdwn
index 414a91053..d3c3b748e 100644
--- a/doc/metadata.mdwn
+++ b/doc/metadata.mdwn
@@ -19,7 +19,7 @@ fields, which each can have any number of values. For example, to tag
files, the `tag` field is typically used, with values set to each tag that
applies to the file.
-The field names are freeform (but cannot include spaces). The metadata
+The field names are limited to alphanumerics (and `[_-.]`). The metadata
values can contain absolutely anything you like -- but you're recommended
to keep it simple and reasonably short.