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