1fd761da7SRatan Gupta #include <cereal/archives/binary.hpp> 2fd761da7SRatan Gupta #include <cereal/types/string.hpp> 3fd761da7SRatan Gupta #include <fstream> 4fd761da7SRatan Gupta #include <phosphor-logging/log.hpp> 5fd761da7SRatan Gupta #include "config.h" 6fd761da7SRatan Gupta #include "ldap_mapper_serialize.hpp" 7fd761da7SRatan Gupta 8fd761da7SRatan Gupta // Register class version 9fd761da7SRatan Gupta // From cereal documentation; 10fd761da7SRatan Gupta // "This macro should be placed at global scope" 11*7b04c352SRatan Gupta CEREAL_CLASS_VERSION(phosphor::ldap::LDAPMapperEntry, CLASS_VERSION); 12fd761da7SRatan Gupta 13fd761da7SRatan Gupta namespace phosphor 14fd761da7SRatan Gupta { 15*7b04c352SRatan Gupta namespace ldap 16fd761da7SRatan Gupta { 17fd761da7SRatan Gupta 18fd761da7SRatan Gupta using namespace phosphor::logging; 19fd761da7SRatan Gupta 20fd761da7SRatan Gupta /** @brief Function required by Cereal to perform serialization. 21fd761da7SRatan Gupta * 22fd761da7SRatan Gupta * @tparam Archive - Cereal archive type (binary in this case). 23fd761da7SRatan Gupta * @param[in] archive - reference to cereal archive. 24fd761da7SRatan Gupta * @param[in] entry- const reference to LDAP mapper entry 25fd761da7SRatan Gupta * @param[in] version - Class version that enables handling a serialized data 26fd761da7SRatan Gupta * across code levels 27fd761da7SRatan Gupta */ 28fd761da7SRatan Gupta template <class Archive> 29fd761da7SRatan Gupta void save(Archive& archive, const LDAPMapperEntry& entry, 30fd761da7SRatan Gupta const std::uint32_t version) 31fd761da7SRatan Gupta { 32fd761da7SRatan Gupta archive(entry.groupName(), entry.privilege()); 33fd761da7SRatan Gupta } 34fd761da7SRatan Gupta 35fd761da7SRatan Gupta /** @brief Function required by Cereal to perform deserialization. 36fd761da7SRatan Gupta * 37fd761da7SRatan Gupta * @tparam Archive - Cereal archive type (binary in our case). 38fd761da7SRatan Gupta * @param[in] archive - reference to cereal archive. 39fd761da7SRatan Gupta * @param[out] entry - LDAP mapper entry to be read 40fd761da7SRatan Gupta * @param[in] version - Class version that enables handling a serialized data 41fd761da7SRatan Gupta * across code levels 42fd761da7SRatan Gupta */ 43fd761da7SRatan Gupta template <class Archive> 44fd761da7SRatan Gupta void load(Archive& archive, LDAPMapperEntry& entry, const std::uint32_t version) 45fd761da7SRatan Gupta { 46fd761da7SRatan Gupta std::string groupName{}; 47fd761da7SRatan Gupta std::string privilege{}; 48fd761da7SRatan Gupta 49fd761da7SRatan Gupta archive(groupName, privilege); 50fd761da7SRatan Gupta 51fd761da7SRatan Gupta entry.sdbusplus::xyz::openbmc_project::User::server::PrivilegeMapperEntry:: 52fd761da7SRatan Gupta groupName(groupName, true); 53fd761da7SRatan Gupta entry.sdbusplus::xyz::openbmc_project::User::server::PrivilegeMapperEntry:: 54fd761da7SRatan Gupta privilege(privilege, true); 55fd761da7SRatan Gupta } 56fd761da7SRatan Gupta 57*7b04c352SRatan Gupta fs::path serialize(const LDAPMapperEntry& entry, const fs::path& path) 58fd761da7SRatan Gupta { 59*7b04c352SRatan Gupta fs::create_directories(path.parent_path()); 60*7b04c352SRatan Gupta std::ofstream os(path.c_str(), std::ios::binary | std::ios::out); 61fd761da7SRatan Gupta cereal::BinaryOutputArchive oarchive(os); 62fd761da7SRatan Gupta oarchive(entry); 63fd761da7SRatan Gupta return path; 64fd761da7SRatan Gupta } 65fd761da7SRatan Gupta 66fd761da7SRatan Gupta bool deserialize(const fs::path& path, LDAPMapperEntry& entry) 67fd761da7SRatan Gupta { 68fd761da7SRatan Gupta try 69fd761da7SRatan Gupta { 70fd761da7SRatan Gupta if (fs::exists(path)) 71fd761da7SRatan Gupta { 72fd761da7SRatan Gupta std::ifstream is(path.c_str(), std::ios::in | std::ios::binary); 73fd761da7SRatan Gupta cereal::BinaryInputArchive iarchive(is); 74fd761da7SRatan Gupta iarchive(entry); 75fd761da7SRatan Gupta return true; 76fd761da7SRatan Gupta } 77fd761da7SRatan Gupta return false; 78fd761da7SRatan Gupta } 79fd761da7SRatan Gupta catch (cereal::Exception& e) 80fd761da7SRatan Gupta { 81fd761da7SRatan Gupta log<level::ERR>(e.what()); 82fd761da7SRatan Gupta fs::remove(path); 83fd761da7SRatan Gupta return false; 84fd761da7SRatan Gupta } 85fd761da7SRatan Gupta catch (const std::length_error& e) 86fd761da7SRatan Gupta { 87fd761da7SRatan Gupta log<level::ERR>(e.what()); 88fd761da7SRatan Gupta fs::remove(path); 89fd761da7SRatan Gupta return false; 90fd761da7SRatan Gupta } 91fd761da7SRatan Gupta } 92fd761da7SRatan Gupta 93*7b04c352SRatan Gupta } // namespace ldap 94fd761da7SRatan Gupta } // namespace phosphor 95