{-# LANGUAGE OverloadedStrings          #-}
{-# OPTIONS_GHC -fno-warn-unused-imports#-}

module Data.KeyStore.CLI.Command
    ( CLI(..)
    , Command(..)
    , parseCLI
    , parseCLI'
    , cliInfo
    , cliParser
    , paramsParser
    , runParse
    )
    where

import           Data.KeyStore.KS.Opt
import           Data.KeyStore.Types
import           Data.KeyStore.IO.IC
import           Data.Monoid
import           Data.String
import           Text.KSRegex
import qualified Data.Text              as T
import           Options.Applicative
import           System.Environment
import           System.Exit
import           System.IO


data CLI =
    CLI
        { CLI -> CtxParams
cli_params    :: CtxParams
        , CLI -> Command
cli_command   :: Command
        }
    deriving (Int -> CLI -> ShowS
[CLI] -> ShowS
CLI -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CLI] -> ShowS
$cshowList :: [CLI] -> ShowS
show :: CLI -> String
$cshow :: CLI -> String
showsPrec :: Int -> CLI -> ShowS
$cshowsPrec :: Int -> CLI -> ShowS
Show)

data Command
    = Version
    | Keystore
    | Initialise        FilePath
    | UpdateSettings    FilePath
    | ListSettings
    | ListSettingOpts  (Maybe OptEnum)
    | AddTrigger        TriggerID Pattern FilePath
    | RmvTrigger        TriggerID
    | ListTriggers
    | Create            Name Comment Identity (Maybe EnvVar) (Maybe FilePath) [Safeguard]
    | CreateKeyPair     Name Comment Identity                                 [Safeguard]
    | Secure            Name                                 (Maybe FilePath) [Safeguard]
    | List
    | Info             [Name]
    | ShowIdentity      Bool Name
    | ShowComment       Bool Name
    | ShowDate          Bool Name
    | ShowHash          Bool Name
    | ShowHashComment   Bool Name
    | ShowHashSalt      Bool Name
    | ShowPublic        Bool Name
    | ShowSecret   Bool Name
    | Encrypt           Name    FilePath FilePath
    | Decrypt                   FilePath FilePath
    | Sign              Name    FilePath FilePath
    | Verify                    FilePath FilePath
    | Delete           [Name]
    deriving (Int -> Command -> ShowS
[Command] -> ShowS
Command -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Command] -> ShowS
$cshowList :: [Command] -> ShowS
show :: Command -> String
$cshow :: Command -> String
showsPrec :: Int -> Command -> ShowS
$cshowsPrec :: Int -> Command -> ShowS
Show)

parseCLI :: IO CLI
parseCLI :: IO CLI
parseCLI = IO [String]
getArgs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [String] -> IO CLI
parseCLI'

parseCLI' :: [String] -> IO CLI
parseCLI' :: [String] -> IO CLI
parseCLI' = forall a. ParserInfo a -> [String] -> IO a
runParse ParserInfo CLI
cliInfo

cliInfo :: ParserInfo CLI
cliInfo :: ParserInfo CLI
cliInfo =
    forall a. Parser a -> InfoMod a -> ParserInfo a
info (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser CLI
cliParser)
        (   forall a. InfoMod a
fullDesc
         forall a. Semigroup a => a -> a -> a
<> forall a. String -> InfoMod a
progDesc String
"for storing secret things"
         forall a. Semigroup a => a -> a -> a
<> forall a. String -> InfoMod a
header String
"ks - key store management"
         forall a. Semigroup a => a -> a -> a
<> forall a. String -> InfoMod a
footer String
"'ks COMMAND --help' to get help on each command")

cliParser :: Parser CLI
cliParser :: Parser CLI
cliParser =
    CtxParams -> Command -> CLI
CLI
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser CtxParams
paramsParser
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Command
p_command

paramsParser :: Parser CtxParams
paramsParser :: Parser CtxParams
paramsParser =
    Maybe String -> Maybe Bool -> Maybe Bool -> CtxParams
