diff --git a/blossom/handlers.go b/blossom/handlers.go index 90fabf0..d9fca4e 100644 --- a/blossom/handlers.go +++ b/blossom/handlers.go @@ -52,7 +52,7 @@ func (bs BlossomServer) handleUploadCheck(w http.ResponseWriter, r *http.Request func (bs BlossomServer) handleUpload(w http.ResponseWriter, r *http.Request) { auth, err := readAuthorization(r) if err != nil { - blossomError(w, "invalid \"Authorization\": "+err.Error(), 400) + blossomError(w, "invalid \"Authorization\": "+err.Error(), 404) return } if auth == nil { @@ -206,7 +206,6 @@ func (bs BlossomServer) handleGetBlob(w http.ResponseWriter, r *http.Request) { } blossomError(w, "file not found", 404) - return } func (bs BlossomServer) handleHasBlob(w http.ResponseWriter, r *http.Request) { @@ -228,8 +227,6 @@ func (bs BlossomServer) handleHasBlob(w http.ResponseWriter, r *http.Request) { blossomError(w, "file not found", 404) return } - - return } func (bs BlossomServer) handleList(w http.ResponseWriter, r *http.Request) { @@ -331,6 +328,38 @@ func (bs BlossomServer) handleDelete(w http.ResponseWriter, r *http.Request) { } } +func (bs BlossomServer) handleReport(w http.ResponseWriter, r *http.Request) { + var body []byte + _, err := r.Body.Read(body) + if err != nil { + blossomError(w, "can't read request body", 400) + return + } + + var evt *nostr.Event + if err := json.Unmarshal(body, evt); err != nil { + blossomError(w, "can't parse event", 400) + return + } + + if isValid, _ := evt.CheckSignature(); !isValid { + blossomError(w, "invalid report event is provided", 400) + return + } + + if evt.Kind != nostr.KindReporting { + blossomError(w, "invalid report event is provided", 400) + return + } + + for _, rr := range bs.ReceiveReport { + if err := rr(r.Context(), evt); err != nil { + blossomError(w, "failed to receive report: "+err.Error(), 500) + return + } + } +} + func (bs BlossomServer) handleMirror(w http.ResponseWriter, r *http.Request) { } diff --git a/blossom/server.go b/blossom/server.go index d1c37b6..61d4f3d 100644 --- a/blossom/server.go +++ b/blossom/server.go @@ -14,9 +14,10 @@ type BlossomServer struct { ServiceURL string Store BlobIndex - StoreBlob []func(ctx context.Context, sha256 string, body []byte) error - LoadBlob []func(ctx context.Context, sha256 string) (io.ReadSeeker, error) - DeleteBlob []func(ctx context.Context, sha256 string) error + StoreBlob []func(ctx context.Context, sha256 string, body []byte) error + LoadBlob []func(ctx context.Context, sha256 string) (io.ReadSeeker, error) + DeleteBlob []func(ctx context.Context, sha256 string) error + ReceiveReport []func(ctx context.Context, reportEvt *nostr.Event) error RejectUpload []func(ctx context.Context, auth *nostr.Event, size int, ext string) (bool, string, int) RejectGet []func(ctx context.Context, auth *nostr.Event, sha256 string) (bool, string, int) @@ -61,6 +62,13 @@ func New(rl *khatru.Relay, serviceURL string) *BlossomServer { } } + if r.URL.Path == "/report" { + if r.Method == "PUT" { + bs.handleReport(w, r) + return + } + } + base.ServeHTTP(w, r) })