summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Szyndela <adrian.s@samsung.com>2020-11-03 10:42:17 +0100
committerAdrian Szyndela <adrian.s@samsung.com>2020-11-03 10:44:21 +0100
commitbf74e4e0524dc0c525340aad3c688e6bf8dadf43 (patch)
tree12db76d4783f58dcd4bc1e816af7a2a1baada651
parentcdaf39ced4a983e3915e331267598921cd04a6ea (diff)
downloadlibdbuspolicy-bf74e4e0524dc0c525340aad3c688e6bf8dadf43.tar.gz
libdbuspolicy-bf74e4e0524dc0c525340aad3c688e6bf8dadf43.tar.bz2
libdbuspolicy-bf74e4e0524dc0c525340aad3c688e6bf8dadf43.zip
serialization: add simple file verification methodsubmit/tizen/20201104.053310accepted/tizen/unified/20201105.124409
Change-Id: I95d3501bcfffa0e4601ee2c3738b38c41b366a44
-rw-r--r--src/internal/serializer_direct.cpp4
-rw-r--r--src/internal/storage_backend_direct.cpp22
-rw-r--r--src/internal/storage_backend_direct.hpp7
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<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();
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 <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;
}
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<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