summaryrefslogtreecommitdiff
path: root/lib/KeyDB.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/KeyDB.hs')
-rw-r--r--lib/KeyDB.hs58
1 files changed, 58 insertions, 0 deletions
diff --git a/lib/KeyDB.hs b/lib/KeyDB.hs
new file mode 100644
index 0000000..f5a4357
--- /dev/null
+++ b/lib/KeyDB.hs
@@ -0,0 +1,58 @@
1module KeyDB
2 {-
3 ( TrustMap
4 , SigAndTrust
5 , SubKey(..)
6 , KeyData(..)
7 , KeyDB
8 , emptyKeyDB
9 , keyData
10 , transmute
11 ) -} where
12
13import Control.Monad
14import Data.Functor
15import qualified Data.Map.Strict as Map
16import Data.OpenPGP
17
18import FunctorToMaybe
19import KeyRing.Types
20
21type TrustMap = Map.Map FilePath Packet
22type SigAndTrust = ( MappedPacket
23 , TrustMap ) -- trust packets
24data SubKey = SubKey MappedPacket [SigAndTrust] deriving Show
25
26-- | This is a GPG Identity which includes a master key and all its UIDs and
27-- subkeys and associated signatures.
28data KeyData = KeyData
29 { keyMappedPacket :: MappedPacket -- main key
30 , keySigAndTrusts :: [SigAndTrust] -- sigs on main key
31 , keyUids :: (Map.Map String ([SigAndTrust],OriginMap)) -- uids
32 , keySubKeys :: (Map.Map KeyKey SubKey) -- subkeys
33 } deriving Show
34
35
36data KeyDB = KeyDB
37 { byKeyKey :: Map.Map KeyKey KeyData
38 } deriving Show
39
40emptyKeyDB :: KeyDB
41emptyKeyDB = KeyDB { byKeyKey = Map.empty }
42
43keyData :: KeyDB -> [KeyData]
44keyData db = Map.elems (byKeyKey db)
45
46
47transmute :: (Monad m, Monad kiki, Traversable kiki) =>
48 ((KeyData, [info]) -> opcode -> m (kiki (KeyData, [info]))) -- ^ interpreter
49 -> (KeyData -> [opcode]) -- ^ instructions
50 -> KeyDB -- ^ initial state
51 -> m (kiki (KeyDB, [info]))
52transmute perform update db = do
53 let performAll kd = foldM (\kkd op -> join <$> mapM (`perform` op) kkd)
54 (pure (kd,[]))
55 (update kd)
56 r <- sequenceA <$> mapM performAll (byKeyKey db)
57 return $ r <&> \bkk -> ( db { byKeyKey = fst <$> bkk }
58 , concatMap snd $ Map.elems bkk )