{-# 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
| Bool Name
| ShowDate Bool Name
| ShowHash Bool Name
| 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")
=
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")
=
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
=
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