From ab12445390b5861ce1865dabd78de8d8fc08581d Mon Sep 17 00:00:00 2001 From: joe Date: Fri, 29 Nov 2013 19:18:44 -0500 Subject: Converted handles in trust packet maps to filenames. --- kiki.hs | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'kiki.hs') diff --git a/kiki.hs b/kiki.hs index 4f79095..c1e6aea 100644 --- a/kiki.hs +++ b/kiki.hs @@ -556,6 +556,7 @@ readPacketsFromFile fname = do Right (_,_,msg ) -> msg Left (_,_,_) -> Message [] +readPacketsFromFile' n = fmap (n,) (readPacketsFromFile n) parseOptionFile fname = do xs <- fmap lines (readFile fname) @@ -822,8 +823,8 @@ is40digitHex xs = ys == xs && length ys==40 | 'a' <= c && c <= 'f' = True ishex c = False -scanPackets [] = [] -scanPackets (p:ps) = scanl doit (doit (MarkerPacket,MarkerPacket,ret MarkerPacket) p) ps +scanPackets filename [] = [] +scanPackets filename (p:ps) = scanl doit (doit (MarkerPacket,MarkerPacket,ret MarkerPacket) p) ps where ret p = (p,Map.empty) doit (top,sub,prev) p = @@ -834,9 +835,9 @@ scanPackets (p:ps) = scanl doit (doit (MarkerPacket,MarkerPacket,ret MarkerPacke _ | isTrust p -> (top,sub,updateTrust top sub prev p) _ | otherwise -> (top,sub,ret p) - updateTrust top (PublicKeyPacket {}) (pre,t) p = (pre,Map.insert "public" p t) - updateTrust (PublicKeyPacket {}) _ (pre,t) p = (pre,Map.insert "public" p t) - updateTrust _ _ (pre,t) p = (pre,Map.insert "secret" p t) + updateTrust top (PublicKeyPacket {}) (pre,t) p = (pre,Map.insert filename p t) -- public + updateTrust (PublicKeyPacket {}) _ (pre,t) p = (pre,Map.insert filename p t) -- public + updateTrust _ _ (pre,t) p = (pre,Map.insert filename p t) -- secret type SigAndTrust = ( Packet @@ -876,10 +877,10 @@ subcomp a b = error $ unlines ["Unable to merge subs:" , PP.ppShow b ] -merge :: Map.Map KeyKey KeyData -> Message -> Map.Map KeyKey KeyData -merge db (Message ps) = foldl mergeit db qs +merge :: Map.Map KeyKey KeyData -> FilePath -> Message -> Map.Map KeyKey KeyData +merge db filename (Message ps) = foldl mergeit db qs where - qs = scanPackets ps + qs = scanPackets filename ps -- mergeit db (_,_,TrustPacket {}) = db -- Filter TrustPackets mergeit db (top,sub,ptt@(p,trustmap)) | isKey top = Map.alter update (keykey top) db where @@ -962,7 +963,10 @@ flattenKeys isPublic db = Message $ concatMap flattenTop (prefilter . Map.assocs flattenSub (_,SubKey key sigs) = unk key: concatMap unsig sigs unk k = if isPublic then secretToPublic k else k - unsig (sig,trustmap) = [sig]++maybeToList (Map.lookup (if isPublic then "public" else "secret") trustmap) + unsig (sig,trustmap) = [sig]++ take 1 (Map.elems $ Map.filterWithKey f trustmap) + where + f "%secring" _ = not isPublic + f _ _ = isPublic prefilter = if isPublic then id else filter isSecret where isSecret (_,(KeyData (SecretKeyPacket {}) _ _ _)) = True @@ -1306,9 +1310,9 @@ main = do , sec -- e3ozbhvej4jvlu43.onion/gpg/gnupghome/secring.gpg , grip -- Just "AD1CA892FCF4ED9829C762269BDEA5B4D5643321" ) <- getPGPEnviron cmd - let db = merge Map.empty (Message sec) - ms <- mapM readPacketsFromFile (files cmd) - let db' = foldl' merge db ms + let db = merge Map.empty "%secring" (Message sec) + ms <- mapM readPacketsFromFile' (files cmd) + let db' = foldl' (uncurry . merge) db ms m = flattenKeys False db' L.putStr (encode m) return () @@ -1318,9 +1322,9 @@ main = do , sec -- e3ozbhvej4jvlu43.onion/gpg/gnupghome/secring.gpg , grip -- Just "AD1CA892FCF4ED9829C762269BDEA5B4D5643321" ) <- getPGPEnviron cmd - let db = merge Map.empty (Message sec) - ms <- mapM readPacketsFromFile (files cmd) - let db' = foldl' merge db ms + let db = merge Map.empty "%secring" (Message sec) + ms <- mapM readPacketsFromFile' (files cmd) + let db' = foldl' (uncurry . merge) db ms m = flattenKeys True db' L.putStr (encode m) return () @@ -1343,9 +1347,9 @@ main = do flip (maybe (error "No working key?")) grip $ \grip -> do - ms <- mapM readPacketsFromFile files - let db = merge Map.empty (Message sec) - db' = foldl' merge db ms + ms <- mapM readPacketsFromFile' files + let db = merge Map.empty "%secring" (Message sec) + db' = foldl' (uncurry . merge) db ms m = flattenKeys True db' Message allpkts = m -- cgit v1.2.3