Don't read files outside of user data directory

If a file path does not exist relative to the working directory, but
it does exist relative to the user data directory, and it exists outside
of the user data directory, do not read it. This applies to readDataFile
and readMetadataFile in PandocMonad and, by extension, any module that
uses these by passing them relative paths.
This commit is contained in:
Even Brenden 2022-01-27 23:59:20 +01:00 committed by John MacFarlane
parent e1f8c4b396
commit d36a16a4df
5 changed files with 27 additions and 4 deletions

View file

@ -254,6 +254,8 @@ extra-source-files:
test/command/5876.yaml
test/command/5876/metadata/5876.yaml
test/command/5876/metadata/command/5876.yaml
test/command/7861.yaml
test/command/7861/metadata/placeholder
test/docbook-chapter.docbook
test/docbook-reader.docbook
test/docbook-xref.docbook

View file

@ -574,11 +574,25 @@ getDefaultReferencePptx = do
Nothing -> foldr addEntryToArchive emptyArchive <$>
mapM pathToEntry paths
-- | Read file from user data directory or,
-- if not found there, from the default data files.
-- | Checks if the file path is relative to a parent directory.
isRelativeToParentDir :: FilePath -> Bool
isRelativeToParentDir fname =
let canonical = makeCanonical fname
in length canonical >= 2 && take 2 canonical == ".."
-- | Returns possible user data directory if the file path refers to a file or
-- subdirectory within it.
checkUserDataDir :: PandocMonad m => FilePath -> m (Maybe FilePath)
checkUserDataDir fname =
if isRelative fname && not (isRelativeToParentDir fname)
then getUserDataDir
else return Nothing
--- | Read file from user data directory or,
--- if not found there, from the default data files.
readDataFile :: PandocMonad m => FilePath -> m B.ByteString
readDataFile fname = do
datadir <- getUserDataDir
datadir <- checkUserDataDir fname
case datadir of
Nothing -> readDefaultDataFile fname
Just userDir -> do
@ -595,7 +609,7 @@ readMetadataFile fname = do
if existsInWorkingDir
then readFileStrict fname
else do
dataDir <- getUserDataDir
dataDir <- checkUserDataDir fname
case dataDir of
Nothing ->
throwError $ PandocCouldNotFindMetadataFileError $ T.pack fname

7
test/command/7861.md Normal file
View file

@ -0,0 +1,7 @@
```
% pandoc -s -t native --data-dir=command/7861 --metadata-file=../../7861.yaml
Hello
^D
2> Could not find metadata file ../../7861.yaml
=> 98
```

0
test/command/7861.yaml Normal file
View file

View file