module Hadolint.Rule.DL3055 (rule) where import qualified Data.Map as Map import qualified Data.Text as Text import Hadolint.Rule import Language.Docker.Syntax rule :: LabelSchema -> Rule args rule :: LabelSchema -> Rule args rule LabelSchema labelschema = [Rule args] -> Rule args forall a. Monoid a => [a] -> a mconcat ([Rule args] -> Rule args) -> [Rule args] -> Rule args forall a b. (a -> b) -> a -> b $ (LabelName -> Rule args) -> [LabelName] -> [Rule args] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap LabelName -> Rule args forall args. LabelName -> Rule args labelIsNotGitHashRule (LabelSchema -> [LabelName] forall k a. Map k a -> [k] Map.keys ((LabelType -> Bool) -> LabelSchema -> LabelSchema forall a k. (a -> Bool) -> Map k a -> Map k a Map.filter (LabelType -> LabelType -> Bool forall a. Eq a => a -> a -> Bool == LabelType GitHash) LabelSchema labelschema)) {-# INLINEABLE rule #-} labelIsNotGitHashRule :: LabelName -> Rule args labelIsNotGitHashRule :: LabelName -> Rule args labelIsNotGitHashRule LabelName label = RuleCode -> DLSeverity -> LabelName -> (Instruction args -> Bool) -> Rule args forall args. RuleCode -> DLSeverity -> LabelName -> (Instruction args -> Bool) -> Rule args simpleRule RuleCode code DLSeverity severity LabelName message Instruction args -> Bool forall args. Instruction args -> Bool check where code :: RuleCode code = RuleCode "DL3055" severity :: DLSeverity severity = DLSeverity DLWarningC message :: LabelName message = LabelName "Label `" LabelName -> LabelName -> LabelName forall a. Semigroup a => a -> a -> a <> LabelName label LabelName -> LabelName -> LabelName forall a. Semigroup a => a -> a -> a <> LabelName "` is not a valid git hash." check :: Instruction args -> Bool check (Label Pairs ls) = Pairs -> Bool forall (t :: * -> *) a. Foldable t => t a -> Bool null (Pairs -> Bool) -> Pairs -> Bool forall a b. (a -> b) -> a -> b $ LabelName -> Pairs -> Pairs getBadHashLabels LabelName label Pairs ls check Instruction args _ = Bool True getBadHashLabels :: LabelName -> Pairs -> Pairs getBadHashLabels :: LabelName -> Pairs -> Pairs getBadHashLabels LabelName lbl Pairs prs = [(LabelName l, LabelName v) | (LabelName l, LabelName v) <- Pairs prs, LabelName l LabelName -> LabelName -> Bool forall a. Eq a => a -> a -> Bool == LabelName lbl, LabelName -> Bool isBadHash LabelName v] isBadHash :: Text.Text -> Bool isBadHash :: LabelName -> Bool isBadHash LabelName h = (Char -> Bool) -> LabelName -> Bool Text.any (Char -> [Char] -> Bool forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `notElem` [Char] validHash) LabelName h Bool -> Bool -> Bool || (LabelName -> Int Text.length LabelName h Int -> Int -> Bool forall a. Eq a => a -> a -> Bool /= Int 40 Bool -> Bool -> Bool && LabelName -> Int Text.length LabelName h Int -> Int -> Bool forall a. Eq a => a -> a -> Bool /= Int 7) validHash :: String validHash :: [Char] validHash = [Char '0'..Char '9'] [Char] -> [Char] -> [Char] forall a. [a] -> [a] -> [a] ++ [Char 'a'..Char 'f']