serialization: add simple file verification method 15/246715/2 accepted/tizen/unified/20201105.124409 submit/tizen/20201104.053310
authorAdrian Szyndela <adrian.s@samsung.com>
Tue, 3 Nov 2020 09:42:17 +0000 (10:42 +0100)
committerAdrian Szyndela <adrian.s@samsung.com>
Tue, 3 Nov 2020 09:44:21 +0000 (10:44 +0100)
Change-Id: I95d3501bcfffa0e4601ee2c3738b38c41b366a44

src/internal/serializer_direct.cpp
src/internal/storage_backend_direct.cpp
src/internal/storage_backend_direct.hpp

index d74ce9b..d90387e 100644 (file)
@@ -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<ldp_xml_parser::PolicyOwn>(),
                serializeSet<ldp_xml_parser::PolicySend>(),
                serializeSet<ldp_xml_parser::PolicyReceive>(),
-               serializeSet<ldp_xml_parser::PolicyAccess>()};
+               serializeSet<ldp_xml_parser::PolicyAccess>(),
+               ldp_serialized::StorageBackendDirect::currentDbVersion};
 
        size = r.size();
        return r.releaseData();
index 455f443..5628b52 100644 (file)
  * 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 <cassert>
 
 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<const File*>(mem);
+
+       if (verify) {
+               bool verified = false;
+               auto end = mem + size;
+               auto version = fileGetDbVersion(file);
+               auto version_uint8 = reinterpret_cast<const uint8_t *>(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;
 }
index 4b3b47b..7afb1f7 100644 (file)
@@ -122,6 +122,7 @@ namespace ldp_serialized {
  *                     }
  *             }
  *     }
+ *  db_version: string;
  *
  *     define DecisionItem = {
  *             decision: Decision;
@@ -371,6 +372,8 @@ public:
        { return ptr<ReceiveSetType>(2); }
        const auto *getAccessSet() const
        { return ptr<AccessSetType>(3); }
+       const auto *getDbVersion() const
+       { return ptr<Str>(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 <typename PolicyType>
        auto setGetContextDefault(const Set<PolicyType> *set) const