xref: /openbmc/phosphor-certificate-manager/certs_manager.cpp (revision 1396511d56355f13a488a110433e9da1dfd6c5a6)
1cfbc8dc8SJayanth Othayoth #include "certs_manager.hpp"
2cfbc8dc8SJayanth Othayoth 
36ceec40bSMarri Devender Rao #include <phosphor-logging/elog-errors.hpp>
46ceec40bSMarri Devender Rao #include <xyz/openbmc_project/Certs/Install/error.hpp>
5cfbc8dc8SJayanth Othayoth #include <xyz/openbmc_project/Common/error.hpp>
6cfbc8dc8SJayanth Othayoth namespace phosphor
7cfbc8dc8SJayanth Othayoth {
8cfbc8dc8SJayanth Othayoth namespace certs
9cfbc8dc8SJayanth Othayoth {
10cfbc8dc8SJayanth Othayoth 
11*1396511dSMarri Devender Rao using InternalFailure =
12*1396511dSMarri Devender Rao     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
13cfbc8dc8SJayanth Othayoth 
146ceec40bSMarri Devender Rao /** @brief Constructor to put object onto bus at a dbus path.
156ceec40bSMarri Devender Rao  *  @param[in] bus - Bus to attach to.
166ceec40bSMarri Devender Rao  *  @param[in] path - Path to attach at.
176ceec40bSMarri Devender Rao  *  @param[in] type - Type of the certificate.
186ceec40bSMarri Devender Rao  *  @param[in] unit - Unit consumed by this certificate.
196ceec40bSMarri Devender Rao  *  @param[in] installPath - Certificate installation path.
206ceec40bSMarri Devender Rao  */
216ceec40bSMarri Devender Rao Manager::Manager(sdbusplus::bus::bus& bus, const char* path,
226ceec40bSMarri Devender Rao                  const CertificateType& type, UnitsToRestart&& unit,
236ceec40bSMarri Devender Rao                  CertInstallPath&& installPath) :
246ceec40bSMarri Devender Rao     Ifaces(bus, path),
256ceec40bSMarri Devender Rao     bus(bus), objectPath(path), certType(type), unitToRestart(std::move(unit)),
266ceec40bSMarri Devender Rao     certInstallPath(std::move(installPath))
27cfbc8dc8SJayanth Othayoth {
28*1396511dSMarri Devender Rao     using InvalidCertificate = sdbusplus::xyz::openbmc_project::Certs::Install::
29*1396511dSMarri Devender Rao         Error::InvalidCertificate;
30*1396511dSMarri Devender Rao     using Reason =
31*1396511dSMarri Devender Rao         xyz::openbmc_project::Certs::Install::InvalidCertificate::REASON;
32bf7c588cSMarri Devender Rao     if (fs::exists(certInstallPath))
33bf7c588cSMarri Devender Rao     {
34bf7c588cSMarri Devender Rao         try
35bf7c588cSMarri Devender Rao         {
36bf7c588cSMarri Devender Rao             // TODO: Issue#3 At present supporting only one certificate to be
37bf7c588cSMarri Devender Rao             // uploaded this need to be revisited to support multiple
38bf7c588cSMarri Devender Rao             // certificates
39bf7c588cSMarri Devender Rao             auto certObjectPath = objectPath + '/' + '1';
40bf7c588cSMarri Devender Rao             certificatePtr = std::make_unique<Certificate>(
41bf7c588cSMarri Devender Rao                 bus, certObjectPath, certType, unitToRestart, certInstallPath,
42bf7c588cSMarri Devender Rao                 certInstallPath);
43bf7c588cSMarri Devender Rao         }
44bf7c588cSMarri Devender Rao         catch (const InternalFailure& e)
45bf7c588cSMarri Devender Rao         {
46bf7c588cSMarri Devender Rao             report<InternalFailure>();
47bf7c588cSMarri Devender Rao         }
48bf7c588cSMarri Devender Rao         catch (const InvalidCertificate& e)
49bf7c588cSMarri Devender Rao         {
50bf7c588cSMarri Devender Rao             report<InvalidCertificate>(
51bf7c588cSMarri Devender Rao                 Reason("Existing certificate file is corrupted"));
52bf7c588cSMarri Devender Rao         }
53bf7c588cSMarri Devender Rao     }
54dd74bd20SJayanth Othayoth }
55589159f2SJayanth Othayoth 
566ceec40bSMarri Devender Rao void Manager::install(const std::string filePath)
57cfbc8dc8SJayanth Othayoth {
58*1396511dSMarri Devender Rao     using NotAllowed =
59*1396511dSMarri Devender Rao         sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
60*1396511dSMarri Devender Rao     using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
61*1396511dSMarri Devender Rao     // TODO: Issue#3 At present supporting only one certificate to be
62*1396511dSMarri Devender Rao     // uploaded this need to be revisited to support multiple
63*1396511dSMarri Devender Rao     // certificates
64*1396511dSMarri Devender Rao     if (certificatePtr != nullptr)
65*1396511dSMarri Devender Rao     {
66*1396511dSMarri Devender Rao         elog<NotAllowed>(Reason("Certificate already exist"));
67*1396511dSMarri Devender Rao     }
68*1396511dSMarri Devender Rao     auto certObjectPath = objectPath + '/' + '1';
69*1396511dSMarri Devender Rao     certificatePtr =
70*1396511dSMarri Devender Rao         std::make_unique<Certificate>(bus, certObjectPath, certType,
71*1396511dSMarri Devender Rao                                       unitToRestart, certInstallPath, filePath);
72589159f2SJayanth Othayoth }
73ae70b3daSDeepak Kodihalli 
74ae70b3daSDeepak Kodihalli void Manager::delete_()
75ae70b3daSDeepak Kodihalli {
766ceec40bSMarri Devender Rao     // TODO: #Issue 4 when a certificate is deleted system auto generates
776ceec40bSMarri Devender Rao     // certificate file. At present we are not supporting creation of
786ceec40bSMarri Devender Rao     // certificate object for the auto-generated certificate file as
796ceec40bSMarri Devender Rao     // deletion if only applicable for REST server and Bmcweb does not allow
806ceec40bSMarri Devender Rao     // deletion of certificates
816ceec40bSMarri Devender Rao     if (certificatePtr != nullptr)
82ae70b3daSDeepak Kodihalli     {
836ceec40bSMarri Devender Rao         certificatePtr.reset(nullptr);
84ae70b3daSDeepak Kodihalli     }
85ae70b3daSDeepak Kodihalli }
86cfbc8dc8SJayanth Othayoth } // namespace certs
87cfbc8dc8SJayanth Othayoth } // namespace phosphor
88