Lines
100 %
Functions
#include "source/common/secret/secret_provider_impl.h"
#include "envoy/extensions/transport_sockets/tls/v3/cert.pb.h"
#include "source/common/common/assert.h"
#include "source/common/config/datasource.h"
#include "source/common/ssl/certificate_validation_context_config_impl.h"
#include "source/common/ssl/tls_certificate_config_impl.h"
namespace Envoy {
namespace Secret {
absl::StatusOr<std::unique_ptr<ThreadLocalGenericSecretProvider>>
ThreadLocalGenericSecretProvider::create(GenericSecretConfigProviderSharedPtr&& provider,
ThreadLocal::SlotAllocator& tls, Api::Api& api) {
absl::Status creation_status = absl::OkStatus();
auto ret = std::unique_ptr<ThreadLocalGenericSecretProvider>(
new ThreadLocalGenericSecretProvider(std::move(provider), tls, api, creation_status));
RETURN_IF_NOT_OK(creation_status);
return ret;
}
ThreadLocalGenericSecretProvider::ThreadLocalGenericSecretProvider(
GenericSecretConfigProviderSharedPtr&& provider, ThreadLocal::SlotAllocator& tls, Api::Api& api,
absl::Status& creation_status)
: provider_(provider), api_(api),
tls_(std::make_unique<ThreadLocal::TypedSlot<ThreadLocalSecret>>(tls)),
cb_(provider_->addUpdateCallback([this] { return update(); })) {
std::string value;
if (const auto* secret = provider_->secret(); secret != nullptr) {
auto value_or_error = Config::DataSource::read(secret->secret(), true, api_);
SET_AND_RETURN_IF_NOT_OK(value_or_error.status(), creation_status);
value = std::move(value_or_error.value());
tls_->set([value = std::move(value)](Event::Dispatcher&) {
return std::make_shared<ThreadLocalSecret>(value);
});
const std::string& ThreadLocalGenericSecretProvider::secret() const { return (*tls_)->value_; }
// This function is executed on the main during xDS update.
absl::Status ThreadLocalGenericSecretProvider::update() {
ASSERT_IS_MAIN_OR_TEST_THREAD();
RETURN_IF_NOT_OK_REF(value_or_error.status());
tls_->runOnAllThreads(
[value = std::move(value)](OptRef<ThreadLocalSecret> tls) { tls->value_ = value; });
return absl::OkStatus();
} // namespace Secret
} // namespace Envoy