CtxParams
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser String
p_store
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Bool
p_debug_flg    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Bool
p_no_debug_flg )
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Bool
p_readonly_flg forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Bool
p_writeback_flg)

p_store :: Parser FilePath
p_store :: Parser String
p_store =
    forall s. IsString s => Mod OptionFields s -> Parser s
strOption
      forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"store"
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE"
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"the file containing the key store"

p_debug_flg :: Parser Bool
p_debug_flg :: Parser Bool
p_debug_flg =
    forall a. a -> Mod FlagFields a -> Parser a
flag' Bool
True
      forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasName f => String -> Mod f a
long  String
"debug"
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'd'
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help  String
"enable debug logging"

p_no_debug_flg :: Parser Bool
p_no_debug_flg :: Parser Bool
p_no_debug_flg =
    forall a. a -> Mod FlagFields a -> Parser a
flag' Bool
False
      forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasName f => String -> Mod f a
long  String
"no-debug"
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'q'
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help  String
"disable debug logging"

p_readonly_flg :: Parser Bool
p_readonly_flg :: Parser Bool
p_readonly_flg =
    forall a. a -> Mod FlagFields a -> Parser a
flag' Bool
True
      forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasName f => String -> Mod f a
long  String
"readonly"
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'r'
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help  String
"disable updating of keystore"

p_writeback_flg :: Parser Bool
p_writeback_flg :: Parser Bool
p_writeback_flg =
    forall a. a -> Mod FlagFields a -> Parser a
flag' Bool
False
      forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasName f => String -> Mod f a
long  String
"writeback"
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'w'
      forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help  String
"write back the keystore"

p_command :: Parser Command
p_command :: Parser Command
p_command =
    forall a. Mod CommandFields a -> Parser a
subparser
     forall a b. (a -> b) -> a -> b
$  forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"version"           ParserInfo Command
pi_version
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"keystore"          ParserInfo Command
pi_keystore
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"initialise"        ParserInfo Command
pi_initialise
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"update-settings"   ParserInfo Command
pi_update_settings
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"list-settings"     ParserInfo Command
pi_list_settings
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"list-setting-opts" ParserInfo Command
pi_list_setting_opts
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"add-trigger"       ParserInfo Command
pi_add_trigger
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"rmv-trigger"       ParserInfo Command
pi_rmv_trigger
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"list-triggers"     ParserInfo Command
pi_list_triggers
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"create"            ParserInfo Command
pi_create
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"create-key-pair"   ParserInfo Command
pi_create_key_pair
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"secure"            ParserInfo Command
pi_secure
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"list"              ParserInfo Command
pi_list
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"info"              ParserInfo Command
pi_info
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-identity"     ParserInfo Command
pi_show_identity
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-comment"      ParserInfo Command
pi_show_comment
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-date"         ParserInfo Command
pi_show_date
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-hash"         ParserInfo Command
pi_show_hash
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-hash-comment" ParserInfo Command
pi_show_hash_comment
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-hash-salt"    ParserInfo Command
pi_show_hash_salt
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-public"       ParserInfo Command
pi_show_public
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"show-secret"       ParserInfo Command
pi_show_secret
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"encrypt"           ParserInfo Command
pi_encrypt
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"decrypt"           ParserInfo Command
pi_decrypt
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"sign"              ParserInfo Command
pi_sign
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"verify"            ParserInfo Command
pi_verify
     forall a. Semigroup a => a -> a -> a
<> forall a. String -> ParserInfo a -> Mod CommandFields a
command String
"delete"            ParserInfo Command
pi_delete

