summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2017-09-12 15:45:03 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2017-09-12 15:45:03 -0400
commitcdf02436fd560da7ec8e0c0d3488bb52573cb66a (patch)
tree0729af98e5344d580e25e7bb15b22cc208c8d9eb
parent8149e26f66b49af2340198cfaa794a799f80cc5f (diff)
webdav: Fix lack of url-escaping of filenames.
inDAVLocation does not url-escape, and so exporting a filename with spaces to box.com at least resulted in a error 400. It might also have affected storing keys on a webdav remote, if the key contained a space or other problem character. Pretty unlikely. I emailed Clint about the inDAVLocation gotcha, but seems best to fix it here. This commit was supported by the NSF-funded DataLad project.
-rw-r--r--CHANGELOG2
-rw-r--r--Remote/WebDAV/DavLocation.hs7
2 files changed, 7 insertions, 2 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 378b5c579..5934afe3e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -14,6 +14,8 @@ git-annex (6.20170819) UNRELEASED; urgency=medium
triggered a bug in its webdav support that generates an infinite series
of redirects. Deal with such problems by assuming such behavior means
the file is not present.
+ * webdav: Fix lack of url-escaping of filenames. Mostly impacted exports
+ of filenames containing eg spaces.
-- Joey Hess <id@joeyh.name> Mon, 28 Aug 2017 12:20:59 -0400
diff --git a/Remote/WebDAV/DavLocation.hs b/Remote/WebDAV/DavLocation.hs
index 82a3739d0..81777e887 100644
--- a/Remote/WebDAV/DavLocation.hs
+++ b/Remote/WebDAV/DavLocation.hs
@@ -21,14 +21,17 @@ import Utility.Split
import System.FilePath.Posix -- for manipulating url paths
import Network.Protocol.HTTP.DAV (inDAVLocation, DAVT)
import Control.Monad.IO.Class (MonadIO)
+import Network.URI
import Data.Default
-- Relative to the top of the DAV url.
type DavLocation = String
-{- Runs action in subdirectory, relative to the current location. -}
+{- Runs action with a new location relative to the current location. -}
inLocation :: (MonadIO m) => DavLocation -> DAVT m a -> DAVT m a
-inLocation d = inDAVLocation (</> d)
+inLocation d = inDAVLocation (</> d')
+ where
+ d' = escapeURIString isUnescapedInURI d
{- The directory where files(s) for a key are stored. -}
keyDir :: Key -> DavLocation