001/*
002 * Copyright 2011-2024 Ping Identity Corporation
003 * All Rights Reserved.
004 */
005/*
006 * Copyright 2011-2024 Ping Identity Corporation
007 *
008 * Licensed under the Apache License, Version 2.0 (the "License");
009 * you may not use this file except in compliance with the License.
010 * You may obtain a copy of the License at
011 *
012 *    http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing, software
015 * distributed under the License is distributed on an "AS IS" BASIS,
016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017 * See the License for the specific language governing permissions and
018 * limitations under the License.
019 */
020/*
021 * Copyright (C) 2011-2024 Ping Identity Corporation
022 *
023 * This program is free software; you can redistribute it and/or modify
024 * it under the terms of the GNU General Public License (GPLv2 only)
025 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
026 * as published by the Free Software Foundation.
027 *
028 * This program is distributed in the hope that it will be useful,
029 * but WITHOUT ANY WARRANTY; without even the implied warranty of
030 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
031 * GNU General Public License for more details.
032 *
033 * You should have received a copy of the GNU General Public License
034 * along with this program; if not, see <http://www.gnu.org/licenses>.
035 */
036package com.unboundid.ldap.listener;
037
038
039
040import java.net.InetAddress;
041import javax.net.SocketFactory;
042import javax.net.ServerSocketFactory;
043import javax.net.ssl.SSLSocketFactory;
044import javax.net.ssl.SSLServerSocketFactory;
045
046import com.unboundid.ldap.sdk.LDAPException;
047import com.unboundid.ldap.sdk.ResultCode;
048import com.unboundid.util.Debug;
049import com.unboundid.util.NotMutable;
050import com.unboundid.util.NotNull;
051import com.unboundid.util.Nullable;
052import com.unboundid.util.StaticUtils;
053import com.unboundid.util.ThreadSafety;
054import com.unboundid.util.ThreadSafetyLevel;
055import com.unboundid.util.ssl.SSLUtil;
056import com.unboundid.util.ssl.TrustAllTrustManager;
057
058import static com.unboundid.ldap.listener.ListenerMessages.*;
059
060
061
062/**
063 * This class provides a data structure that can be used to configure a
064 * listener for use in the in-memory directory server.  Each in-memory directory
065 * server instance has the ability to have multiple listeners, and those
066 * listeners may have different settings (e.g., listen on one port for
067 * unencrypted LDAP communication with optional support for StartTLS, and listen
068 * on a separate port for SSL-encrypted communication).  If the server is to
069 * provide support for SSL and/or StartTLS, then the {@link SSLUtil} class can
070 * make it easy to create the necessary socket factories.
071 */
072@NotMutable()
073@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
074public final class InMemoryListenerConfig
075{
076  // Indicates whether the listener should request that the client provide a
077  // certificate.
078  private final boolean requestClientCertificate;
079
080  // Indicates whether the listener should require that the client provide a
081  // certificate.
082  private final boolean requireClientCertificate;
083
084  // The address on which this listener should accept client connections.
085  @Nullable private final InetAddress listenAddress;
086
087  // The port on which this listener should accept client connections.
088  private final int listenPort;
089
090  // The socket factory that should be used for accepting new connections.
091  @Nullable private final ServerSocketFactory serverSocketFactory;
092
093  // The socket factory that should be used for creating client connections.
094  @Nullable private final SocketFactory clientSocketFactory;
095
096  // The socket factory that will be used to add StartTLS encryption to an
097  // existing connection.
098  @Nullable private final SSLSocketFactory startTLSSocketFactory;
099
100  // The used to refer to this listener.
101  @NotNull private final String listenerName;
102
103
104
105  /**
106   * Creates a new in-memory directory server listener configuration with the
107   * provided settings.
108   *
109   * @param  listenerName           The name to assign to this listener.  It
110   *                                must not be {@code null} and must not be the
111   *                                same as the name for any other listener
112   *                                configured in the server.
113   * @param  listenAddress          The address on which the listener should
114   *                                accept connections from clients.  It may be
115   *                                {@code null} to indicate that it should
116   *                                accept connections on all addresses on all
117   *                                interfaces.
118   * @param  listenPort             The port on which the listener should accept
119   *                                connections from clients.  It may be 0 to
120   *                                indicate that the server should
121   *                                automatically choose an available port.
122   * @param  serverSocketFactory    The socket factory that should be used to
123   *                                create sockets when accepting client
124   *                                connections.  It may be {@code null} if the
125   *                                JVM-default server socket factory should be
126   *                                used.
127   * @param  clientSocketFactory    The socket factory that should be used to
128   *                                create client connections to the server.  It
129   *                                may be {@code null} if the JVM-default
130   *                                socket factory should be used.
131   * @param  startTLSSocketFactory  The socket factory that should be used to
132   *                                add StartTLS encryption to existing
133   *                                connections.  It may be {@code null} if
134   *                                StartTLS is not to be supported on this
135   *                                listener, and should be {@code null} if the
136   *                                server socket factory already provides some
137   *                                other form of communication security.
138   *
139   * @throws  LDAPException  If the provided listener name is {@code null} or
140   *                         the configured listen port is out of range.
141   */
142  public InMemoryListenerConfig(@NotNull final String listenerName,
143              @Nullable final InetAddress listenAddress, final int listenPort,
144              @Nullable final ServerSocketFactory serverSocketFactory,
145              @Nullable final SocketFactory clientSocketFactory,
146              @Nullable final SSLSocketFactory startTLSSocketFactory)
147         throws LDAPException
148  {
149    this(listenerName, listenAddress, listenPort, serverSocketFactory,
150         clientSocketFactory, startTLSSocketFactory, false, false);
151  }
152
153
154
155  /**
156   * Creates a new in-memory directory server listener configuration with the
157   * provided settings.
158   *
159   * @param  listenerName              The name to assign to this listener.  It
160   *                                   must not be {@code null} and must not be
161   *                                   the same as the name for any other
162   *                                   listener configured in the server.
163   * @param  listenAddress             The address on which the listener should
164   *                                   accept connections from clients.  It may
165   *                                   be {@code null} to indicate that it
166   *                                   should accept connections on all
167   *                                   addresses on all interfaces.
168   * @param  listenPort                The port on which the listener should
169   *                                   accept connections from clients.  It may
170   *                                   be 0 to indicate that the server should
171   *                                   automatically choose an available port.
172   * @param  serverSocketFactory       The socket factory that should be used to
173   *                                   create sockets when accepting client
174   *                                   connections.  It may be {@code null} if
175   *                                   the JVM-default server socket factory
176   *                                   should be used.
177   * @param  clientSocketFactory       The socket factory that should be used to
178   *                                   create client connections to the server.
179   *                                   It may be {@code null} if the JVM-default
180   *                                   socket factory should be used.
181   * @param  startTLSSocketFactory     The socket factory that should be used to
182   *                                   add StartTLS encryption to existing
183   *                                   connections.  It may be {@code null} if
184   *                                   StartTLS is not to be supported on this
185   *                                   listener, and should be {@code null} if
186   *                                   the server socket factory already
187   *                                   provides some other form of communication
188   *                                   security.
189   * @param  requestClientCertificate  Indicates whether the listener should
190   *                                   request that the client present its own
191   *                                   certificate chain during TLS negotiation.
192   *                                   This will be ignored for non-TLS-based
193   *                                   connections.
194   * @param  requireClientCertificate  Indicates whether the listener should
195   *                                   require that the client present its own
196   *                                   certificate chain during TLS negotiation,
197   *                                   and should fail negotiation if the client
198   *                                   does not present one.  This will be
199   *                                   ignored for non-TLS-based connections or
200   *                                   if {@code requestClientCertificate} is
201   *                                   {@code false}.
202   *
203   * @throws  LDAPException  If the provided listener name is {@code null} or
204   *                         the configured listen port is out of range.
205   */
206  public InMemoryListenerConfig(@NotNull final String listenerName,
207              @Nullable final InetAddress listenAddress, final int listenPort,
208              @Nullable final ServerSocketFactory serverSocketFactory,
209              @Nullable final SocketFactory clientSocketFactory,
210              @Nullable final SSLSocketFactory startTLSSocketFactory,
211              final boolean requestClientCertificate,
212              final boolean requireClientCertificate)
213         throws LDAPException
214  {
215    if ((listenerName == null) || listenerName.isEmpty())
216    {
217      throw new LDAPException(ResultCode.PARAM_ERROR,
218           ERR_LISTENER_CFG_NO_NAME.get());
219    }
220
221    if ((listenPort < 0) || (listenPort > 65_535))
222    {
223      throw new LDAPException(ResultCode.PARAM_ERROR,
224           ERR_LISTENER_CFG_INVALID_PORT.get(listenPort));
225    }
226
227    this.listenerName             = listenerName;
228    this.listenAddress            = listenAddress;
229    this.listenPort               = listenPort;
230    this.serverSocketFactory      = serverSocketFactory;
231    this.clientSocketFactory      = clientSocketFactory;
232    this.startTLSSocketFactory    = startTLSSocketFactory;
233    this.requestClientCertificate = requestClientCertificate;
234    this.requireClientCertificate = requireClientCertificate;
235  }
236
237
238
239  /**
240   * Creates a new listener configuration that will listen for unencrypted LDAP
241   * communication on an automatically-selected port on all available addresses.
242   * It will not support StartTLS.
243   *
244   * @param  listenerName  The name to use for the listener.  It must not be
245   *                       {@code null}.
246   *
247   * @return  The newly-created listener configuration.
248   *
249   * @throws  LDAPException  If the provided name is {@code null}.
250   */
251  @NotNull()
252  public static InMemoryListenerConfig createLDAPConfig(
253                                            @NotNull final String listenerName)
254         throws LDAPException
255  {
256    return new InMemoryListenerConfig(listenerName, null, 0, null, null, null);
257  }
258
259
260
261  /**
262   * Creates a new listener configuration that will listen for unencrypted LDAP
263   * communication on the specified port on all available addresses.  It will
264   * not support StartTLS.
265   *
266   * @param  listenerName  The name to use for the listener.  It must not be
267   *                       {@code null}.
268   * @param  listenPort    The port on which the listener should accept
269   *                       connections from clients.  It may be 0 to indicate
270   *                       that the server should automatically choose an
271   *                       available port.
272   *
273   * @return  The newly-created listener configuration.
274   *
275   * @throws  LDAPException  If the provided listener name is {@code null} or
276   *                         the configured listen port is out of range.
277   */
278  @NotNull()
279  public static InMemoryListenerConfig createLDAPConfig(
280                                            @NotNull final String listenerName,
281                                            final int listenPort)
282         throws LDAPException
283  {
284    return new InMemoryListenerConfig(listenerName, null, listenPort, null,
285         null, null);
286  }
287
288
289
290  /**
291   * Creates a new listener configuration that will listen for unencrypted LDAP
292   * communication, and may optionally support StartTLS.
293   *
294   * @param  listenerName           The name to assign to this listener.  It
295   *                                must not be {@code null} and must not be the
296   *                                same as the name for any other listener
297   *                                configured in the server.
298   * @param  listenAddress          The address on which the listener should
299   *                                accept connections from clients.  It may be
300   *                                {@code null} to indicate that it should
301   *                                accept connections on all addresses on all
302   *                                interfaces.
303   * @param  listenPort             The port on which the listener should accept
304   *                                connections from clients.  It may be 0 to
305   *                                indicate that the server should
306   *                                automatically choose an available port.
307   * @param  startTLSSocketFactory  The socket factory that should be used to
308   *                                add StartTLS encryption to an existing
309   *                                connection.  It may be {@code null} if
310   *                                StartTLS is not to be supported on this
311   *                                listener, and should be {@code null} if the
312   *                                server socket factory already provides some
313   *                                other form of communication security.
314   *
315   * @return  The newly-created listener configuration.
316   *
317   * @throws  LDAPException  If the provided listener name is {@code null} or
318   *                         the configured listen port is out of range.
319   */
320  @NotNull()
321  public static InMemoryListenerConfig createLDAPConfig(
322                     @NotNull final String listenerName,
323                     @Nullable final InetAddress listenAddress,
324                     final int listenPort,
325                     @Nullable final SSLSocketFactory startTLSSocketFactory)
326         throws LDAPException
327  {
328    return createLDAPConfig(listenerName, listenAddress, listenPort,
329         startTLSSocketFactory, false, false);
330  }
331
332
333
334  /**
335   * Creates a new listener configuration that will listen for unencrypted LDAP
336   * communication, and may optionally support StartTLS.
337   *
338   * @param  listenerName              The name to assign to this listener.  It
339   *                                   must not be {@code null} and must not be
340   *                                   the same as the name for any other
341   *                                   listener configured in the server.
342   * @param  listenAddress             The address on which the listener should
343   *                                   accept connections from clients.  It may
344   *                                   be {@code null} to indicate that it
345   *                                   should accept connections on all
346   *                                   addresses on all interfaces.
347   * @param  listenPort                The port on which the listener should
348   *                                   accept connections from clients.  It may
349   *                                   be 0 to indicate that the server should
350   *                                   automatically choose an available port.
351   * @param  startTLSSocketFactory     The socket factory that should be used to
352   *                                   add StartTLS encryption to an existing
353   *                                   connection.  It may be {@code null} if
354   *                                   StartTLS is not to be supported on this
355   *                                   listener, and should be {@code null} if
356   *                                   the server socket factory already
357   *                                   provides some other form of communication
358   *                                   security.
359   * @param  requestClientCertificate  Indicates whether the listener should
360   *                                   request that the client present its own
361   *                                   certificate chain during TLS negotiation.
362   *                                   This will be ignored for non-TLS-based
363   *                                   connections.
364   * @param  requireClientCertificate  Indicates whether the listener should
365   *                                   require that the client present its own
366   *                                   certificate chain during TLS negotiation,
367   *                                   and should fail negotiation if the client
368   *                                   does not present one.  This will be
369   *                                   ignored for non-TLS-based connections or
370   *                                   if {@code requestClientCertificate} is
371   *                                   {@code false}.
372   *
373   * @return  The newly-created listener configuration.
374   *
375   * @throws  LDAPException  If the provided listener name is {@code null} or
376   *                         the configured listen port is out of range.
377   */
378  @NotNull()
379  public static InMemoryListenerConfig createLDAPConfig(
380                     @NotNull final String listenerName,
381                     @Nullable final InetAddress listenAddress,
382                     final int listenPort,
383                     @Nullable final SSLSocketFactory startTLSSocketFactory,
384                     final boolean requestClientCertificate,
385                     final boolean requireClientCertificate)
386         throws LDAPException
387  {
388    return new InMemoryListenerConfig(listenerName, listenAddress, listenPort,
389         null, null, startTLSSocketFactory, requestClientCertificate,
390         requireClientCertificate);
391  }
392
393
394
395  /**
396   * Creates a new listener configuration that will listen for SSL-encrypted
397   * LDAP communication on an automatically-selected port on all available
398   * addresses.
399   *
400   * @param  listenerName         The name to use for the listener.  It must not
401   *                              be {@code null}.
402   * @param  serverSocketFactory  The SSL server socket factory that will be
403   *                              used for accepting SSL-based connections from
404   *                              clients.  It must not be {@code null}.
405   *
406   * @return  The newly-created listener configuration.
407   *
408   * @throws  LDAPException  If the provided name is {@code null}.
409   */
410  @NotNull()
411  public static InMemoryListenerConfig createLDAPSConfig(
412                     @NotNull final String listenerName,
413                     @NotNull final SSLServerSocketFactory serverSocketFactory)
414         throws LDAPException
415  {
416    return createLDAPSConfig(listenerName, null, 0, serverSocketFactory, null);
417  }
418
419
420
421  /**
422   * Creates a new listener configuration that will listen for SSL-encrypted
423   * LDAP communication on the specified port on all available addresses.
424   *
425   * @param  listenerName         The name to use for the listener.  It must not
426   *                              be {@code null}.
427   * @param  listenPort           The port on which the listener should accept
428   *                              connections from clients.  It may be 0 to
429   *                              indicate that the server should
430   *                              automatically choose an available port.
431   * @param  serverSocketFactory  The SSL server socket factory that will be
432   *                              used for accepting SSL-based connections from
433   *                              clients.  It must not be {@code null}.
434   *
435   * @return  The newly-created listener configuration.
436   *
437   * @throws  LDAPException  If the provided name is {@code null}.
438   */
439  @NotNull()
440  public static InMemoryListenerConfig createLDAPSConfig(
441                     @NotNull final String listenerName, final int listenPort,
442                     @NotNull final SSLServerSocketFactory serverSocketFactory)
443         throws LDAPException
444  {
445    return createLDAPSConfig(listenerName, null, listenPort,
446         serverSocketFactory, null);
447  }
448
449
450
451  /**
452   * Creates a new listener configuration that will listen for SSL-encrypted
453   * LDAP communication on an automatically-selected port on all available
454   * addresses.
455   *
456   * @param  listenerName         The name to use for the listener.  It must not
457   *                              be {@code null}.
458   * @param  listenAddress        The address on which the listener should
459   *                              accept connections from clients.  It may be
460   *                              {@code null} to indicate that it should
461   *                              accept connections on all addresses on all
462   *                              interfaces.
463   * @param  listenPort           The port on which the listener should accept
464   *                              connections from clients.  It may be 0 to
465   *                              indicate that the server should
466   *                              automatically choose an available port.
467   * @param  serverSocketFactory  The SSL server socket factory that will be
468   *                              used for accepting SSL-based connections from
469   *                              clients.  It must not be {@code null}.
470   * @param  clientSocketFactory  The SSL socket factory that will be used to
471   *                              create secure connections to the server.  It
472   *                              may be {@code null} if a default "trust all"
473   *                              socket factory should be used.
474   *
475   * @return  The newly-created listener configuration.
476   *
477   * @throws  LDAPException  If the provided name or server socket factory is
478   *          {@code null}, or an error occurs while attempting to create a
479   *          client socket factory.
480   */
481  @NotNull()
482  public static InMemoryListenerConfig createLDAPSConfig(
483                     @NotNull final String listenerName,
484                     @Nullable final InetAddress listenAddress,
485                     final int listenPort,
486                     @NotNull final SSLServerSocketFactory serverSocketFactory,
487                     @Nullable final SSLSocketFactory clientSocketFactory)
488         throws LDAPException
489  {
490    return createLDAPSConfig(listenerName, listenAddress, listenPort,
491         serverSocketFactory, clientSocketFactory, false, false);
492  }
493
494
495
496  /**
497   * Creates a new listener configuration that will listen for SSL-encrypted
498   * LDAP communication on an automatically-selected port on all available
499   * addresses.
500   *
501   * @param  listenerName              The name to use for the listener.  It
502   *                                   must not be {@code null}.
503   * @param  listenAddress             The address on which the listener should
504   *                                   accept connections from clients.  It may
505   *                                   be  {@code null} to indicate that it
506   *                                   should accept connections on all
507   *                                   addresses on all interfaces.
508   * @param  listenPort                The port on which the listener should
509   *                                   accept connections from clients.  It may
510   *                                   be 0 to indicate that the server should
511   *                                   automatically choose an available port.
512   * @param  serverSocketFactory       The SSL server socket factory that will
513   *                                   be used for accepting SSL-based
514   *                                   connections from clients.  It must not be
515   *                                   {@code null}.
516   * @param  clientSocketFactory       The SSL socket factory that will be used
517   *                                   to create secure connections to the
518   *                                   server.  It may be {@code null} if a
519   *                                   default "trust all" socket factory should
520   *                                   be used.
521   * @param  requestClientCertificate  Indicates whether the listener should
522   *                                   request that the client present its own
523   *                                   certificate chain during TLS negotiation.
524   *                                   This will be ignored for non-TLS-based
525   *                                   connections.
526   * @param  requireClientCertificate  Indicates whether the listener should
527   *                                   require that the client present its own
528   *                                   certificate chain during TLS negotiation,
529   *                                   and should fail negotiation if the client
530   *                                   does not present one.  This will be
531   *                                   ignored for non-TLS-based connections or
532   *                                   if {@code requestClientCertificate} is
533   *                                   {@code false}.
534   *
535   * @return  The newly-created listener configuration.
536   *
537   * @throws  LDAPException  If the provided name or server socket factory is
538   *          {@code null}, or an error occurs while attempting to create a
539   *          client socket factory.
540   */
541  @NotNull()
542  public static InMemoryListenerConfig createLDAPSConfig(
543                     @NotNull final String listenerName,
544                     @Nullable final InetAddress listenAddress,
545                     final int listenPort,
546                     @NotNull final SSLServerSocketFactory serverSocketFactory,
547                     @Nullable final SSLSocketFactory clientSocketFactory,
548                     final boolean requestClientCertificate,
549                     final boolean requireClientCertificate)
550         throws LDAPException
551  {
552    if (serverSocketFactory == null)
553    {
554      throw new LDAPException(ResultCode.PARAM_ERROR,
555           ERR_LISTENER_CFG_NO_SSL_SERVER_SOCKET_FACTORY.get());
556    }
557
558    final SSLSocketFactory clientFactory;
559    if (clientSocketFactory == null)
560    {
561      try
562      {
563        final SSLUtil sslUtil = new SSLUtil(new TrustAllTrustManager());
564        clientFactory = sslUtil.createSSLSocketFactory();
565      }
566      catch (final Exception e)
567      {
568        Debug.debugException(e);
569        throw new LDAPException(ResultCode.LOCAL_ERROR,
570             ERR_LISTENER_CFG_COULD_NOT_CREATE_SSL_SOCKET_FACTORY.get(
571                  StaticUtils.getExceptionMessage(e)),
572             e);
573      }
574    }
575    else
576    {
577      clientFactory = clientSocketFactory;
578    }
579
580    return new InMemoryListenerConfig(listenerName, listenAddress, listenPort,
581         serverSocketFactory, clientFactory, null, requestClientCertificate,
582         requireClientCertificate);
583  }
584
585
586
587  /**
588   * Retrieves the name for this listener configuration.
589   *
590   * @return  The name for this listener configuration.
591   */
592  @NotNull()
593  public String getListenerName()
594  {
595    return listenerName;
596  }
597
598
599
600  /**
601   * Retrieves the address on which the listener should accept connections from
602   * clients, if defined.
603   *
604   * @return  The address on which the listener should accept connections from
605   *          clients, or {@code null} if it should accept connections on all
606   *          addresses on all interfaces.
607   */
608  @Nullable()
609  public InetAddress getListenAddress()
610  {
611    return listenAddress;
612  }
613
614
615
616  /**
617   * Retrieves the port on which the listener should accept connections from
618   * clients, if defined.
619   *
620   * @return  The port on which the listener should accept connections from
621   *          clients, or 0 if the listener should automatically select an
622   *          available port.
623   */
624  public int getListenPort()
625  {
626    return listenPort;
627  }
628
629
630
631  /**
632   * Retrieves the socket factory that should be used to create sockets when
633   * accepting client connections, if defined.
634   *
635   * @return  The socket factory that should be used to create sockets when
636   *          accepting client connections, or {@code null} if the JVM-default
637   *          server socket factory should be used.
638   */
639  @Nullable()
640  public ServerSocketFactory getServerSocketFactory()
641  {
642    return serverSocketFactory;
643  }
644
645
646
647  /**
648   * Retrieves the socket factory that should be used to create client
649   * connections to the server, if defined.
650   *
651   * @return  The socket factory that should be used to create client
652   *          connections to the server, or {@code null} if the JVM-default
653   *          socket factory should be used.
654   */
655  @Nullable()
656  public SocketFactory getClientSocketFactory()
657  {
658    return clientSocketFactory;
659  }
660
661
662
663  /**
664   * Retrieves the socket factory that should be used to add StartTLS encryption
665   * to existing connections, if defined.
666   *
667   * @return  The socket factory that should be used to add StartTLS encryption
668   *          to existing connections, or {@code null} if StartTLS should not be
669   *          supported.
670   */
671  @Nullable()
672  public SSLSocketFactory getStartTLSSocketFactory()
673  {
674    return startTLSSocketFactory;
675  }
676
677
678
679  /**
680   * Indicates whether the listener should request that the client present its
681   * own certificate chain during TLS negotiation.  This will be ignored for
682   * non-TLS-based connections.
683   *
684   * @return  {@code true} if the listener should request that the client
685   *          present its own certificate chain during TLS negotiation, or
686   *          {@code false} if not.
687   */
688  public boolean requestClientCertificate()
689  {
690    return requestClientCertificate;
691  }
692
693
694
695  /**
696   * Indicates whether the listener should require that the client present its
697   * own certificate chain during TLS negotiation and should fail negotiation
698   * if no certificate chain was provided.  This will be ignored for
699   * non-TLS-based connections, and it will also be ignored if
700   * {@link #requestClientCertificate} returns false.
701   *
702   * @return  {@code true} if the listener should require that the client
703   *          present its own certificate chain during TLS negotiation, or
704   *          {@code false} if TLS negotiation should continue even if the
705   *          client did not present a certificate chain when requested.
706   */
707  public boolean requireClientCertificate()
708  {
709    return requireClientCertificate;
710  }
711
712
713
714  /**
715   * Retrieves a string representation of this listener configuration.
716   *
717   * @return  A string representation of this listener configuration.
718   */
719  @Override()
720  @NotNull()
721  public String toString()
722  {
723    final StringBuilder buffer = new StringBuilder();
724    toString(buffer);
725    return buffer.toString();
726  }
727
728
729
730  /**
731   * Appends a string representation of this listener configuration to the
732   * provided buffer.
733   *
734   * @param  buffer  The buffer to which the information should be appended.
735   */
736  public void toString(@NotNull final StringBuilder buffer)
737  {
738    buffer.append("InMemoryListenerConfig(name='");
739    buffer.append(listenerName);
740    buffer.append('\'');
741
742    if (listenAddress != null)
743    {
744      buffer.append(", listenAddress='");
745      buffer.append(listenAddress.getHostAddress());
746      buffer.append('\'');
747    }
748
749    buffer.append(", listenPort=");
750    buffer.append(listenPort);
751
752    if (serverSocketFactory != null)
753    {
754      buffer.append(", serverSocketFactoryClass='");
755      buffer.append(serverSocketFactory.getClass().getName());
756      buffer.append('\'');
757    }
758
759    if (clientSocketFactory != null)
760    {
761      buffer.append(", clientSocketFactoryClass='");
762      buffer.append(clientSocketFactory.getClass().getName());
763      buffer.append('\'');
764    }
765
766    if (startTLSSocketFactory != null)
767    {
768      buffer.append(", startTLSSocketFactoryClass='");
769      buffer.append(startTLSSocketFactory.getClass().getName());
770      buffer.append('\'');
771    }
772
773    buffer.append(", requestClientCertificate=");
774    buffer.append(requestClientCertificate);
775    buffer.append(", requireClientCertificate=");
776    buffer.append(requireClientCertificate);
777
778    buffer.append(')');
779  }
780}