From 769ffa643557af7e2b10f7034a4690f4d0ebe6e4 Mon Sep 17 00:00:00 2001 From: joe Date: Mon, 14 Apr 2014 19:12:37 -0400 Subject: runKeyRing method --- KeyRing.hs | 60 +++++++++++++++++++++++++++++++++++------------------------- kiki.hs | 7 +++++++ 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/KeyRing.hs b/KeyRing.hs index c05e9e7..cdfcd34 100644 --- a/KeyRing.hs +++ b/KeyRing.hs @@ -36,9 +36,13 @@ home = HomeDir data InputFile = HomeSec | HomePub | ArgFile FilePath | FileDesc Int -data FileType = KeyRingFile | PEMFile | WalletFile +type UsageTag = String +type Initializer = String +type PassWordFile = InputFile -data RefType = ConstRef | MutableRef +data FileType = KeyRingFile PassWordFile | PEMFile UsageTag | WalletFile + +data RefType = ConstRef | MutableRef (Maybe Initializer) data KeyRingRuntime = KeyRingRuntime @@ -53,9 +57,22 @@ data KeyRingAction a = KeyRingAction a | RunTimeAction (KeyRingRuntime -> a) data KeyRingData = KeyRingData { kFiles :: Map.Map InputFile (RefType,FileType) + , kImports :: Map.Map String (KeyData -> Bool) , homeSpec :: Maybe String } +filesToLock k secring pubring = do + (f,(rtyp,ftyp)) <- Map.toList (kFiles k) + case rtyp of + ConstRef -> [] + MutableRef {} -> resolve f + where + resolve HomeSec = return secring + resolve HomePub = return pubring + resolve (ArgFile f) = return f + resolve _ = [] + + -- kret :: a -> KeyRingData a -- kret x = KeyRingData Map.empty Nothing (KeyRingAction x) @@ -85,21 +102,10 @@ data KikiResult a = KikiResult , kikiReport :: [ (FilePath, KikiReportAction) ] } -{- -empty = KeyRingData { filesToLock = [] - , homeSpec = Nothing - , kaction = \KeyRingRuntime {} -> return () - , keyringFiles = [] - , walletFiles = [] - } - -runKeyRing :: KeyRingData a -> IO (KikiResult a) -runKeyRing keyring = do +runKeyRing :: KeyRingData -> (KeyRingRuntime -> a) -> IO (KikiResult a) +runKeyRing keyring op = do (homedir,secring,pubring,grip0) <- getHomeDir (homeSpec keyring) - let tolocks = map resolve (filesToLock keyring) - where resolve (ArgFile f) = f - resolve HomePub = pubring - resolve HomeSec = secring + let tolocks = filesToLock keyring secring pubring lks <- forM tolocks $ \f -> do lk <- dotlock_create f 0 v <- flip (maybe $ return Nothing) lk $ \lk -> do @@ -109,23 +115,27 @@ runKeyRing keyring = do return (v,f) let (lked, map snd -> failed) = partition (isJust . fst) lks ret = if null failed then KikiSuccess () else FailedToLock failed - ret <- case functorToEither ret of Right {} -> do - a <- kaction keyring KeyRingRuntime + report <- todo -- build db + + a <- return $ op KeyRingRuntime { rtPubring = pubring , rtSecring = secring - , rtRings = secring:pubring:keyringFiles keyring - , rtWallets = walletFiles keyring + , rtRings = [] -- todo secring:pubring:keyringFiles keyring + , rtWallets = [] -- todo walletFiles keyring , rtGrip = grip0 } - return (KikiSuccess a) - Left err -> return err + report <- todo report -- write files + + return $ KikiResult (KikiSuccess a) report + Left err -> return $ KikiResult err [] forM_ lked $ \(Just lk, fname) -> do dotlock_release lk - dotlock_destroy lk - return KikiResult { kikiCondition = ret, kikiReport = [] } --} + dotlock_destroy lk -- todo: verify we want this + + return ret + parseOptionFile fname = do xs <- fmap lines (readFile fname) diff --git a/kiki.hs b/kiki.hs index cabb721..365562b 100644 --- a/kiki.hs +++ b/kiki.hs @@ -1950,6 +1950,13 @@ has_good_sig wk (KeyData k sigs uids subs) = any goodsig $ Map.toList uids pre_ov <- signatures (Message [packet k, UserIDPacket uidstr, sig0]) signatures_over $ verify (Message [wk]) pre_ov +markForImport + :: Ord d => + Map.Map String a + -> Maybe String + -> [Char] + -> Map.Map d KeyData + -> IO (Map.Map d KeyData) markForImport margs grip pubring db = maybe (return db) import_db $ wantToImport where wantToImport = mplus import_f importifauth_f where -- cgit v1.2.3