{- Copyright 2016 Joey Hess - - Licensed under the GNU AGPL version 3 or higher. -} module CmdLine (CmdLine(..), Mode(..), get, parse, selectMode) where import Types import qualified Gpg import Options.Applicative import qualified Data.ByteString.UTF8 as BU8 import System.Directory data CmdLine = CmdLine { mode :: Maybe Mode , secretkeysource :: Maybe SecretKeySource , testMode :: Bool , gui :: Bool } deriving (Show) data Mode = Backup | Restore | Benchmark deriving (Show) parse :: Parser CmdLine parse = CmdLine <$> optional (backup <|> restore <|> benchmark) <*> optional (gpgswitch <|> fileswitch) <*> testmodeswitch <*> guiswitch where backup = flag' Backup ( long "backup" <> help "Store a secret key in keysafe." ) restore = flag' Restore ( long "restore" <> help "Retrieve a secret key from keysafe." ) benchmark = flag' Benchmark ( long "benchmark" <> help "Benchmark speed of keysafe's cryptographic primitives." ) gpgswitch = GpgKey . KeyId . BU8.fromString <$> strOption ( long "gpgkeyid" <> help "Specify keyid of gpg key to back up or restore." ) fileswitch = KeyFile <$> strOption ( long "keyfile" <> help "Specify secret key file to back up or restore. (The same filename must be used to restore a key as was used to back it up.)" ) testmodeswitch = switch ( long "testmode" <> help "Avoid using expensive cryptographic operation to secure key. Use for testing only, not with real secret keys." ) guiswitch = switch ( long "gui" <> help "Use GUI interface for interaction. Default is to use readline interface when run in a terminal, and GUI otherwise." ) get :: IO CmdLine get = execParser opts where opts = info (helper <*> parse) ( fullDesc <> header "keysafe - securely back up secret keys" ) -- | When a mode is not specified on the command line, -- default to backing up if a secret key exists, and otherwise restoring. selectMode :: CmdLine -> IO Mode selectMode cmdline = case mode cmdline of Just m -> return m Nothing -> case secretkeysource cmdline of Just (KeyFile f) -> present <$> doesFileExist f _ -> present . not . null <$> Gpg.listSecretKeys where present True = Backup present False = Restore