diff options
author | Joey Hess <joey@kitenet.net> | 2014-02-23 13:34:59 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2014-02-23 13:34:59 -0400 |
commit | 84884101e3c19b0db4c8c5975fc47575dc0782fb (patch) | |
tree | 34744e6eadb3405e8c31f9f67df57270eb2781ba | |
parent | 82b230213dc35f17ed26dbc5074cb8bc14444ba1 (diff) |
metadata: Field names limited to alphanumerics and a few whitelisted punctuation characters to avoid issues with views, etc.
-rw-r--r-- | Types/MetaData.hs | 24 | ||||
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | doc/metadata.mdwn | 2 |
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. |