| #include "config.h" |
| |
| #include "ldap_mapper_serialize.hpp" |
| |
| #include <cereal/archives/binary.hpp> |
| #include <cereal/types/string.hpp> |
| #include <phosphor-logging/log.hpp> |
| |
| #include <fstream> |
| |
| // Register class version |
| // From cereal documentation; |
| // "This macro should be placed at global scope" |
| CEREAL_CLASS_VERSION(phosphor::ldap::LDAPMapperEntry, CLASS_VERSION); |
| |
| namespace phosphor |
| { |
| namespace ldap |
| { |
| |
| 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 <class Archive> |
| 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 <class Archive> |
| 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, const fs::path& path) |
| { |
| fs::create_directories(path.parent_path()); |
| std::ofstream os(path.c_str(), std::ios::binary | std::ios::out); |
| 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 (const cereal::Exception& e) |
| { |
| log<level::ERR>(e.what()); |
| fs::remove(path); |
| return false; |
| } |
| catch (const std::length_error& e) |
| { |
| log<level::ERR>(e.what()); |
| fs::remove(path); |
| return false; |
| } |
| } |
| |
| } // namespace ldap |
| } // namespace phosphor |