From 0b14c471fc77cbcb93f435a46878b25f57741e0e Mon Sep 17 00:00:00 2001 From: Tom Joseph Date: Sun, 30 Sep 2018 01:42:59 +0530 Subject: ldap: Add persistence for LDAP mapper D-Bus objects Change-Id: Ib8979a7c655f74c332d80e7fb221ef03e9a3f83c Signed-off-by: Tom Joseph --- phosphor-ldap-mapper/ldap_mapper_serialize.cpp | 95 ++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 phosphor-ldap-mapper/ldap_mapper_serialize.cpp (limited to 'phosphor-ldap-mapper/ldap_mapper_serialize.cpp') diff --git a/phosphor-ldap-mapper/ldap_mapper_serialize.cpp b/phosphor-ldap-mapper/ldap_mapper_serialize.cpp new file mode 100644 index 0000000..534e0a1 --- /dev/null +++ b/phosphor-ldap-mapper/ldap_mapper_serialize.cpp @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include "config.h" +#include "ldap_mapper_serialize.hpp" + +// Register class version +// From cereal documentation; +// "This macro should be placed at global scope" +CEREAL_CLASS_VERSION(phosphor::user::LDAPMapperEntry, CLASS_VERSION); + +namespace phosphor +{ +namespace user +{ + +using namespace phosphor::logging; + +/** @brief Function required by Cereal to perform serialization. + * + * @tparam Archive - Cereal archive type (binary in this case). + * @param[in] archive - reference to cereal archive. + * @param[in] entry- const reference to LDAP mapper entry + * @param[in] version - Class version that enables handling a serialized data + * across code levels + */ +template +void save(Archive& archive, const LDAPMapperEntry& entry, + const std::uint32_t version) +{ + archive(entry.groupName(), entry.privilege()); +} + +/** @brief Function required by Cereal to perform deserialization. + * + * @tparam Archive - Cereal archive type (binary in our case). + * @param[in] archive - reference to cereal archive. + * @param[out] entry - LDAP mapper entry to be read + * @param[in] version - Class version that enables handling a serialized data + * across code levels + */ +template +void load(Archive& archive, LDAPMapperEntry& entry, const std::uint32_t version) +{ + std::string groupName{}; + std::string privilege{}; + + archive(groupName, privilege); + + entry.sdbusplus::xyz::openbmc_project::User::server::PrivilegeMapperEntry:: + groupName(groupName, true); + entry.sdbusplus::xyz::openbmc_project::User::server::PrivilegeMapperEntry:: + privilege(privilege, true); +} + +fs::path serialize(const LDAPMapperEntry& entry, Id id) +{ + fs::path dir(LDAP_MAPPER_PERSIST_PATH); + auto path = dir / std::to_string(id); + std::ofstream os(path.c_str(), std::ios::binary); + cereal::BinaryOutputArchive oarchive(os); + oarchive(entry); + return path; +} + +bool deserialize(const fs::path& path, LDAPMapperEntry& entry) +{ + try + { + if (fs::exists(path)) + { + std::ifstream is(path.c_str(), std::ios::in | std::ios::binary); + cereal::BinaryInputArchive iarchive(is); + iarchive(entry); + return true; + } + return false; + } + catch (cereal::Exception& e) + { + log(e.what()); + fs::remove(path); + return false; + } + catch (const std::length_error& e) + { + log(e.what()); + fs::remove(path); + return false; + } +} + +} // namespace user +} // namespace phosphor -- cgit v1.2.1