fix ASN.1 container parsing

This commit is contained in:
Trolli Schmittlauch 2020-05-08 17:15:40 +02:00
parent 2f10ea6628
commit 91bb72cb57

View file

@ -201,7 +201,7 @@ encodePayload payload'@QueryIDResponsePayload{} =
Start Sequence Start Sequence
: encodeQueryResult resp : encodeQueryResult resp
: case resp of : case resp of
FOUND _ -> [] FOUND ns -> encodeNodeState $ ns
FORWARD entrySet -> FORWARD entrySet ->
Start Sequence Start Sequence
: (concatMap encodeCacheEntry . Set.elems $ entrySet) : (concatMap encodeCacheEntry . Set.elems $ entrySet)
@ -314,8 +314,7 @@ parseRequest action = do
sender <- parseNodeState sender <- parseNodeState
parts <- parseInteger parts <- parseInteger
part <- parseInteger part <- parseInteger
payload <- onNextContainer Sequence $ payload <- case action of
case action of
QueryID -> parseQueryIDRequest QueryID -> parseQueryIDRequest
Join -> parseJoinRequest Join -> parseJoinRequest
Leave -> parseLeaveRequest Leave -> parseLeaveRequest
@ -330,18 +329,12 @@ parseResponse responseTo = do
parts <- parseInteger parts <- parseInteger
part <- parseInteger part <- parseInteger
action <- parseEnum :: ParseASN1 Action action <- parseEnum :: ParseASN1 Action
payload <- onNextContainer Sequence $ payload <- case action of
case action of
QueryID -> parseQueryIDResponse QueryID -> parseQueryIDResponse
Join -> parseJoinResponse Join -> parseJoinResponse
Leave -> parseLeaveResponse Leave -> parseLeaveResponse
Stabilise -> parseStabiliseResponse Stabilise -> parseStabiliseResponse
Ping -> parsePingResponse Ping -> parsePingResponse
-- consume sequence end
end <- getNext
case end of
End Sequence -> return ()
x -> throwParseError $ "unexpected ASN.1 element " ++ show x
return $ Response responseTo senderID parts part action payload return $ Response responseTo senderID parts part action payload
@ -414,7 +407,7 @@ parseJoinRequest = do
return JoinRequestPayload return JoinRequestPayload
parseJoinResponse :: ParseASN1 ActionPayload parseJoinResponse :: ParseASN1 ActionPayload
parseJoinResponse = do parseJoinResponse = onNextContainer Sequence $ do
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
cache <- parseNodeCache cache <- parseNodeCache
@ -425,7 +418,7 @@ parseJoinResponse = do
} }
parseQueryIDRequest :: ParseASN1 ActionPayload parseQueryIDRequest :: ParseASN1 ActionPayload
parseQueryIDRequest = do parseQueryIDRequest = onNextContainer Sequence $ do
targetID <- fromInteger <$> parseInteger targetID <- fromInteger <$> parseInteger
lBestNodes <- parseInteger lBestNodes <- parseInteger
return $ QueryIDRequestPayload { return $ QueryIDRequestPayload {
@ -434,7 +427,7 @@ parseQueryIDRequest = do
} }
parseQueryIDResponse :: ParseASN1 ActionPayload parseQueryIDResponse :: ParseASN1 ActionPayload
parseQueryIDResponse = do parseQueryIDResponse = onNextContainer Sequence $ do
Enumerated resultType <- getNext Enumerated resultType <- getNext
result <- case resultType of result <- case resultType of
0 -> FOUND <$> parseNodeState 0 -> FOUND <$> parseNodeState
@ -450,7 +443,7 @@ parseStabiliseRequest = do
return StabiliseRequestPayload return StabiliseRequestPayload
parseStabiliseResponse :: ParseASN1 ActionPayload parseStabiliseResponse :: ParseASN1 ActionPayload
parseStabiliseResponse = do parseStabiliseResponse = onNextContainer Sequence $ do
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
return $ StabiliseResponsePayload { return $ StabiliseResponsePayload {
@ -459,7 +452,7 @@ parseStabiliseResponse = do
} }
parseLeaveRequest :: ParseASN1 ActionPayload parseLeaveRequest :: ParseASN1 ActionPayload
parseLeaveRequest = do parseLeaveRequest = onNextContainer Sequence $ do
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
return $ LeaveRequestPayload { return $ LeaveRequestPayload {
@ -478,7 +471,7 @@ parsePingRequest = do
return PingRequestPayload return PingRequestPayload
parsePingResponse :: ParseASN1 ActionPayload parsePingResponse :: ParseASN1 ActionPayload
parsePingResponse = do parsePingResponse = onNextContainer Sequence $ do
handledNodes <- getMany parseNodeState handledNodes <- getMany parseNodeState
return $ PingResponsePayload { return $ PingResponsePayload {
pingNodeStates = handledNodes pingNodeStates = handledNodes