diff options
Diffstat (limited to 'lib/KeyDB.hs')
-rw-r--r-- | lib/KeyDB.hs | 58 |
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 @@ | |||
1 | module KeyDB | ||
2 | {- | ||
3 | ( TrustMap | ||
4 | , SigAndTrust | ||
5 | , SubKey(..) | ||
6 | , KeyData(..) | ||
7 | , KeyDB | ||
8 | , emptyKeyDB | ||
9 | , keyData | ||
10 | , transmute | ||
11 | ) -} where | ||
12 | |||
13 | import Control.Monad | ||
14 | import Data.Functor | ||
15 | import qualified Data.Map.Strict as Map | ||
16 | import Data.OpenPGP | ||
17 | |||
18 | import FunctorToMaybe | ||
19 | import KeyRing.Types | ||
20 | |||
21 | type TrustMap = Map.Map FilePath Packet | ||
22 | type SigAndTrust = ( MappedPacket | ||
23 | , TrustMap ) -- trust packets | ||
24 | data 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. | ||
28 | data 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 | |||
36 | data KeyDB = KeyDB | ||
37 | { byKeyKey :: Map.Map KeyKey KeyData | ||
38 | } deriving Show | ||
39 | |||
40 | emptyKeyDB :: KeyDB | ||
41 | emptyKeyDB = KeyDB { byKeyKey = Map.empty } | ||
42 | |||
43 | keyData :: KeyDB -> [KeyData] | ||
44 | keyData db = Map.elems (byKeyKey db) | ||
45 | |||
46 | |||
47 | transmute :: (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])) | ||
52 | transmute 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 ) | ||