From 4bb2a785d2350239be62207af56b43a3b6ca1798 Mon Sep 17 00:00:00 2001 From: Doug Hoyte Date: Thu, 5 Sep 2024 14:16:02 -0400 Subject: [PATCH] more work on error messages --- src/apps/relay/RelayIngester.cpp | 16 +++++++++------- src/events.cpp | 4 +++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/apps/relay/RelayIngester.cpp b/src/apps/relay/RelayIngester.cpp index 560750e..4093945 100644 --- a/src/apps/relay/RelayIngester.cpp +++ b/src/apps/relay/RelayIngester.cpp @@ -31,7 +31,7 @@ void RelayServer::runIngester(ThreadPool::Thread &thr) { try { ingesterProcessEvent(txn, msg->connId, msg->ipAddr, secpCtx, arr[1], writerMsgs); } catch (std::exception &e) { - sendOKResponse(msg->connId, arr[1].at("id").is_string() ? arr[1].at("id").get_string() : "?", + sendOKResponse(msg->connId, arr[1].is_object() && arr[1].at("id").is_string() ? arr[1].at("id").get_string() : "?", false, std::string("invalid: ") + e.what()); if (cfg().relay__logging__invalidEvents) LI << "Rejected invalid event: " << e.what(); } @@ -134,10 +134,12 @@ void RelayServer::ingesterProcessReq(lmdb::txn &txn, uint64_t connId, const tao: void RelayServer::ingesterProcessClose(lmdb::txn &txn, uint64_t connId, const tao::json::value &arr) { if (arr.get_array().size() != 2) throw herr("arr too small/big"); - tpReqWorker.dispatch(connId, MsgReqWorker{MsgReqWorker::RemoveSub{connId, SubId(arr[1].get_string())}}); + tpReqWorker.dispatch(connId, MsgReqWorker{MsgReqWorker::RemoveSub{connId, SubId(jsonGetString(arr[1], "CLOSE subscription id was not a string"))}}); } void RelayServer::ingesterProcessNegentropy(lmdb::txn &txn, Decompressor &decomp, uint64_t connId, const tao::json::value &arr) { + const auto &subscriptionStr = jsonGetString(arr[1], "NEG-OPEN subscription id was not a string"); + if (arr.at(0) == "NEG-OPEN") { if (arr.get_array().size() < 4) throw herr("negentropy query missing elements"); @@ -146,7 +148,7 @@ void RelayServer::ingesterProcessNegentropy(lmdb::txn &txn, Decompressor &decomp auto filterJson = arr.at(2); NostrFilterGroup filter = NostrFilterGroup::unwrapped(filterJson, maxFilterLimit); - Subscription sub(connId, jsonGetString(arr[1], "NEG-OPEN subscription id was not a string"), std::move(filter)); + Subscription sub(connId, subscriptionStr, std::move(filter)); if (filterJson.is_object()) { filterJson.get_object().erase("since"); @@ -154,14 +156,14 @@ void RelayServer::ingesterProcessNegentropy(lmdb::txn &txn, Decompressor &decomp } std::string filterStr = tao::json::to_string(filterJson); - std::string negPayload = from_hex(arr.at(3).get_string()); + std::string negPayload = from_hex(jsonGetString(arr.at(3), "negentropy payload not a string")); tpNegentropy.dispatch(connId, MsgNegentropy{MsgNegentropy::NegOpen{std::move(sub), std::move(filterStr), std::move(negPayload)}}); } else if (arr.at(0) == "NEG-MSG") { - std::string negPayload = from_hex(arr.at(2).get_string()); - tpNegentropy.dispatch(connId, MsgNegentropy{MsgNegentropy::NegMsg{connId, SubId(arr[1].get_string()), std::move(negPayload)}}); + std::string negPayload = from_hex(jsonGetString(arr.at(2), "negentropy payload not a string")); + tpNegentropy.dispatch(connId, MsgNegentropy{MsgNegentropy::NegMsg{connId, SubId(subscriptionStr), std::move(negPayload)}}); } else if (arr.at(0) == "NEG-CLOSE") { - tpNegentropy.dispatch(connId, MsgNegentropy{MsgNegentropy::NegClose{connId, SubId(arr[1].get_string())}}); + tpNegentropy.dispatch(connId, MsgNegentropy{MsgNegentropy::NegClose{connId, SubId(subscriptionStr)}}); } else { throw herr("unknown command"); } diff --git a/src/events.cpp b/src/events.cpp index bf3f4d2..70c7bad 100644 --- a/src/events.cpp +++ b/src/events.cpp @@ -36,8 +36,8 @@ std::string nostrJsonToPackedEvent(const tao::json::value &v) { auto tagVal = tag.size() >= 2 ? jsonGetString(tag.at(1), "tag val was not a string") : ""; if (tagName == "e" || tagName == "p") { + if (tagVal.size() != 64) throw herr("unexpected size for fixed-size tag: ", tagName); tagVal = from_hex(tagVal, false); - if (tagVal.size() != 32) throw herr("unexpected size for fixed-size tag"); tagBuilder.add(tagName[0], tagVal); } else if (tagName == "expiration") { @@ -135,6 +135,8 @@ void verifyEventTimestamp(PackedEventView packed) { void parseAndVerifyEvent(const tao::json::value &origJson, secp256k1_context *secpCtx, bool verifyMsg, bool verifyTime, std::string &packedStr, std::string &jsonStr) { + if (!origJson.is_object()) throw herr("event is not an object"); + packedStr = nostrJsonToPackedEvent(origJson); PackedEventView packed(packedStr); if (verifyTime) verifyEventTimestamp(packed);