diff options
author | Joey Hess <joeyh@joeyh.name> | 2016-08-28 13:00:02 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2016-08-28 13:00:02 -0400 |
commit | b35b44e0d47abca77107ad689b620c0721412cb6 (patch) | |
tree | ce264e531b475638fbd2dd6a781ca1214a9dae23 | |
parent | b0aa14ea3b12ab0559793bfb46df4625d7792bd4 (diff) | |
download | keysafe-b35b44e0d47abca77107ad689b620c0721412cb6.tar.gz |
Fix gpg secret key list parser to support gpg 2.
Should also support gpg 1.
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | Gpg.hs | 20 |
2 files changed, 14 insertions, 7 deletions
@@ -5,6 +5,7 @@ keysafe (0.20160820) UNRELEASED; urgency=medium only supports prime fields. This caused shares to be twice the size of the input value. * Reduced object size to 32kb due to share size doubling. + * Fix gpg secret key list parser to support gpg 2. -- Joey Hess <id@joeyh.name> Mon, 22 Aug 2016 13:56:16 -0400 @@ -11,7 +11,6 @@ import Types import UI import System.Process import Data.List.Split -import Data.Maybe import System.IO import System.Exit import qualified Data.ByteString as B @@ -37,13 +36,20 @@ anyKey :: SecretKeySource anyKey = GpgKey (KeyId "") listSecretKeys :: IO [(Name, KeyId)] -listSecretKeys = mapMaybe parse . lines <$> readProcess "gpg" - ["--batch", "--with-colons", "--list-secret-keys"] "" +listSecretKeys = map mk . parse . lines <$> readProcess "gpg" + ["--batch", "--with-colons", "--list-secret-keys", "--fixed-list-mode"] "" where - parse l = case splitOn ":" l of - ("sec":_:_:_:kid:_:_:_:_:n:_) -> Just - (Name (BU8.fromString n), KeyId (BU8.fromString kid)) - _ -> Nothing + parse = extract [] Nothing . map (splitOn ":") + extract c (Just keyid) (("uid":_:_:_:_:_:_:_:_:userid:_):rest) = + extract ((userid, keyid):c) Nothing rest + extract c (Just keyid) rest = + extract (("", keyid):c) Nothing rest + extract c _ [] = c + extract c _ (("sec":_:_:_:keyid:_):rest) = + extract c (Just keyid) rest + extract c k (_:rest) = + extract c k rest + mk (userid, keyid) = (Name (BU8.fromString userid), KeyId (BU8.fromString keyid)) getSecretKey :: KeyId -> IO SecretKey getSecretKey (KeyId kid) = do |