content: /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.camel.component.mina;
  
  import java.util.Collections;
  
  import org.apache.camel.BindToRegistry;
  import org.apache.camel.support.jsse.ClientAuthentication;
  import org.apache.camel.support.jsse.KeyManagersParameters;
  import org.apache.camel.support.jsse.KeyStoreParameters;
  import org.apache.camel.support.jsse.SSLContextParameters;
  import org.apache.camel.support.jsse.SSLContextServerParameters;
  import org.apache.camel.support.jsse.SecureSocketProtocolsParameters;
  import org.apache.camel.support.jsse.TrustManagersParameters;
  import org.apache.camel.test.AvailablePortFinder;
  import org.apache.camel.test.junit5.CamelTestSupport;
  import org.junit.jupiter.api.BeforeAll;
  
  public abstract class BaseMinaTest extends CamelTestSupport {
  
      protected static final String KEY_STORE_PASSWORD = "changeit";
  
      private static volatile int port;
  
      @BeforeAll
      public static void initPort() {
          port = AvailablePortFinder.getNextAvailable();
      }
  
      protected int getNextPort() {
          return AvailablePortFinder.getNextAvailable();
      }
  
      protected int getPort() {
          return port;
      }
  
      protected boolean isUseSslContext() {
          return false;
      }
  
      @BindToRegistry("sslContextParameters")
      public SSLContextParameters createSslContextParameters() {
          KeyStoreParameters ksp = new KeyStoreParameters();
          ksp.setResource(this.getClass().getClassLoader().getResource("jsse/localhost.p12").toString());
          ksp.setPassword(KEY_STORE_PASSWORD);
  
          KeyManagersParameters kmp = new KeyManagersParameters();
          kmp.setKeyPassword(KEY_STORE_PASSWORD);
          kmp.setKeyStore(ksp);
  
          TrustManagersParameters tmp = new TrustManagersParameters();
          tmp.setKeyStore(ksp);
  
          // NOTE: Needed since the client uses a loose trust configuration when
          // no ssl context
          // is provided. We turn on WANT client-auth to prefer using
          // authentication
          SSLContextServerParameters scsp = new SSLContextServerParameters();
          scsp.setClientAuthentication(ClientAuthentication.WANT.name());
  
          SSLContextParameters sslContextParameters = new SSLContextParameters();
  
          //with tls 1.3 there are random failures, 1.2 is used instead
          //(see https://issues.apache.org/jira/browse/DIRMINA-1132)
          SecureSocketProtocolsParameters secureSocketProtocols = new SecureSocketProtocolsParameters();
          secureSocketProtocols.setSecureSocketProtocol(Collections.singletonList("TLSv1.2"));
          sslContextParameters.setSecureSocketProtocols(secureSocketProtocols);
  
          sslContextParameters.setKeyManagers(kmp);
          sslContextParameters.setTrustManagers(tmp);
          sslContextParameters.setServerParameters(scsp);
          return sslContextParameters;
      }
  }
  