pi_version
    , pi_keystore
    , pi_initialise
    , pi_update_settings
    , pi_list_settings
    , pi_list_setting_opts
    , pi_add_trigger
    , pi_rmv_trigger
    , pi_list_triggers
    , pi_create
    , pi_create_key_pair
    , pi_secure
    , pi_list
    , pi_info
    , pi_show_identity
    , pi_show_comment
    , pi_show_date
    , pi_show_hash
    , pi_show_hash_comment
    , pi_show_hash_salt
    , pi_show_public
    , pi_show_secret
    , pi_encrypt
    , pi_decrypt
    , pi_sign
    , pi_verify
    , pi_delete :: ParserInfo Command

pi_version :: ParserInfo Command
pi_version =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
Version)
        (forall a. String -> InfoMod a
progDesc String
"report the version of this package")

pi_keystore :: ParserInfo Command
pi_keystore =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
Keystore)
        (forall a. String -> InfoMod a
progDesc String
"list the details of the keystore")

pi_initialise :: ParserInfo Command
pi_initialise =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (String -> Command
Initialise
                forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> String -> Parser String
p_file String
"FILE" String
"home of the new keystore"))
        (forall a. String -> InfoMod a
progDesc String
"initialise a new key store")

pi_update_settings :: ParserInfo Command
pi_update_settings =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (String -> Command
UpdateSettings
                forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> String -> Parser String
p_file String
"JSON-SETTINGS-FILE"  String
"new settings"))
        (forall a. String -> InfoMod a
progDesc String
"update the keystore settings")

pi_list_settings :: ParserInfo Command
pi_list_settings =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
ListSettings))
        (forall a. String -> InfoMod a
progDesc String
"dump the keystore settings on stdout")

pi_list_setting_opts :: ParserInfo Command
pi_list_setting_opts =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (Maybe OptEnum -> Command
ListSettingOpts
                forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser OptEnum
p_opt))
        (forall a. String -> InfoMod a
progDesc String
"list the settings options")

pi_add_trigger :: ParserInfo Command
pi_add_trigger =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (TriggerID -> Pattern -> String -> Command
AddTrigger
                forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser TriggerID
p_trigger_id
                forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Pattern
p_pattern
                forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"JSON-SETTINGS-FILE"  String
"conditional settings"))
        (forall a. String -> InfoMod a
progDesc String
"add trigger")

pi_rmv_trigger :: ParserInfo Command
pi_rmv_trigger =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (TriggerID -> Command
RmvTrigger
                forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser TriggerID
p_trigger_id))
        (forall a. String -> InfoMod a
progDesc String
"remove trigger")

pi_list_triggers :: ParserInfo Command
pi_list_triggers =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
ListTriggers))
        (forall a. String -> InfoMod a
progDesc String
"remove trigger")

pi_create :: ParserInfo Command
pi_create =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
            (Name
-> Comment
-> Identity
-> Maybe EnvVar
-> Maybe String
-> [Safeguard]
-> Command
Create
                forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
                forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Comment
p_comment
                forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Identity
p_identity
                forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser EnvVar
p_env_var
                forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser String
p_key_text
                forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Safeguard
p_safeguard))
        (forall a. String -> InfoMod a
progDesc String
"create a key")

pi_create_key_pair :: ParserInfo Command
pi_create_key_pair =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Name -> Comment -> Identity -> [Safeguard] -> Command
CreateKeyPair
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Comment
p_comment
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Identity
p_identity
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Safeguard
p_safeguard)
        (forall a. String -> InfoMod a
progDesc String
"create an RSA key pair")

pi_secure :: ParserInfo Command
pi_secure =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Name -> Maybe String -> [Safeguard] -> Command
Secure
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser String
p_key_text
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Safeguard
p_safeguard)
        (forall a. String -> InfoMod a
progDesc String
"insert an encrypted copy of the named secret key")

pi_list :: ParserInfo Command
pi_list =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (forall (f :: * -> *) a. Applicative f => a -> f a
pure Command
List)
        (forall a. String -> InfoMod a
progDesc String
"list individual keys or all keys in the store")

pi_info :: ParserInfo Command
pi_info =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        ([Name] -> Command
Info
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"list individual keys or all keys in the store")

