@@ -44,6 +44,59 @@ pub enum KafkaListenerName {
4444 Bootstrap ,
4545 #[ strum( serialize = "CONTROLLER" ) ]
4646 Controller ,
47+ #[ strum( serialize = "CONTROLLER_AUTH" ) ]
48+ ControllerAuth ,
49+ }
50+
51+ impl KafkaListenerName {
52+ pub fn listener_ssl_keystore_location ( & self ) -> String {
53+ format ! (
54+ "listener.name.{listener_name}.ssl.keystore.location" ,
55+ listener_name = self . to_string( ) . to_lowercase( )
56+ )
57+ }
58+
59+ pub fn listener_ssl_keystore_password ( & self ) -> String {
60+ format ! (
61+ "listener.name.{listener_name}.ssl.keystore.password" ,
62+ listener_name = self . to_string( ) . to_lowercase( )
63+ )
64+ }
65+
66+ pub fn listener_ssl_keystore_type ( & self ) -> String {
67+ format ! (
68+ "listener.name.{listener_name}.ssl.keystore.type" ,
69+ listener_name = self . to_string( ) . to_lowercase( )
70+ )
71+ }
72+
73+ pub fn listener_ssl_truststore_location ( & self ) -> String {
74+ format ! (
75+ "listener.name.{listener_name}.ssl.truststore.location" ,
76+ listener_name = self . to_string( ) . to_lowercase( )
77+ )
78+ }
79+
80+ pub fn listener_ssl_truststore_password ( & self ) -> String {
81+ format ! (
82+ "listener.name.{listener_name}.ssl.truststore.password" ,
83+ listener_name = self . to_string( ) . to_lowercase( )
84+ )
85+ }
86+
87+ pub fn listener_ssl_truststore_type ( & self ) -> String {
88+ format ! (
89+ "listener.name.{listener_name}.ssl.truststore.type" ,
90+ listener_name = self . to_string( ) . to_lowercase( )
91+ )
92+ }
93+
94+ pub fn listener_ssl_client_auth ( & self ) -> String {
95+ format ! (
96+ "listener.name.{listener_name}.ssl.client.auth" ,
97+ listener_name = self . to_string( ) . to_lowercase( )
98+ )
99+ }
47100}
48101
49102#[ derive( Debug ) ]
@@ -82,6 +135,16 @@ impl KafkaListenerConfig {
82135 . collect :: < Vec < String > > ( )
83136 . join ( "," )
84137 }
138+
139+ /// Returns the `listener.security.protocol.map` for the Kafka `broker.properties` config.
140+ pub fn listener_security_protocol_map_for_listener (
141+ & self ,
142+ listener_name : & KafkaListenerName ,
143+ ) -> Option < String > {
144+ self . listener_security_protocol_map
145+ . get ( listener_name)
146+ . map ( |protocol| format ! ( "{listener_name}:{protocol}" ) )
147+ }
85148}
86149
87150#[ derive( Debug ) ]
@@ -127,6 +190,10 @@ pub fn get_kafka_listener_config(
127190 } ) ;
128191 listener_security_protocol_map
129192 . insert ( KafkaListenerName :: ClientAuth , KafkaListenerProtocol :: Ssl ) ;
193+ listener_security_protocol_map. insert (
194+ KafkaListenerName :: ControllerAuth ,
195+ KafkaListenerProtocol :: Ssl ,
196+ ) ;
130197 } else if kafka_security. has_kerberos_enabled ( ) {
131198 // 2) Kerberos and TLS authentication classes are mutually exclusive
132199 listeners. push ( KafkaListener {
@@ -144,6 +211,10 @@ pub fn get_kafka_listener_config(
144211 } ) ;
145212 listener_security_protocol_map
146213 . insert ( KafkaListenerName :: Client , KafkaListenerProtocol :: SaslSsl ) ;
214+ listener_security_protocol_map. insert (
215+ KafkaListenerName :: Controller ,
216+ KafkaListenerProtocol :: SaslSsl ,
217+ ) ;
147218 } else if kafka_security. tls_server_secret_class ( ) . is_some ( ) {
148219 // 3) If no client authentication but tls is required we expose CLIENT with SSL
149220 listeners. push ( KafkaListener {
@@ -180,7 +251,7 @@ pub fn get_kafka_listener_config(
180251 . insert ( KafkaListenerName :: Client , KafkaListenerProtocol :: Plaintext ) ;
181252 }
182253
183- // INTERNAL
254+ // INTERNAL / CONTROLLER
184255 if kafka_security. has_kerberos_enabled ( ) || kafka_security. tls_internal_secret_class ( ) . is_some ( )
185256 {
186257 // 5) & 6) Kerberos and TLS authentication classes are mutually exclusive but both require internal tls to be used
@@ -196,6 +267,8 @@ pub fn get_kafka_listener_config(
196267 } ) ;
197268 listener_security_protocol_map
198269 . insert ( KafkaListenerName :: Internal , KafkaListenerProtocol :: Ssl ) ;
270+ listener_security_protocol_map
271+ . insert ( KafkaListenerName :: Controller , KafkaListenerProtocol :: Ssl ) ;
199272 } else {
200273 // 7) If no internal tls is required we expose INTERNAL as PLAINTEXT
201274 listeners. push ( KafkaListener {
@@ -212,6 +285,10 @@ pub fn get_kafka_listener_config(
212285 KafkaListenerName :: Internal ,
213286 KafkaListenerProtocol :: Plaintext ,
214287 ) ;
288+ listener_security_protocol_map. insert (
289+ KafkaListenerName :: Controller ,
290+ KafkaListenerProtocol :: Plaintext ,
291+ ) ;
215292 }
216293
217294 // BOOTSTRAP
@@ -233,15 +310,6 @@ pub fn get_kafka_listener_config(
233310 . insert ( KafkaListenerName :: Bootstrap , KafkaListenerProtocol :: SaslSsl ) ;
234311 }
235312
236- // CONTROLLER
237- if kafka. is_controller_configured ( ) {
238- // TODO: SSL?
239- listener_security_protocol_map. insert (
240- KafkaListenerName :: Controller ,
241- KafkaListenerProtocol :: Plaintext ,
242- ) ;
243- }
244-
245313 Ok ( KafkaListenerConfig {
246314 listeners,
247315 advertised_listeners,
0 commit comments