summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-07-16 10:57:55 -0400
committerJoe Crayne <joe@jerkface.net>2019-07-16 10:57:55 -0400
commit9e39fd87b2dfa6b2bf7a9fa1661b89d9a83f7ef4 (patch)
tree065fdb86764a058dff9717505f555269a79f650f
parentc54b35e665f2a8ec2fff484de99fd59b0454dcff (diff)
Added byGrip map to KeyDB.
-rw-r--r--lib/KeyDB.hs42
1 files changed, 39 insertions, 3 deletions
diff --git a/lib/KeyDB.hs b/lib/KeyDB.hs
index 1aef747..5e74ea4 100644
--- a/lib/KeyDB.hs
+++ b/lib/KeyDB.hs
@@ -1,3 +1,4 @@
1{-# LANGUAGE LambdaCase #-}
1module KeyDB 2module KeyDB
2 ( TrustMap 3 ( TrustMap
3 , SigAndTrust 4 , SigAndTrust
@@ -8,6 +9,7 @@ module KeyDB
8 , keyData 9 , keyData
9 , kkData 10 , kkData
10 , lookupKeyData 11 , lookupKeyData
12 , lookupByGrip
11 , transmute 13 , transmute
12 , transmuteAt 14 , transmuteAt
13 , alterKeyDB 15 , alterKeyDB
@@ -25,13 +27,21 @@ module KeyDB
25 ) where 27 ) where
26 28
27import Control.Monad 29import Control.Monad
30import Data.Binary
31import qualified Data.ByteString as S
32import qualified Data.ByteString.Lazy as L
28import Data.Functor 33import Data.Functor
29import Data.List 34import Data.List
30import qualified Data.Map.Strict as Map 35import qualified Data.Map.Strict as Map
31import Data.Maybe 36import Data.Maybe
32import Data.OpenPGP 37import Data.OpenPGP
33import Data.Ord 38import Data.Ord
39import Foreign.Storable
34 40
41import Data.List.Merge
42import Data.OpenPGP.Util
43import qualified IntMapClass as I
44 ;import IntMapClass (IMap)
35import KeyRing.Types 45import KeyRing.Types
36 46
37type TrustMap = Map.Map FilePath Packet 47type TrustMap = Map.Map FilePath Packet
@@ -51,12 +61,20 @@ data KeyData = KeyData
51 } deriving Show 61 } deriving Show
52 62
53 63
64newtype KeyGrip = KeyInt Int
65
66fingerprintGrip :: Fingerprint -> KeyGrip
67fingerprintGrip (Fingerprint bs) =
68 case decode $ L.fromStrict $ S.drop (S.length bs - sizeOf (0::Int)) bs of
69 i -> KeyInt i
70
54data KeyDB = KeyDB 71data KeyDB = KeyDB
55 { byKeyKey :: Map.Map KeyKey KeyData 72 { byKeyKey :: Map.Map KeyKey KeyData
73 , byGrip :: IMap KeyGrip [KeyKey]
56 } deriving Show 74 } deriving Show
57 75
58emptyKeyDB :: KeyDB 76emptyKeyDB :: KeyDB
59emptyKeyDB = KeyDB { byKeyKey = Map.empty } 77emptyKeyDB = KeyDB { byKeyKey = Map.empty, byGrip = I.empty }
60 78
61keyData :: KeyDB -> [KeyData] 79keyData :: KeyDB -> [KeyData]
62keyData db = Map.elems (byKeyKey db) 80keyData db = Map.elems (byKeyKey db)
@@ -67,6 +85,11 @@ kkData db = Map.toList (byKeyKey db)
67lookupKeyData :: KeyKey -> KeyDB -> Maybe KeyData 85lookupKeyData :: KeyKey -> KeyDB -> Maybe KeyData
68lookupKeyData kk db = Map.lookup kk (byKeyKey db) 86lookupKeyData kk db = Map.lookup kk (byKeyKey db)
69 87
88lookupByGrip :: KeyGrip -> KeyDB -> [KeyData]
89lookupByGrip k db = mapMaybe (`Map.lookup` byKeyKey db)
90 $ concat . maybeToList
91 $ I.lookup k (byGrip db)
92
70transmute :: (Monad m, Monad kiki, Traversable kiki) => 93transmute :: (Monad m, Monad kiki, Traversable kiki) =>
71 ((KeyData, [info]) -> opcode -> m (kiki (KeyData, [info]))) -- ^ interpreter 94 ((KeyData, [info]) -> opcode -> m (kiki (KeyData, [info]))) -- ^ interpreter
72 -> (KeyData -> [opcode]) -- ^ instructions 95 -> (KeyData -> [opcode]) -- ^ instructions
@@ -78,10 +101,21 @@ transmute perform update db = do
78 (update kd) 101 (update kd)
79 r <- sequenceA <$> mapM performAll (byKeyKey db) 102 r <- sequenceA <$> mapM performAll (byKeyKey db)
80 return $ r <&> \bkk -> ( db { byKeyKey = fst <$> bkk } 103 return $ r <&> \bkk -> ( db { byKeyKey = fst <$> bkk }
104 -- Note: We currently leave deleted-keys in the byGrip map.
81 , concatMap snd $ Map.elems bkk ) 105 , concatMap snd $ Map.elems bkk )
82 106
83alterKeyDB :: (Maybe KeyData -> Maybe KeyData) -> KeyKey -> KeyDB -> KeyDB 107alterKeyDB :: (Maybe KeyData -> Maybe KeyData) -> KeyKey -> KeyDB -> KeyDB
84alterKeyDB update kk db = db { byKeyKey = Map.alter update kk (byKeyKey db) } 108alterKeyDB update kk db = db
109 { byKeyKey = Map.alter update kk (byKeyKey db)
110 , byGrip = case Map.lookup kk (byKeyKey db) of
111 Just _ -> byGrip db
112 Nothing -> case update Nothing of
113 Just kd -> I.alter (\case Nothing -> Just [kk]
114 Just kks -> Just $ mergeL [kk] kks)
115 (fingerprintGrip $ fingerprint $ packet $ keyMappedPacket kd)
116 (byGrip db)
117 Nothing -> byGrip db
118 }
85 119
86transmuteAt :: ( Monad m 120transmuteAt :: ( Monad m
87 , Functor kiki 121 , Functor kiki
@@ -93,7 +127,9 @@ transmuteAt go kk db = do
93 127
94mergeKeyDB :: (KeyData -> KeyData -> KeyData) -> KeyDB -> KeyDB -> KeyDB 128mergeKeyDB :: (KeyData -> KeyData -> KeyData) -> KeyDB -> KeyDB -> KeyDB
95mergeKeyDB mergeKeyData db dbtrans = 129mergeKeyDB mergeKeyData db dbtrans =
96 KeyDB { byKeyKey = Map.unionWith mergeKeyData (byKeyKey db) (byKeyKey dbtrans) } 130 KeyDB { byKeyKey = Map.unionWith mergeKeyData (byKeyKey db) (byKeyKey dbtrans)
131 , byGrip = I.unionWith mergeL (byGrip db) (byGrip dbtrans)
132 }
97 133
98mapKeyDB :: Monad m => (KeyData -> m KeyData) -> KeyDB -> m KeyDB 134mapKeyDB :: Monad m => (KeyData -> m KeyData) -> KeyDB -> m KeyDB
99mapKeyDB f db = fmap (\m -> db { byKeyKey = m }) $ mapM f (byKeyKey db) 135mapKeyDB f db = fmap (\m -> db { byKeyKey = m }) $ mapM f (byKeyKey db)