| #ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_ROUTES_TRUST_BUNDLE_MANAGER_H_ |
| #define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_ROUTES_TRUST_BUNDLE_MANAGER_H_ |
| |
| #include <string> |
| |
| #include "absl/base/no_destructor.h" |
| #include "absl/base/thread_annotations.h" |
| #include "absl/functional/any_invocable.h" |
| #include "absl/status/status.h" |
| #include "absl/status/statusor.h" |
| #include "absl/strings/string_view.h" |
| #include "absl/synchronization/mutex.h" |
| #include "absl/time/time.h" |
| |
| namespace milotic_tlbmc::certificate_service { |
| |
| class TrustBundleManagerPeer; |
| |
| inline constexpr int kTrustBundleRestartDelaySeconds = 3; |
| // Add 1 second as buffer to make sure the restart is triggered after the delay |
| // but the grpc server is not restarted, so we allow retry to go through. |
| inline constexpr int kTrustBundleRetryDelaySeconds = |
| kTrustBundleRestartDelaySeconds + 1; |
| |
| class StagedTempFile { |
| public: |
| static absl::StatusOr<StagedTempFile> Create( |
| absl::string_view content, absl::string_view temp_name_template); |
| ~StagedTempFile(); |
| StagedTempFile(StagedTempFile&& other) noexcept; |
| StagedTempFile& operator=(StagedTempFile&& other) noexcept; |
| StagedTempFile(const StagedTempFile&) = delete; |
| StagedTempFile& operator=(const StagedTempFile&) = delete; |
| |
| const std::string& path() const { return path_; } |
| |
| private: |
| explicit StagedTempFile(absl::string_view path); |
| std::string path_; |
| }; |
| |
| absl::StatusOr<StagedTempFile> VerifyAndStageTrustBundle( |
| absl::string_view trust_bundle, absl::string_view signature, |
| absl::string_view ca_file_path); |
| |
| class TrustBundleManager { |
| public: |
| static TrustBundleManager& GetInstance() { |
| static absl::NoDestructor<TrustBundleManager> instance; |
| return *instance; |
| } |
| |
| absl::Status InstallTrustBundle(absl::string_view trust_bundle_blob, |
| absl::string_view signature); |
| |
| private: |
| friend class TrustBundleManagerPeer; |
| friend class absl::NoDestructor<TrustBundleManager>; |
| |
| TrustBundleManager() = default; |
| |
| // For testing only |
| void SetCaller(absl::AnyInvocable<int(const char*) const>&& caller); |
| |
| absl::Status RestartGrpcServer(absl::string_view staged_temp_file_path); |
| |
| absl::Mutex mutex_; |
| absl::Time last_install_time_ ABSL_GUARDED_BY(mutex_) = absl::InfinitePast(); |
| absl::AnyInvocable<int(const char*) const> system_caller_ = std::system; |
| }; |
| |
| } // namespace milotic_tlbmc::certificate_service |
| |
| #endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_REDFISH_ROUTES_TRUST_BUNDLE_MANAGER_H_ |