001/*
002 * Copyright 2022-2024 Ping Identity Corporation
003 * All Rights Reserved.
004 */
005/*
006 * Copyright 2022-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) 2022-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.sdk.unboundidds;
037
038
039
040import java.io.File;
041import java.io.Serializable;
042import java.util.concurrent.TimeUnit;
043
044import com.unboundid.util.Mutable;
045import com.unboundid.util.NotNull;
046import com.unboundid.util.ThreadSafety;
047import com.unboundid.util.ThreadSafetyLevel;
048import com.unboundid.util.Validator;
049
050
051
052/**
053 * This class defines a number of configuration properties that may be used by
054 * the {@link TopologyRegistryTrustManager}.
055 * <BR>
056 * <BLOCKQUOTE>
057 *   <B>NOTE:</B>  This class, and other classes within the
058 *   {@code com.unboundid.ldap.sdk.unboundidds} package structure, are only
059 *   supported for use against Ping Identity, UnboundID, and
060 *   Nokia/Alcatel-Lucent 8661 server products.  These classes provide support
061 *   for proprietary functionality or for external specifications that are not
062 *   considered stable or mature enough to be guaranteed to work in an
063 *   interoperable way with other types of LDAP servers.
064 * </BLOCKQUOTE>
065 */
066@Mutable()
067@ThreadSafety(level=ThreadSafetyLevel.NOT_THREADSAFE)
068public final class TopologyRegistryTrustManagerProperties
069       implements Serializable
070{
071  /**
072   * The default cache duration in milliseconds.
073   */
074  private static final long DEFAULT_CACHE_DURATION_MILLIS =
075       TimeUnit.MINUTES.toMillis(5L);
076
077
078
079  /**
080   * The serial version UID for this serializable class.
081   */
082  private static final long serialVersionUID = -4753111539481801666L;
083
084
085
086  // Indicates whether to ignore the validity window for issuer certificates
087  // when determining whether to trust a certificate chain.
088  private boolean ignoreIssuerCertificateValidityWindow;
089
090  // Indicates whether to ignore the validity window for the peer certificate
091  // when determining whether to trust a certificate chain.
092  private boolean ignorePeerCertificateValidityWindow;
093
094  // Indicates whether to require the peer certificate itself to be included in
095  // the topology registry for a certificate chain to be trusted.
096  private boolean requirePeerCertificateInTopologyRegistry;
097
098  // The server configuration file from which the topology registry certificates
099  // will be read.
100  @NotNull private File configurationFile;
101
102  // The maximum length of time in milliseconds that previously loaded
103  // certificates may be cached.
104  private long cacheDurationMillis;
105
106
107
108  /**
109   * Creates a new topology registry trust manager properties object with the
110   * specified configuration file and the default settings for all other
111   * properties.  Default settings include:
112   * <UL>
113   *   <LI>cacheDurationMillis -- 300,000 (five minutes)</LI>
114   *   <LI>requirePeerCertificateInTopologyRegistry -- false</LI>
115   *   <LI>ignorePeerCertificateValidityWindow -- false</LI>
116   *   <LI>ignoreIssuerCertificateValidityWindow -- false</LI>
117   * </UL>
118   *
119   * @param  configurationFilePath  The path to the server configuration file
120   *                                from which the topology registry
121   *                                certificates will be read.  It must not be
122   *                                {@code null}, and the file must exist.
123   */
124  public TopologyRegistryTrustManagerProperties(
125              @NotNull final String configurationFilePath)
126  {
127    this(new File(configurationFilePath));
128  }
129
130
131
132  /**
133   * Creates a new topology registry trust manager properties object with the
134   * specified configuration file and the default settings for all other
135   * properties.  Default settings include:
136   * <UL>
137   *   <LI>cacheDurationMillis -- 300,000 (five minutes)</LI>
138   *   <LI>requirePeerCertificateInTopologyRegistry -- false</LI>
139   *   <LI>ignorePeerCertificateValidityWindow -- false</LI>
140   *   <LI>ignoreIssuerCertificateValidityWindow -- false</LI>
141   * </UL>
142   *
143   * @param  configurationFile  The server configuration file from which the
144   *                            topology registry certificates will be read.  It
145   *                            must not be {@code null}, and the file must
146   *                            exist.
147   */
148  public TopologyRegistryTrustManagerProperties(
149              @NotNull final File configurationFile)
150  {
151    Validator.ensureNotNull(configurationFile,
152         "TopologyRegistryTrustManagerProperties.configurationFile must not " +
153              "be null.");
154
155    this.configurationFile = configurationFile;
156
157    cacheDurationMillis = DEFAULT_CACHE_DURATION_MILLIS;
158    requirePeerCertificateInTopologyRegistry = false;
159    ignorePeerCertificateValidityWindow = false;
160    ignoreIssuerCertificateValidityWindow = false;
161  }
162
163
164
165  /**
166   * Retrieves the server configuration file from which the topology registry
167   * certificates will be read.
168   *
169   * @return  The server configuration file from which the topology registry
170   *          certificates will be read.
171   */
172  @NotNull()
173  public File getConfigurationFile()
174  {
175    return configurationFile;
176  }
177
178
179
180  /**
181   * Specifies the server configuration file from which the topology registry
182   * certificates will be read.
183   *
184   * @param  configurationFile  The server configuration file from which the
185   *                            topology registry certificates will be read.  It
186   *                            must not be {@code null}, and the file must
187   *                            exist.
188   */
189  public void setConfigurationFile(@NotNull final File configurationFile)
190  {
191    Validator.ensureNotNull(configurationFile,
192         "TopologyRegistryTrustManagerProperties.configurationFile must not " +
193              "be null.");
194
195    this.configurationFile = configurationFile;
196  }
197
198
199
200  /**
201   * Retrieves the maximum length of time in milliseconds that cached topology
202   * registry information should be considered valid.
203   *
204   * @return  The maximum length of time in milliseconds that cached topology
205   *          registry information should be considered valid, or zero if
206   *          topology registry information should not be cached.
207   */
208  public long getCacheDurationMillis()
209  {
210    return cacheDurationMillis;
211  }
212
213
214
215  /**
216   * Specifies the maximum length of time that cached topology registry
217   * information should be considered valid.
218   *
219   * @param  cacheDurationValue     The cache duration value to use with the
220   *                                given time unit.  If this is less than or
221   *                                equal to zero, then topology registry
222   *                                information will not be cached.
223   * @param  cacheDurationTimeUnit  The time unit to use with the given value.
224   *                                It must not be {@code null}.
225   */
226  public void setCacheDuration(final long cacheDurationValue,
227                               @NotNull final TimeUnit cacheDurationTimeUnit)
228  {
229    Validator.ensureNotNullWithMessage(cacheDurationTimeUnit,
230         "TopologyRegistryTrustManagerProperties.setCacheDuration." +
231              "cacheDurationTimeUnit must not be null.");
232
233    if (cacheDurationValue <= 0L)
234    {
235      cacheDurationMillis = 0L;
236    }
237    else
238    {
239      cacheDurationMillis = cacheDurationTimeUnit.toMillis(cacheDurationValue);
240    }
241  }
242
243
244
245  /**
246   * Indicates whether to require the peer certificate itself to be included in
247   * the topology registry for a certificate chain to be trusted.
248   *
249   * @return  {@code true} if a certificate chain may only be trusted if the
250   *          topology registry includes the peer certificate itself, or
251   *          {@code false} if a certificate chain may be trusted if the
252   *          topology registry contains the peer certificate or any of its
253   *          issuers.
254   */
255  public boolean requirePeerCertificateInTopologyRegistry()
256  {
257    return requirePeerCertificateInTopologyRegistry;
258  }
259
260
261
262  /**
263   * Specifies whether to require the peer certificate itself to be included in
264   * the topology registry for a certificate chain to be trusted.
265   *
266   * @param  requirePeerCertificateInTopologyRegistry
267   *              Indicates whether to require the peer certificate itself to be
268   *              included in the topology registry for a certificate chain to
269   *              be trusted.  If this is {@code true}, then a certificate chain
270   *              may be trusted only if the topology registry contains the
271   *              peer certificate itself.  If this is {@code false}, then a
272   *              certificate chain may be trusted if the topology registry
273   *              contains the peer certificate or any of its issuers.
274   */
275  public void setRequirePeerCertificateInTopologyRegistry(
276                   final boolean requirePeerCertificateInTopologyRegistry)
277  {
278    this.requirePeerCertificateInTopologyRegistry =
279         requirePeerCertificateInTopologyRegistry;
280  }
281
282
283
284  /**
285   * Indicates whether to ignore the validity window for the peer certificate
286   * when determining whether to trust a certificate chain.
287   *
288   * @return  {@code true} if a certificate chain may be considered trusted
289   *          even if the current time is outside the peer certificate's
290   *          validity window, or {@code false} if a certificate chain may only
291   *          be considered trusted if the current time is between the
292   *          {@code notBefore} and {@code notAfter} timestamps for the peer
293   *          certificate.
294   */
295  public boolean ignorePeerCertificateValidityWindow()
296  {
297    return ignorePeerCertificateValidityWindow;
298  }
299
300
301
302  /**
303   * Indicates whether to ignore the validity window for the peer certificate
304   * when determining whether to trust a certificate chain.
305   *
306   * @param  ignorePeerCertificateValidityWindow
307   *              Specifies whether to ignore the validity window for the peer
308   *              certificate when determining whether to trust a certificate
309   *              chain.  If this is {@code true}, then a certificate chain may
310   *              be trusted even if the current time is outside the peer
311   *              certificate's validity window.  If this is {@code false}, then
312   *              a certificate chain may only be trusted if the current time is
313   *              between the {@code notBefore} and {@code notAfter} timestamps
314   *              for the peer certificate.
315   */
316  public void setIgnorePeerCertificateValidityWindow(
317                   final boolean ignorePeerCertificateValidityWindow)
318  {
319    this.ignorePeerCertificateValidityWindow =
320         ignorePeerCertificateValidityWindow;
321  }
322
323
324
325  /**
326   * Indicates whether to ignore the validity window for issuer certificates
327   * when determining whether to trust a certificate chain.
328   *
329   * @return  {@code true} if a certificate chain may be considered trusted
330   *          even if the current time is outside the any issuer certificate's
331   *          validity window, or {@code false} if a certificate chain may only
332   *          be considered trusted if the current time is between the
333   *          {@code notBefore} and {@code notAfter} timestamps for all issuer
334   *          certificates.
335   */
336  public boolean ignoreIssuerCertificateValidityWindow()
337  {
338    return ignoreIssuerCertificateValidityWindow;
339  }
340
341
342
343  /**
344   * Indicates whether to ignore the validity window for the issuer certificates
345   * when determining whether to trust a certificate chain.
346   *
347   * @param  ignoreIssuerCertificateValidityWindow
348   *              Specifies whether to ignore the validity window for issuer
349   *              certificates when determining whether to trust a certificate
350   *              chain.  If this is {@code true}, then a certificate chain may
351   *              be trusted even if the current time is outside any issuer
352   *              certificate's validity window.  If this is {@code false}, then
353   *              a certificate chain may only be trusted if the current time is
354   *              between the {@code notBefore} and {@code notAfter} timestamps
355   *              for all issuer certificate.
356   */
357  public void setIgnoreIssuerCertificateValidityWindow(
358                   final boolean ignoreIssuerCertificateValidityWindow)
359  {
360    this.ignoreIssuerCertificateValidityWindow =
361         ignoreIssuerCertificateValidityWindow;
362  }
363
364
365
366  /**
367   * Retrieves a string representation of the topology registry trust manager
368   * properties.
369   *
370   * @return  A string representation of the topology registry trust manager
371   *          properties.
372   */
373  @Override()
374  @NotNull()
375  public String toString()
376  {
377    final StringBuilder buffer = new StringBuilder();
378    toString(buffer);
379    return buffer.toString();
380  }
381
382
383
384  /**
385   * Appends a string representation of the topology registry trust manager
386   * properties to the given buffer.
387   *
388   * @param  buffer  The buffer to which the string representation should be
389   *                 appended.
390   */
391  public void toString(@NotNull final StringBuilder buffer)
392  {
393    buffer.append("TopologyRegistryTrustManagerProperties(configurationFile='");
394    buffer.append(configurationFile.getAbsolutePath());
395    buffer.append("', cacheDurationMillis=");
396    buffer.append(cacheDurationMillis);
397    buffer.append(", requirePeerCertificateInTopologyRegistry=");
398    buffer.append(requirePeerCertificateInTopologyRegistry);
399    buffer.append(", ignorePeerCertificateValidityWindow=");
400    buffer.append(ignorePeerCertificateValidityWindow);
401    buffer.append(", ignoreIssuerCertificateValidityWindow=");
402    buffer.append(ignoreIssuerCertificateValidityWindow);
403    buffer.append(')');
404  }
405}