diff options
Diffstat (limited to 'SybilLimit.hs')
-rw-r--r-- | SybilLimit.hs | 25 |
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. | ||
142 | forwardMessage :: ThisNode -> (FriendNode -> IntMap Int) -> (NodeId,PeerMessage) -> (NodeId, PeerMessage) | 143 | forwardMessage :: ThisNode -> (FriendNode -> IntMap Int) -> (NodeId,PeerMessage) -> (NodeId, PeerMessage) |
143 | forwardMessage me next (srcId,msg) = msg' | 144 | forwardMessage 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 | ||
192 | reactToMessage w (srcId, msg) me = | 194 | reactToMessage 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 |