mirror of
https://github.com/waku-org/nwaku.git
synced 2025-02-04 11:05:38 +00:00
waku_store: better response when the store is requested with wrong cursor (#2231)
This commit is contained in:
parent
897f487978
commit
c48accb513
@ -259,3 +259,44 @@ procSuite "WakuNode - Store":
|
|||||||
|
|
||||||
## Cleanup
|
## Cleanup
|
||||||
waitFor allFutures(client.stop(), server.stop(), filterSource.stop())
|
waitFor allFutures(client.stop(), server.stop(), filterSource.stop())
|
||||||
|
|
||||||
|
test "history query should return INVALID_CURSOR if the cursor has empty data in the request":
|
||||||
|
## Setup
|
||||||
|
let
|
||||||
|
serverKey = generateSecp256k1Key()
|
||||||
|
server = newTestWakuNode(serverKey, ValidIpAddress.init("0.0.0.0"), Port(0))
|
||||||
|
clientKey = generateSecp256k1Key()
|
||||||
|
client = newTestWakuNode(clientKey, ValidIpAddress.init("0.0.0.0"), Port(0))
|
||||||
|
|
||||||
|
waitFor allFutures(client.start(), server.start())
|
||||||
|
|
||||||
|
let mountArchiveRes = server.mountArchive(archiveA)
|
||||||
|
assert mountArchiveRes.isOk(), mountArchiveRes.error
|
||||||
|
|
||||||
|
waitFor server.mountStore()
|
||||||
|
|
||||||
|
client.mountStoreClient()
|
||||||
|
|
||||||
|
## Forcing a bad cursor with empty digest data
|
||||||
|
var data: array[32, byte] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
let cursor = HistoryCursor(
|
||||||
|
pubsubTopic: "pubsubTopic",
|
||||||
|
senderTime: now(),
|
||||||
|
storeTime: now(),
|
||||||
|
digest: waku_archive.MessageDigest(data: data)
|
||||||
|
)
|
||||||
|
|
||||||
|
## Given
|
||||||
|
let req = HistoryQuery(contentTopics: @[DefaultContentTopic], cursor: some(cursor))
|
||||||
|
let serverPeer = server.peerInfo.toRemotePeerInfo()
|
||||||
|
|
||||||
|
## When
|
||||||
|
let queryRes = waitFor client.query(req, peer=serverPeer)
|
||||||
|
|
||||||
|
## Then
|
||||||
|
check not queryRes.isOk()
|
||||||
|
|
||||||
|
check queryRes.error == "BAD_REQUEST: invalid cursor"
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
waitFor allFutures(client.stop(), server.stop())
|
||||||
|
@ -816,6 +816,10 @@ proc mountStore*(node: WakuNode) {.async, raises: [Defect, LPError].} =
|
|||||||
|
|
||||||
# TODO: Review this handler logic. Maybe, move it to the appplication code
|
# TODO: Review this handler logic. Maybe, move it to the appplication code
|
||||||
let queryHandler: HistoryQueryHandler = proc(request: HistoryQuery): Future[HistoryResult] {.async.} =
|
let queryHandler: HistoryQueryHandler = proc(request: HistoryQuery): Future[HistoryResult] {.async.} =
|
||||||
|
if request.cursor.isSome():
|
||||||
|
request.cursor.get().checkHistCursor().isOkOr:
|
||||||
|
return err(error)
|
||||||
|
|
||||||
let request = request.toArchiveQuery()
|
let request = request.toArchiveQuery()
|
||||||
let response = await node.wakuArchive.findMessages(request)
|
let response = await node.wakuArchive.findMessages(request)
|
||||||
return response.toHistoryResult()
|
return response.toHistoryResult()
|
||||||
|
@ -4,7 +4,7 @@ else:
|
|||||||
{.push raises: [].}
|
{.push raises: [].}
|
||||||
|
|
||||||
import
|
import
|
||||||
std/options,
|
std/[options,sequtils],
|
||||||
stew/results,
|
stew/results,
|
||||||
stew/byteutils,
|
stew/byteutils,
|
||||||
nimcrypto/sha2
|
nimcrypto/sha2
|
||||||
@ -99,3 +99,18 @@ proc `$`*(err: HistoryError): string =
|
|||||||
"SERVICE_UNAVAILABLE"
|
"SERVICE_UNAVAILABLE"
|
||||||
of HistoryErrorKind.UNKNOWN:
|
of HistoryErrorKind.UNKNOWN:
|
||||||
"UNKNOWN"
|
"UNKNOWN"
|
||||||
|
|
||||||
|
proc checkHistCursor*(self: HistoryCursor): Result[void, HistoryError] =
|
||||||
|
if self.pubsubTopic.len == 0:
|
||||||
|
return err(HistoryError(kind: BAD_REQUEST,
|
||||||
|
cause: "empty pubsubTopic"))
|
||||||
|
if self.senderTime == 0:
|
||||||
|
return err(HistoryError(kind: BAD_REQUEST,
|
||||||
|
cause: "invalid senderTime"))
|
||||||
|
if self.storeTime == 0:
|
||||||
|
return err(HistoryError(kind: BAD_REQUEST,
|
||||||
|
cause: "invalid storeTime"))
|
||||||
|
if self.digest.data.all(proc (x: byte): bool = x == 0):
|
||||||
|
return err(HistoryError(kind: BAD_REQUEST,
|
||||||
|
cause: "empty digest"))
|
||||||
|
return ok()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user