fail properly when a storage function errors and other fixes related to prefixed reason messages.

This commit is contained in:
fiatjaf 2023-12-22 19:51:35 -03:00
parent 08a527f9d8
commit 9b22ea3ee6
No known key found for this signature in database
GPG Key ID: BAD43C4BE5C1A3A1
4 changed files with 18 additions and 25 deletions

View File

@ -2,6 +2,7 @@ package khatru
import (
"context"
"errors"
"fmt"
"github.com/fiatjaf/eventstore"
@ -10,15 +11,16 @@ import (
func (rl *Relay) AddEvent(ctx context.Context, evt *nostr.Event) error {
if evt == nil {
return fmt.Errorf("event is nil")
return errors.New("error: event is nil")
}
for _, reject := range rl.RejectEvent {
if reject, msg := reject(ctx, evt); reject {
if msg == "" {
msg = "no reason"
return errors.New("blocked: no reason")
} else {
return errors.New(nostr.NormalizeOKMessage(msg, "blocked"))
}
return fmt.Errorf(msg)
}
}
@ -63,12 +65,7 @@ func (rl *Relay) AddEvent(ctx context.Context, evt *nostr.Event) error {
case eventstore.ErrDupEvent:
return nil
default:
errmsg := saveErr.Error()
if nip20prefixmatcher.MatchString(errmsg) {
return saveErr
} else {
return fmt.Errorf("error: failed to save (%s)", errmsg)
}
return fmt.Errorf(nostr.NormalizeOKMessage(saveErr.Error(), "error"))
}
}
}

View File

@ -6,7 +6,7 @@ import (
"crypto/sha256"
"encoding/hex"
"encoding/json"
"fmt"
"errors"
"net/http"
"strings"
"sync"
@ -135,20 +135,21 @@ func (rl *Relay) HandleWebsocket(w http.ResponseWriter, r *http.Request) {
}
var ok bool
var writeErr error
if env.Event.Kind == 5 {
err = rl.handleDeleteRequest(ctx, &env.Event)
// this always returns "blocked: " whenever it returns an error
writeErr = rl.handleDeleteRequest(ctx, &env.Event)
} else {
err = rl.AddEvent(ctx, &env.Event)
// this will also always return a prefixed reason
writeErr = rl.AddEvent(ctx, &env.Event)
}
var reason string
if err == nil {
reason := writeErr.Error()
if writeErr == nil {
ok = true
} else {
if strings.HasPrefix(reason, "auth-required:") {
ws.WriteJSON(nostr.AuthEnvelope{Challenge: &ws.Challenge})
} else {
reason = nostr.NormalizeOKMessage(err.Error(), "blocked")
}
}
ws.WriteJSON(nostr.OKEnvelope{EventID: env.Event.ID, OK: ok, Reason: reason})
@ -177,11 +178,9 @@ func (rl *Relay) HandleWebsocket(w http.ResponseWriter, r *http.Request) {
reason := err.Error()
if strings.HasPrefix(reason, "auth-required:") {
ws.WriteJSON(nostr.AuthEnvelope{Challenge: &ws.Challenge})
} else {
reason = nostr.NormalizeOKMessage(reason, "blocked")
}
ws.WriteJSON(nostr.ClosedEnvelope{SubscriptionID: env.SubscriptionID, Reason: reason})
cancelReqCtx(fmt.Errorf("filter rejected"))
cancelReqCtx(errors.New("filter rejected"))
return
}
}

View File

@ -3,7 +3,6 @@ package khatru
import (
"hash/maphash"
"net/http"
"regexp"
"strconv"
"strings"
"unsafe"
@ -16,8 +15,6 @@ const (
WS_KEY
)
var nip20prefixmatcher = regexp.MustCompile(`^\w+: `)
func pointerHasher[V any](_ maphash.Seed, k *V) uint64 {
return uint64(uintptr(unsafe.Pointer(k)))
}

View File

@ -2,7 +2,7 @@ package khatru
import (
"context"
"fmt"
"errors"
"sync"
"github.com/nbd-wtf/go-nostr"
@ -18,7 +18,7 @@ func (rl *Relay) handleRequest(ctx context.Context, id string, eose *sync.WaitGr
}
if filter.Limit < 0 {
return fmt.Errorf("filter invalidated")
return errors.New("blocked: filter invalidated")
}
// then check if we'll reject this filter (we apply this after overwriting
@ -28,7 +28,7 @@ func (rl *Relay) handleRequest(ctx context.Context, id string, eose *sync.WaitGr
for _, reject := range rl.RejectFilter {
if reject, msg := reject(ctx, filter); reject {
ws.WriteJSON(nostr.NoticeEnvelope(msg))
return fmt.Errorf(msg)
return errors.New(nostr.NormalizeOKMessage(msg, "blocked"))
}
}