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