diff options
Diffstat (limited to 'PrevActivity.hs')
-rw-r--r-- | PrevActivity.hs | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/PrevActivity.hs b/PrevActivity.hs index 0836c8b..74203fd 100644 --- a/PrevActivity.hs +++ b/PrevActivity.hs @@ -19,7 +19,10 @@ removeHashes msg = MissingHashes $ case msg of Developer (ActivityMessage a) -> Developer (go a) _ -> msg where - go a = ActivityMessage $ a { prevActivity = Nothing } + go a = ActivityMessage $ a + { prevActivity = Nothing + , prevEntered = Nothing + } type RecentActivity = STM (SigVerifier, [Hash]) @@ -29,17 +32,27 @@ type RecentActivity = STM (SigVerifier, [Hash]) -- point the message's signature will verify. restoreHashes :: RecentActivity -> MissingHashes AnyMessage -> STM AnyMessage restoreHashes ra (MissingHashes msg) = case msg of - User (ActivityMessage act) -> - User . ActivityMessage <$> (go act =<< ra) + User (ActivityMessage act) -> + User . ActivityMessage <$> find act Developer (ActivityMessage act) -> - Developer . ActivityMessage <$> (go act =<< ra) + Developer . ActivityMessage <$> find act User (ControlMessage {}) -> return msg Developer (ControlMessage {}) -> return msg where - go act (_, []) = return act - go act (sigverifier, (h:hs)) = do - let act' = act { prevActivity = Just h } - if verifySigned sigverifier act' - then return act' - else go act (sigverifier, hs) + find act = do + (sigverifier, l) <- ra + let l' = Nothing : map Just l + let ll = do + ah <- l' + eh <- l' + return $ act + { prevActivity = ah + , prevEntered = eh + } + go act sigverifier ll + go act _ [] = return act + go act sigverifier (l:ls) = do + if verifySigned sigverifier l + then return l + else go act sigverifier ls |