pi_show_identity :: ParserInfo Command
pi_show_identity =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowIdentity
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_comment :: ParserInfo Command
pi_show_comment =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowComment
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_date :: ParserInfo Command
pi_show_date =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowDate
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_hash :: ParserInfo Command
pi_show_hash =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowHash
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_hash_comment :: ParserInfo Command
pi_show_hash_comment =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowHashComment
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_hash_salt :: ParserInfo Command
pi_show_hash_salt =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowHashSalt
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"show the hash of the secret text")

pi_show_public :: ParserInfo Command
pi_show_public =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowPublic
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"show the public key (DER format)")

pi_show_secret :: ParserInfo Command
pi_show_secret =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Bool -> Name -> Command
ShowSecret
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Bool
p_armour
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"show the secret text")

pi_encrypt :: ParserInfo Command
pi_encrypt =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Name -> String -> String -> Command
Encrypt
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"INPUT-FILE"  String
"file to encrypt"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"OUTPUT-FILE" String
"encrypted file")
        (forall a. String -> InfoMod a
progDesc String
"encrypt a file with a named public key")

pi_decrypt :: ParserInfo Command
pi_decrypt =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (String -> String -> Command
Decrypt
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> String -> Parser String
p_file String
"INPUT-FILE"  String
"file to decrypt"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"OUTPUT-FILE" String
"decrypted file")
        (forall a. String -> InfoMod a
progDesc String
"decrypt a file with the private key")

pi_sign :: ParserInfo Command
pi_sign =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (Name -> String -> String -> Command
Sign
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Name
p_name
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"INPUT-FILE"  String
"file to sign"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"OUTPUT-FILE" String
"file to place the signature")
        (forall a. String -> InfoMod a
progDesc String
"sign a file with a named private key")

pi_verify :: ParserInfo Command
pi_verify =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        (String -> String -> Command
Verify
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> String -> Parser String
p_file String
"INPUT-FILE"     String
"file that was signed"
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> String -> Parser String
p_file String
"SIGNATURE-FILE" String
"signature to verify")
        (forall a. String -> InfoMod a
progDesc String
"verify a file with the public key")

pi_delete :: ParserInfo Command
pi_delete =
    forall a. Parser a -> InfoMod a -> ParserInfo a
h_info
        ([Name] -> Command
Delete
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Name
p_name)
        (forall a. String -> InfoMod a
progDesc String
"delete one or more (unused) keys")

p_trigger_id  :: Parser TriggerID
p_trigger_id :: Parser TriggerID
p_trigger_id =
    forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument (forall a. (String -> Either String a) -> ReadM a
eitherReader forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> TriggerID
TriggerID forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack)
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"TRIGGER"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help    String
"name of the triggered settings"

p_pattern :: Parser Pattern
p_pattern :: Parser Pattern
p_pattern =
    forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument (forall a. (String -> Either String a) -> ReadM a
eitherReader forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Pattern
mk)
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"REGEX"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help    String
"POSIX regular expression for selecting matching keys"
  where
    mk :: String -> Pattern
mk String
s = String -> Regex -> Pattern
Pattern String
s forall a b. (a -> b) -> a -> b
$ String -> Regex
mkRegex String
s

p_name :: Parser Name
p_name :: Parser Name
p_name =
    forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument (forall a. (String -> Either String a) -> ReadM a
eitherReader forall a b. (a -> b) -> a -> b
$ forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a b. a -> Either a b
Left forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reason -> String
showReason) forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> E Name
name)
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"NAME"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help    String
"name of the key"

p_comment :: Parser Comment
p_comment :: Parser Comment
p_comment =
    forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument (forall a. (String -> Either String a) -> ReadM a
eitherReader forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Comment
Comment forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack)
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"COMMENT"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help    String
"comment text"

