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