40ecf58d4b
This does not change the overall license of the git-annex program, which was already AGPL due to a number of sources files being AGPL already. Legally speaking, I'm adding a new license under which these files are now available; I already released their current contents under the GPL license. Now they're dual licensed GPL and AGPL. However, I intend for all my future changes to these files to only be released under the AGPL license, and I won't be tracking the dual licensing status, so I'm simply changing the license statement to say it's AGPL. (In some cases, others wrote parts of the code of a file and released it under the GPL; but in all cases I have contributed a significant portion of the code in each file and it's that code that is getting the AGPL license; the GPL license of other contributors allows combining with AGPL code.)
47 lines
1.3 KiB
Haskell
47 lines
1.3 KiB
Haskell
{- git-annex URL contents
|
|
-
|
|
- Copyright 2014 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
-}
|
|
|
|
module Types.UrlContents (
|
|
UrlContents(..),
|
|
SafeFilePath,
|
|
mkSafeFilePath,
|
|
fromSafeFilePath
|
|
) where
|
|
|
|
import Utility.Url
|
|
import Utility.Path
|
|
|
|
import System.FilePath
|
|
|
|
data UrlContents
|
|
-- An URL contains a file, whose size may be known.
|
|
-- There might be a nicer filename to use.
|
|
= UrlContents (Maybe Integer) (Maybe SafeFilePath)
|
|
-- Sometimes an URL points to multiple files, each accessible
|
|
-- by their own URL.
|
|
| UrlMulti [(URLString, Maybe Integer, SafeFilePath)]
|
|
|
|
-- This is a FilePath, from an untrusted source,
|
|
-- sanitized so it doesn't contain any directory traversal tricks
|
|
-- and is always relative. It can still contain subdirectories.
|
|
-- Any unusual characters are also filtered out.
|
|
newtype SafeFilePath = SafeFilePath FilePath
|
|
deriving (Show)
|
|
|
|
mkSafeFilePath :: FilePath -> SafeFilePath
|
|
mkSafeFilePath p = SafeFilePath $ if null p' then "file" else p'
|
|
where
|
|
p' = joinPath $ filter safe $ map sanitizeFilePath $ splitDirectories p
|
|
safe s
|
|
| isDrive s = False
|
|
| s == ".." = False
|
|
| s == ".git" = False
|
|
| null s = False
|
|
| otherwise = True
|
|
|
|
fromSafeFilePath :: SafeFilePath -> FilePath
|
|
fromSafeFilePath (SafeFilePath p) = p
|