1 #pragma once
2 
3 #include "ldap_config.hpp"
4 
5 #include "config.h"
6 #include <xyz/openbmc_project/User/Ldap/Config/server.hpp>
7 #include <xyz/openbmc_project/User/Ldap/Create/server.hpp>
8 #include <xyz/openbmc_project/Common/error.hpp>
9 #include <phosphor-logging/log.hpp>
10 #include <phosphor-logging/elog.hpp>
11 #include <phosphor-logging/elog-errors.hpp>
12 #include <sdbusplus/bus.hpp>
13 #include <string>
14 namespace phosphor
15 {
16 namespace ldap
17 {
18 
19 static constexpr auto defaultNslcdFile = "nslcd.conf.default";
20 static constexpr auto nsSwitchFile = "nsswitch.conf";
21 
22 using namespace phosphor::logging;
23 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
24 using CreateIface = sdbusplus::server::object::object<
25     sdbusplus::xyz::openbmc_project::User::Ldap::server::Create>;
26 
27 // class Config;
28 /** @class ConfigMgr
29  *  @brief Creates LDAP server configuration.
30  *  @details concrete implementation of xyz.openbmc_project.User.Ldap.Create
31  *  APIs, in order to create LDAP configuration.
32  */
33 class ConfigMgr : public CreateIface
34 {
35   public:
36     ConfigMgr() = delete;
37     ~ConfigMgr() = default;
38     ConfigMgr(const ConfigMgr&) = delete;
39     ConfigMgr& operator=(const ConfigMgr&) = delete;
40     ConfigMgr(ConfigMgr&&) = delete;
41     ConfigMgr& operator=(ConfigMgr&&) = delete;
42 
43     /** @brief ConfigMgr to put object onto bus at a dbus path.
44      *  @param[in] bus - Bus to attach to.
45      *  @param[in] path - Path to attach at.
46      *  @param[in] filePath - LDAP configuration file.
47      *  @param[in] dbusPersistentPath - Persistent path for LDAP D-Bus property.
48      *  @param[in] caCertFile - LDAP's CA certificate file.
49      */
50     ConfigMgr(sdbusplus::bus::bus& bus, const char* path, const char* filePath,
51               const char* dbusPersistentPath, const char* caCertFile) :
52         CreateIface(bus, path, true),
53         dbusPersistentPath(dbusPersistentPath), configFilePath(filePath),
54         bus(bus)
55     {
56         try
57         {
58             restore(configFilePath.c_str());
59             emit_object_added();
60         }
61         catch (const std::exception& e)
62         {
63             configPtr.reset(nullptr);
64             log<level::ERR>(e.what());
65             elog<InternalFailure>();
66         }
67     }
68 
69     /** @brief concrete implementation of the pure virtual funtion
70             xyz.openbmc_project.User.Ldap.Create.createConfig.
71      *  @param[in] lDAPServerURI - LDAP URI of the server.
72      *  @param[in] lDAPBindDN - distinguished name with which bind to bind
73             to the directory server for lookups.
74      *  @param[in] lDAPBaseDN -  distinguished name to use as search base.
75      *  @param[in] lDAPBindDNPassword - credentials with which to bind.
76      *  @param[in] lDAPSearchScope - the search scope.
77      *  @param[in] lDAPType - Specifies the LDAP server type which can be AD
78             or openLDAP.
79      *  @param[in] groupNameAttribute - Specifies attribute name that contains
80      *             the name of the Group in the LDAP server.
81      *  @param[in] usernameAttribute - Specifies attribute name that contains
82      *             the username in the LDAP server.
83      *  @returns the object path of the D-Bus object created.
84      */
85     std::string createConfig(std::string lDAPServerURI, std::string lDAPBindDN,
86                              std::string lDAPBaseDN,
87                              std::string lDAPBindDNPassword,
88                              CreateIface::SearchScope lDAPSearchScope,
89                              CreateIface::Type lDAPType,
90                              std::string groupNameAttribute,
91                              std::string userNameAttribute) override;
92 
93     /** @brief restarts given service
94      *  @param[in] service - Service to be restarted.
95      */
96     virtual void restartService(const std::string& service);
97 
98     /** @brief stops given service
99      *  @param[in] service - Service to be stopped.
100      */
101     virtual void stopService(const std::string& service);
102 
103     /** @brief start or stop the service depending on the given value
104      *  @param[in] service - Service to be start/stop.
105      *  @param[in] value - true to start the service otherwise stop.
106      */
107     virtual void startOrStopService(const std::string& service, bool value);
108 
109     /** @brief delete the config D-Bus object.
110      */
111     void deleteObject();
112 
113     /* ldap service enabled property would be saved under
114      * this path.
115      */
116     std::string dbusPersistentPath;
117 
118   protected:
119     std::string configFilePath{};
120     std::string tlsCacertFile{};
121 
122     /** @brief Persistent sdbusplus D-Bus bus connection. */
123     sdbusplus::bus::bus& bus;
124 
125     /** @brief Pointer to a Config D-Bus object */
126     std::unique_ptr<Config> configPtr = nullptr;
127 
128     /** @brief Populate existing config into D-Bus properties
129      *  @param[in] filePath - LDAP config file path
130      */
131     virtual void restore(const char* filePath);
132 };
133 } // namespace ldap
134 } // namespace phosphor
135