summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2013-12-03 20:16:45 -0500
committerjoe <joe@jerkface.net>2013-12-03 20:16:45 -0500
commit8fbdda3c60ba9cabc367846c7e78851ba75b9d64 (patch)
tree23ff981ecd2e39d26ad9229db65a3e5b57744033
parentf9af7493658c3cdb7be2d84c0de818ab3eae7443 (diff)
Added code to preserve packet ordering.
-rw-r--r--kiki.hs20
1 files changed, 15 insertions, 5 deletions
diff --git a/kiki.hs b/kiki.hs
index 3ecb8b8..96e57e2 100644
--- a/kiki.hs
+++ b/kiki.hs
@@ -997,17 +997,20 @@ flattenKeys isPublic db = Message $ concatMap (map packet . flattenTop "" isPubl
997 isSecret _ = False 997 isSecret _ = False
998 998
999 999
1000concatSort fname getp f = concat . sortByHint fname getp . map f
1001
1000flattenTop :: FilePath -> Bool -> KeyData -> [MappedPacket] 1002flattenTop :: FilePath -> Bool -> KeyData -> [MappedPacket]
1001flattenTop fname ispub (KeyData key sigs uids subkeys) = 1003flattenTop fname ispub (KeyData key sigs uids subkeys) =
1002 unk ispub key : ( concatMap (flattenUid fname ispub (snd uids)) (Map.assocs (fst uids)) 1004 unk ispub key :
1003 ++ concatMap (flattenSub fname ispub) (Map.elems subkeys)) 1005 ( concatSort fname head (flattenUid fname ispub (snd uids)) (Map.assocs (fst uids))
1006 ++ concatSort fname head (flattenSub fname ispub) (Map.elems subkeys))
1004 1007
1005flattenUid :: FilePath -> Bool -> OriginMap -> (String,[SigAndTrust]) -> [MappedPacket] 1008flattenUid :: FilePath -> Bool -> OriginMap -> (String,[SigAndTrust]) -> [MappedPacket]
1006flattenUid fname ispub om (str,sigs) = 1009flattenUid fname ispub om (str,sigs) =
1007 MappedPacket (UserIDPacket str) om : concatMap (unsig fname ispub) sigs 1010 MappedPacket (UserIDPacket str) om : concatSort fname head (unsig fname ispub) sigs
1008 1011
1009flattenSub :: FilePath -> Bool -> SubKey -> [MappedPacket] 1012flattenSub :: FilePath -> Bool -> SubKey -> [MappedPacket]
1010flattenSub fname ispub (SubKey key sigs) = unk ispub key: concatMap (unsig fname ispub) sigs 1013flattenSub fname ispub (SubKey key sigs) = unk ispub key: concatSort fname head (unsig fname ispub) sigs
1011 1014
1012unk :: Bool -> MappedPacket -> MappedPacket 1015unk :: Bool -> MappedPacket -> MappedPacket
1013unk isPublic = if isPublic then toPacket secretToPublic else id 1016unk isPublic = if isPublic then toPacket secretToPublic else id
@@ -1032,6 +1035,13 @@ showPacket p | isKey p = (if is_subkey p
1032 | otherwise = showPacket0 p 1035 | otherwise = showPacket0 p
1033showPacket0 p = concat . take 1 $ words (show p) 1036showPacket0 p = concat . take 1 $ words (show p)
1034 1037
1038sortByHint fname f = sortBy (comparing gethint)
1039 where
1040 gethint = maybe defnum originalNum . Map.lookup fname . locations . f
1041 defnum = -1
1042
1043keyPacket (KeyData k _ _ _) = k
1044
1035writeOutKeyrings db = do 1045writeOutKeyrings db = do
1036 let ks = Map.elems db 1046 let ks = Map.elems db
1037 fs = Map.keys (foldr unionfiles Map.empty ks) 1047 fs = Map.keys (foldr unionfiles Map.empty ks)
@@ -1041,7 +1051,7 @@ writeOutKeyrings db = do
1041 let s = do 1051 let s = do
1042 f <- fs 1052 f <- fs
1043 let x = do 1053 let x = do
1044 d@(KeyData p _ _ _) <- filter (fromfile f) ks 1054 d@(KeyData p _ _ _) <- filter (fromfile f) (sortByHint f keyPacket ks)
1045 n <- maybeToList $ Map.lookup f (locations p) 1055 n <- maybeToList $ Map.lookup f (locations p)
1046 flattenTop f (originallyPublic n) d 1056 flattenTop f (originallyPublic n) d
1047 changes = filter notnew x 1057 changes = filter notnew x