When checking that an url has a key, verify that the Content-Length, if available, matches the size of the key.
If there's no Content-Length, or the key has no size, this check is not done, but it should happen most of the time, and protect against web content that has changed.
This commit is contained in:
parent
fa77d9486d
commit
9030f68452
5 changed files with 30 additions and 11 deletions
|
@ -28,6 +28,7 @@ import qualified Utility.Url as Url
|
||||||
import Utility.TempFile
|
import Utility.TempFile
|
||||||
import Config
|
import Config
|
||||||
import Init
|
import Init
|
||||||
|
import Types.Key
|
||||||
|
|
||||||
remote :: RemoteType
|
remote :: RemoteType
|
||||||
remote = RemoteType {
|
remote = RemoteType {
|
||||||
|
@ -143,7 +144,8 @@ inAnnex r key
|
||||||
where
|
where
|
||||||
go e [] = return $ Left e
|
go e [] = return $ Left e
|
||||||
go _ (u:us) = do
|
go _ (u:us) = do
|
||||||
res <- catchMsgIO $ Url.exists u
|
res <- catchMsgIO $
|
||||||
|
Url.check u (keySize key)
|
||||||
case res of
|
case res of
|
||||||
Left e -> go e us
|
Left e -> go e us
|
||||||
v -> return v
|
v -> return v
|
||||||
|
|
|
@ -15,6 +15,7 @@ import Annex.Content
|
||||||
import Config
|
import Config
|
||||||
import Logs.Web
|
import Logs.Web
|
||||||
import qualified Utility.Url as Url
|
import qualified Utility.Url as Url
|
||||||
|
import Types.Key
|
||||||
|
|
||||||
remote :: RemoteType
|
remote :: RemoteType
|
||||||
remote = RemoteType {
|
remote = RemoteType {
|
||||||
|
@ -77,8 +78,8 @@ checkKey key = do
|
||||||
us <- getUrls key
|
us <- getUrls key
|
||||||
if null us
|
if null us
|
||||||
then return $ Right False
|
then return $ Right False
|
||||||
else return . Right =<< checkKey' us
|
else return . Right =<< checkKey' key us
|
||||||
checkKey' :: [URLString] -> Annex Bool
|
checkKey' :: Key -> [URLString] -> Annex Bool
|
||||||
checkKey' us = untilTrue us $ \u -> do
|
checkKey' key us = untilTrue us $ \u -> do
|
||||||
showAction $ "checking " ++ u
|
showAction $ "checking " ++ u
|
||||||
liftIO $ Url.exists u
|
liftIO $ Url.check u (keySize key)
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
module Utility.Url (
|
module Utility.Url (
|
||||||
URLString,
|
URLString,
|
||||||
|
check,
|
||||||
exists,
|
exists,
|
||||||
canDownload,
|
canDownload,
|
||||||
download,
|
download,
|
||||||
|
@ -14,6 +15,7 @@ module Utility.Url (
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
|
import Control.Monad
|
||||||
import qualified Network.Browser as Browser
|
import qualified Network.Browser as Browser
|
||||||
import Network.HTTP
|
import Network.HTTP
|
||||||
import Network.URI
|
import Network.URI
|
||||||
|
@ -23,16 +25,28 @@ import Utility.Path
|
||||||
|
|
||||||
type URLString = String
|
type URLString = String
|
||||||
|
|
||||||
{- Checks that an url exists and could be successfully downloaded. -}
|
{- Checks that an url exists and could be successfully downloaded,
|
||||||
exists :: URLString -> IO Bool
|
- also checking that its size, if available, matches a specified size. -}
|
||||||
|
check :: URLString -> Maybe Integer -> IO Bool
|
||||||
|
check url expected_size = handle <$> exists url
|
||||||
|
where
|
||||||
|
handle (False, _) = False
|
||||||
|
handle (True, Nothing) = True
|
||||||
|
handle (True, s) = expected_size == s
|
||||||
|
|
||||||
|
{- Checks that an url exists and could be successfully downloaded,
|
||||||
|
- also returning its size if available. -}
|
||||||
|
exists :: URLString -> IO (Bool, Maybe Integer)
|
||||||
exists url =
|
exists url =
|
||||||
case parseURI url of
|
case parseURI url of
|
||||||
Nothing -> return False
|
Nothing -> return (False, Nothing)
|
||||||
Just u -> do
|
Just u -> do
|
||||||
r <- request u HEAD
|
r <- request u HEAD
|
||||||
case rspCode r of
|
case rspCode r of
|
||||||
(2,_,_) -> return True
|
(2,_,_) -> return (True, size r)
|
||||||
_ -> return False
|
_ -> return (False, Nothing)
|
||||||
|
where
|
||||||
|
size = liftM read . lookupHeader HdrContentLength . rspHeaders
|
||||||
|
|
||||||
canDownload :: IO Bool
|
canDownload :: IO Bool
|
||||||
canDownload = (||) <$> inPath "wget" <*> inPath "curl"
|
canDownload = (||) <$> inPath "wget" <*> inPath "curl"
|
||||||
|
|
2
debian/changelog
vendored
2
debian/changelog
vendored
|
@ -18,6 +18,8 @@ git-annex (3.20120124) UNRELEASED; urgency=low
|
||||||
location of the file.
|
location of the file.
|
||||||
* addurl: Normalize badly encoded urls.
|
* addurl: Normalize badly encoded urls.
|
||||||
* Fix teardown of stale cached ssh connections.
|
* Fix teardown of stale cached ssh connections.
|
||||||
|
* When checking that an url has a key, verify that the Content-Length,
|
||||||
|
if available, matches the size of the key.
|
||||||
|
|
||||||
-- Joey Hess <joeyh@debian.org> Tue, 24 Jan 2012 16:21:55 -0400
|
-- Joey Hess <joeyh@debian.org> Tue, 24 Jan 2012 16:21:55 -0400
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
Name: git-annex
|
Name: git-annex
|
||||||
Version: 3.20120123
|
Version: 3.20120124
|
||||||
Cabal-Version: >= 1.6
|
Cabal-Version: >= 1.6
|
||||||
License: GPL
|
License: GPL
|
||||||
Maintainer: Joey Hess <joey@kitenet.net>
|
Maintainer: Joey Hess <joey@kitenet.net>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue