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