1
#pragma once
2

            
3
#include <cstdint>
4
#include <string>
5

            
6
#include "envoy/network/connection.h"
7
#include "envoy/network/transport_socket.h"
8
#include "envoy/secret/secret_callbacks.h"
9
#include "envoy/ssl/handshaker.h"
10
#include "envoy/ssl/private_key/private_key_callbacks.h"
11
#include "envoy/ssl/ssl_socket_extended_info.h"
12
#include "envoy/ssl/ssl_socket_state.h"
13
#include "envoy/stats/scope.h"
14
#include "envoy/stats/stats_macros.h"
15

            
16
#include "source/common/common/logger.h"
17
#include "source/common/network/transport_socket_options_impl.h"
18
#include "source/common/tls/context_impl.h"
19
#include "source/common/tls/ssl_handshaker.h"
20
#include "source/common/tls/ssl_socket.h"
21
#include "source/common/tls/utility.h"
22

            
23
#include "absl/container/node_hash_map.h"
24
#include "absl/synchronization/mutex.h"
25
#include "absl/types/optional.h"
26
#include "openssl/ssl.h"
27

            
28
namespace Envoy {
29
namespace Extensions {
30
namespace TransportSockets {
31
namespace Tls {
32

            
33
class ServerSslSocketFactory : public Network::DownstreamTransportSocketFactory,
34
                               public Secret::SecretCallbacks,
35
                               Logger::Loggable<Logger::Id::config> {
36
public:
37
  static absl::StatusOr<std::unique_ptr<ServerSslSocketFactory>>
38
  create(Envoy::Ssl::ServerContextConfigPtr config, Envoy::Ssl::ContextManager& manager,
39
         Stats::Scope& stats_scope);
40

            
41
  ~ServerSslSocketFactory() override;
42

            
43
  Network::TransportSocketPtr createDownstreamTransportSocket() const override;
44
  bool implementsSecureTransport() const override;
45

            
46
  // Secret::SecretCallbacks
47
  absl::Status onAddOrUpdateSecret() override;
48

            
49
protected:
50
  ServerSslSocketFactory(Envoy::Ssl::ServerContextConfigPtr config,
51
                         Envoy::Ssl::ContextManager& manager, Stats::Scope& stats_scope,
52
                         absl::Status& creation_status);
53

            
54
private:
55
  Ssl::ContextManager& manager_;
56
  Stats::Scope& stats_scope_;
57
  SslSocketFactoryStats stats_;
58
  Envoy::Ssl::ServerContextConfigPtr config_;
59
  mutable absl::Mutex ssl_ctx_mu_;
60
  Envoy::Ssl::ServerContextSharedPtr ssl_ctx_ ABSL_GUARDED_BY(ssl_ctx_mu_);
61
};
62

            
63
} // namespace Tls
64
} // namespace TransportSockets
65
} // namespace Extensions
66
} // namespace Envoy