xref: /openbmc/phosphor-user-manager/phosphor-ldap-config/ldap_mapper_serialize.cpp (revision 11ec666bef0767eb1ef6024e69be02717c852138)
19638afb9SPatrick Williams #include "config.h"
29638afb9SPatrick Williams 
39638afb9SPatrick Williams #include "ldap_mapper_serialize.hpp"
49638afb9SPatrick Williams 
5fd761da7SRatan Gupta #include <cereal/archives/binary.hpp>
6fd761da7SRatan Gupta #include <cereal/types/string.hpp>
7*11ec666bSJiaqing Zhao #include <phosphor-logging/lg2.hpp>
89638afb9SPatrick Williams 
99638afb9SPatrick 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 /** @brief Function required by Cereal to perform serialization.
22fd761da7SRatan Gupta  *
23fd761da7SRatan Gupta  *  @tparam Archive - Cereal archive type (binary in this case).
24fd761da7SRatan Gupta  *  @param[in] archive - reference to cereal archive.
25fd761da7SRatan Gupta  *  @param[in] entry- const reference to LDAP mapper entry
26fd761da7SRatan Gupta  *  @param[in] version - Class version that enables handling a serialized data
27fd761da7SRatan Gupta  *                       across code levels
28fd761da7SRatan Gupta  */
29fd761da7SRatan Gupta template <class Archive>
save(Archive & archive,const LDAPMapperEntry & entry,const std::uint32_t)30fd761da7SRatan Gupta void save(Archive& archive, const LDAPMapperEntry& entry,
310b1ad3d8SRatan Gupta           const std::uint32_t /*version*/)
32fd761da7SRatan Gupta {
33fd761da7SRatan Gupta     archive(entry.groupName(), entry.privilege());
34fd761da7SRatan Gupta }
35fd761da7SRatan Gupta 
36fd761da7SRatan Gupta /** @brief Function required by Cereal to perform deserialization.
37fd761da7SRatan Gupta  *
38fd761da7SRatan Gupta  *  @tparam Archive - Cereal archive type (binary in our case).
39fd761da7SRatan Gupta  *  @param[in] archive - reference to cereal archive.
40fd761da7SRatan Gupta  *  @param[out] entry - LDAP mapper entry to be read
41fd761da7SRatan Gupta  *  @param[in] version - Class version that enables handling a serialized data
42fd761da7SRatan Gupta  *                       across code levels
43fd761da7SRatan Gupta  */
44fd761da7SRatan Gupta template <class Archive>
load(Archive & archive,LDAPMapperEntry & entry,const std::uint32_t)450b1ad3d8SRatan Gupta void load(Archive& archive, LDAPMapperEntry& entry,
460b1ad3d8SRatan Gupta           const std::uint32_t /*version*/)
47fd761da7SRatan Gupta {
48fd761da7SRatan Gupta     std::string groupName{};
49fd761da7SRatan Gupta     std::string privilege{};
50fd761da7SRatan Gupta 
51fd761da7SRatan Gupta     archive(groupName, privilege);
52fd761da7SRatan Gupta 
53fd761da7SRatan Gupta     entry.sdbusplus::xyz::openbmc_project::User::server::PrivilegeMapperEntry::
54fd761da7SRatan Gupta         groupName(groupName, true);
55fd761da7SRatan Gupta     entry.sdbusplus::xyz::openbmc_project::User::server::PrivilegeMapperEntry::
56fd761da7SRatan Gupta         privilege(privilege, true);
57fd761da7SRatan Gupta }
58fd761da7SRatan Gupta 
serialize(const LDAPMapperEntry & entry,const fs::path & path)597b04c352SRatan Gupta fs::path serialize(const LDAPMapperEntry& entry, const fs::path& path)
60fd761da7SRatan Gupta {
617b04c352SRatan Gupta     fs::create_directories(path.parent_path());
627b04c352SRatan Gupta     std::ofstream os(path.c_str(), std::ios::binary | std::ios::out);
63fd761da7SRatan Gupta     cereal::BinaryOutputArchive oarchive(os);
64fd761da7SRatan Gupta     oarchive(entry);
65fd761da7SRatan Gupta     return path;
66fd761da7SRatan Gupta }
67fd761da7SRatan Gupta 
deserialize(const fs::path & path,LDAPMapperEntry & entry)68fd761da7SRatan Gupta bool deserialize(const fs::path& path, LDAPMapperEntry& entry)
69fd761da7SRatan Gupta {
70fd761da7SRatan Gupta     try
71fd761da7SRatan Gupta     {
72fd761da7SRatan Gupta         if (fs::exists(path))
73fd761da7SRatan Gupta         {
74fd761da7SRatan Gupta             std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
75fd761da7SRatan Gupta             cereal::BinaryInputArchive iarchive(is);
76fd761da7SRatan Gupta             iarchive(entry);
77fd761da7SRatan Gupta             return true;
78fd761da7SRatan Gupta         }
79fd761da7SRatan Gupta         return false;
80fd761da7SRatan Gupta     }
81d019e3d2SPatrick Williams     catch (const cereal::Exception& e)
82fd761da7SRatan Gupta     {
83*11ec666bSJiaqing Zhao         lg2::error("Failed to deserialize {FILE}: {ERR}", "FILE", path, "ERR",
84*11ec666bSJiaqing Zhao                    e);
85fd761da7SRatan Gupta         fs::remove(path);
86fd761da7SRatan Gupta         return false;
87fd761da7SRatan Gupta     }
88fd761da7SRatan Gupta     catch (const std::length_error& e)
89fd761da7SRatan Gupta     {
90*11ec666bSJiaqing Zhao         lg2::error("Failed to deserialize {FILE}: {ERR}", "FILE", path, "ERR",
91*11ec666bSJiaqing Zhao                    e);
92fd761da7SRatan Gupta         fs::remove(path);
93fd761da7SRatan Gupta         return false;
94fd761da7SRatan Gupta     }
95fd761da7SRatan Gupta }
96fd761da7SRatan Gupta 
977b04c352SRatan Gupta } // namespace ldap
98fd761da7SRatan Gupta } // namespace phosphor
99