summaryrefslogtreecommitdiff
path: root/SybilLimit.hs
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2014-08-10 20:56:44 -0400
committerjoe <joe@jerkface.net>2014-08-10 20:56:44 -0400
commitf4603b395c58881421f6e806fe12c077f9181183 (patch)
tree7b67b634642b7acddf153f9fbb1d8867d892e4d5 /SybilLimit.hs
parentc1dc1da953d360e0a3182722591ef9acb069ab01 (diff)
more robustness fixes
Diffstat (limited to 'SybilLimit.hs')
-rw-r--r--SybilLimit.hs25
1 files changed, 15 insertions, 10 deletions
diff --git a/SybilLimit.hs b/SybilLimit.hs
index 9befb31..f2b983c 100644
--- a/SybilLimit.hs
+++ b/SybilLimit.hs
@@ -139,6 +139,7 @@ updateRoute i (k,j) fs = jfromk $ ktoj fs
139 setFrom i x f = f { routesFrom = IntMap.insert i x (routesFrom f)} 139 setFrom i x f = f { routesFrom = IntMap.insert i x (routesFrom f)}
140 140
141 141
142-- | Note: an exception will be thrown if srcId is not a valid friend node.
142forwardMessage :: ThisNode -> (FriendNode -> IntMap Int) -> (NodeId,PeerMessage) -> (NodeId, PeerMessage) 143forwardMessage :: ThisNode -> (FriendNode -> IntMap Int) -> (NodeId,PeerMessage) -> (NodeId, PeerMessage)
143forwardMessage me next (srcId,msg) = msg' 144forwardMessage me next (srcId,msg) = msg'
144 where msg' = ( dest, msg { rrCount = rrCount msg + 1 } ) 145 where msg' = ( dest, msg { rrCount = rrCount msg + 1 } )
@@ -186,29 +187,33 @@ reactToMessage w (srcId, msg@(RegistrationQuery {})) me =
186 resp = RegistrationResponse { rrSuspect = rrSuspect msg 187 resp = RegistrationResponse { rrSuspect = rrSuspect msg
187 , rrRegisteredFrom = rrRegisteredFrom msg 188 , rrRegisteredFrom = rrRegisteredFrom msg
188 , rrValidRegistration = check } 189 , rrValidRegistration = check }
189 key = friendById me Map.! rrRegisteredFrom msg 190 check = fromMaybe False $ do
190 check = registeredTerminal (friends me ! key) == Just (rrSuspect msg) 191 key <- Map.lookup (rrRegisteredFrom msg) $ friendById me
192 return $ registeredTerminal (friends me ! key) == Just (rrSuspect msg)
191 193
192reactToMessage w (srcId, msg) me = 194reactToMessage w (srcId, msg) me =
193 if rrCount msg == w then terminate 195 case Map.lookup srcId $ friendById me of
194 else MessageReaction me [forwardMessage me next (srcId,msg)] [] 196 Nothing -> MessageReaction me [] []
197 Just srcNo ->
198 if rrCount msg == w
199 then terminate srcNo
200 else MessageReaction me [forwardMessage me next (srcId,msg)] []
195 where 201 where
196 (terminate,next) = case msg of 202 (terminate,next) = case msg of
197 ForwardRRMessage {} -> ( terminateForward, routesTo ) 203 ForwardRRMessage {} -> ( terminateForward, routesTo )
198 BackwardRRMessage {} -> ( terminateBackward, routesFrom ) 204 BackwardRRMessage {} -> ( terminateBackward, routesFrom )
199 205
200 terminateForward = MessageReaction me { friends = friends' } 206 terminateForward srcNo = MessageReaction me { friends = friends' }
201 [pong] 207 [pong]
202 [] 208 []
203 where pong =( srcId, BackwardRRMessage { rrCount = 1 209 where pong =( srcId, BackwardRRMessage { rrCount = 1
204 , rrRoute = rrRoute msg 210 , rrRoute = rrRoute msg
205 , rrTail = (srcId, selfId me) 211 , rrTail = (srcId, selfId me)
206 } ) 212 } )
207 friends' = IntMap.adjust adj suspectNo $ friends me 213 friends' = IntMap.adjust adj srcNo $ friends me
208 suspectNo = friendById me Map.! rrSuspect msg
209 adj f = f { registeredTerminal = Just $ rrSuspect msg } 214 adj f = f { registeredTerminal = Just $ rrSuspect msg }
210 215
211 terminateBackward = MessageReaction me' [] [] 216 terminateBackward _ = MessageReaction me' [] []
212 where me' = me { routeTails = 217 where me' = me { routeTails =
213 IntMap.insert (rrRoute msg) (rrTail msg) 218 IntMap.insert (rrRoute msg) (rrTail msg)
214 $ routeTails me 219 $ routeTails me