From 9b22ea3ee68db6886e84e6c786c9552b9c23b4b8 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 22 Dec 2023 19:51:35 -0300 Subject: [PATCH] fail properly when a storage function errors and other fixes related to prefixed reason messages. --- add-event.go | 15 ++++++--------- handlers.go | 19 +++++++++---------- helpers.go | 3 --- serve-req.go | 6 +++--- 4 files changed, 18 insertions(+), 25 deletions(-) diff --git a/add-event.go b/add-event.go index 6587d96..1c3eeba 100644 --- a/add-event.go +++ b/add-event.go @@ -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")) } } } diff --git a/handlers.go b/handlers.go index 5e3bbf9..9ec3e30 100644 --- a/handlers.go +++ b/handlers.go @@ -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 } } diff --git a/helpers.go b/helpers.go index 5e08da8..888b4c6 100644 --- a/helpers.go +++ b/helpers.go @@ -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))) } diff --git a/serve-req.go b/serve-req.go index ee63fbc..2ec5c03 100644 --- a/serve-req.go +++ b/serve-req.go @@ -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")) } }