This repository was archived by the owner on Aug 18, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 631
/
Copy pathKeyStorage.hs
87 lines (68 loc) · 2.68 KB
/
KeyStorage.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
module Pos.Client.KeyStorage
( MonadKeysRead (..)
, MonadKeys (..)
, AllUserSecrets (..)
, getSecretDefault
, modifySecretPureDefault
, modifySecretDefault
, getSecretKeys
, getSecretKeysPlain
, addSecretKey
, deleteAllSecretKeys
, deleteSecretKeyBy
) where
import Universum
import qualified Control.Concurrent.STM as STM
import Control.Lens ((<%=), (<>~))
import Serokell.Util (modifyTVarS)
import Pos.Crypto (EncryptedSecretKey, hash)
import Pos.Util.UserSecret (HasUserSecret (..), UserSecret, usKeys,
writeUserSecret)
----------------------------------------------------------------------
-- MonadKeys class and default functions
----------------------------------------------------------------------
class Monad m => MonadKeysRead m where
getSecret :: m UserSecret
class MonadKeysRead m => MonadKeys m where
modifySecret :: (UserSecret -> UserSecret) -> m ()
type HasKeysContext ctx m =
( MonadReader ctx m
, HasUserSecret ctx
, MonadIO m
)
getSecretDefault :: HasKeysContext ctx m => m UserSecret
getSecretDefault = view userSecret >>= atomically . STM.readTVar
modifySecretPureDefault :: HasKeysContext ctx m => (UserSecret -> UserSecret) -> m ()
modifySecretPureDefault f = do
us <- view userSecret
atomically $ STM.modifyTVar' us f
modifySecretDefault :: HasKeysContext ctx m => (UserSecret -> UserSecret) -> m ()
modifySecretDefault f = do
us <- view userSecret
new <- atomically $ modifyTVarS us (identity <%= f)
writeUserSecret new
----------------------------------------------------------------------
-- Helpers
----------------------------------------------------------------------
newtype AllUserSecrets = AllUserSecrets
{ getAllUserSecrets :: [EncryptedSecretKey]
} deriving (Container)
getSecretKeys :: MonadKeysRead m => m AllUserSecrets
getSecretKeys = AllUserSecrets <$> getSecretKeysPlain
getSecretKeysPlain :: MonadKeysRead m => m [EncryptedSecretKey]
getSecretKeysPlain = view usKeys <$> getSecret
{-# INLINE addSecretKey #-}
addSecretKey :: MonadKeys m => EncryptedSecretKey -> m ()
addSecretKey sk = modifySecret $ \us ->
if view usKeys us `containsKey` sk
then us
else us & usKeys <>~ [sk]
where
containsKey ls k = hash k `elem` map hash ls
deleteAllSecretKeys :: MonadKeys m => m ()
deleteAllSecretKeys = modifySecret (usKeys .~ [])
deleteSecretKeyBy :: MonadKeys m => (EncryptedSecretKey -> Bool) -> m ()
deleteSecretKeyBy predicate = modifySecret (usKeys %~ filter (not . predicate))