summaryrefslogtreecommitdiffhomepage
path: root/Gpg.hs
diff options
context:
space:
mode:
authorJoey Hess <joeyh@joeyh.name>2016-08-17 15:29:34 -0400
committerJoey Hess <joeyh@joeyh.name>2016-08-17 15:29:34 -0400
commitefee99a335b36ae6265662f3afd7fbfaf75420d2 (patch)
tree3cd7d329d61bca02be08eaea87745af698ea6663 /Gpg.hs
parent194d7d2702712668f05ea2ac956a0dcecc5c4b70 (diff)
downloadkeysafe-efee99a335b36ae6265662f3afd7fbfaf75420d2.tar.gz
refactor
Diffstat (limited to 'Gpg.hs')
-rw-r--r--Gpg.hs22
1 files changed, 22 insertions, 0 deletions
diff --git a/Gpg.hs b/Gpg.hs
index 7002e16..4a0633a 100644
--- a/Gpg.hs
+++ b/Gpg.hs
@@ -3,9 +3,12 @@
- Licensed under the GNU AGPL version 3 or higher.
-}
+{-# LANGUAGE OverloadedStrings #-}
+
module Gpg where
import Types
+import UI
import System.Process
import Data.List.Split
import Data.Maybe
@@ -13,6 +16,25 @@ import System.Exit
import qualified Data.ByteString as B
import qualified Data.ByteString.UTF8 as BU8
+-- | Pick gpg secret key to back up.
+--
+-- If there is only one gpg secret key,
+-- the choice is obvious. Otherwise prompt the user with a list.
+getKeyToBackup :: UI -> IO SecretKey
+getKeyToBackup ui = go =<< Gpg.listSecretKeys
+ where
+ go [] = do
+ showError ui "You have no gpg secret keys to back up."
+ error "Aborting on no gpg secret keys."
+ go [(_, kid)] = Gpg.getSecretKey kid
+ go l = maybe (error "Canceled") Gpg.getSecretKey
+ =<< promptKeyId ui "Pick gpg secret key"
+ "Pick gpg secret key to back up:" l
+
+-- | Use when the gpg keyid will not be known at restore time.
+anyKey :: SecretKeySource
+anyKey = GpgKey (KeyId "")
+
listSecretKeys :: IO [(Name, KeyId)]
listSecretKeys = mapMaybe parse . lines <$> readProcess "gpg"
["--batch", "--with-colons", "--list-secret-keys"] ""