1
#include "source/extensions/http/injected_credentials/oauth2/config.h"
2

            
3
#include "envoy/secret/secret_manager.h"
4
#include "envoy/secret/secret_provider.h"
5
#include "envoy/upstream/cluster_manager.h"
6

            
7
namespace Envoy {
8
namespace Extensions {
9
namespace Http {
10
namespace InjectedCredentials {
11
namespace OAuth2 {
12

            
13
namespace {
14
Secret::GenericSecretConfigProviderSharedPtr
15
secretsProvider(const envoy::extensions::transport_sockets::tls::v3::SdsSecretConfig& config,
16
                Server::Configuration::ServerFactoryContext& server_context,
17
25
                Init::Manager& init_manager) {
18
25
  if (config.has_sds_config()) {
19
22
    return server_context.secretManager().findOrCreateGenericSecretProvider(
20
22
        config.sds_config(), config.name(), server_context, init_manager);
21
23
  } else {
22
3
    return server_context.secretManager().findStaticGenericSecretProvider(config.name());
23
3
  }
24
25
}
25
} // namespace
26

            
27
Common::CredentialInjectorSharedPtr
28
OAuth2CredentialInjectorFactory::createCredentialInjectorFromProtoTyped(
29
    const OAuth2& config, const std::string& stats_prefix,
30
25
    Server::Configuration::ServerFactoryContext& context, Init::Manager& init_manager) {
31

            
32
25
  switch (config.flow_type_case()) {
33
24
  case envoy::extensions::http::injected_credentials::oauth2::v3::OAuth2::FlowTypeCase::
34
24
      kClientCredentials:
35
24
    return createOauth2ClientCredentialInjector(config, stats_prefix, context, init_manager);
36
1
  case envoy::extensions::http::injected_credentials::oauth2::v3::OAuth2::FlowTypeCase::
37
1
      FLOW_TYPE_NOT_SET:
38
1
    throw EnvoyException("OAuth2 flow type not set");
39
25
  }
40
  return nullptr;
41
25
}
42

            
43
Common::CredentialInjectorSharedPtr
44
OAuth2CredentialInjectorFactory::createOauth2ClientCredentialInjector(
45
    const OAuth2& proto_config, const std::string& stats_prefix,
46
25
    Server::Configuration::ServerFactoryContext& context, Init::Manager& init_manager) {
47
25
  auto& cluster_manager = context.clusterManager();
48

            
49
25
  const auto& client_secret_secret = proto_config.client_credentials().client_secret();
50

            
51
25
  auto client_secret_provider = secretsProvider(client_secret_secret, context, init_manager);
52
25
  if (client_secret_provider == nullptr) {
53
1
    throw EnvoyException("Invalid oauth2 client secret configuration");
54
1
  }
55

            
56
24
  auto secret_reader = std::make_shared<const Common::SDSSecretReader>(
57
24
      std::move(client_secret_provider), context.threadLocal(), context.api());
58
24
  auto token_reader = std::make_shared<const TokenProvider>(
59
24
      secret_reader, context.threadLocal(), cluster_manager, proto_config,
60
24
      context.mainThreadDispatcher(), stats_prefix, context.scope());
61

            
62
24
  return std::make_shared<OAuth2ClientCredentialTokenInjector>(token_reader);
63
25
}
64

            
65
/**
66
 * Static registration for the OAuth2 client credentials injector. @see
67
 * NamedCredentialInjectorConfigFactory.
68
 */
69
REGISTER_FACTORY(
70
    OAuth2CredentialInjectorFactory,
71
    Envoy::Extensions::Http::InjectedCredentials::Common::NamedCredentialInjectorConfigFactory);
72

            
73
} // namespace OAuth2
74
} // namespace InjectedCredentials
75
} // namespace Http
76
} // namespace Extensions
77
} // namespace Envoy