1
#pragma once
2

            
3
#include "envoy/config/core/v3/grpc_service.pb.h"
4
#include "envoy/config/grpc_credential/v3/file_based_metadata.pb.h"
5
#include "envoy/grpc/google_grpc_creds.h"
6

            
7
#include "source/common/protobuf/protobuf.h"
8

            
9
namespace Envoy {
10
namespace Extensions {
11
namespace GrpcCredentials {
12
namespace FileBasedMetadata {
13

            
14
/**
15
 * File Based Metadata implementation of Google Grpc Credentials Factory
16
 * This implementation uses ssl creds for the grpc channel if available. Additionally, it uses
17
 * MetadataCredentialsFromPlugin to add a static secret that is loaded from a file. The header key
18
 * and header prefix are configurable.
19
 *
20
 * This implementation uses the from_plugin field in the call credentials config to get the filename
21
 * of where the secret is stored to add to the header.
22
 */
23
class FileBasedMetadataGrpcCredentialsFactory : public Grpc::GoogleGrpcCredentialsFactory {
24
public:
25
  std::shared_ptr<grpc::ChannelCredentials>
26
  getChannelCredentials(const envoy::config::core::v3::GrpcService& grpc_service_config,
27
                        Server::Configuration::CommonFactoryContext& context) override;
28

            
29
4
  Envoy::ProtobufTypes::MessagePtr createEmptyConfigProto() {
30
4
    return std::make_unique<envoy::config::grpc_credential::v3::FileBasedMetadataConfig>();
31
4
  }
32

            
33
4
  std::string name() const override { return "envoy.grpc_credentials.file_based_metadata"; }
34
};
35

            
36
class FileBasedMetadataAuthenticator : public grpc::MetadataCredentialsPlugin {
37
public:
38
  FileBasedMetadataAuthenticator(
39
      const envoy::config::grpc_credential::v3::FileBasedMetadataConfig& config, Api::Api& api)
40
5
      : config_(config), api_(api) {}
41

            
42
  grpc::Status GetMetadata(grpc::string_ref, grpc::string_ref, const grpc::AuthContext&,
43
                           std::multimap<grpc::string, grpc::string>* metadata) override;
44

            
45
private:
46
  const envoy::config::grpc_credential::v3::FileBasedMetadataConfig config_;
47
  Api::Api& api_;
48
};
49

            
50
} // namespace FileBasedMetadata
51
} // namespace GrpcCredentials
52
} // namespace Extensions
53
} // namespace Envoy