taler-mailbox

Service for asynchronous wallet-to-wallet payment messages
Log | Files | Refs | Submodules | README | LICENSE

commit e092170e1a343bf2892849f138ac8f83bf46c43b
parent b6485165f2a2f91f779156d47ea84b45f396a90b
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Fri, 25 Apr 2025 23:44:26 +0200

add message in response limit

Diffstat:
Mcmd/mailbox-server/main_test.go | 15++++++++-------
Mcmd/mailbox-server/test-mailbox.conf | 1+
Mpkg/rest/mailbox.go | 12+++++++++++-
3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/cmd/mailbox-server/main_test.go b/cmd/mailbox-server/main_test.go @@ -185,11 +185,12 @@ func TestPostMessagePaid(t *testing.T) { func TestPostThenDeleteMessage(t *testing.T) { // testMessage := make([]byte, 256) var deletionReq mailbox.MessageDeletionRequest - testMessages := make([]byte, 25600) + numMessagesToPost := (a.MessageResponseLimit + 7) + testMessages := make([]byte, 256 * numMessagesToPost) _, _ = rand.Read(testMessages) a.Db.Where("1 = 1").Delete(&mailbox.InboxEntry{}) - for i := 0; i < 100; i++ { + for i := 0; i < int(numMessagesToPost); i++ { testMessage := testMessages[i*256 : (i+1)*256] req, _ := http.NewRequest("POST", "/"+testWalletAliceString, bytes.NewReader(testMessage)) response := executeRequest(req) @@ -207,7 +208,7 @@ func TestPostThenDeleteMessage(t *testing.T) { checkResponseCode(t, http.StatusOK, response.Code) - if response.Body.Len() != 25600 { + if response.Body.Len() != int(256 * a.MessageResponseLimit) { t.Errorf("Expected response of 25600 bytes, Got %d", response.Body.Len()) } @@ -219,7 +220,7 @@ func TestPostThenDeleteMessage(t *testing.T) { // Now delete 10 messages h := sha512.New() - for i := 0; i < 10; i++ { + for i := 0; i < int(a.MessageResponseLimit); i++ { h.Write(testMessages[i*256 : (i+1)*256]) } var signed_msg [64 + 4 + 4]byte @@ -234,7 +235,7 @@ func TestPostThenDeleteMessage(t *testing.T) { t.Errorf("Signature invalid!") } deletionReq.WalletSig = gnunetutil.EncodeBinaryToString(sig) - deletionReq.Count = 10 + deletionReq.Count = int(a.MessageResponseLimit) deletionReq.Checksum = gnunetutil.EncodeBinaryToString(checksum) reqJson, _ := json.Marshal(deletionReq) @@ -255,7 +256,7 @@ func TestPostThenDeleteMessage(t *testing.T) { checkResponseCode(t, http.StatusOK, response.Code) - if response.Body.Len() != 25600-2560 { - t.Errorf("Expected response of 25600 - 2560 bytes, Got %d", response.Body.Len()) + if response.Body.Len() != int(256 * 7) { + t.Errorf("Expected response of 256*7 bytes, Got %d", response.Body.Len()) } } diff --git a/cmd/mailbox-server/test-mailbox.conf b/cmd/mailbox-server/test-mailbox.conf @@ -3,6 +3,7 @@ bind_to = localhost:11000 production = false message_body_bytes = 256 message_fee = KUDOS:0 +message_response_limit = 25 [mailbox-pq] host = localhost diff --git a/pkg/rest/mailbox.go b/pkg/rest/mailbox.go @@ -70,6 +70,10 @@ type Mailbox struct { // MessageFee for sending message MessageFee *talerutil.Amount + + // How many messages will a single response + // contain at maximum. + MessageResponseLimit uint64 } // VersionResponse is the JSON response of the /config enpoint @@ -91,6 +95,10 @@ type VersionResponse struct { // How long will the service store a message // before giving up DeliveryPeriod uint64 `json:"delivery_period"` + + // How many messages will a single response + // contain at maximum. + MessageResponseLimit uint64 `json:"message_response_limit"` } // MessageDeletionRequest is used to request the deletion of already received @@ -145,6 +153,7 @@ func (m *Mailbox) configResponse(w http.ResponseWriter, r *http.Request) { Version: "0:0:0", Name: "taler-mailbox", MessageBodyBytes: m.MessageBodyBytes, + MessageResponseLimit: m.MessageResponseLimit, MessageFee: m.MessageFee.String(), DeliveryPeriod: uint64(dp.Microseconds()), } @@ -160,7 +169,7 @@ func (m *Mailbox) getMessagesResponse(w http.ResponseWriter, r *http.Request) { // FIXME rate limit // FIXME timeout // FIXME possibly limit results here - err := m.Db.Where("h_mailbox = ?", vars["h_mailbox"]).Find(&entries).Error + err := m.Db.Where("h_mailbox = ?", vars["h_mailbox"]).Limit(int(m.MessageResponseLimit)).Find(&entries).Error if err != nil { log.Printf("%v", err) w.WriteHeader(http.StatusInternalServerError) @@ -390,6 +399,7 @@ func (m *Mailbox) Initialize(cfg MailboxConfig) { } m.BaseUrl = cfg.Ini.Section("mailbox").Key("base_url").MustString("https://example.com") m.MessageBodyBytes = cfg.Ini.Section("mailbox").Key("message_body_bytes").MustInt64(256) + m.MessageResponseLimit = cfg.Ini.Section("mailbox").Key("message_response_limit").MustUint64(50) // FIXME actual cost fee, err := talerutil.ParseAmount(cfg.Ini.Section("mailbox").Key("message_fee").MustString("KUDOS:1")) if err != nil {