summaryrefslogtreecommitdiff
path: root/lib/KeyRing
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2019-07-16 20:33:23 -0400
committerAndrew Cady <d@jerkface.net>2019-07-16 20:33:23 -0400
commit8af08303e56fc109135e2ade91299338d03b57b0 (patch)
tree7131b086733c62c610e667638a3f7893b7304618 /lib/KeyRing
parent7a94f5103671011295f818bfcf30280423c44042 (diff)
this compiles
Diffstat (limited to 'lib/KeyRing')
-rw-r--r--lib/KeyRing/BuildKeyDB.hs23
-rw-r--r--lib/KeyRing/Types.hs25
2 files changed, 29 insertions, 19 deletions
diff --git a/lib/KeyRing/BuildKeyDB.hs b/lib/KeyRing/BuildKeyDB.hs
index 461afa2..510c820 100644
--- a/lib/KeyRing/BuildKeyDB.hs
+++ b/lib/KeyRing/BuildKeyDB.hs
@@ -83,9 +83,9 @@ newtype IPsToWriteToHostsFile = IPsToWriteToHostsFile [SockAddr]
83-- 83--
84-- merge all keyrings, PEM files, and wallets into process memory. 84-- merge all keyrings, PEM files, and wallets into process memory.
85-- 85--
86buildKeyDB :: InputFileContext -> Maybe String -> KeyRingOperation 86buildKeyDB :: InputFileContext -> Maybe Fingerprint -> KeyRingOperation
87 -> IO (KikiCondition (({- db -} KeyDB 87 -> IO (KikiCondition (({- db -} KeyDB
88 ,{- grip -} Maybe String 88 ,{- grip -} Maybe Fingerprint
89 ,{- wk -} Maybe MappedPacket 89 ,{- wk -} Maybe MappedPacket
90 ,{- hs -} ({- hostdbs0 -}[Hosts.Hosts], 90 ,{- hs -} ({- hostdbs0 -}[Hosts.Hosts],
91 {- hostdbs -}[Hosts.Hosts], 91 {- hostdbs -}[Hosts.Hosts],
@@ -128,7 +128,8 @@ buildKeyDB ctx grip0 keyring = do
128 ringPackets <- Map.traverseWithKey readp ringMap 128 ringPackets <- Map.traverseWithKey readp ringMap
129 let _ = ringPackets :: Map.Map InputFile (StreamInfo, Message) 129 let _ = ringPackets :: Map.Map InputFile (StreamInfo, Message)
130 130
131 let grip = grip0 `mplus` (show . fingerprint <$> fstkey) 131 let grip :: Maybe Fingerprint
132 grip = grip0 `mplus` (fingerprint <$> fstkey)
132 where 133 where
133 fstkey = do 134 fstkey = do
134 (_,Message ps) <- Map.lookup HomeSec ringPackets 135 (_,Message ps) <- Map.lookup HomeSec ringPackets
@@ -223,7 +224,7 @@ buildKeyDB ctx grip0 keyring = do
223 guard $ all (==usage) $ drop 1 us 224 guard $ all (==usage) $ drop 1 us
224 -- TODO: KikiCondition reporting for spill/fill usage mismatch? 225 -- TODO: KikiCondition reporting for spill/fill usage mismatch?
225 -- TODO: parseSpec3 226 -- TODO: parseSpec3
226 let (topspec,subspec) = parseSpec grip usage 227 let (topspec,subspec) = parseSpec (Just grip) usage
227 ms = map fst $ filterMatches topspec (kkData db) 228 ms = map fst $ filterMatches topspec (kkData db)
228 cmd = initializer stream 229 cmd = initializer stream
229 return (n,subspec,ms,stream, cmd) 230 return (n,subspec,ms,stream, cmd)
@@ -408,16 +409,16 @@ usageFromFilter _ = mzero
408 409
409-- | Parse a key specification. 410-- | Parse a key specification.
410-- The first argument is a grip for the default working key. 411-- The first argument is a grip for the default working key.
411parseSpec :: Fingerprint -> String -> (KeySpec,Maybe String) 412parseSpec :: Maybe Fingerprint -> String -> (KeySpec,Maybe String)
412parseSpec wkgrip spec = 413parseSpec wkgrip spec =
413 if not slashed 414 if not slashed
414 then 415 then
415 case prespec of 416 case prespec of
416 AnyMatch -> (KeyGrip "", Nothing) 417 AnyMatch -> (KeyGrip "", Nothing)
417 EmptyMatch -> error "Bad key spec." 418 EmptyMatch -> error "Bad key spec."
418 WorkingKeyMatch -> (KeyGrip wkgrip, Nothing) 419 WorkingKeyMatch -> (KeyGrip $ show wkgrip, Nothing)
419 SubstringMatch (Just KeyTypeField) tag -> (KeyGrip wkgrip, Just tag) 420 SubstringMatch (Just KeyTypeField) tag -> (KeyGrip $ show wkgrip, Just tag)
420 SubstringMatch Nothing str -> (KeyGrip wkgrip, Just str) 421 SubstringMatch Nothing str -> (KeyGrip $ show wkgrip, Just str)
421 SubstringMatch (Just UserIDField) ustr -> (KeyUidMatch ustr, Nothing) 422 SubstringMatch (Just UserIDField) ustr -> (KeyUidMatch ustr, Nothing)
422 FingerprintMatch fp -> (KeyGrip fp, Nothing) 423 FingerprintMatch fp -> (KeyGrip fp, Nothing)
423 else 424 else
@@ -780,8 +781,8 @@ is40digitHex xs = ys == xs && length ys==40
780 781
781matchSpec :: KeySpec -> KeyData -> Bool 782matchSpec :: KeySpec -> KeyData -> Bool
782matchSpec (KeyGrip grip) (KeyData p _ _ _) 783matchSpec (KeyGrip grip) (KeyData p _ _ _)
783 | matchpr grip (packet p)==grip = True 784 | matchpr' grip (packet p) = True
784 | otherwise = False 785 | otherwise = False
785 786
786matchSpec (KeyTag key tag) (KeyData _ sigs _ _) = not . null $ filter match ps 787matchSpec (KeyTag key tag) (KeyData _ sigs _ _) = not . null $ filter match ps
787 where 788 where
@@ -791,7 +792,7 @@ matchSpec (KeyTag key tag) (KeyData _ sigs _ _) = not . null $ filter match ps
791 && has_issuer key p 792 && has_issuer key p
792 has_issuer key p = isJust $ do 793 has_issuer key p = isJust $ do
793 issuer <- signature_issuer p 794 issuer <- signature_issuer p
794 guard $ matchpr issuer key == issuer 795 guard $ matchpr' issuer key
795 has_tag tag p = tag `elem` mapMaybe usage (hashed_subpackets p) 796 has_tag tag p = tag `elem` mapMaybe usage (hashed_subpackets p)
796 || tag `elem` map usageString (mapMaybe keyflags (hashed_subpackets p)) 797 || tag `elem` map usageString (mapMaybe keyflags (hashed_subpackets p))
797 798
diff --git a/lib/KeyRing/Types.hs b/lib/KeyRing/Types.hs
index 1177789..1a12a61 100644
--- a/lib/KeyRing/Types.hs
+++ b/lib/KeyRing/Types.hs
@@ -1,3 +1,4 @@
1{-# LANGUAGE StandaloneDeriving #-}
1{-# LANGUAGE DeriveFunctor #-} 2{-# LANGUAGE DeriveFunctor #-}
2{-# LANGUAGE DeriveTraversable #-} 3{-# LANGUAGE DeriveTraversable #-}
3{-# LANGUAGE PatternSynonyms #-} 4{-# LANGUAGE PatternSynonyms #-}
@@ -119,7 +120,7 @@ data PassphraseSpec = PassphraseSpec
119 { passSpecRingFile :: Maybe FilePath 120 { passSpecRingFile :: Maybe FilePath
120 -- ^ If not Nothing, the passphrase is to be used for packets 121 -- ^ If not Nothing, the passphrase is to be used for packets
121 -- from this file. 122 -- from this file.
122 , passSpecKeySpec :: Maybe String 123 , passSpecKeySpec :: Maybe Fingerprint
123 -- ^ Non-Nothing value reserved for future use. 124 -- ^ Non-Nothing value reserved for future use.
124 -- (TODO: Use this to implement per-key passphrase associations). 125 -- (TODO: Use this to implement per-key passphrase associations).
125 , passSpecPassFile :: InputFile 126 , passSpecPassFile :: InputFile
@@ -129,6 +130,9 @@ data PassphraseSpec = PassphraseSpec
129 | PassphraseMemoizer { passSpecTranscoder :: PacketTranscoder } 130 | PassphraseMemoizer { passSpecTranscoder :: PacketTranscoder }
130 | PassphraseAgent 131 | PassphraseAgent
131 132
133deriving instance Ord Fingerprint
134deriving instance Eq Fingerprint
135
132instance Show PassphraseSpec where 136instance Show PassphraseSpec where
133 show (PassphraseSpec a b c) = "PassphraseSpec "++show (a,b,c) 137 show (PassphraseSpec a b c) = "PassphraseSpec "++show (a,b,c)
134 show (PassphraseMemoizer _) = "PassphraseMemoizer" 138 show (PassphraseMemoizer _) = "PassphraseMemoizer"
@@ -350,14 +354,19 @@ isTrust _ = False
350-- matchpr fp = Data.List.Extra.takeEnd (length fp) 354-- matchpr fp = Data.List.Extra.takeEnd (length fp)
351-- 355--
352matchpr :: Fingerprint -> Packet -> Bool 356matchpr :: Fingerprint -> Packet -> Bool
353matchpr fp k = p == show fp 357matchpr fp k = matchpr' (show fp) k
354 where
355 p = reverse $ zipWith const (reverse (show $ fingerprint k)) (show fp)
356 358
359matchpr' :: String -> Packet -> Bool
360matchpr' fp k = p == fp
361 where
362 p = reverse $ zipWith const (reverse (show $ fingerprint k)) fp
357 363
364matchpr'' :: String -> Packet -> String
365matchpr'' fp k | matchpr' fp k = fp
366matchpr'' fp k | otherwise = ""
358 367
359data KeySpec = 368data KeySpec =
360 KeyGrip Fingerprint -- fp: 369 KeyGrip String -- fp:
361 | KeyTag Packet String -- fp:????/t: 370 | KeyTag Packet String -- fp:????/t:
362 | KeyUidMatch String -- u: 371 | KeyUidMatch String -- u:
363 deriving Show 372 deriving Show
@@ -428,8 +437,8 @@ seek_key :: KeySpec -> [Packet] -> ([Packet],[Packet])
428seek_key (KeyGrip grip) sec = (pre, subs) 437seek_key (KeyGrip grip) sec = (pre, subs)
429 where 438 where
430 (pre,subs) = break pred sec 439 (pre,subs) = break pred sec
431 pred p@(SecretKeyPacket {}) = matchpr grip p 440 pred p@(SecretKeyPacket {}) = matchpr' grip p
432 pred p@(PublicKeyPacket {}) = matchpr grip p 441 pred p@(PublicKeyPacket {}) = matchpr' grip p
433 pred _ = False 442 pred _ = False
434 443
435seek_key (KeyTag key tag) ps 444seek_key (KeyTag key tag) ps
@@ -442,7 +451,7 @@ seek_key (KeyTag key tag) ps
442 (as,bs) = break (\p -> isSignaturePacket p 451 (as,bs) = break (\p -> isSignaturePacket p
443 && has_tag tag p 452 && has_tag tag p
444 && isJust (signature_issuer p) 453 && isJust (signature_issuer p)
445 && matchpr (fromJust $ signature_issuer p) key == fromJust (signature_issuer p) ) 454 && matchpr' (fromJust $ signature_issuer p) key)
446 ps 455 ps
447 (rs,qs) = break isKey (reverse as) 456 (rs,qs) = break isKey (reverse as)
448 457