From bf74e4e0524dc0c525340aad3c688e6bf8dadf43 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Tue, 3 Nov 2020 10:42:17 +0100 Subject: [PATCH] serialization: add simple file verification method Change-Id: I95d3501bcfffa0e4601ee2c3738b38c41b366a44 --- src/internal/serializer_direct.cpp | 4 +++- src/internal/storage_backend_direct.cpp | 22 +++++++++++++++++++++- src/internal/storage_backend_direct.hpp | 7 +++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/internal/serializer_direct.cpp b/src/internal/serializer_direct.cpp index d74ce9b..d90387e 100644 --- a/src/internal/serializer_direct.cpp +++ b/src/internal/serializer_direct.cpp @@ -24,6 +24,7 @@ #include "serialization_traits.hpp" #include "serialized.hpp" #include "serializer_direct.hpp" +#include "storage_backend_direct.hpp" using namespace ldp_serializer; using ldp_serializer::Serialized; @@ -154,7 +155,8 @@ const uint8_t *SerializerDirectImpl::serialize(size_t &size) { serializeSet(), serializeSet(), serializeSet(), - serializeSet()}; + serializeSet(), + ldp_serialized::StorageBackendDirect::currentDbVersion}; size = r.size(); return r.releaseData(); diff --git a/src/internal/storage_backend_direct.cpp b/src/internal/storage_backend_direct.cpp index 455f443..5628b52 100644 --- a/src/internal/storage_backend_direct.cpp +++ b/src/internal/storage_backend_direct.cpp @@ -20,12 +20,32 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#include "tslog.hpp" #include "storage_backend_direct.hpp" +#include using namespace ldp_serialized; -bool StorageBackendDirect::initFromData(const uint8_t *mem, size_t , bool ) { +const boost::string_ref StorageBackendDirect::currentDbVersion{"Libdbuspolicy direct serialization database, v. 1.0"}; +bool StorageBackendDirect::initFromData(const uint8_t *mem, size_t size, bool verify) { + assert(mem); file = reinterpret_cast(mem); + + if (verify) { + bool verified = false; + auto end = mem + size; + auto version = fileGetDbVersion(file); + auto version_uint8 = reinterpret_cast(version); + if (version_uint8 < end) { + auto s = stringGetSize(version); + if (version_uint8 + s < end) + verified = currentDbVersion == stringGetCStr(version); + } + + if (!verified) + file = nullptr; + } + return file != nullptr; } diff --git a/src/internal/storage_backend_direct.hpp b/src/internal/storage_backend_direct.hpp index 4b3b47b..7afb1f7 100644 --- a/src/internal/storage_backend_direct.hpp +++ b/src/internal/storage_backend_direct.hpp @@ -122,6 +122,7 @@ namespace ldp_serialized { * } * } * } + * db_version: string; * * define DecisionItem = { * decision: Decision; @@ -371,6 +372,8 @@ public: { return ptr(2); } const auto *getAccessSet() const { return ptr(3); } + const auto *getDbVersion() const + { return ptr(4); } }; class StorageBackendDirect { @@ -398,6 +401,8 @@ class StorageBackendDirect { return std::make_pair(false, *container->begin()); } public: + static const boost::string_ref currentDbVersion; + bool initFromData(const uint8_t *serialized_data, size_t size, bool verify = false); void release() {} @@ -412,6 +417,8 @@ public: { return file->getReceiveSet(); } auto fileGetAccessSet(const File *file) const { return file->getAccessSet(); } + auto fileGetDbVersion(const File *file) const + { return file->getDbVersion(); } template auto setGetContextDefault(const Set *set) const -- 2.7.4