From bdabb409b7dc09476c2962ced7e2f72e63a02c91 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 20 Aug 2024 13:34:20 +0200 Subject: [PATCH] improve exception message on invalid base64 input in memory::Block --- .../GradidoBlockchainException.h | 4 ++-- src/GradidoBlockchainException.cpp | 18 +++++++++++------- src/memory/Block.cpp | 2 +- test/MemoryBlockTest.cpp | 8 +++++++- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/include/gradido_blockchain/GradidoBlockchainException.h b/include/gradido_blockchain/GradidoBlockchainException.h index a6c66372..e604ff84 100644 --- a/include/gradido_blockchain/GradidoBlockchainException.h +++ b/include/gradido_blockchain/GradidoBlockchainException.h @@ -103,11 +103,11 @@ class GRADIDOBLOCKCHAIN_EXPORT GradidoUnhandledEnum : public GradidoUnknownEnumE class GRADIDOBLOCKCHAIN_EXPORT GradidoInvalidBase64Exception : public GradidoBlockchainException { public: - explicit GradidoInvalidBase64Exception(const char* what, const std::string& base64, int lastValidCharacter) noexcept; + explicit GradidoInvalidBase64Exception(const char* what, const std::string& base64, size_t lastValidCharacterIndex) noexcept; std::string getFullString() const; protected: std::string mBase64; - int mLastValidCharacter; + size_t mLastValidCharacterIndex; }; diff --git a/src/GradidoBlockchainException.cpp b/src/GradidoBlockchainException.cpp index 418bd975..dd01b91a 100644 --- a/src/GradidoBlockchainException.cpp +++ b/src/GradidoBlockchainException.cpp @@ -156,20 +156,24 @@ std::string GradidoUnknownEnumException::getFullString() const } // **************************** Invalid Base64 **************************************** -GradidoInvalidBase64Exception::GradidoInvalidBase64Exception(const char* what, const std::string& base64, int lastValidCharacter) noexcept - : GradidoBlockchainException(what), mBase64(base64), mLastValidCharacter(lastValidCharacter) +GradidoInvalidBase64Exception::GradidoInvalidBase64Exception(const char* what, const std::string& base64, size_t lastValidCharacterIndex) noexcept + : GradidoBlockchainException(what), mBase64(base64), mLastValidCharacterIndex(lastValidCharacterIndex) { - } std::string GradidoInvalidBase64Exception::getFullString() const { - std::string resultString; - std::string lastValidCharacterString = std::to_string(mLastValidCharacter); - size_t resultSize = strlen(what()) + mBase64.size() + 10 + lastValidCharacterString.size() + 19; + std::string resultString; + size_t resultSize = strlen(what()) + 8 + mBase64.size() + 14 + mLastValidCharacterIndex + 2; resultString.reserve(resultSize); resultString = what(); - resultString += ", with: " + mBase64 + ", last valid char: " + lastValidCharacterString; + resultString += ", with: " + mBase64 + ", valid part: "; + if(mLastValidCharacterIndex < mBase64.size()) { + resultString += mBase64.substr(0, mLastValidCharacterIndex); + } else { + resultString += mBase64; + } + return resultString; } diff --git a/src/memory/Block.cpp b/src/memory/Block.cpp index 9023e5b0..a4aa4b09 100644 --- a/src/memory/Block.cpp +++ b/src/memory/Block.cpp @@ -139,7 +139,7 @@ namespace memory { const char* firstInvalidByte = nullptr; auto convertResult = sodium_base642bin(bin, binSize, base64String, size, nullptr, &resultBinSize, &firstInvalidByte, variant); if (0 != convertResult) { - throw GradidoInvalidBase64Exception("invalid base64", base64String, (int)*firstInvalidByte); + throw GradidoInvalidBase64Exception("invalid base64", base64String, firstInvalidByte - base64String); } if (resultBinSize < binSize) { memory::Block bin_real(resultBinSize, bin); diff --git a/test/MemoryBlockTest.cpp b/test/MemoryBlockTest.cpp index cfb19b46..beb36a98 100644 --- a/test/MemoryBlockTest.cpp +++ b/test/MemoryBlockTest.cpp @@ -145,6 +145,12 @@ TEST(BlockTest, ConvertToAndFromBase64) { // invalid base64 EXPECT_THROW(Block::fromBase64("AAECAwQFBgcICQ"), GradidoInvalidBase64Exception); + try { + Block::fromBase64("AAECAwQFBgc"); + printf("valid\n"); + } catch(GradidoInvalidBase64Exception& ex) { + printf("invalid base64: %s\n", ex.getFullString().data()); + } } TEST(BlockTest, Blake2bHash) { @@ -193,4 +199,4 @@ TEST(BlockTest, CopyAsVector) { for (size_t i = 0; i < block.size(); ++i) { EXPECT_EQ(copyVec[i], static_cast(block.data()[i])); } -} \ No newline at end of file +}