summaryrefslogtreecommitdiff
path: root/KeyRing.hs
diff options
context:
space:
mode:
Diffstat (limited to 'KeyRing.hs')
-rw-r--r--KeyRing.hs96
1 files changed, 78 insertions, 18 deletions
diff --git a/KeyRing.hs b/KeyRing.hs
index 39bff4c..b223ee7 100644
--- a/KeyRing.hs
+++ b/KeyRing.hs
@@ -9,6 +9,7 @@ import Data.Maybe
9import Data.Char 9import Data.Char
10import Data.List 10import Data.List
11import Data.OpenPGP 11import Data.OpenPGP
12import Data.Functor
12import Control.Applicative ( (<$>) ) 13import Control.Applicative ( (<$>) )
13import System.Directory ( getHomeDirectory, doesFileExist ) 14import System.Directory ( getHomeDirectory, doesFileExist )
14import Control.Arrow ( first, second ) 15import Control.Arrow ( first, second )
@@ -17,6 +18,7 @@ import Data.ByteString.Lazy ( ByteString )
17import Text.Show.Pretty as PP ( ppShow ) 18import Text.Show.Pretty as PP ( ppShow )
18import qualified Data.Map as Map 19import qualified Data.Map as Map
19 20
21import FunctorToMaybe
20import DotLock 22import DotLock
21 23
22data HomeDir = 24data HomeDir =
@@ -51,13 +53,29 @@ data KeyRingData a = KeyRingData
51 53
52todo = error "unimplemented" 54todo = error "unimplemented"
53 55
54data KikiResult = KikiSuccess | FailedToLock [FilePath] 56data KikiCondition a = KikiSuccess a | FailedToLock [FilePath]
55 57
56{- 58#define TRIVIAL(OP) fmap _ (OP) = OP
57newtype KeyRing a = KeyRing 59instance Functor KikiCondition where
58 { krAction :: KeyRingData b -> IO a 60 fmap f (KikiSuccess a) = KikiSuccess (f a)
61 TRIVIAL( FailedToLock x )
62instance FunctorToMaybe KikiCondition where
63 functorToMaybe (KikiSuccess a) = Just a
64 functorToMaybe _ = Nothing
65
66data KikiReportAction =
67 NewPacket String
68 | MissingPacket String
69 | ExportedSubkey
70 | GeneratedSubkeyFile
71 | NewWalletKey String
72 | YieldSignature
73 | YieldSecretKeyPacket String
74
75data KikiResult a = KikiResult
76 { kikiCondition :: KikiCondition a
77 , kikiReport :: [ (FilePath, KikiReportAction) ]
59 } 78 }
60-}
61 79
62empty = KeyRingData { filesToLock = [] 80empty = KeyRingData { filesToLock = []
63 , homeSpec = Nothing 81 , homeSpec = Nothing
@@ -66,13 +84,7 @@ empty = KeyRingData { filesToLock = []
66 , walletFiles = [] 84 , walletFiles = []
67 } 85 }
68 86
69{- 87runKeyRing :: KeyRingData a -> IO (KikiResult a)
70runKeyRing :: KeyRing () -> IO a
71runKeyRing keyring = krAction keyring empty
72-}
73
74
75runKeyRing :: KeyRingData a -> IO KikiResult
76runKeyRing keyring = do 88runKeyRing keyring = do
77 (homedir,secring,pubring,grip0) <- getHomeDir (homeSpec keyring) 89 (homedir,secring,pubring,grip0) <- getHomeDir (homeSpec keyring)
78 let tolocks = map resolve (filesToLock keyring) 90 let tolocks = map resolve (filesToLock keyring)
@@ -87,21 +99,23 @@ runKeyRing keyring = do
87 else dotlock_destroy lk >> return Nothing 99 else dotlock_destroy lk >> return Nothing
88 return (v,f) 100 return (v,f)
89 let (lked, map snd -> failed) = partition (isJust . fst) lks 101 let (lked, map snd -> failed) = partition (isJust . fst) lks
90 ret = if null failed then KikiSuccess else FailedToLock failed 102 ret = if null failed then KikiSuccess () else FailedToLock failed
91 103
92 case ret of 104 ret <- case functorToEither ret of
93 KikiSuccess -> kaction keyring KeyRingRuntime 105 Right {} -> do
106 a <- kaction keyring KeyRingRuntime
94 { rtPubring = pubring 107 { rtPubring = pubring
95 , rtSecring = secring 108 , rtSecring = secring
96 , rtRings = secring:pubring:keyringFiles keyring 109 , rtRings = secring:pubring:keyringFiles keyring
97 , rtWallets = walletFiles keyring 110 , rtWallets = walletFiles keyring
98 , rtGrip = grip0 111 , rtGrip = grip0
99 } 112 }
100 _ -> return undefined 113 return (KikiSuccess a)
114 Left err -> return err
101 115
102 forM_ lked $ \(Just lk, fname) -> do dotlock_release lk 116 forM_ lked $ \(Just lk, fname) -> do dotlock_release lk
103 dotlock_destroy lk 117 dotlock_destroy lk
104 return ret 118 return KikiResult { kikiCondition = ret, kikiReport = [] }
105 119
106parseOptionFile fname = do 120parseOptionFile fname = do
107 xs <- fmap lines (readFile fname) 121 xs <- fmap lines (readFile fname)
@@ -358,3 +372,49 @@ merge_ db filename qs = foldl mergeit db (zip [0..] qs)
358 mergeSubSig n sig Nothing = error $ 372 mergeSubSig n sig Nothing = error $
359 "Unable to merge subkey signature: "++(words (show sig) >>= take 1) 373 "Unable to merge subkey signature: "++(words (show sig) >>= take 1)
360 374
375data Kiki a = Kiki
376
377goHome :: Maybe FilePath -> Kiki ()
378goHome = todo
379
380syncRing :: InputFile -> Kiki ()
381syncRing = todo
382
383syncSubKey :: String -> FilePath -> String -> Kiki ()
384syncSubKey usage path cmd = todo
385
386syncWallet :: FilePath -> Kiki ()
387syncWallet = todo
388
389usePassphraseFD :: Int -> Kiki ()
390usePassphraseFD = todo
391
392importAll :: Kiki ()
393importAll = todo
394
395importAllAuthentic :: Kiki ()
396importAllAuthentic = todo
397
398signSelfAuthorized :: Kiki ()
399signSelfAuthorized = todo
400
401showIdentity :: Message -> String
402showIdentity = todo
403
404identities :: Kiki [Message]
405identities = todo
406
407currentIdentity :: Kiki Message
408currentIdentity = todo
409
410identityBySpec :: String -> Kiki Message
411identityBySpec = todo
412
413identityBySSHKey :: String -> Kiki Message
414identityBySSHKey = todo
415
416keyBySpec :: String -> Kiki Packet
417keyBySpec = todo
418
419walletInputFormat :: Packet -> String
420walletInputFormat = todo