#include "serialization_traits.hpp"
#include "serialized.hpp"
#include "serializer_direct.hpp"
+#include "storage_backend_direct.hpp"
using namespace ldp_serializer;
using ldp_serializer::Serialized;
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();
* 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;
}
* }
* }
* }
+ * db_version: string;
*
* define DecisionItem = {
* decision: Decision;
{ return ptr<ReceiveSetType>(2); }
const auto *getAccessSet() const
{ return ptr<AccessSetType>(3); }
+ const auto *getDbVersion() const
+ { return ptr<Str>(4); }
};
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() {}
{ 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