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