summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2020-05-16 10:03:21 -0400
committerJoe Crayne <joe@jerkface.net>2020-05-16 10:03:21 -0400
commit9a289d6029f73624b0215d100b6295b51993ebee (patch)
tree2eb5bd1256cd7d58374a720942d7b3f8c3d85ca3
parenta3b9c59b4c2839a2f31a060082624937fa4e32dc (diff)
Fix --working issue with multiple secret keys.
-rw-r--r--kiki.hs14
1 files changed, 11 insertions, 3 deletions
diff --git a/kiki.hs b/kiki.hs
index a4857f0..0bc7133 100644
--- a/kiki.hs
+++ b/kiki.hs
@@ -110,8 +110,15 @@ listKeys style pkts = listKeysFiltered style [] pkts
110-- Operates in List Monad... 110-- Operates in List Monad...
111-- returns all output as a single string 111-- returns all output as a single string
112listKeysFiltered :: Foldable t => FingerprintStyle -> t [Char] -> [Packet] -> [Char] 112listKeysFiltered :: Foldable t => FingerprintStyle -> t [Char] -> [Packet] -> [Char]
113listKeysFiltered style grips pkts = do 113listKeysFiltered style grips pkts0 = do
114 let fp = case style of 114 let pkts | null grips = pkts0
115 | otherwise = scrub pkts0
116 scrub [] = []
117 scrub xs =
118 let ys = dropWhile (\p -> not (isKey p && not (is_subkey p)) || not (matchAnyGrip p)) xs
119 (as,bs) = span (\p -> not (isKey p) || is_subkey p || matchAnyGrip p) ys
120 in as ++ scrub bs
121 fp = case style of
115 FingerprintAuto -> \p -> show (fingerprint p) 122 FingerprintAuto -> \p -> show (fingerprint p)
116 Fingerprint5 -> \p -> show (fingerprintv 5 p) 123 Fingerprint5 -> \p -> show (fingerprintv 5 p)
117 masterkeys = filter (\k -> isKey k && not (is_subkey k)) pkts 124 masterkeys = filter (\k -> isKey k && not (is_subkey k)) pkts
@@ -128,8 +135,9 @@ listKeysFiltered style grips pkts = do
128 code (c,(m,s),_,_,_) = (fingerprint_material m,-c) 135 code (c,(m,s),_,_,_) = (fingerprint_material m,-c)
129 ownerkey (_,(a,_),_,_,_) = a 136 ownerkey (_,(a,_),_,_,_) = a
130 sameMaster (ownerkey->a) (ownerkey->b) = fingerprint_material a==fingerprint_material b 137 sameMaster (ownerkey->a) (ownerkey->b) = fingerprint_material a==fingerprint_material b
138 matchAnyGrip top = any (flip fpmatch top . Just) grips
131 matchgrip _ | null grips = True 139 matchgrip _ | null grips = True
132 matchgrip ((code,(top,sub), kind, hashed,claimants):_) | any (flip fpmatch top . Just) grips = True 140 matchgrip ((code,(top,sub), kind, hashed,claimants):_) | matchAnyGrip top = True
133 matchgrip _ = False 141 matchgrip _ = False
134 gs = filter matchgrip $ groupBy sameMaster (sortBy (comparing code) as) 142 gs = filter matchgrip $ groupBy sameMaster (sortBy (comparing code) as)
135 singles = filter (\k -> fp k `notElem` map fp parents) masterkeys -- \\ parents 143 singles = filter (\k -> fp k `notElem` map fp parents) masterkeys -- \\ parents