xref: /openbmc/phosphor-user-manager/phosphor-ldap-config/ldap_mapper_serialize.cpp (revision 9638afb9aa848aa0e696c2447e0fbc70a0aa5eed)
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