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