mirror of
https://github.com/logos-messaging/logos-messaging-nim.git
synced 2026-02-11 01:13:26 +00:00
fix(jsonrpc): use padded-base64 for payload encoding
This commit is contained in:
parent
b6a011733d
commit
8258415804
40
tests/common/test_base64_codec.nim
Normal file
40
tests/common/test_base64_codec.nim
Normal file
@ -0,0 +1,40 @@
|
||||
|
||||
{.used.}
|
||||
|
||||
import
|
||||
stew/[results, byteutils],
|
||||
testutils/unittests
|
||||
import
|
||||
../../waku/common/base64
|
||||
|
||||
|
||||
suite "Waku Common - stew base64 wrapper":
|
||||
|
||||
test "encode into base64 (with padding)":
|
||||
## Given
|
||||
# From RFC 4648 test vectors: https://www.rfc-editor.org/rfc/rfc4648#page-12
|
||||
let data = "fooba"
|
||||
|
||||
## When
|
||||
let encoded = base64.encode(data)
|
||||
|
||||
## Then
|
||||
check:
|
||||
encoded == Base64String("Zm9vYmE=")
|
||||
|
||||
|
||||
test "decode from base64 (with padding)":
|
||||
## Given
|
||||
# From RFC 4648 test vectors: https://www.rfc-editor.org/rfc/rfc4648#page-12
|
||||
let data = Base64String("Zm9vYg==")
|
||||
|
||||
## When
|
||||
let decodedRes = base64.decode(data)
|
||||
|
||||
## Then
|
||||
check:
|
||||
decodedRes.isOk()
|
||||
|
||||
let decoded = decodedRes.tryGet()
|
||||
check:
|
||||
decoded == toBytes("foob")
|
||||
@ -127,7 +127,7 @@ suite "Waku v2 JSON-RPC API - Relay":
|
||||
|
||||
## When
|
||||
let rpcMessage = WakuMessageRPC(
|
||||
payload: Base64String.encode(message.payload),
|
||||
payload: base64.encode(message.payload),
|
||||
contentTopic: some(message.contentTopic),
|
||||
timestamp: some(message.timestamp),
|
||||
version: some(message.version)
|
||||
@ -201,7 +201,7 @@ suite "Waku v2 JSON-RPC API - Relay":
|
||||
## Then
|
||||
check:
|
||||
dstMessages.len == 4
|
||||
dstMessages[2].payload == Base64String.encode(messages[2].payload)
|
||||
dstMessages[2].payload == base64.encode(messages[2].payload)
|
||||
dstMessages[2].contentTopic.get() == messages[2].contentTopic
|
||||
dstMessages[2].timestamp.get() == messages[2].timestamp
|
||||
dstMessages[2].version.get() == messages[2].version
|
||||
@ -264,7 +264,7 @@ suite "Waku v2 JSON-RPC API - Relay (Private)":
|
||||
## Given
|
||||
let
|
||||
payload = @[byte 38]
|
||||
payloadBase64 = Base64String.encode(payload)
|
||||
payloadBase64 = base64.encode(payload)
|
||||
|
||||
let message = WakuMessageRPC(
|
||||
payload: payloadBase64,
|
||||
@ -353,7 +353,7 @@ suite "Waku v2 JSON-RPC API - Relay (Private)":
|
||||
## Given
|
||||
let
|
||||
payload = @[byte 38]
|
||||
payloadBase64 = Base64String.encode(payload)
|
||||
payloadBase64 = base64.encode(payload)
|
||||
|
||||
let message = WakuMessageRPC(
|
||||
payload: payloadBase64,
|
||||
|
||||
@ -8,10 +8,10 @@ import
|
||||
presto, presto/client as presto_client,
|
||||
libp2p/crypto/crypto
|
||||
import
|
||||
../../waku/common/base64,
|
||||
../../waku/v2/node/waku_node,
|
||||
../../waku/v2/node/rest/server,
|
||||
../../waku/v2/node/rest/client,
|
||||
../../waku/v2/node/rest/base64,
|
||||
../../waku/v2/node/rest/responses,
|
||||
../../waku/v2/node/rest/relay/types,
|
||||
../../waku/v2/node/rest/relay/handlers as relay_api,
|
||||
@ -163,7 +163,7 @@ suite "Waku v2 Rest API - Relay":
|
||||
$response.contentType == $MIMETYPE_JSON
|
||||
response.data.len == 3
|
||||
response.data.all do (msg: RelayWakuMessage) -> bool:
|
||||
msg.payload == Base64String.encode("TEST-1") and
|
||||
msg.payload == base64.encode("TEST-1") and
|
||||
msg.contentTopic.get().string == "content-topic-x" and
|
||||
msg.version.get() == 2 and
|
||||
msg.timestamp.get() != Timestamp(0)
|
||||
@ -210,7 +210,7 @@ suite "Waku v2 Rest API - Relay":
|
||||
discard await client.relayPostSubscriptionsV1(newTopics)
|
||||
|
||||
let response = await client.relayPostMessagesV1(DefaultPubsubTopic, RelayWakuMessage(
|
||||
payload: Base64String.encode("TEST-PAYLOAD"),
|
||||
payload: base64.encode("TEST-PAYLOAD"),
|
||||
contentTopic: some(DefaultContentTopic),
|
||||
timestamp: some(int64(2022))
|
||||
))
|
||||
|
||||
@ -6,8 +6,8 @@ import
|
||||
unittest2,
|
||||
json_serialization
|
||||
import
|
||||
../../waku/common/base64,
|
||||
../../waku/v2/node/rest/serdes,
|
||||
../../waku/v2/node/rest/base64,
|
||||
../../waku/v2/node/rest/relay/types,
|
||||
../../waku/v2/protocol/waku_message
|
||||
|
||||
@ -18,7 +18,7 @@ suite "Waku v2 Rest API - Relay - serialization":
|
||||
suite "RelayWakuMessage - decode":
|
||||
test "optional fields are not provided":
|
||||
# Given
|
||||
let payload = Base64String.encode("MESSAGE")
|
||||
let payload = base64.encode("MESSAGE")
|
||||
let jsonBytes = toBytes("{\"payload\":\"" & $payload & "\"}")
|
||||
|
||||
# When
|
||||
@ -36,7 +36,7 @@ suite "Waku v2 Rest API - Relay - serialization":
|
||||
suite "RelayWakuMessage - encode":
|
||||
test "optional fields are none":
|
||||
# Given
|
||||
let payload = Base64String.encode("MESSAGE")
|
||||
let payload = base64.encode("MESSAGE")
|
||||
let data = RelayWakuMessage(
|
||||
payload: payload,
|
||||
contentTopic: none(ContentTopic),
|
||||
|
||||
@ -9,19 +9,30 @@ import stew/[results, byteutils, base64]
|
||||
type Base64String* = distinct string
|
||||
|
||||
|
||||
proc encode*(t: type Base64String, value: string|seq[byte]): Base64String =
|
||||
let val = block:
|
||||
when value is string:
|
||||
toBytes(value)
|
||||
else:
|
||||
value
|
||||
Base64String(base64.encode(Base64, val))
|
||||
proc encode*[T: byte|char](value: openArray[T]): Base64String =
|
||||
Base64String(encode(Base64Pad, value))
|
||||
|
||||
proc encode*(value: string): Base64String =
|
||||
encode(toBytes(value))
|
||||
|
||||
|
||||
proc decode[T: byte|char](btype: typedesc[Base64Types],
|
||||
instr: openArray[T]): Result[seq[byte], string] =
|
||||
## Decode BASE64 string ``instr`` and return sequence of bytes as result.
|
||||
if len(instr) == 0:
|
||||
return ok(newSeq[byte]())
|
||||
|
||||
var bufferLen = decodedLength(btype, len(instr))
|
||||
var buffer = newSeq[byte](bufferLen)
|
||||
|
||||
if decode(btype, instr, buffer, bufferLen) != Base64Status.Success:
|
||||
return err("Incorrect base64 string")
|
||||
|
||||
buffer.setLen(bufferLen)
|
||||
ok(buffer)
|
||||
|
||||
proc decode*(t: Base64String): Result[seq[byte], string] =
|
||||
try:
|
||||
ok(base64.decode(Base64, string(t)))
|
||||
except:
|
||||
err("decoding failed: " & getCurrentExceptionMsg())
|
||||
decode(Base64Pad, string(t))
|
||||
|
||||
|
||||
proc `$`*(t: Base64String): string {.inline.}=
|
||||
|
||||
@ -21,7 +21,7 @@ type
|
||||
|
||||
func toWakuMessageRPC*(msg: WakuMessage): WakuMessageRPC =
|
||||
WakuMessageRPC(
|
||||
payload: Base64String.encode(msg.payload),
|
||||
payload: base64.encode(msg.payload),
|
||||
contentTopic: some(msg.contentTopic),
|
||||
version: some(msg.version),
|
||||
timestamp: some(msg.timestamp),
|
||||
|
||||
@ -128,7 +128,7 @@ proc toWakuMessageRPC(message: WakuMessage,
|
||||
keyInfo = keyInfo(symkey, privateKey)
|
||||
decoded = decodePayload(message, keyInfo)
|
||||
|
||||
WakuMessageRPC(payload: Base64String.encode(decoded.get().payload),
|
||||
WakuMessageRPC(payload: base64.encode(decoded.get().payload),
|
||||
contentTopic: some(message.contentTopic),
|
||||
version: some(message.version),
|
||||
timestamp: some(message.timestamp))
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
{.deprecated: "import 'waku/common/base64' instead".}
|
||||
|
||||
import ../../../common/base64
|
||||
|
||||
export base64
|
||||
@ -10,9 +10,9 @@ import
|
||||
json_serialization/std/options,
|
||||
presto/[route, client, common]
|
||||
import
|
||||
../../../../common/base64,
|
||||
../../../protocol/waku_message,
|
||||
../serdes,
|
||||
../base64
|
||||
../serdes
|
||||
|
||||
|
||||
#### Types
|
||||
@ -37,7 +37,7 @@ type
|
||||
|
||||
proc toRelayWakuMessage*(msg: WakuMessage): RelayWakuMessage =
|
||||
RelayWakuMessage(
|
||||
payload: base64.encode(Base64String, msg.payload),
|
||||
payload: base64.encode(msg.payload),
|
||||
contentTopic: some(msg.contentTopic),
|
||||
version: some(Natural(msg.version)),
|
||||
timestamp: some(msg.timestamp)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user