Improved display of errors when accessing a git http remote fails.

New error message:

  Remote foo not usable by git-annex; setting annex-ignore

  http://localhost/foo/config download failed: Configuration of annex.security.allowed-ip-addresses does not allow accessing address ::1

If git config parse fails, or the git config file is not available at the url,
a better error message for that is also shown.

This commit was sponsored by Mark Reidenbach on Patreon.
This commit is contained in:
Joey Hess 2021-03-24 14:19:32 -04:00
parent fdf1ccbe3f
commit 537f9d9a11
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
5 changed files with 28 additions and 16 deletions

View file

@ -19,7 +19,6 @@ module Annex.Url (
download', download',
exists, exists,
getUrlInfo, getUrlInfo,
U.downloadQuiet,
U.URLString, U.URLString,
U.UrlOptions(..), U.UrlOptions(..),
U.UrlInfo(..), U.UrlInfo(..),

View file

@ -25,6 +25,7 @@ git-annex (8.20210311) UNRELEASED; urgency=medium
some expensive things needed to support unlocked files. some expensive things needed to support unlocked files.
* Sped up git-annex init in a clone of an existing repository. * Sped up git-annex init in a clone of an existing repository.
* Fix build with attoparsec-0.14. * Fix build with attoparsec-0.14.
* Improved display of errors when accessing a git http remote fails.
-- Joey Hess <id@joeyh.name> Fri, 12 Mar 2021 12:06:37 -0400 -- Joey Hess <id@joeyh.name> Fri, 12 Mar 2021 12:06:37 -0400

View file

@ -260,7 +260,9 @@ tryGitConfigRead autoinit r hasuuid
| haveconfig r = return r -- already read | haveconfig r = return r -- already read
| Git.repoIsSsh r = storeUpdatedRemote $ do | Git.repoIsSsh r = storeUpdatedRemote $ do
v <- Ssh.onRemote NoConsumeStdin r v <- Ssh.onRemote NoConsumeStdin r
(pipedconfig Git.Config.ConfigList autoinit (Git.repoDescribe r), return (Left $ giveup "configlist failed")) ( pipedconfig Git.Config.ConfigList autoinit (Git.repoDescribe r)
, return (Left "configlist failed")
)
"configlist" [] configlistfields "configlist" [] configlistfields
case v of case v of
Right r' Right r'
@ -289,25 +291,32 @@ tryGitConfigRead autoinit r hasuuid
return $ Right r' return $ Right r'
Left l -> do Left l -> do
warning $ "Unable to parse git config from " ++ configloc warning $ "Unable to parse git config from " ++ configloc
return $ Left l return $ Left (show l)
geturlconfig = Url.withUrlOptionsPromptingCreds $ \uo -> do geturlconfig = Url.withUrlOptionsPromptingCreds $ \uo -> do
let url = Git.repoLocation r ++ "/config"
v <- withTmpFile "git-annex.tmp" $ \tmpfile h -> do v <- withTmpFile "git-annex.tmp" $ \tmpfile h -> do
liftIO $ hClose h liftIO $ hClose h
let url = Git.repoLocation r ++ "/config" Url.download' nullMeterUpdate url tmpfile uo >>= \case
ifM (liftIO $ Url.downloadQuiet nullMeterUpdate url tmpfile uo) Right () -> pipedconfig Git.Config.ConfigNullList
( Just <$> pipedconfig Git.Config.ConfigNullList False url "git" [Param "config", Param "--null", Param "--list", Param "--file", File tmpfile] False url "git"
, return Nothing [ Param "config"
) , Param "--null"
, Param "--list"
, Param "--file"
, File tmpfile
]
Left err -> return (Left err)
case v of case v of
Just (Right r') -> do Right r' -> do
-- Cache when http remote is not bare for -- Cache when http remote is not bare for
-- optimisation. -- optimisation.
unless (Git.Config.isBare r') $ unless (Git.Config.isBare r') $
setremote setRemoteBare False setremote setRemoteBare False
return r' return r'
_ -> do Left err -> do
set_ignore "not usable by git-annex" False set_ignore "not usable by git-annex" False
warning $ url ++ " " ++ err
return r return r
{- Is this remote just not available, or does {- Is this remote just not available, or does

View file

@ -30,7 +30,6 @@ module Utility.Url (
getUrlInfo, getUrlInfo,
assumeUrlExists, assumeUrlExists,
download, download,
downloadQuiet,
downloadConduit, downloadConduit,
sinkResponseFile, sinkResponseFile,
downloadPartial, downloadPartial,
@ -364,11 +363,6 @@ headRequest r = r
download :: MeterUpdate -> URLString -> FilePath -> UrlOptions -> IO (Either String ()) download :: MeterUpdate -> URLString -> FilePath -> UrlOptions -> IO (Either String ())
download = download' False download = download' False
{- Avoids displaying any error message, including silencing curl errors. -}
downloadQuiet :: MeterUpdate -> URLString -> FilePath -> UrlOptions -> IO Bool
downloadQuiet meterupdate url file uo = isRight
<$> download' True meterupdate url file uo
download' :: Bool -> MeterUpdate -> URLString -> FilePath -> UrlOptions -> IO (Either String ()) download' :: Bool -> MeterUpdate -> URLString -> FilePath -> UrlOptions -> IO (Either String ())
download' nocurlerror meterupdate url file uo = download' nocurlerror meterupdate url file uo =
catchJust matchHttpException go showhttpexception catchJust matchHttpException go showhttpexception

View file

@ -7,3 +7,12 @@ There needs to be a better error message, or possibly don't apply
annex.security.allowed-ip-addresses to uuid discovery -- which does not annex.security.allowed-ip-addresses to uuid discovery -- which does not
seem like it would involve the kind of security problem that config exists seem like it would involve the kind of security problem that config exists
to prevent. --[[Joey]] to prevent. --[[Joey]]
> While I think it would be safe to bypass
> annex.security.allowed-ip-addresses in this case, it seemed complicated
> to implement that, and also getting that wrong would be a security hole.
> Since this is a pretty unusual case, I think it's ok to need that to be
> set.
>
> So, I've improved the error message in this case. (And a few other
> cases.) [[done]] --[[Joey]]