/*
 * 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.spring.boot.security;

import org.apache.camel.support.jsse.CipherSuitesParameters;
import org.apache.camel.support.jsse.FilterParameters;
import org.apache.camel.support.jsse.KeyManagersParameters;
import org.apache.camel.support.jsse.SSLContextClientParameters;
import org.apache.camel.support.jsse.SSLContextParameters;
import org.apache.camel.support.jsse.SSLContextServerParameters;
import org.apache.camel.support.jsse.SecureRandomParameters;
import org.apache.camel.support.jsse.SecureSocketProtocolsParameters;
import org.apache.camel.support.jsse.TrustManagersParameters;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "camel.ssl")
public class CamelSSLConfigurationProperties {

    // These option must be copied from camel-core SSLContextParameters to
    // allow spring boot to include them in its spring-configuration-metadata.json file

    /**
     * Global Camel security configuration.
     */
    private SSLContextParameters config = new SSLContextParameters();

    /**
     * The optional key manager configuration for creating the KeyManager used in constructing an SSLContext.
     */
    private KeyManagersParameters keyManagers;

    /**
     * The optional trust manager configuration for creating the TrustManager used in constructing an SSLContext.
     */
    private TrustManagersParameters trustManagers;

    /**
     * Allows to trust all SSL certificates without performing certificate validation. This can be used in development
     * environment but may expose the system to security risks. Notice that if the trustAllCertificates option is set to
     * true then the trustStore/trustStorePassword options are not in use.
     */
    private boolean trustAllCertificates;

    /**
     * The optional secure random configuration options to use for constructing the SecureRandom used in the creation of
     * an SSLContext.
     */
    private SecureRandomParameters secureRandom;

    /**
     * The optional configuration options to be applied purely to the client side settings of the SSLContext. Settings
     * specified here override any duplicate settings provided at the overall level by this class. These parameters
     * apply to SSLSocketFactory and SSLEngine produced by the SSLContext produced from this class as well as to the
     * SSLContext itself.
     */
    private SSLContextClientParameters clientParameters;

    /**
     * The optional configuration options to be applied purely to the server side settings of the SSLContext. Settings
     * specified here override any duplicate settings provided at the overall level by this class. These parameters
     * apply to SSLServerSocketFactory and SSLEngine produced by the SSLContext produced from this class as well as to
     * the SSLContext itself.
     */
    private SSLContextServerParameters serverParameters;

    /**
     * The optional provider identifier for the JSSE implementation to use when constructing an SSLContext.
     */
    private String provider;

    /**
     * The optional protocol for the secure sockets created by the SSLContext represented by this instance's
     * configuration. See Appendix A in the Java Secure Socket Extension Reference Guide for information about standard
     * protocol names.
     */
    private String secureSocketProtocol;

    /**
     * An optional certificate alias to use. This is useful when the keystore has multiple certificates.
     */
    private String certAlias;

    /**
     * The optional explicitly configured cipher suites for this configuration.
     */
    private CipherSuitesParameters cipherSuites;

    /**
     * The optional cipher suite filter configuration for this configuration.
     */
    private FilterParameters cipherSuitesFilter;

    /**
     * The optional explicitly configured secure socket protocol names for this configuration.
     */
    private SecureSocketProtocolsParameters secureSocketProtocols;

    /**
     * The option secure socket protocol name filter configuration for this configuration.
     */
    private FilterParameters secureSocketProtocolsFilter;

    /**
     * The optional SSLSessionContext timeout time for javax.net.ssl.SSLSession in seconds.
     */
    private String sessionTimeout;

    public SSLContextParameters getConfig() {
        return config;
    }

    public void setConfig(SSLContextParameters config) {
        this.config = config;
    }

    public KeyManagersParameters getKeyManagers() {
        return this.keyManagers;
    }

    public void setKeyManagers(KeyManagersParameters keyManagers) {
        this.keyManagers = keyManagers;
    }

    public TrustManagersParameters getTrustManagers() {
        return this.trustManagers;
    }

    public void setTrustManagers(TrustManagersParameters trustManagers) {
        this.trustManagers = trustManagers;
    }

    public boolean isTrustAllCertificates() {
        return trustAllCertificates;
    }

    public void setTrustAllCertificates(boolean trustAllCertificates) {
        this.trustAllCertificates = trustAllCertificates;
    }

    public SecureRandomParameters getSecureRandom() {
        return this.secureRandom;
    }

    public void setSecureRandom(SecureRandomParameters secureRandom) {
        this.secureRandom = secureRandom;
    }

    public SSLContextClientParameters getClientParameters() {
        return this.clientParameters;
    }

    public void setClientParameters(SSLContextClientParameters clientParameters) {
        this.clientParameters = clientParameters;
    }

    public SSLContextServerParameters getServerParameters() {
        return this.serverParameters;
    }

    public void setServerParameters(SSLContextServerParameters serverParameters) {
        this.serverParameters = serverParameters;
    }

    public String getProvider() {
        return this.provider;
    }

    public void setProvider(String provider) {
        this.provider = provider;
    }

    public String getSecureSocketProtocol() {
        return this.secureSocketProtocol;
    }

    public void setSecureSocketProtocol(String secureSocketProtocol) {
        this.secureSocketProtocol = secureSocketProtocol;
    }

    public String getCertAlias() {
        return this.certAlias;
    }

    public void setCertAlias(String certAlias) {
        this.certAlias = certAlias;
    }

    public CipherSuitesParameters getCipherSuites() {
        return this.cipherSuites;
    }

    public void setCipherSuites(CipherSuitesParameters cipherSuites) {
        this.cipherSuites = cipherSuites;
    }

    public FilterParameters getCipherSuitesFilter() {
        return this.cipherSuitesFilter;
    }

    public void setCipherSuitesFilter(FilterParameters cipherSuitesFilter) {
        this.cipherSuitesFilter = cipherSuitesFilter;
    }

    public SecureSocketProtocolsParameters getSecureSocketProtocols() {
        return this.secureSocketProtocols;
    }

    public void setSecureSocketProtocols(SecureSocketProtocolsParameters secureSocketProtocols) {
        this.secureSocketProtocols = secureSocketProtocols;
    }

    public FilterParameters getSecureSocketProtocolsFilter() {
        return this.secureSocketProtocolsFilter;
    }

    public void setSecureSocketProtocolsFilter(FilterParameters secureSocketProtocolsFilter) {
        this.secureSocketProtocolsFilter = secureSocketProtocolsFilter;
    }

    public String getSessionTimeout() {
        return this.sessionTimeout;
    }

    public void setSessionTimeout(String sessionTimeout) {
        this.sessionTimeout = sessionTimeout;
    }

}
