aura-3.2.7: exec/Aura/Commands/P.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE LambdaCase #-}
-- |
-- Module : Aura.Commands.P
-- Copyright : (c) Colin Woodbury, 2012 - 2021
-- License : GPL3
-- Maintainer: Colin Woodbury <colin@fosskers.ca>
--
--
-- Handles @-P@ flags for analysing PKGBUILDs.
module Aura.Commands.P
( exploitsFromFile
, exploitsFromStdin
, audit
) where
import Aura.Core
import Aura.Languages
import Aura.Pkgbuild.Fetch
import Aura.Pkgbuild.Security
import Aura.Security
import Aura.Settings
import Aura.Types
import Control.Scheduler (Comp(..), traverseConcurrently)
import RIO
import RIO.ByteString (getContents)
import qualified RIO.Set as S
---
-- | Given a specific file path, print out any potential PKGBUILD exploits and
-- exit the program aggressively to force a naughty exit code.
exploitsFromFile :: FilePath -> RIO Env ()
exploitsFromFile = readFileBinary >=> findExploits . Pkgbuild
exploitsFromStdin :: RIO Env ()
exploitsFromStdin = getContents >>= findExploits . Pkgbuild
-- | Analyse all locally installed AUR packages.
audit :: RIO Env ()
audit = do
ss <- asks settings
let !m = managerOf ss
ps <- liftIO . foreignPackages $ envOf ss
warn ss . security_13 . fromIntegral $ S.size ps
pbs <- catMaybes <$> liftIO (traverseConcurrently Par' (getPkgbuild m . spName) $ S.toList ps)
mapMaybeA f pbs >>= \case
[] -> notify ss security_14
_ -> throwM . Failure $ FailMsg security_12
where
f :: Pkgbuild -> RIO Env (Maybe Pkgbuild)
f pb = case parsedPB pb of
Nothing -> pure Nothing
Just l -> case bannedTerms l of
[] -> pure Nothing
bts -> do
ss <- asks settings
liftIO $ traverse_ (displayBannedTerms ss) bts
pure $ Just pb
findExploits :: Pkgbuild -> RIO Env ()
findExploits pb = case parsedPB pb of
Nothing -> throwM . Failure $ FailMsg security_11
Just l -> case bannedTerms l of
[] -> pure ()
bts -> do
ss <- asks settings
liftIO $ traverse_ (displayBannedTerms ss) bts
throwM . Failure $ FailMsg security_12