From bcac8b451fcedd8a4485920d187f36bb9fd3c198 Mon Sep 17 00:00:00 2001 From: joe Date: Thu, 17 Apr 2014 23:12:49 -0400 Subject: passed doDecrypt to buildKeyDB --- KeyRing.hs | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) (limited to 'KeyRing.hs') diff --git a/KeyRing.hs b/KeyRing.hs index 1c68d36..bda1958 100644 --- a/KeyRing.hs +++ b/KeyRing.hs @@ -655,9 +655,10 @@ importPEMKey db' tup = do where doDecrypt = todo -buildKeyDB :: FilePath -> FilePath -> Maybe String -> KeyRingData +buildKeyDB :: (MappedPacket -> IO (KikiCondition Packet)) + -> FilePath -> FilePath -> Maybe String -> KeyRingData -> IO (KikiCondition ((KeyDB,Maybe String,Maybe Packet),[(FilePath,KikiReportAction)])) -buildKeyDB secring pubring grip0 keyring = do +buildKeyDB doDecrypt secring pubring grip0 keyring = do let files isring = do @@ -680,8 +681,6 @@ buildKeyDB secring pubring grip0 keyring = do try r $ \(db'',report) -> do return $ KikiSuccess (db'', report0 ++ report) - doDecrypt = todo - -- KeyRings (todo: KikiCondition reporting?) (db_rings,wk,grip) <- do ms <- mapM readp (files isring) @@ -1119,6 +1118,34 @@ writePEMKeys db exports = do flip (maybe $ return BadPassphrase) pun $ \pun -> do return $ KikiSuccess (fname,pun) +doDecrypt :: IORef (Map.Map KeyKey Packet) + -> Map.Map FilePath (IO S.ByteString) + -> MappedPacket + -> IO (KikiCondition Packet) +doDecrypt unkeysRef pws mp = do + unkeys <- readIORef unkeysRef + let wk = packet mp + kk = keykey wk + fs = Map.keys $ locations mp + + decryptIt [] = return BadPassphrase + decryptIt (getpw:getpws) = do + pw <- getpw + let wkun = maybe wk id $ decryptSecretKey pw wk + case symmetric_algorithm wkun of + Unencrypted -> do + writeIORef unkeysRef (Map.insert kk wkun unkeys) + return $ KikiSuccess wkun + _ -> decryptIt getpws + + getpws = mapMaybe (flip Map.lookup pws) fs + + case symmetric_algorithm wk of + Unencrypted -> return (KikiSuccess wk) + _ -> maybe (decryptIt getpws) + (return . KikiSuccess) + $ Map.lookup kk unkeys + runKeyRing :: KeyRingData -> IO (KikiResult KeyRingRuntime) runKeyRing keyring = do @@ -1146,14 +1173,18 @@ runKeyRing keyring = do then return $ KikiResult (FailedToLock failed_locks) [] else do - let doDecrypt = todo - pws <- + -- TODO: head will throw an exception if a File Descriptor keyring + -- file is present. We probably should change OriginMap to use InputFile + -- instead of FilePath. Traversable.mapM (cachedContents secring pubring . pwfile . snd) - (Map.filter (isring . snd) $ kFiles keyring) + (Map.mapKeys (head . resolveInputFile secring pubring) + $ Map.filter (isring . snd) $ kFiles keyring) + + unkeysRef <- newIORef Map.empty -- merge all keyrings, PEM files, and wallets - bresult <- buildKeyDB secring pubring grip0 keyring + bresult <- buildKeyDB (doDecrypt unkeysRef pws) secring pubring grip0 keyring try' bresult $ \((db,grip,wk),report_imports) -> do -- cgit v1.2.3