From 3346aa965923391aa608cd814c1b5b85e26a7454 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 12 Apr 2023 14:03:44 -0400 Subject: [PATCH] safe output to terminal for calckey inprogress and lookupkey These are quite low-level, but still there is no point in displaying escape sequences that have been embedded in a key to the terminal. I think these are the only remaining commands that didn't use safe output, except for cases where git-annex is speaking a protocol to itself. Sponsored-by: Kevin Mueller on Patreon --- CHANGELOG | 4 +++- Command/CalcKey.hs | 6 +++++- Command/Inprogress.hs | 20 +++++++++++--------- Command/LookupKey.hs | 6 +++++- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 649f74f4d4..5a5581ce4d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,7 +6,9 @@ git-annex (10.20230408) UNRELEASED; urgency=medium characters as-is in filenames. * Control characters in non-filename data coming from the repository or other possible untrusted sources are filtered out of the display of many - commands. + commands. When the command output is intended for use in scripting, + control characters are only filtered out when displaying to the + terminal. * find, findkeys, examinekey: When outputting to a terminal and --format is not used, quote unusual characters. (Similar to the behavior of GNU find.) diff --git a/Command/CalcKey.hs b/Command/CalcKey.hs index 4003f8ce43..44aa69b59d 100644 --- a/Command/CalcKey.hs +++ b/Command/CalcKey.hs @@ -11,6 +11,8 @@ import Command import Backend (genKey, defaultBackend) import Types.KeySource import Utility.Metered +import Utility.Terminal +import Utility.SafeOutput cmd :: Command cmd = noCommit $ noMessages $ dontCheck repoExists $ @@ -23,7 +25,9 @@ cmd = noCommit $ noMessages $ dontCheck repoExists $ run :: () -> SeekInput -> String -> Annex Bool run _ _ file = tryNonAsync (genKey ks nullMeterUpdate =<< defaultBackend) >>= \case Right (k, _) -> do - liftIO $ putStrLn $ serializeKey k + IsTerminal isterminal <- liftIO $ checkIsTerminal stdout + let sk = serializeKey k + liftIO $ putStrLn $ if isterminal then safeOutput sk else sk return True Left _err -> return False where diff --git a/Command/Inprogress.hs b/Command/Inprogress.hs index f5414e8815..6df55c6f03 100644 --- a/Command/Inprogress.hs +++ b/Command/Inprogress.hs @@ -9,6 +9,8 @@ module Command.Inprogress where import Command import Annex.Transfer +import Utility.Terminal +import Utility.SafeOutput import qualified Data.Set as S @@ -32,14 +34,14 @@ seek o = do ts <- map (transferKey . fst) <$> getTransfers case keyOptions o of Just WantAllKeys -> - forM_ ts $ commandAction . start' + forM_ ts $ commandAction . (start' isterminal) Just (WantSpecificKey k) - | k `elem` ts -> commandAction (start' k) + | k `elem` ts -> commandAction (start' isterminal k) | otherwise -> commandAction stop _ -> do let s = S.fromList ts let seeker = AnnexedFileSeeker - { startAction = start s + { startAction = start isterminal s , checkContentPresent = Nothing , usesLocationLog = False } @@ -48,14 +50,14 @@ seek o = do where ww = WarnUnmatchLsFiles -start :: S.Set Key -> SeekInput -> RawFilePath -> Key -> CommandStart -start s _si _file k - | S.member k s = start' k +start :: IsTerminal -> S.Set Key -> SeekInput -> RawFilePath -> Key -> CommandStart +start isterminal s _si _file k + | S.member k s = start' isterminal k | otherwise = stop -start' :: Key -> CommandStart -start' k = startingCustomOutput k $ do +start' :: IsTerminal -> Key -> CommandStart +start' (IsTerminal isterminal) k = startingCustomOutput k $ do tmpf <- fromRawFilePath <$> fromRepo (gitAnnexTmpObjectLocation k) whenM (liftIO $ doesFileExist tmpf) $ - liftIO $ putStrLn tmpf + liftIO $ putStrLn (if isterminal then safeOutput tmpf else tmpf) next $ return True diff --git a/Command/LookupKey.hs b/Command/LookupKey.hs index ce4d5a5500..991bb5e4b9 100644 --- a/Command/LookupKey.hs +++ b/Command/LookupKey.hs @@ -10,6 +10,8 @@ module Command.LookupKey where import Command import Annex.CatFile import qualified Git.LsFiles +import Utility.Terminal +import Utility.SafeOutput cmd :: Command cmd = notBareRepo $ noCommit $ noMessages $ @@ -23,7 +25,9 @@ run _ _ file = seekSingleGitFile file >>= \case Nothing -> return False Just file' -> catKeyFile file' >>= \case Just k -> do - liftIO $ putStrLn $ serializeKey k + IsTerminal isterminal <- liftIO $ checkIsTerminal stdout + let sk = serializeKey k + liftIO $ putStrLn $ if isterminal then safeOutput sk else sk return True Nothing -> return False