Skip to content

Commit e69b53a

Browse files
mmhatblackheaven
authored andcommitted
Simplified query logic
1 parent b244c0b commit e69b53a

File tree

1 file changed

+18
-48
lines changed

1 file changed

+18
-48
lines changed

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

Lines changed: 18 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ import Data.Text (Text)
1717
import qualified Data.Text as T
1818
import qualified Data.Text.IO as T
1919
import Distribution.Parsec (eitherParsec)
20-
import Distribution.Types.VersionRange (VersionRange, VersionRangeF(..), anyVersion, earlierVersion, intersectVersionRanges, majorUpperBound, orLaterVersion, projectVersionRange)
20+
import Distribution.Types.VersionInterval (asVersionIntervals)
21+
import Distribution.Types.VersionRange (VersionRange, anyVersion, earlierVersion, intersectVersionRanges, noVersion, orLaterVersion, unionVersionRanges)
2122
import Validation (Validation(..))
2223

2324
import Security.Advisories.Definition
@@ -27,53 +28,24 @@ import Security.Advisories.Filesystem
2728
isAffectedBy :: Text -> VersionRange -> Advisory -> Bool
2829
isAffectedBy queryPackageName queryVersionRange =
2930
any checkAffected . advisoryAffected
30-
where checkAffected :: Affected -> Bool
31+
where
32+
checkAffected :: Affected -> Bool
3133
checkAffected affected =
3234
queryPackageName == affectedPackage affected
33-
&& any
34-
(intersectsWith (projectVersionRange queryVersionRange) . projectVersionRange . mkVersionRange)
35-
(affectedVersions affected)
36-
mkVersionRange :: AffectedVersionRange -> VersionRange
37-
mkVersionRange x =
38-
case affectedVersionRangeFixed x of
39-
Nothing ->
40-
orLaterVersion (affectedVersionRangeIntroduced x)
41-
Just affectedVersionRangeFixed' ->
42-
orLaterVersion (affectedVersionRangeIntroduced x) `intersectVersionRanges` earlierVersion affectedVersionRangeFixed'
43-
intersectsWith :: VersionRangeF VersionRange -> VersionRangeF VersionRange -> Bool
44-
intersectsWith left right =
45-
case (left, right) of
46-
(ThisVersionF x, ThisVersionF y) -> x == y
47-
(ThisVersionF x, LaterVersionF y) -> x < y
48-
(ThisVersionF x, OrLaterVersionF y) -> x >= y
49-
(ThisVersionF x, EarlierVersionF y) -> x < y
50-
(ThisVersionF x, OrEarlierVersionF y) -> x <= y
51-
(LaterVersionF x, ThisVersionF y) -> x < y
52-
(LaterVersionF _, LaterVersionF _) -> True
53-
(LaterVersionF _, OrLaterVersionF _) -> True
54-
(LaterVersionF x, EarlierVersionF y) -> x < y
55-
(LaterVersionF x, OrEarlierVersionF y) -> x < y
56-
(OrLaterVersionF x, ThisVersionF y) -> x <= y
57-
(OrLaterVersionF _, LaterVersionF _) -> True
58-
(OrLaterVersionF _, OrLaterVersionF _) -> True
59-
(OrLaterVersionF x, EarlierVersionF y) -> x < y
60-
(OrLaterVersionF x, OrEarlierVersionF y) -> x <= y
61-
(EarlierVersionF x, ThisVersionF y) -> x > y
62-
(EarlierVersionF x, LaterVersionF y) -> x > y
63-
(EarlierVersionF x, OrLaterVersionF y) -> x > y
64-
(EarlierVersionF _, EarlierVersionF _) -> True
65-
(EarlierVersionF _, OrEarlierVersionF _) -> True
66-
(OrEarlierVersionF x, ThisVersionF y) -> x >= y
67-
(OrEarlierVersionF x, LaterVersionF y) -> x > y
68-
(OrEarlierVersionF x, OrLaterVersionF y) -> x >= y
69-
(OrEarlierVersionF _, EarlierVersionF _) -> True
70-
(OrEarlierVersionF _, OrEarlierVersionF _) -> True
71-
(MajorBoundVersionF x, _) -> intersectsWith (OrLaterVersionF x) right && intersectsWith (EarlierVersionF $ majorUpperBound x) right
72-
(UnionVersionRangesF x y, _) -> intersectsWith (projectVersionRange x) right || intersectsWith (projectVersionRange y) right
73-
(IntersectVersionRangesF x y, _) -> intersectsWith (projectVersionRange x) right && intersectsWith (projectVersionRange y) right
74-
(_, UnionVersionRangesF x y) -> intersectsWith left (projectVersionRange x) || intersectsWith left (projectVersionRange y)
75-
(_, IntersectVersionRangesF x y) -> intersectsWith left (projectVersionRange x) && intersectsWith left (projectVersionRange y)
76-
(_, MajorBoundVersionF x) -> intersectsWith left (OrLaterVersionF x) && intersectsWith left (EarlierVersionF $ majorUpperBound x)
35+
&& isSomeVersion (fromAffected affected `intersectVersionRanges` queryVersionRange)
36+
37+
fromAffected :: Affected -> VersionRange
38+
fromAffected = foldr (unionVersionRanges . fromAffectedVersionRange) noVersion . affectedVersions
39+
40+
fromAffectedVersionRange :: AffectedVersionRange -> VersionRange
41+
fromAffectedVersionRange avr = intersectVersionRanges
42+
(orLaterVersion (affectedVersionRangeIntroduced avr))
43+
(maybe anyVersion earlierVersion (affectedVersionRangeFixed avr))
44+
45+
isSomeVersion :: VersionRange -> Bool
46+
isSomeVersion range
47+
| [] <- asVersionIntervals range = False
48+
| otherwise = True
7749

7850
-- | Parse 'VersionRange' as given to the CLI
7951
parseVersionRange :: Maybe Text -> Either Text VersionRange
@@ -91,6 +63,4 @@ listAffectedBy root queryPackageName queryVersionRange = do
9163
exitFailure
9264
Success advisories ->
9365
return advisories
94-
95-
9666
return $ filter (isAffectedBy queryPackageName queryVersionRange) advisories

0 commit comments

Comments
 (0)