{-# OPTIONS_GHC -Wno-dodgy-exports #-}
{-# OPTIONS_GHC -Wno-unused-imports #-}

module Cardano.Api.IO.Internal.Compat
  ( checkVrfFilePermissions
  , handleFileForWritingWithOwnerPermission
  , writeSecrets
  )
where

import Cardano.Api.Error
import Cardano.Api.IO.Internal.Base
import Cardano.Api.IO.Internal.Compat.Posix
import Cardano.Api.IO.Internal.Compat.Wasm
import Cardano.Api.IO.Internal.Compat.Win32

import Control.Monad.Except (ExceptT)
import Control.Monad.IO.Class (MonadIO (..))
import Data.ByteString (ByteString)
import GHC.Stack (HasCallStack)
import System.IO

handleFileForWritingWithOwnerPermission
  :: MonadIO m
  => FilePath
  -> (Handle -> IO ())
  -> m (Either (FileError e) ())
handleFileForWritingWithOwnerPermission :: forall (m :: * -> *) e.
MonadIO m =>
FilePath -> (Handle -> IO ()) -> m (Either (FileError e) ())
handleFileForWritingWithOwnerPermission FilePath
path Handle -> IO ()
f =
  IO (Either (FileError e) ()) -> m (Either (FileError e) ())
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either (FileError e) ()) -> m (Either (FileError e) ()))
-> IO (Either (FileError e) ()) -> m (Either (FileError e) ())
forall a b. (a -> b) -> a -> b
$ FilePath -> (Handle -> IO ()) -> IO (Either (FileError e) ())
forall e.
FilePath -> (Handle -> IO ()) -> IO (Either (FileError e) ())
handleFileForWritingWithOwnerPermissionImpl FilePath
path Handle -> IO ()
f

-- | Write a list of secrets to individual files in the given directory, as
-- @\<prefix\>.\<3-digit index\>.\<suffix\>@. Each file is written atomically
-- (the contents go to a temporary file which is then renamed into place) and
-- ends up readable only by its owner.
writeSecrets
  :: HasCallStack
  => MonadIO m
  => FilePath
  -- ^ Output directory
  -> [Char]
  -- ^ Filename prefix
  -> [Char]
  -- ^ Filename suffix
  -> (a -> ByteString)
  -- ^ Serialisation function for the secrets
  -> [a]
  -- ^ Secrets to write, one file each
  -> m ()
writeSecrets :: forall (m :: * -> *) a.
(HasCallStack, MonadIO m) =>
FilePath
-> FilePath -> FilePath -> (a -> ByteString) -> [a] -> m ()
writeSecrets FilePath
outDir FilePath
prefix FilePath
suffix a -> ByteString
secretOp [a]
xs =
  IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ FilePath
-> FilePath -> FilePath -> (a -> ByteString) -> [a] -> IO ()
forall a.
HasCallStack =>
FilePath
-> FilePath -> FilePath -> (a -> ByteString) -> [a] -> IO ()
writeSecretsImpl FilePath
outDir FilePath
prefix FilePath
suffix a -> ByteString
secretOp [a]
xs

checkVrfFilePermissions :: File content direction -> ExceptT VRFPrivateKeyFilePermissionError IO ()
checkVrfFilePermissions :: forall content (direction :: FileDirection).
File content direction
-> ExceptT VRFPrivateKeyFilePermissionError IO ()
checkVrfFilePermissions = File content direction
-> ExceptT VRFPrivateKeyFilePermissionError IO ()
forall content (direction :: FileDirection).
File content direction
-> ExceptT VRFPrivateKeyFilePermissionError IO ()
checkVrfFilePermissionsImpl