Skip to content

Commit ffc9154

Browse files
committed
fetchAndReadSourcePackageRemoteTarball checks sha256 if present.
We can write URIs with a fragment like https://hackage.haskell.org/package/cabal-fmt-0.1.2/cabal-fmt-0.1.2.tar.gz#sha256=aae556efbcaddfd65c6a1c1811b122b0d8c8d00624c8c2e36aabb5e9f9ea9840 and fetchAndReadSourcePackageRemoteTarball will check the hash after download before continuing.
1 parent f4ecbf1 commit ffc9154

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

cabal-install/Distribution/Client/ProjectConfig.hs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ import Distribution.Simple.Utils
121121
( die', warn, notice, info, createDirectoryIfMissingVerbose )
122122
import Distribution.Client.Utils
123123
( determineNumJobs )
124+
import Distribution.Parsec (explicitEitherParsec)
124125
import Distribution.Utils.NubList
125126
( fromNubList )
126127
import Distribution.Verbosity
@@ -141,6 +142,7 @@ import Control.Monad.Trans (liftIO)
141142
import Control.Exception
142143
import Data.Either
143144
import qualified Data.ByteString as BS
145+
import qualified Data.ByteString.Char8 as BS8
144146
import qualified Data.ByteString.Lazy as LBS
145147
import qualified Data.Map as Map
146148
import qualified Data.List.NonEmpty as NE
@@ -155,6 +157,9 @@ import System.Directory
155157
import Network.URI
156158
( URI(..), URIAuth(..), parseAbsoluteURI, uriToString )
157159

160+
import qualified Crypto.Hash.SHA256 as SHA256
161+
import qualified Data.ByteString.Base16 as Base16
162+
import qualified Distribution.Compat.CharParsing as P
158163

159164
----------------------------------------
160165
-- Resolving configuration to settings
@@ -1099,7 +1104,7 @@ fetchAndReadSourcePackageRemoteTarball verbosity
10991104
distDownloadSrcDirectory
11001105
}
11011106
getTransport
1102-
tarballUri =
1107+
origTarballUri =
11031108
-- The tarball download is expensive so we use another layer of file
11041109
-- monitor to avoid it whenever possible.
11051110
rerunIfChanged verbosity monitor tarballUri $ do
@@ -1109,9 +1114,29 @@ fetchAndReadSourcePackageRemoteTarball verbosity
11091114
liftIO $ do
11101115
transportCheckHttps verbosity transport tarballUri
11111116
notice verbosity ("Downloading " ++ show tarballUri)
1117+
1118+
sha256expected <-
1119+
if null (uriFragment origTarballUri)
1120+
then return Nothing
1121+
else case msha256expected of
1122+
Right hash -> return (Just hash)
1123+
Left err -> die' verbosity $
1124+
"Cannot parse URI fragment " ++ uriFragment origTarballUri ++
1125+
" " ++ err
11121126
createDirectoryIfMissingVerbose verbosity True
11131127
distDownloadSrcDirectory
11141128
_ <- downloadURI transport verbosity tarballUri tarballFile
1129+
1130+
for_ sha256expected $ \expected -> do
1131+
contents <- LBS.readFile tarballFile
1132+
let actual = SHA256.hashlazy contents
1133+
unless (expected == actual) $
1134+
die' verbosity $ unwords
1135+
[ "SHA256 doesn't match for", show tarballUri
1136+
, "expected", BS8.unpack (Base16.encode expected)
1137+
, "actual", BS8.unpack (Base16.encode actual)
1138+
]
1139+
11151140
return ()
11161141

11171142
-- Read
@@ -1121,10 +1146,20 @@ fetchAndReadSourcePackageRemoteTarball verbosity
11211146
. uncurry (readSourcePackageCabalFile verbosity)
11221147
=<< extractTarballPackageCabalFile tarballFile
11231148
where
1149+
tarballUri = origTarballUri { uriFragment = "" }
1150+
11241151
tarballStem = distDownloadSrcDirectory
11251152
</> localFileNameForRemoteTarball tarballUri
11261153
tarballFile = tarballStem <.> "tar.gz"
11271154

1155+
msha256expected :: Either String BS.ByteString
1156+
msha256expected = explicitEitherParsec fragmentParser (uriFragment origTarballUri)
1157+
1158+
fragmentParser = do
1159+
_ <- P.string "#sha256="
1160+
str <- some P.hexDigit
1161+
return (fst (Base16.decode (BS8.pack str)))
1162+
11281163
monitor :: FileMonitor URI (PackageSpecifier (SourcePackage UnresolvedPkgLoc))
11291164
monitor = newFileMonitor (tarballStem <.> "cache")
11301165

0 commit comments

Comments
 (0)