fix: encode waku message payloads in base64

This commit is contained in:
Richard Ramos 2023-02-13 08:52:53 -04:00 committed by RichΛrd
parent 78520e9280
commit c3be19f922
8 changed files with 39 additions and 238 deletions

View File

@ -123,9 +123,7 @@ func (f *FilterService) GetV1Messages(req *http.Request, args *ContentTopicArgs,
return fmt.Errorf("topic %s not subscribed", args.ContentTopic)
}
for i := range f.messages[args.ContentTopic] {
*reply = append(*reply, ProtoWakuMessageToRPCWakuMessage(f.messages[args.ContentTopic][i]))
}
*reply = f.messages[args.ContentTopic]
f.messages[args.ContentTopic] = make([]*pb.WakuMessage, 0)
return nil

View File

@ -38,15 +38,15 @@ type KeyPairReply struct {
}
type SymmetricMessageArgs struct {
Topic string `json:"topic"`
Message RPCWakuMessage `json:"message"`
SymKey string `json:"symkey"`
Topic string `json:"topic"`
Message *pb.WakuMessage `json:"message"`
SymKey string `json:"symkey"`
}
type AsymmetricMessageArgs struct {
Topic string `json:"topic"`
Message RPCWakuMessage `json:"message"`
PublicKey string `json:"publicKey"`
Topic string `json:"topic"`
Message *pb.WakuMessage `json:"message"`
PublicKey string `json:"publicKey"`
}
type SymmetricMessagesArgs struct {
@ -125,7 +125,7 @@ func (p *PrivateService) PostV1SymmetricMessage(req *http.Request, args *Symmetr
keyInfo.Kind = payload.Symmetric
keyInfo.SymKey = symKeyBytes
msg := args.Message.toProto()
msg := args.Message
msg.Version = 1
err = payload.EncodeWakuMessage(msg, keyInfo)
@ -163,7 +163,7 @@ func (p *PrivateService) PostV1AsymmetricMessage(req *http.Request, args *Asymme
keyInfo.PubKey = *pubKey
msg := args.Message.toProto()
msg := args.Message
msg.Version = 1
err = payload.EncodeWakuMessage(msg, keyInfo)
@ -214,9 +214,7 @@ func (p *PrivateService) GetV1SymmetricMessages(req *http.Request, args *Symmetr
decodedMessages = append(decodedMessages, msg)
}
for i := range decodedMessages {
*reply = append(*reply, ProtoWakuMessageToRPCWakuMessage(decodedMessages[i]))
}
*reply = decodedMessages
return nil
}
@ -250,9 +248,7 @@ func (p *PrivateService) GetV1AsymmetricMessages(req *http.Request, args *Asymme
decodedMessages = append(decodedMessages, msg)
}
for i := range decodedMessages {
*reply = append(*reply, ProtoWakuMessageToRPCWakuMessage(decodedMessages[i]))
}
*reply = decodedMessages
return nil
}

View File

@ -9,6 +9,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/require"
"github.com/waku-org/go-waku/waku/v2/node"
"github.com/waku-org/go-waku/waku/v2/protocol/pb"
"github.com/waku-org/go-waku/waku/v2/utils"
)
@ -59,7 +60,7 @@ func TestPostV1SymmetricMessage(t *testing.T) {
makeRequest(t),
&SymmetricMessageArgs{
Topic: "test",
Message: RPCWakuMessage{Payload: []byte("test")},
Message: &pb.WakuMessage{Payload: []byte("test")},
SymKey: "0x1122334455667788991011223344556677889910112233445566778899101122",
},
&reply,
@ -77,7 +78,7 @@ func TestPostV1AsymmetricMessage(t *testing.T) {
makeRequest(t),
&AsymmetricMessageArgs{
Topic: "test",
Message: RPCWakuMessage{Payload: []byte("test")},
Message: &pb.WakuMessage{Payload: []byte("test")},
PublicKey: "0x045ded6a56c88173e87a88c55b96956964b1bd3351b5fcb70950a4902fbc1bc0ceabb0ac846c3a4b8f2f6024c0e19f0a7f6a4865035187de5463f34012304fc7c5",
},
&reply,
@ -100,7 +101,7 @@ func TestGetV1SymmetricMessages(t *testing.T) {
makeRequest(t),
&SymmetricMessageArgs{
Topic: "test",
Message: RPCWakuMessage{Payload: []byte("test")},
Message: &pb.WakuMessage{Payload: []byte("test")},
SymKey: "0x1122334455667788991011223344556677889910112233445566778899101122",
},
&reply,
@ -140,7 +141,7 @@ func TestGetV1AsymmetricMessages(t *testing.T) {
makeRequest(t),
&AsymmetricMessageArgs{
Topic: "test",
Message: RPCWakuMessage{Payload: []byte("test")},
Message: &pb.WakuMessage{Payload: []byte("test")},
PublicKey: hexutil.Encode(crypto.FromECDSAPub(&prvKey.PublicKey)),
},
&reply,

View File

@ -25,8 +25,8 @@ type RelayService struct {
}
type RelayMessageArgs struct {
Topic string `json:"topic,omitempty"`
Message RPCWakuRelayMessage `json:"message,omitempty"`
Topic string `json:"topic,omitempty"`
Message *pb.WakuMessage `json:"message,omitempty"`
}
type TopicsArgs struct {
@ -85,12 +85,10 @@ func (r *RelayService) Stop() {
func (r *RelayService) PostV1Message(req *http.Request, args *RelayMessageArgs, reply *SuccessReply) error {
var err error
msg := args.Message.toProto()
if args.Topic == "" {
_, err = r.node.Relay().Publish(req.Context(), msg)
_, err = r.node.Relay().Publish(req.Context(), args.Message)
} else {
_, err = r.node.Relay().PublishToTopic(req.Context(), msg, args.Topic)
_, err = r.node.Relay().PublishToTopic(req.Context(), args.Message, args.Topic)
}
if err != nil {
r.log.Error("publishing message", zap.Error(err))
@ -151,9 +149,7 @@ func (r *RelayService) GetV1Messages(req *http.Request, args *TopicArgs, reply *
return fmt.Errorf("topic %s not subscribed", args.Topic)
}
for i := range r.messages[args.Topic] {
*reply = append(*reply, ProtoWakuMessageToRPCWakuRelayMessage(r.messages[args.Topic][i]))
}
*reply = r.messages[args.Topic]
r.messages[args.Topic] = make([]*pb.WakuMessage, 0)

View File

@ -9,6 +9,7 @@ import (
"github.com/multiformats/go-multiaddr"
"github.com/stretchr/testify/require"
"github.com/waku-org/go-waku/waku/v2/node"
"github.com/waku-org/go-waku/waku/v2/protocol/pb"
"github.com/waku-org/go-waku/waku/v2/utils"
)
@ -27,9 +28,18 @@ func TestPostV1Message(t *testing.T) {
d := makeRelayService(t)
msg := &pb.WakuMessage{
Payload: []byte{1, 2, 3},
ContentTopic: "abc",
Version: 0,
Timestamp: utils.GetUnixEpoch(),
}
err := d.PostV1Message(
makeRequest(t),
&RelayMessageArgs{},
&RelayMessageArgs{
Message: msg,
},
&reply,
)
require.NoError(t, err)
@ -100,7 +110,7 @@ func TestRelayGetV1Messages(t *testing.T) {
makeRequest(t),
&RelayMessageArgs{
Topic: "test",
Message: RPCWakuRelayMessage{
Message: &pb.WakuMessage{
Payload: []byte("test"),
},
},

View File

@ -1,10 +1,12 @@
package rpc
import "github.com/waku-org/go-waku/waku/v2/protocol/pb"
type SuccessReply = bool
type Empty struct {
}
type MessagesReply = []*RPCWakuMessage
type MessagesReply = []*pb.WakuMessage
type RelayMessagesReply = []*RPCWakuRelayMessage
type RelayMessagesReply = []*pb.WakuMessage

View File

@ -33,7 +33,7 @@ type StoreMessagesArgs struct {
}
type StoreMessagesReply struct {
Messages []RPCWakuMessage `json:"messages,omitempty"`
Messages []*pb.WakuMessage `json:"messages,omitempty"`
PagingInfo StorePagingOptions `json:"pagingInfo,omitempty"`
Error string `json:"error,omitempty"`
}
@ -61,10 +61,7 @@ func (s *StoreService) GetV1Messages(req *http.Request, args *StoreMessagesArgs,
return nil
}
reply.Messages = make([]RPCWakuMessage, len(res.Messages))
for i := range res.Messages {
reply.Messages[i] = *ProtoWakuMessageToRPCWakuMessage(res.Messages[i])
}
reply.Messages = res.Messages
reply.PagingInfo = StorePagingOptions{
PageSize: args.PagingOptions.PageSize,

View File

@ -1,199 +0,0 @@
package rpc
import (
"encoding/hex"
"fmt"
"strings"
"github.com/waku-org/go-waku/waku/v2/protocol/pb"
"github.com/waku-org/go-waku/waku/v2/utils"
)
// HexBytes is marshalled to a hex string
type HexBytes []byte
// ByteArray is marshalled to a uint8 array
type ByteArray []byte
type RateLimitProof struct {
Proof HexBytes `json:"proof,omitempty"`
MerkleRoot HexBytes `json:"merkle_root,omitempty"`
Epoch HexBytes `json:"epoch,omitempty"`
ShareX HexBytes `json:"share_x,omitempty"`
ShareY HexBytes `json:"share_y,omitempty"`
Nullifier HexBytes `json:"nullifier,omitempty"`
RlnIdentifier HexBytes `json:"rln_identifier,omitempty"`
}
type RPCWakuMessage struct {
Payload ByteArray `json:"payload,omitempty"`
ContentTopic string `json:"contentTopic,omitempty"`
Version uint32 `json:"version"`
Timestamp int64 `json:"timestamp,omitempty"`
RateLimitProof *RateLimitProof `json:"rateLimitProof,omitempty"`
}
type RPCWakuRelayMessage struct {
Payload HexBytes `json:"payload,omitempty"`
ContentTopic string `json:"contentTopic,omitempty"`
Timestamp int64 `json:"timestamp,omitempty"`
RateLimitProof *RateLimitProof `json:"rateLimitProof,omitempty"`
Version uint32 `json:"version"`
}
func ProtoWakuMessageToRPCWakuMessage(input *pb.WakuMessage) *RPCWakuMessage {
if input == nil {
return nil
}
rpcWakuMsg := &RPCWakuMessage{
Payload: input.Payload,
ContentTopic: input.ContentTopic,
Version: input.Version,
Timestamp: input.Timestamp,
}
if input.RateLimitProof != nil {
rpcWakuMsg.RateLimitProof = &RateLimitProof{
Proof: input.RateLimitProof.Proof,
MerkleRoot: input.RateLimitProof.MerkleRoot,
Epoch: input.RateLimitProof.Epoch,
ShareX: input.RateLimitProof.ShareX,
ShareY: input.RateLimitProof.ShareY,
Nullifier: input.RateLimitProof.Nullifier,
RlnIdentifier: input.RateLimitProof.RlnIdentifier,
}
}
return rpcWakuMsg
}
func (r *RPCWakuMessage) toProto() *pb.WakuMessage {
if r == nil {
return nil
}
msg := &pb.WakuMessage{
Payload: r.Payload,
ContentTopic: r.ContentTopic,
Version: r.Version,
Timestamp: r.Timestamp,
}
if r.RateLimitProof != nil {
msg.RateLimitProof = &pb.RateLimitProof{
Proof: r.RateLimitProof.Proof,
MerkleRoot: r.RateLimitProof.MerkleRoot,
Epoch: r.RateLimitProof.Epoch,
ShareX: r.RateLimitProof.ShareX,
ShareY: r.RateLimitProof.ShareY,
Nullifier: r.RateLimitProof.Nullifier,
RlnIdentifier: r.RateLimitProof.RlnIdentifier,
}
}
return msg
}
func (u HexBytes) MarshalJSON() ([]byte, error) {
var result string
if u == nil {
result = "null"
} else {
result = strings.Join(strings.Fields(fmt.Sprintf("%d", u)), ",")
}
return []byte(result), nil
}
func (h *HexBytes) UnmarshalText(b []byte) error {
hexString := ""
if b != nil {
hexString = string(b)
}
decoded, err := utils.DecodeHexString(hexString)
if err != nil {
return err
}
*h = decoded
return nil
}
func ProtoWakuMessageToRPCWakuRelayMessage(input *pb.WakuMessage) *RPCWakuRelayMessage {
if input == nil {
return nil
}
rpcMsg := &RPCWakuRelayMessage{
Payload: input.Payload,
ContentTopic: input.ContentTopic,
Timestamp: input.Timestamp,
}
if input.RateLimitProof != nil {
rpcMsg.RateLimitProof = &RateLimitProof{
Proof: input.RateLimitProof.Proof,
MerkleRoot: input.RateLimitProof.MerkleRoot,
Epoch: input.RateLimitProof.Epoch,
ShareX: input.RateLimitProof.ShareX,
ShareY: input.RateLimitProof.ShareY,
Nullifier: input.RateLimitProof.Nullifier,
RlnIdentifier: input.RateLimitProof.RlnIdentifier,
}
}
return rpcMsg
}
func (r *RPCWakuRelayMessage) toProto() *pb.WakuMessage {
if r == nil {
return nil
}
msg := &pb.WakuMessage{
Payload: r.Payload,
ContentTopic: r.ContentTopic,
Timestamp: r.Timestamp,
Version: r.Version,
}
if r.RateLimitProof != nil {
msg.RateLimitProof = &pb.RateLimitProof{
Proof: r.RateLimitProof.Proof,
MerkleRoot: r.RateLimitProof.MerkleRoot,
Epoch: r.RateLimitProof.Epoch,
ShareX: r.RateLimitProof.ShareX,
ShareY: r.RateLimitProof.ShareY,
Nullifier: r.RateLimitProof.Nullifier,
RlnIdentifier: r.RateLimitProof.RlnIdentifier,
}
}
return msg
}
func (h ByteArray) MarshalText() ([]byte, error) {
if h == nil {
return []byte{}, nil
}
return []byte(hex.EncodeToString(h)), nil
}
func (h *ByteArray) UnmarshalText(b []byte) error {
hexString := ""
if b != nil {
hexString = string(b)
}
decoded, err := utils.DecodeHexString(hexString)
if err != nil {
return err
}
*h = decoded
return nil
}