mirror of
https://github.com/input-output-hk/foliage.git
synced 2024-12-02 07:54:45 +03:00
080197e9e2
1. Foliage takes as input a complete description of the index, where source distributions and revisions come with a timestamp. This allows us to recreate the entire index in a reproducible way. 2. Added a experimental command to import an index from a Hackage (as downloaded with Cabal). This was originally a testing/development need but there might be different use cases.
59 lines
2.1 KiB
Haskell
59 lines
2.1 KiB
Haskell
{-# LANGUAGE FlexibleContexts #-}
|
|
|
|
module Foliage.HackageSecurity
|
|
( module Foliage.HackageSecurity,
|
|
module Hackage.Security.Server,
|
|
module Hackage.Security.TUF.FileMap,
|
|
module Hackage.Security.Key.Env,
|
|
module Hackage.Security.Util.Path,
|
|
module Hackage.Security.Util.Some,
|
|
)
|
|
where
|
|
|
|
import Control.Monad (replicateM_)
|
|
import Data.Functor.Identity
|
|
import Hackage.Security.Key.Env (fromKeys)
|
|
import Hackage.Security.Server
|
|
import Hackage.Security.TUF.FileMap
|
|
import Hackage.Security.Util.Path (fromFilePath, fromUnrootedFilePath, makeAbsolute, rootPath)
|
|
import Hackage.Security.Util.Some
|
|
import System.Directory (createDirectoryIfMissing)
|
|
import System.FilePath
|
|
|
|
readJSONSimple :: FromJSON ReadJSON_NoKeys_NoLayout a => FilePath -> IO (Either DeserializationError a)
|
|
readJSONSimple fp = do
|
|
p <- makeAbsolute (fromFilePath fp)
|
|
readJSON_NoKeys_NoLayout p
|
|
|
|
writeJSONSimple :: ToJSON Identity a => FilePath -> a -> IO ()
|
|
writeJSONSimple fp a = do
|
|
p <- makeAbsolute (fromFilePath fp)
|
|
writeJSON_NoLayout p a
|
|
|
|
computeFileInfoSimple :: FilePath -> IO FileInfo
|
|
computeFileInfoSimple fp = do
|
|
p <- makeAbsolute (fromFilePath fp)
|
|
computeFileInfo p
|
|
|
|
createKeys :: FilePath -> IO ()
|
|
createKeys base = do
|
|
createDirectoryIfMissing True (base </> "root")
|
|
replicateM_ 3 $ createKey' KeyTypeEd25519 >>= writeKeyWithId (base </> "root")
|
|
createDirectoryIfMissing True (base </> "target")
|
|
replicateM_ 3 $ createKey' KeyTypeEd25519 >>= writeKeyWithId (base </> "target")
|
|
createDirectoryIfMissing True (base </> "timestamp")
|
|
replicateM_ 1 $ createKey' KeyTypeEd25519 >>= writeKeyWithId (base </> "timestamp")
|
|
createDirectoryIfMissing True (base </> "snapshot")
|
|
replicateM_ 1 $ createKey' KeyTypeEd25519 >>= writeKeyWithId (base </> "snapshot")
|
|
createDirectoryIfMissing True (base </> "mirrors")
|
|
replicateM_ 3 $ createKey' KeyTypeEd25519 >>= writeKeyWithId (base </> "mirrors")
|
|
|
|
writeKeyWithId :: FilePath -> Some Key -> IO ()
|
|
writeKeyWithId base k =
|
|
writeKey (base </> keyIdString (someKeyId k) <.> "json") k
|
|
|
|
writeKey :: FilePath -> Some Key -> IO ()
|
|
writeKey fp key = do
|
|
p <- makeAbsolute (fromFilePath fp)
|
|
writeJSON_NoLayout p key
|