<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
 Copyright (c) 2019, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.

 Licensed 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.
-->

<!--
    This is the main server configuration file

    ${carbon.home} represents the carbon.home system property.
    Other system properties can be specified in a similar manner.
-->
<Server xmlns="http://wso2.org/projects/carbon/carbon.xml" xmlns:svns="http://org.wso2.securevault/configuration">

    <!--
       Product Name
    -->
    <Name>WSO2 Micro Integrator</Name>

    <!--
       machine readable unique key to identify each product
    -->
    <ServerKey>MI</ServerKey>

    <!--
       Product Version
    -->
    <Version>@product.version@</Version>

    <!--
       Host name or IP address of the machine hosting this server
       e.g. www.wso2.org, 192.168.1.10
       This is will become part of the End Point Reference of the
       services deployed on this server instance.
    -->
    <HostName>{{server.hostname}}</HostName>

    <!--
    Host name to be used for the Carbon management console
    -->
    <MgtHostName>{{server.hostname}}</MgtHostName>

    <!--
        The URL of the back end server. This is where the admin services are hosted and
        will be used by the clients in the front end server.
        This is required only for the Front-end server. This is used when seperating BE server from FE server
       -->
    <ServerURL>local:/${carbon.context}/services/</ServerURL>
    <!--
    <ServerURL>https://${carbon.local.ip}:${carbon.management.port}${carbon.context}/services/</ServerURL>
    -->
    <!--
    The URL of the index page. This is where the user will be redirected after signing in to the
    carbon server.
    -->
    <!-- IndexPageURL>/carbon/admin/index.jsp</IndexPageURL-->

    <!--
    For cApp deployment, we have to identify the roles that can be acted by the current server.
    The following property is used for that purpose. Any number of roles can be defined here.
    Regular expressions can be used in the role.
    Ex : <Role>.*</Role> means this server can act any role
    -->
    <ServerRoles>
        {% for role in server.roles %}
        <Role>{{ role }}</Role>
        {% endfor %}
    </ServerRoles>

    <!-- uncommnet this line to subscribe to a bam instance automatically -->
    <!--<BamServerURL>https://bamhost:bamport/services/</BamServerURL>-->

    <!--
       The fully qualified name of the server
    -->
    <Package>org.wso2.carbon</Package>

    <!--
       Webapp context root of WSO2 Carbon management console.
    -->
    {% if server.web_context_root is defined %}
    <WebContextRoot>{{ server.web_context_root }}</WebContextRoot>
    {% else %}
    <WebContextRoot>/</WebContextRoot>
    {% endif %}
    <!--
    	Proxy context path is a useful parameter to add a proxy path when a Carbon server is fronted by reverse proxy. In addtion
        to the proxy host and proxy port this parameter allows you add a path component to external URLs. e.g.
     		URL of the Carbon server -> https://10.100.1.1:9443/carbon
   		URL of the reverse proxy -> https://prod.abc.com/appserver/carbon

   	appserver - proxy context path. This specially required whenever you are generating URLs to displace in
   	Carbon UI components.
    -->
    <MgtProxyContextPath></MgtProxyContextPath>
    <ProxyContextPath>{{server.proxy_context_path}}</ProxyContextPath>

    <!-- In-order to  get the registry http Port from the back-end when the default http transport is not the same-->
    <!--RegistryHttpPort>9763</RegistryHttpPort-->

    <!--
    Number of items to be displayed on a management console page. This is used at the
    backend server for pagination of various items.
    -->
    <ItemsPerPage>15</ItemsPerPage>

    <!-- The endpoint URL of the cloud instance management Web service -->
    <!--<InstanceMgtWSEndpoint>https://ec2.amazonaws.com/</InstanceMgtWSEndpoint>-->

    <!--
       Ports used by this server
    -->
    <Ports>

        <!-- Ports offset. This entry will set the value of the ports defined below to
         the define value + Offset.
         e.g. Offset=2 and HTTPS port=9443 will set the effective HTTPS port to 9445
         -->
        <Offset>{{server.offset | default('10')}}</Offset>

        <!-- The JMX Ports -->
        <JMX>
            <!--The port RMI registry is exposed-->
            <RMIRegistryPort>{{monitoring.jmx.rmi_registry_port}}</RMIRegistryPort>
            <!--The port RMI server should be exposed-->
            <RMIServerPort>{{monitoring.jmx.rmi_server_port}}</RMIServerPort>
        </JMX>

        <!-- Embedded LDAP server specific ports -->
        <EmbeddedLDAP>
            <!-- Port which embedded LDAP server runs -->
            <LDAPServerPort>10389</LDAPServerPort>
            <!-- Port which KDC (Kerberos Key Distribution Center) server runs -->
            <KDCServerPort>8000</KDCServerPort>
        </EmbeddedLDAP>

        <!--
                 Override datasources JNDIproviderPort defined in bps.xml and datasources.properties files
        -->
        <!--<JNDIProviderPort>2199</JNDIProviderPort>-->
        <!--Override receive port of thrift based entitlement service.-->
        <ThriftEntitlementReceivePort>10500</ThriftEntitlementReceivePort>

        <!--
         This is the proxy port of the worker cluster. These need to be configured in a scenario where
         manager node is not exposed through the load balancer through which the workers are exposed
         therefore doesn't have a proxy port.
        <WorkerHttpProxyPort>80</WorkerHttpProxyPort>
        <WorkerHttpsProxyPort>443</WorkerHttpsProxyPort>
        -->

    </Ports>

    <!--
        JNDI Configuration
    -->
    <JNDI>
        <!--
             The fully qualified name of the default initial context factory
        -->
        <DefaultInitialContextFactory>org.wso2.micro.tomcat.jndi.CarbonJavaURLContextFactory</DefaultInitialContextFactory>
        <!--
             The restrictions that are done to various JNDI Contexts in a Multi-tenant environment
        -->
        <Restrictions>
            <!--
                Contexts that will be available only to the super-tenant
            -->
            <!-- <SuperTenantOnly>
                <UrlContexts>
                    <UrlContext>
                        <Scheme>foo</Scheme>
                    </UrlContext>
                    <UrlContext>
                        <Scheme>bar</Scheme>
                    </UrlContext>
                </UrlContexts>
            </SuperTenantOnly> -->
            <!--
                Contexts that are common to all tenants
            -->
            <AllTenants>
                <UrlContexts>
                    <UrlContext>
                        <Scheme>java</Scheme>
                    </UrlContext>
                    <!-- <UrlContext>
                        <Scheme>foo</Scheme>
                    </UrlContext> -->
                </UrlContexts>
            </AllTenants>
            <!--
                 All other contexts not mentioned above will be available on a per-tenant basis
                 (i.e. will not be shared among tenants)
            -->
        </Restrictions>
    </JNDI>

    <!--
        Property to determine if the server is running an a cloud deployment environment.
        This property should only be used to determine deployment specific details that are
        applicable only in a cloud deployment, i.e when the server deployed *-as-a-service.
    -->
    <IsCloudDeployment>false</IsCloudDeployment>

    <!--
	Property to determine whether usage data should be collected for metering purposes
    -->
    <EnableMetering>false</EnableMetering>

    <!-- The Max time a thread should take for execution in seconds -->
    <MaxThreadExecutionTime>600</MaxThreadExecutionTime>

    <!-- Graceful shutdown timeout in seconds -->
    <GracefulShutdown>
        <Enabled>{{server.gracefulShutdownEnabled}}</Enabled>
        <Timeout>{{server.gracefulShutdownTimeout}}</Timeout>
    </GracefulShutdown>

    <!--
     Caching related configurations
    -->
    <Cache>
        <!-- Default cache timeout in minutes -->
        <DefaultCacheTimeout>15</DefaultCacheTimeout>
    </Cache>

    <!--
    Axis2 related configurations
    -->
    <Axis2Config>
        <!--
             Location of the Axis2 Services & Modules repository

             This can be a directory in the local file system, or a URL.

             e.g.
             1. /home/wso2wsas/repository/ - An absolute path
             2. repository - In this case, the path is relative to CARBON_HOME
             3. file:///home/wso2wsas/repository/
             4. http://wso2wsas/repository/
        -->
        <RepositoryLocation>${carbon.home}/repository/deployment/server/</RepositoryLocation>

        <!--
         Deployment update interval in seconds. This is the interval between repository listener
         executions.
        -->
        <DeploymentUpdateInterval>15</DeploymentUpdateInterval>

        <!--
            Location of the main Axis2 configuration descriptor file, a.k.a. axis2.xml file

            This can be a file on the local file system, or a URL

            e.g.
            1. /home/repository/axis2.xml - An absolute path
            2. conf/axis2.xml - In this case, the path is relative to CARBON_HOME
            3. file:///home/carbon/repository/axis2.xml
            4. http://repository/conf/axis2.xml
        -->
        <ConfigurationFile>${carbon.home}/conf/axis2/axis2.xml</ConfigurationFile>

        <!--
          ServiceGroupContextIdleTime, which will be set in ConfigurationContex
          for multiple clients which are going to access the same ServiceGroupContext
          Default Value is 30 Sec.
        -->
        <ServiceGroupContextIdleTime>30000</ServiceGroupContextIdleTime>

        <!--
          This repository location is used to crete the client side configuration
          context used by the server when calling admin services.
        -->
        <ClientRepositoryLocation>${carbon.home}/repository/deployment/client/</ClientRepositoryLocation>
        <!-- This axis2 xml is used in createing the configuration context by the FE server
         calling to BE server -->
        <clientAxis2XmlLocation>${carbon.home}/conf/axis2/axis2_client.xml</clientAxis2XmlLocation>
        <!-- If this parameter is set, the ?wsdl on an admin service will not give the admin service wsdl. -->
        <HideAdminServiceWSDLs>{{server.hide_admin_service_wsdl}}</HideAdminServiceWSDLs>

        <!--WARNING-Use With Care! Uncommenting bellow parameter would expose all AdminServices in HTTP transport.
        With HTTP transport your credentials and data routed in public channels are vulnerable for sniffing attacks.
        Use bellow parameter ONLY if your communication channels are confirmed to be secured by other means -->
        <!--HttpAdminServices>*</HttpAdminServices-->

    </Axis2Config>

    <!--
       The default user roles which will be created when the server
       is started up for the first time.
    -->
    <ServiceUserRoles>
        <Role>
            <Name>admin</Name>
            <Description>Default Administrator Role</Description>
        </Role>
        <Role>
            <Name>user</Name>
            <Description>Default User Role</Description>
        </Role>
    </ServiceUserRoles>

    <!--
      Enable following config to allow Emails as usernames.
    -->
    <EnableEmailUserName>false</EnableEmailUserName>

    <!--
       Configurations related to Carbon Crypto Service which is a crypto framework used inside Carbon products.
    -->
    <CryptoService>

        <Enabled>true</Enabled>

        <!-- The crypto provider which is used for internal data encryption and decryption -->
        <InternalCryptoProviderClassName>{{encryption.internal_crypto_provider}}</InternalCryptoProviderClassName>

        <!--
            The crypto provider which is used for the crypto needs which come when communicating with external parties.
            e.g. Signing, Decrypting.
        -->
        <ExternalCryptoProviderClassName>org.wso2.micro.core.encryption.KeyStoreBasedExternalCryptoProvider</ExternalCryptoProviderClassName>

        <!--
            The list of key resolvers which will be used based on the context when handling crypto with external parties.
            e.g. Resolving the public key of an external entity.
        -->
        <KeyResolvers>
            <KeyResolver className="org.wso2.micro.integrator.crypto.provider.ContextIndependentKeyResolver" priority="-1"/>
        </KeyResolvers>

        <Secret>{{encryption.key}}</Secret>

    </CryptoService>

    <!--
          Security configurations
        -->
    <Security>
        <!--
            KeyStore which will be used for encrypting/decrypting passwords
            and other sensitive information.
        -->
        <KeyStore>
            <!-- Keystore file location-->
            <Location>{{keystore.primary.file_name}}</Location>
            <!-- Keystore type (JKS/PKCS12 etc.)-->
            <Type>{{keystore.primary.type}}</Type>
            <!-- Keystore password-->
            <Password>{{keystore.primary.password}}</Password>
            <!-- Private Key alias-->
            <KeyAlias>{{keystore.primary.alias}}</KeyAlias>
            <!-- Private Key password-->
            <KeyPassword>{{keystore.primary.key_password}}</KeyPassword>
        </KeyStore>

        <!--
            The KeyStore which is used for encrypting/decrypting internal data.
            This block is read by Carbon Crypto Service.
        -->
        <InternalKeyStore>
            <!-- Keystore file location-->
            <Location>{{keystore.internal.file_name}}</Location>
            <!-- Keystore type (JKS/PKCS12 etc.)-->
            <Type>{{keystore.internal.type}}</Type>
            <!-- Keystore password-->
            <Password>{{keystore.internal.password}}</Password>
            <!-- Private Key alias-->
            <KeyAlias>{{keystore.internal.alias}}</KeyAlias>
            <!-- Private Key password-->
            <KeyPassword>{{keystore.internal.key_password}}</KeyPassword>
        </InternalKeyStore>

        <!--
            System wide trust-store which is used to maintain the certificates of all
            the trusted parties.
        -->
        <TrustStore>
            <!-- trust-store file location -->
            <Location>{{truststore.file_name}}</Location>
            <!-- trust-store type (JKS/PKCS12 etc.) -->
            <Type>{{truststore.type}}</Type>
            <!-- trust-store password -->
            <Password>{{truststore.password}}</Password>
        </TrustStore>

        <!--
            The Authenticator configuration to be used at the JVM level. We extend the
            java.net.Authenticator to make it possible to authenticate to given servers and
            proxies.
        -->
        <NetworkAuthenticatorConfig>
            <!--
                Below is a sample configuration for a single authenticator. Please note that
                all child elements are mandatory. Not having some child elements would lead to
                exceptions at runtime.
            -->
            <!-- <Credential> -->
            <!--
                the pattern that would match a subset of URLs for which this authenticator
                would be used
            -->
            <!-- <Pattern>regularExpression</Pattern> -->
            <!--
                the type of this authenticator. Allowed values are:
                1. server
                2. proxy
            -->
            <!-- <Type>proxy</Type> -->
            <!-- the username used to log in to server/proxy -->
            <!-- <Username>username</Username> -->
            <!-- the password used to log in to server/proxy -->
            <!-- <Password>password</Password> -->
            <!-- </Credential> -->
        </NetworkAuthenticatorConfig>

        <!--
         The Tomcat realm to be used for hosted Web applications. Allowed values are;
         1. UserManager
         2. Memory

         If this is set to 'UserManager', the realm will pick users & roles from the system's
         WSO2 User Manager. If it is set to 'memory', the realm will pick users & roles from
         CARBON_HOME/conf/tomcat/tomcat-users.xml
        -->
        <TomcatRealm>UserManager</TomcatRealm>

        <!--Option to disable storing of tokens issued by STS-->
        <DisableTokenStore>false</DisableTokenStore>

        <!--
         Security token store class name. If this is not set, default class will be
         org.wso2.carbon.security.util.SecurityTokenStore
        -->
        <!--TokenStoreClassName>org.wso2.carbon.identity.sts.store.DBTokenStore</TokenStoreClassName-->

        <XSSPreventionConfig>
            <Enabled>true</Enabled>
            <Rule>allow</Rule>
            <Patterns>
                <!--Pattern></Pattern-->
            </Patterns>
        </XSSPreventionConfig>
    </Security>

    <!--
       The temporary work directory
    -->
    <WorkDirectory>${carbon.home}/tmp/work</WorkDirectory>

    <!--
       House-keeping configuration
    -->
    <HouseKeeping>

        <!--
           true  - Start House-keeping thread on server startup
           false - Do not start House-keeping thread on server startup.
                   The user will run it manually as and when he wishes.
        -->
        <AutoStart>true</AutoStart>

        <!--
           The interval in *minutes*, between house-keeping runs
        -->
        <Interval>10</Interval>

        <!--
          The maximum time in *minutes*, temp files are allowed to live
          in the system. Files/directories which were modified more than
          "MaxTempFileLifetime" minutes ago will be removed by the
          house-keeping task
        -->
        <MaxTempFileLifetime>30</MaxTempFileLifetime>
    </HouseKeeping>

    <!-- FileNameRegEx is used to validate the file input/upload/write-out names.
    e.g.
     <FileNameRegEx>^(?!(?:CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(?:\.[^.])?$)[^&lt;&gt:"/\\|?*\x00-\x1F][^&lt;&gt:"/\\|?*\x00-\x1F\ .]$</FileNameRegEx>
    -->
    <!--<FileNameRegEx></FileNameRegEx>-->
    <!--
       Processors which process special HTTP GET requests such as ?wsdl, ?policy etc.

       In order to plug in a processor to handle a special request, simply add an entry to this
       section.

       The value of the Item element is the first parameter in the query string(e.g. ?wsdl)
       which needs special processing

       The value of the Class element is a class which implements
       org.wso2.carbon.transport.HttpGetRequestProcessor
    -->
    <HttpGetRequestProcessors>
        <!--Uncomment following info processor if need information page -->
        <!--<Processor>
            <Item>info</Item>
            <Class>org.wso2.micro.core.transports.util.InfoProcessor</Class>
        </Processor>-->
        <Processor>
            <Item>wsdl</Item>
            <Class>org.wso2.micro.core.transports.util.Wsdl11Processor</Class>
        </Processor>
        <Processor>
            <Item>wsdl2</Item>
            <Class>org.wso2.micro.core.transports.util.Wsdl20Processor</Class>
        </Processor>
        <Processor>
            <Item>xsd</Item>
            <Class>org.wso2.micro.core.transports.util.XsdProcessor</Class>
        </Processor>
        <Processor>
            <Item>swagger.json</Item>
            <Class>org.wso2.micro.integrator.transport.handlers.requestprocessors.swagger.format.SwaggerJsonProcessor
            </Class>
        </Processor>
        <Processor>
            <Item>swagger.yaml</Item>
            <Class>org.wso2.micro.integrator.transport.handlers.requestprocessors.swagger.format.SwaggerYamlProcessor
            </Class>
        </Processor>
        {% for processor_item in server.get_request_processor %}
        <Processor>
            <Item>{{processor_item.item}}</Item>
            <Class>{{processor_item.class}}</Class>
        </Processor>
        {% endfor %}
    </HttpGetRequestProcessors>

    <DeploymentSynchronizer>
        <Enabled>false</Enabled>
        <AutoCommit>false</AutoCommit>
        <AutoCheckout>true</AutoCheckout>
        <RepositoryType>svn</RepositoryType>
        <SvnUrl>http://svnrepo.example.com/repos/</SvnUrl>
        <SvnUser>username</SvnUser>
        <SvnPassword>password</SvnPassword>
        <SvnUrlAppendTenantId>true</SvnUrlAppendTenantId>
    </DeploymentSynchronizer>

    <!-- Mediation persistence configurations. Only valid if mediation features are available i.e. ESB -->
    <MediationConfig>
        <LoadFromRegistry>false</LoadFromRegistry>
        <SaveToFile>false</SaveToFile>
        <Persistence>enabled</Persistence>
        <RegistryPersistence>enabled</RegistryPersistence>
    </MediationConfig>

    {% for serverConf in server_conf %}
    <{{serverConf.title}}>
        {% for serverVal in serverConf.param %}
        <{{ serverVal.key}}>{{serverVal.value}}</{{ serverVal.key}}>
        {% endfor %}
    </{{serverConf.title}}>
    {% endfor %}

    <!--
    Server intializing code, specified as implementation classes of org.wso2.carbon.core.ServerInitializer.
    This code will be run when the Carbon server is initialized
    -->
    <ServerInitializers>
        <!--<Initializer></Initializer>-->
    </ServerInitializers>

    <!--
    Indicates whether the Carbon Servlet is required by the system, and whether it should be
    registered
    -->
    <RequireCarbonServlet>${require.carbon.servlet}</RequireCarbonServlet>

    <StatisticsReporterDisabled>true</StatisticsReporterDisabled>


    <!--
       Default Feature Repository of WSO2 Carbon.
    -->
    <FeatureRepository>
        <RepositoryName>default repository</RepositoryName>
        <RepositoryURL>http://product-dist.wso2.com/p2/carbon/releases/wilkes/</RepositoryURL>
    </FeatureRepository>

    <!--
     Configuring EI analytics server details.
     mediation.flow.statistics.enable has to be set to true in synapse.properties
     file in addition to these configs
     -->
    <Analytics>
        <!--
            Server URL of the analytics server. Events are published to this URL
            This url is in the format <protocol>://<hostname or ip>:<port>.
            For the HA mode use a comma seperated list of urls of the nalytics nodes to
            enable publishing events to the servers in a round robin manner.
            e.g.; tcp://analytics-server-1:7612,tcp://analytics-server-2:7612
         -->
        <ServerURL>{{monitoring.ei_analytics.server_url}}</ServerURL>
        <AuthServerURL>{{monitoring.ei_analytics.auth_server_url}}</AuthServerURL>
        <!--
            Credentails of the admin user of the analytics server.
        -->
        <Username>{{monitoring.ei_analytics.username}}</Username>
        <Password>{{monitoring.ei_analytics.password}}</Password>
    </Analytics>

    <!-- Configure JCE provider -->
    {% if jce_provider is defined and jce_provider.provider_name is defined %}
        <JCEProvider>{{jce_provider.provider_name}}</JCEProvider>
    {% endif %}
    <!-- Configure JSSE provider -->
    {% if jsse_provider is defined and jsse_provider.provider_name is defined %}
        <JSSEProvider>
            <ProviderName>{{jsse_provider.provider_name}}</ProviderName>
        </JSSEProvider>
    {% endif %}
</Server>
