1
#include "source/common/secret/secret_provider_impl.h"
2

            
3
#include "envoy/extensions/transport_sockets/tls/v3/cert.pb.h"
4

            
5
#include "source/common/common/assert.h"
6
#include "source/common/config/datasource.h"
7
#include "source/common/ssl/certificate_validation_context_config_impl.h"
8
#include "source/common/ssl/tls_certificate_config_impl.h"
9

            
10
namespace Envoy {
11
namespace Secret {
12

            
13
absl::StatusOr<std::unique_ptr<ThreadLocalGenericSecretProvider>>
14
ThreadLocalGenericSecretProvider::create(GenericSecretConfigProviderSharedPtr&& provider,
15
118
                                         ThreadLocal::SlotAllocator& tls, Api::Api& api) {
16
118
  absl::Status creation_status = absl::OkStatus();
17
118
  auto ret = std::unique_ptr<ThreadLocalGenericSecretProvider>(
18
118
      new ThreadLocalGenericSecretProvider(std::move(provider), tls, api, creation_status));
19
118
  RETURN_IF_NOT_OK(creation_status);
20
118
  return ret;
21
118
}
22
ThreadLocalGenericSecretProvider::ThreadLocalGenericSecretProvider(
23
    GenericSecretConfigProviderSharedPtr&& provider, ThreadLocal::SlotAllocator& tls, Api::Api& api,
24
    absl::Status& creation_status)
25
118
    : provider_(provider), api_(api),
26
118
      tls_(std::make_unique<ThreadLocal::TypedSlot<ThreadLocalSecret>>(tls)),
27
133
      cb_(provider_->addUpdateCallback([this] { return update(); })) {
28
118
  std::string value;
29
118
  if (const auto* secret = provider_->secret(); secret != nullptr) {
30
32
    auto value_or_error = Config::DataSource::read(secret->secret(), true, api_);
31
32
    SET_AND_RETURN_IF_NOT_OK(value_or_error.status(), creation_status);
32
32
    value = std::move(value_or_error.value());
33
32
  }
34
216
  tls_->set([value = std::move(value)](Event::Dispatcher&) {
35
216
    return std::make_shared<ThreadLocalSecret>(value);
36
216
  });
37
118
}
38

            
39
350
const std::string& ThreadLocalGenericSecretProvider::secret() const { return (*tls_)->value_; }
40

            
41
// This function is executed on the main during xDS update.
42
103
absl::Status ThreadLocalGenericSecretProvider::update() {
43
103
  ASSERT_IS_MAIN_OR_TEST_THREAD();
44
103
  std::string value;
45
103
  if (const auto* secret = provider_->secret(); secret != nullptr) {
46
103
    auto value_or_error = Config::DataSource::read(secret->secret(), true, api_);
47
103
    RETURN_IF_NOT_OK_REF(value_or_error.status());
48
103
    value = std::move(value_or_error.value());
49
103
  }
50
103
  tls_->runOnAllThreads(
51
203
      [value = std::move(value)](OptRef<ThreadLocalSecret> tls) { tls->value_ = value; });
52
103
  return absl::OkStatus();
53
103
}
54

            
55
} // namespace Secret
56
} // namespace Envoy