Skip to content

Commit 09bb965

Browse files
mmhatblackheaven
authored andcommitted
Moved validation code to executable
1 parent 86b3220 commit 09bb965

File tree

3 files changed

+19
-24
lines changed

3 files changed

+19
-24
lines changed

code/hsec-tools/app/Main.hs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ import Data.List (intercalate, isPrefixOf)
1212
import Distribution.Parsec (eitherParsec)
1313
import Distribution.Types.VersionRange (VersionRange, anyVersion)
1414
import System.Exit (die, exitFailure, exitSuccess)
15-
import System.IO (hPutStrLn, stderr)
15+
import System.IO (hPrint, hPutStrLn, stderr)
1616
import System.FilePath (takeBaseName)
17+
import Validation (Validation(..))
1718

1819
import qualified Data.Aeson
1920
import qualified Data.Text as T
@@ -117,10 +118,15 @@ commandQuery =
117118
where go :: T.Text -> Maybe VersionRange -> Maybe FilePath -> IO ()
118119
go packageName versionRange advisoriesPath = do
119120
let versionRange' = fromMaybe anyVersion versionRange
120-
affectedAdvisories <- listVersionRangeAffectedBy (fromMaybe "." advisoriesPath) packageName versionRange'
121-
case affectedAdvisories of
122-
[] -> putStrLn "Not affected"
123-
_ -> do
121+
maybeAffectedAdvisories <- listVersionRangeAffectedBy (fromMaybe "." advisoriesPath) packageName versionRange'
122+
case maybeAffectedAdvisories of
123+
Validation.Failure errors -> do
124+
T.hPutStrLn stderr "Cannot parse some advisories"
125+
forM_ errors $
126+
hPrint stderr
127+
exitFailure
128+
Validation.Success [] -> putStrLn "Not affected"
129+
Validation.Success affectedAdvisories -> do
124130
hPutStrLn stderr "Affected by:"
125131
forM_ affectedAdvisories $ \advisory ->
126132
T.hPutStrLn stderr $ "* [" <> T.pack (printHsecId $ advisoryId advisory) <> "] " <> advisorySummary advisory

code/hsec-tools/hsec-tools.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ executable hsec-tools
8888
, hsec-tools
8989
, optparse-applicative >=0.17 && <0.19
9090
, text >=1.2 && <3
91+
, validation-selective >=0.1 && <1
9192

9293
hs-source-dirs: app
9394
default-language: Haskell2010

code/hsec-tools/src/Security/Advisories/Queries.hs

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
{-# LANGUAGE LambdaCase #-}
2-
{-# LANGUAGE OverloadedStrings #-}
3-
41
module Security.Advisories.Queries
52
( listVersionAffectedBy
63
, listVersionRangeAffectedBy
@@ -9,19 +6,16 @@ module Security.Advisories.Queries
96
)
107
where
118

12-
import Control.Monad (forM_)
13-
import System.Exit (exitFailure)
14-
import System.IO (stderr, hPrint)
15-
9+
import Control.Monad.IO.Class (MonadIO)
1610
import Data.Text (Text)
17-
import qualified Data.Text.IO as T
1811
import Distribution.Types.Version (Version)
1912
import Distribution.Types.VersionInterval (asVersionIntervals)
2013
import Distribution.Types.VersionRange (VersionRange, anyVersion, earlierVersion, intersectVersionRanges, noVersion, orLaterVersion, unionVersionRanges, withinRange)
2114
import Validation (Validation(..))
2215

2316
import Security.Advisories.Definition
2417
import Security.Advisories.Filesystem
18+
import Security.Advisories.Parse
2519

2620
-- | Check whether a package and a version is concerned by an advisory
2721
isVersionAffectedBy :: Text -> Version -> Advisory -> Bool
@@ -57,21 +51,15 @@ isAffectedByHelper checkWithRange queryPackageName queryVersionish =
5751
(maybe anyVersion earlierVersion (affectedVersionRangeFixed avr))
5852

5953
-- | List the advisories matching a package name and a version
60-
listVersionAffectedBy :: FilePath -> Text -> Version -> IO [Advisory]
54+
listVersionAffectedBy :: MonadIO m => FilePath -> Text -> Version -> m (Validation [ParseAdvisoryError] [Advisory])
6155
listVersionAffectedBy = listAffectedByHelper isVersionAffectedBy
6256

6357
-- | List the advisories matching a package name and a version range
64-
listVersionRangeAffectedBy :: FilePath -> Text -> VersionRange -> IO [Advisory]
58+
listVersionRangeAffectedBy :: MonadIO m => FilePath -> Text -> VersionRange -> m (Validation [ParseAdvisoryError] [Advisory])
6559
listVersionRangeAffectedBy = listAffectedByHelper isVersionRangeAffectedBy
6660

6761
-- | Helper function for 'listVersionAffectedBy' and 'listVersionRangeAffectedBy'
68-
listAffectedByHelper :: (Text -> a -> Advisory -> Bool) -> FilePath -> Text -> a -> IO [Advisory]
62+
listAffectedByHelper :: MonadIO m => (Text -> a -> Advisory -> Bool) -> FilePath -> Text -> a -> m (Validation [ParseAdvisoryError] [Advisory])
6963
listAffectedByHelper checkAffectedBy root queryPackageName queryVersionish =
70-
listAdvisories root >>= \case
71-
Failure errors -> do
72-
T.hPutStrLn stderr "Cannot parse some advisories"
73-
forM_ errors $
74-
hPrint stderr
75-
exitFailure
76-
Success advisories ->
77-
return $ filter (checkAffectedBy queryPackageName queryVersionish) advisories
64+
fmap (filter (checkAffectedBy queryPackageName queryVersionish)) <$>
65+
listAdvisories root

0 commit comments

Comments
 (0)