p_identity :: Parser Identity
p_identity :: Parser Identity
p_identity = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall b a. b -> (a -> b) -> Maybe a -> b
maybe Identity
"" forall a. a -> a
id) forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional forall a b. (a -> b) -> a -> b
$
    forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument (forall a. (String -> Either String a) -> ReadM a
eitherReader forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Identity
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack)
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"KEY-IDENTITY"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help    String
"identity of the key"

p_env_var :: Parser EnvVar
p_env_var :: Parser EnvVar
p_env_var =
    forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument (forall a. (String -> Either String a) -> ReadM a
eitherReader forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => String -> a
fromString)
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"ENV-VAR"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help    String
"environment variable to hold the key's value"

p_safeguard :: Parser Safeguard
p_safeguard :: Parser Safeguard
p_safeguard =
    forall a. ReadM a -> Mod OptionFields a -> Parser a
option (forall a. (String -> Either String a) -> ReadM a
eitherReader forall a b. (a -> b) -> a -> b
$ forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a b. a -> Either a b
Left forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reason -> String
showReason) forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> E Safeguard
parseSafeguard)
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"safeguard"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"SAFEGUARD"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"keys used to encrypt the secret key"

p_key_text :: Parser FilePath
p_key_text :: Parser String
p_key_text =
    forall s. IsString s => Mod OptionFields s -> Parser s
strOption
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasName f => String -> Mod f a
long    String
"key-file"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help    String
"secret key file"

p_file :: String -> String -> Parser FilePath
p_file :: String -> String -> Parser String
p_file String
mtv String
hlp =
    forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument forall s. IsString s => ReadM s
str
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
mtv
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help    String
hlp

p_armour :: Parser Bool
p_armour :: Parser Bool
p_armour =
    Mod FlagFields Bool -> Parser Bool
switch
        forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"base-64"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"base-64 encode the result"

p_opt :: Parser OptEnum
p_opt :: Parser OptEnum
p_opt =
    forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument (forall a. (String -> Either String a) -> ReadM a
eitherReader forall a b. (a -> b) -> a -> b
$ forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall a b. a -> Either a b
Left String
"bad SETTING-OPT") forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe OptEnum
parseOpt forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack)
        forall a b. (a -> b) -> a -> b
$  forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"SETTING-OPT"
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help    String
"name of a keystore setting option"

h_info :: Parser a -> InfoMod a -> ParserInfo a
h_info :: forall a. Parser a -> InfoMod a -> ParserInfo a
h_info Parser a
pr = forall a. Parser a -> InfoMod a -> ParserInfo a
info (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
pr)

runParse :: ParserInfo a -> [String] -> IO a
runParse :: forall a. ParserInfo a -> [String] -> IO a
runParse ParserInfo a
pinfo [String]
args =
  case forall a. ParserPrefs -> ParserInfo a -> [String] -> ParserResult a
execParserPure (PrefsMod -> ParserPrefs
prefs forall m. Monoid m => m
idm) ParserInfo a
pinfo [String]
args of
    Success a
a -> forall (m :: * -> *) a. Monad m => a -> m a
return a
a
    Failure ParserFailure ParserHelp
failure -> do
      String
progn <- IO String
getProgName
      let (ParserHelp
msg, ExitCode
exit, Int
_) = forall h. ParserFailure h -> String -> (h, ExitCode, Int)
execFailure ParserFailure ParserHelp
failure String
progn
      case ExitCode
exit of
        ExitCode
ExitSuccess -> String -> IO ()
putStrLn forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show ParserHelp
msg
        ExitCode
_           -> Handle -> String -> IO ()
hPutStrLn Handle
stderr forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show ParserHelp
msg
      forall a. ExitCode -> IO a
exitWith ExitCode
exit
    CompletionInvoked CompletionResult
compl -> do
      String
progn <- IO String
getProgName
      String
msg   <- CompletionResult -> String -> IO String
execCompletion CompletionResult
compl String
progn
      String -> IO ()
putStr String
msg
      forall a. ExitCode -> IO a
exitWith ExitCode
ExitSuccess