|  | #pragma once | 
|  |  | 
|  | #include "config.h" | 
|  | #include <xyz/openbmc_project/Object/Delete/server.hpp> | 
|  | #include <xyz/openbmc_project/User/Ldap/Config/server.hpp> | 
|  | #include <xyz/openbmc_project/User/Ldap/Create/server.hpp> | 
|  | #include <xyz/openbmc_project/Common/error.hpp> | 
|  | #include <phosphor-logging/log.hpp> | 
|  | #include <phosphor-logging/elog.hpp> | 
|  | #include <phosphor-logging/elog-errors.hpp> | 
|  | #include <sdbusplus/bus.hpp> | 
|  | #include <sdbusplus/server/object.hpp> | 
|  | #include <string> | 
|  |  | 
|  | namespace phosphor | 
|  | { | 
|  | namespace ldap | 
|  | { | 
|  | static constexpr auto defaultNslcdFile = "nslcd.conf.default"; | 
|  | static constexpr auto nsSwitchFile = "nsswitch.conf"; | 
|  |  | 
|  | using namespace phosphor::logging; | 
|  | using namespace sdbusplus::xyz::openbmc_project::Common::Error; | 
|  | namespace ldap_base = sdbusplus::xyz::openbmc_project::User::Ldap::server; | 
|  | using ConfigIface = sdbusplus::server::object::object< | 
|  | ldap_base::Config, sdbusplus::xyz::openbmc_project::Object::server::Delete>; | 
|  | using CreateIface = sdbusplus::server::object::object<ldap_base::Create>; | 
|  |  | 
|  | class ConfigMgr; | 
|  |  | 
|  | /** @class Config | 
|  | *  @brief Configuration for LDAP. | 
|  | *  @details concrete implementation of xyz.openbmc_project.User.Ldap.Config | 
|  | *  API, in order to provide LDAP configuration. | 
|  | */ | 
|  | class Config : public ConfigIface | 
|  | { | 
|  | public: | 
|  | Config() = delete; | 
|  | ~Config() = default; | 
|  | Config(const Config&) = delete; | 
|  | Config& operator=(const Config&) = delete; | 
|  | Config(Config&&) = default; | 
|  | Config& operator=(Config&&) = default; | 
|  |  | 
|  | /** @brief Constructor to put object onto bus at a D-Bus path. | 
|  | *  @param[in] bus - Bus to attach to. | 
|  | *  @param[in] path - The D-Bus object path to attach at. | 
|  | *  @param[in] filePath - LDAP configuration file. | 
|  | *  @param[in] caCertFile - LDAP's CA certificate file. | 
|  | *  @param[in] secureLDAP - Specifies whether to use SSL or not. | 
|  | *  @param[in] lDAPServerURI - LDAP URI of the server. | 
|  | *  @param[in] lDAPBindDN - distinguished name with which to bind. | 
|  | *  @param[in] lDAPBaseDN -  distinguished name to use as search base. | 
|  | *  @param[in] lDAPBindDNPassword - credentials with which to bind. | 
|  | *  @param[in] lDAPSearchScope - the search scope. | 
|  | *  @param[in] lDAPType - Specifies the LDAP server type which can be AD | 
|  | or openLDAP. | 
|  | *  @param[in] parent - parent of config object. | 
|  | */ | 
|  |  | 
|  | Config(sdbusplus::bus::bus& bus, const char* path, const char* filePath, | 
|  | const char* caCertFile, bool secureLDAP, std::string lDAPServerURI, | 
|  | std::string lDAPBindDN, std::string lDAPBaseDN, | 
|  | std::string&& lDAPBindDNPassword, | 
|  | ldap_base::Config::SearchScope lDAPSearchScope, | 
|  | ldap_base::Config::Type lDAPType, ConfigMgr& parent); | 
|  |  | 
|  | using ConfigIface::lDAPBaseDN; | 
|  | using ConfigIface::lDAPBindDN; | 
|  | using ConfigIface::lDAPSearchScope; | 
|  | using ConfigIface::lDAPServerURI; | 
|  | using ConfigIface::lDAPType; | 
|  | using ConfigIface::setPropertyByName; | 
|  |  | 
|  | /** @brief Update the Server URI property. | 
|  | *  @param[in] value - lDAPServerURI value to be updated. | 
|  | *  @returns value of changed lDAPServerURI. | 
|  | */ | 
|  | std::string lDAPServerURI(std::string value) override; | 
|  |  | 
|  | /** @brief Update the BindDN property. | 
|  | *  @param[in] value - lDAPBindDN value to be updated. | 
|  | *  @returns value of changed lDAPBindDN. | 
|  | */ | 
|  | std::string lDAPBindDN(std::string value) override; | 
|  |  | 
|  | /** @brief Update the BaseDN property. | 
|  | *  @param[in] value - lDAPBaseDN value to be updated. | 
|  | *  @returns value of changed lDAPBaseDN. | 
|  | */ | 
|  | std::string lDAPBaseDN(std::string value) override; | 
|  |  | 
|  | /** @brief Update the Search scope property. | 
|  | *  @param[in] value - lDAPSearchScope value to be updated. | 
|  | *  @returns value of changed lDAPSearchScope. | 
|  | */ | 
|  | ldap_base::Config::SearchScope | 
|  | lDAPSearchScope(ldap_base::Config::SearchScope value) override; | 
|  |  | 
|  | /** @brief Update the LDAP Type property. | 
|  | *  @param[in] value - lDAPType value to be updated. | 
|  | *  @returns value of changed lDAPType. | 
|  | */ | 
|  | ldap_base::Config::Type lDAPType(ldap_base::Config::Type value) override; | 
|  |  | 
|  | /** @brief Delete this D-bus object. | 
|  | */ | 
|  | void delete_() override; | 
|  |  | 
|  | bool secureLDAP; | 
|  |  | 
|  | private: | 
|  | std::string configFilePath{}; | 
|  | std::string tlsCacertFile{}; | 
|  | std::string lDAPBindDNPassword{}; | 
|  |  | 
|  | /** @brief Persistent sdbusplus D-Bus bus connection. */ | 
|  | sdbusplus::bus::bus& bus; | 
|  |  | 
|  | /** @brief Create a new LDAP config file. | 
|  | */ | 
|  | virtual void writeConfig(); | 
|  |  | 
|  | /** @brief reference to config manager object */ | 
|  | ConfigMgr& parent; | 
|  | }; | 
|  |  | 
|  | /** @class ConfigMgr | 
|  | *  @brief Creates LDAP server configuration. | 
|  | *  @details concrete implementation of xyz.openbmc_project.User.Ldap.Create | 
|  | *  APIs, in order to create LDAP configuration. | 
|  | */ | 
|  | class ConfigMgr : public CreateIface | 
|  | { | 
|  | public: | 
|  | ConfigMgr() = delete; | 
|  | ~ConfigMgr() = default; | 
|  | ConfigMgr(const ConfigMgr&) = delete; | 
|  | ConfigMgr& operator=(const ConfigMgr&) = delete; | 
|  | ConfigMgr(ConfigMgr&&) = delete; | 
|  | ConfigMgr& operator=(ConfigMgr&&) = delete; | 
|  |  | 
|  | /** @brief ConfigMgr to put object onto bus at a dbus path. | 
|  | *  @param[in] bus - Bus to attach to. | 
|  | *  @param[in] path - Path to attach at. | 
|  | *  @param[in] filePath - LDAP configuration file. | 
|  | *  @param[in] caCertFile - LDAP's CA certificate file. | 
|  | */ | 
|  | ConfigMgr(sdbusplus::bus::bus& bus, const char* path, const char* filePath, | 
|  | const char* caCertFile) : | 
|  | CreateIface(bus, path, true), | 
|  | configFilePath(filePath), bus(bus) | 
|  | { | 
|  | try | 
|  | { | 
|  | restore(configFilePath.c_str()); | 
|  | emit_object_added(); | 
|  | } | 
|  | catch (const std::exception& e) | 
|  | { | 
|  | configPtr.reset(nullptr); | 
|  | log<level::ERR>(e.what()); | 
|  | elog<InternalFailure>(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** @brief concrete implementation of the pure virtual funtion | 
|  | xyz.openbmc_project.User.Ldap.Create.createConfig. | 
|  | *  @param[in] lDAPServerURI - LDAP URI of the server. | 
|  | *  @param[in] lDAPBindDN - distinguished name with which bind to bind | 
|  | to the directory server for lookups. | 
|  | *  @param[in] lDAPBaseDN -  distinguished name to use as search base. | 
|  | *  @param[in] lDAPBindDNPassword - credentials with which to bind. | 
|  | *  @param[in] lDAPSearchScope - the search scope. | 
|  | *  @param[in] lDAPType - Specifies the LDAP server type which can be AD | 
|  | or openLDAP. | 
|  | *  @returns the object path of the D-Bus object created. | 
|  | */ | 
|  | std::string createConfig(std::string lDAPServerURI, std::string lDAPBindDN, | 
|  | std::string lDAPBaseDN, | 
|  | std::string lDAPBindDNPassword, | 
|  | ldap_base::Create::SearchScope lDAPSearchScope, | 
|  | ldap_base::Create::Type lDAPType) override; | 
|  |  | 
|  | /** @brief restarts given service | 
|  | *  @param[in] service - Service to be restarted. | 
|  | */ | 
|  | virtual void restartService(const std::string& service); | 
|  |  | 
|  | /** @brief stops given service | 
|  | *  @param[in] service - Service to be stopped. | 
|  | */ | 
|  | virtual void stopService(const std::string& service); | 
|  |  | 
|  | /** @brief delete the config D-Bus object. | 
|  | */ | 
|  | void deleteObject(); | 
|  |  | 
|  | protected: | 
|  | std::string configFilePath{}; | 
|  | std::string tlsCacertFile{}; | 
|  |  | 
|  | /** @brief Persistent sdbusplus D-Bus bus connection. */ | 
|  | sdbusplus::bus::bus& bus; | 
|  |  | 
|  | /** @brief Pointer to a Config D-Bus object */ | 
|  | std::unique_ptr<Config> configPtr = nullptr; | 
|  |  | 
|  | /** @brief Populate existing config into D-Bus properties | 
|  | *  @param[in] filePath - LDAP config file path | 
|  | */ | 
|  | virtual void restore(const char* filePath); | 
|  | }; | 
|  | } // namespace ldap | 
|  | } // namespace phosphor |