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:
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 {