From 677b8492d54a5a3b47c596baef265d5a440acc0c Mon Sep 17 00:00:00 2001 From: Tom Sydney Kerckhove Date: Mon, 18 Dec 2023 15:46:06 +0100 Subject: [PATCH] base64-encode the schedule hash --- smos-scheduler/default.nix | 10 ++++---- smos-scheduler/package.yaml | 1 + smos-scheduler/smos-scheduler.cabal | 1 + .../src/Smos/Scheduler/OptParse/Types.hs | 8 ++++--- .../test/Smos/Scheduler/OptParseSpec.hs | 24 +++++++++++++++---- 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/smos-scheduler/default.nix b/smos-scheduler/default.nix index 91a85e853..972c7f8ab 100644 --- a/smos-scheduler/default.nix +++ b/smos-scheduler/default.nix @@ -1,6 +1,6 @@ { mkDerivation, aeson, autodocodec, autodocodec-yaml, autoexporter -, base, bytestring, conduit, containers, cron, cryptohash-sha256 -, dirforest, envparse, fuzzy-time, genvalidity +, base, base64-bytestring, bytestring, conduit, containers, cron +, cryptohash-sha256, dirforest, envparse, fuzzy-time, genvalidity , genvalidity-bytestring, genvalidity-containers, genvalidity-path , genvalidity-sydtest, genvalidity-sydtest-aeson, genvalidity-text , genvalidity-time, lib, megaparsec, mtl, optparse-applicative @@ -17,9 +17,9 @@ mkDerivation { isLibrary = true; isExecutable = true; libraryHaskellDepends = [ - aeson autodocodec base bytestring conduit containers cron - cryptohash-sha256 envparse fuzzy-time megaparsec mtl - optparse-applicative path path-io pretty-relative-time safe + aeson autodocodec base base64-bytestring bytestring conduit + containers cron cryptohash-sha256 envparse fuzzy-time megaparsec + mtl optparse-applicative path path-io pretty-relative-time safe safe-coloured-text safe-coloured-text-terminfo smos-cli smos-data smos-directory smos-report text time tz unliftio validity validity-path validity-text yaml diff --git a/smos-scheduler/package.yaml b/smos-scheduler/package.yaml index a826e83b3..b47391d8b 100644 --- a/smos-scheduler/package.yaml +++ b/smos-scheduler/package.yaml @@ -18,6 +18,7 @@ library: dependencies: - aeson - autodocodec + - base64-bytestring - bytestring - conduit - containers diff --git a/smos-scheduler/smos-scheduler.cabal b/smos-scheduler/smos-scheduler.cabal index 733c0a62a..0341fd386 100644 --- a/smos-scheduler/smos-scheduler.cabal +++ b/smos-scheduler/smos-scheduler.cabal @@ -38,6 +38,7 @@ library aeson , autodocodec , base + , base64-bytestring , bytestring , conduit , containers diff --git a/smos-scheduler/src/Smos/Scheduler/OptParse/Types.hs b/smos-scheduler/src/Smos/Scheduler/OptParse/Types.hs index ae2a4c664..566c27133 100644 --- a/smos-scheduler/src/Smos/Scheduler/OptParse/Types.hs +++ b/smos-scheduler/src/Smos/Scheduler/OptParse/Types.hs @@ -16,6 +16,7 @@ import Crypto.Hash.SHA256 as SHA256 import Data.Aeson (FromJSON, ToJSON) import Data.ByteString (ByteString) import qualified Data.ByteString as SB +import qualified Data.ByteString.Base64 as Base64 import qualified Data.ByteString.Lazy as LB import Data.Map (Map) import qualified Data.Map as M @@ -39,7 +40,6 @@ import Smos.Data import Smos.Directory.OptParse.Types import Smos.Report.Time import System.Cron (CronSchedule, parseCronSchedule, serializeCronSchedule) -import Text.Read import UnliftIO.IO.File data Arguments = Arguments Command (FlagsWithConfigFile Flags) @@ -181,10 +181,12 @@ hashScheduleItem :: ScheduleItem -> ScheduleItemHash hashScheduleItem = ScheduleItemHash . SHA256.hashlazy . serialiseScheduleItemConsistently renderScheduleItemHash :: ScheduleItemHash -> Text -renderScheduleItemHash = T.pack . show . unScheduleItemHash +renderScheduleItemHash = TE.decodeUtf8 . Base64.encode . unScheduleItemHash parseScheduleItemHash :: Text -> Maybe ScheduleItemHash -parseScheduleItemHash = fmap ScheduleItemHash . readMaybe . T.unpack +parseScheduleItemHash t = case Base64.decode (TE.encodeUtf8 t) of + Left _ -> Nothing + Right sb -> pure $ ScheduleItemHash sb writeScheduleTemplate :: Path Abs File -> ScheduleTemplate -> IO () writeScheduleTemplate p a = do diff --git a/smos-scheduler/test/Smos/Scheduler/OptParseSpec.hs b/smos-scheduler/test/Smos/Scheduler/OptParseSpec.hs index 332719a95..d21a27e76 100644 --- a/smos-scheduler/test/Smos/Scheduler/OptParseSpec.hs +++ b/smos-scheduler/test/Smos/Scheduler/OptParseSpec.hs @@ -1,10 +1,11 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TypeApplications #-} -module Smos.Scheduler.OptParseSpec - ( spec, - ) -where +module Smos.Scheduler.OptParseSpec (spec) where +import Path +import Smos.Report.Time import Smos.Scheduler.OptParse.Types import Smos.Scheduler.Render.Gen () import Test.Syd @@ -21,3 +22,18 @@ spec = do jsonSpec @EntryTemplate genValidSpec @ScheduleTemplate jsonSpec @ScheduleTemplate + genValidSpec @ScheduleItem + describe "hashScheduleItem" $ do + it "produces valid hashes" $ + producesValid hashScheduleItem + it "produces the exact same hash, consistently" $ + renderScheduleItemHash + ( hashScheduleItem + ScheduleItem + { scheduleItemDescription = Just "Foobar", + scheduleItemTemplate = "template.smos.template", + scheduleItemDestination = DestinationPathTemplate [relfile|result.smos.template|], + scheduleItemRecurrence = HaircutRecurrence $ Months 1 + } + ) + `shouldBe` "sARhcXIVaaVp94P3nKt4HkR8nkM6HgxrwpY5kb3Lvf4="