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

# web properties #
nifi.registry.web.war.directory=${nifi.registry.web.war.directory}
nifi.registry.web.http.host=${nifi.registry.web.http.host}
nifi.registry.web.http.port=${nifi.registry.web.http.port}
nifi.registry.web.https.host=${nifi.registry.web.https.host}
nifi.registry.web.https.port=${nifi.registry.web.https.port}
nifi.registry.web.jetty.working.directory=${nifi.registry.jetty.work.dir}
nifi.registry.web.jetty.threads=${nifi.registry.web.jetty.threads}

# security properties #
nifi.registry.security.keystore=${nifi.registry.security.keystore}
nifi.registry.security.keystoreType=${nifi.registry.security.keystoreType}
nifi.registry.security.keystorePasswd=${nifi.registry.security.keystorePasswd}
nifi.registry.security.keyPasswd=${nifi.registry.security.keyPasswd}
nifi.registry.security.truststore=${nifi.registry.security.truststore}
nifi.registry.security.truststoreType=${nifi.registry.security.truststoreType}
nifi.registry.security.truststorePasswd=${nifi.registry.security.truststorePasswd}
nifi.registry.security.needClientAuth=${nifi.registry.security.needClientAuth}
nifi.registry.security.authorizers.configuration.file=${nifi.registry.security.authorizers.configuration.file}
nifi.registry.security.authorizer=${nifi.registry.security.authorizer}
nifi.registry.security.identity.providers.configuration.file=${nifi.registry.security.identity.providers.configuration.file}
nifi.registry.security.identity.provider=${nifi.registry.security.identity.provider}

# sensitive property protection properties #
# nifi.registry.sensitive.props.additional.keys=

# providers properties #
nifi.registry.providers.configuration.file=${nifi.registry.providers.configuration.file}

# registry alias properties #
nifi.registry.registry.alias.configuration.file=${nifi.registry.registry.alias.configuration.file}

# extensions working dir #
nifi.registry.extensions.working.directory=${nifi.registry.extensions.working.directory}

# legacy database properties, used to migrate data from original DB to new DB below
# NOTE: Users upgrading from 0.1.0 should leave these populated, but new installs after 0.1.0 should leave these empty
nifi.registry.db.directory=${nifi.registry.db.directory}
nifi.registry.db.url.append=${nifi.registry.db.url.append}

# database properties
nifi.registry.db.url=${nifi.registry.db.url}
nifi.registry.db.driver.class=${nifi.registry.db.driver.class}
nifi.registry.db.driver.directory=${nifi.registry.db.driver.directory}
nifi.registry.db.username=${nifi.registry.db.username}
nifi.registry.db.password=${nifi.registry.db.password}
nifi.registry.db.maxConnections=${nifi.registry.db.maxConnections}
nifi.registry.db.sql.debug=${nifi.registry.db.sql.debug}

# extension directories #
# Each property beginning with "nifi.registry.extension.dir." will be treated as location for an extension,
# and a class loader will be created for each location, with the system class loader as the parent
#
#nifi.registry.extension.dir.1=/path/to/extension1
#nifi.registry.extension.dir.2=/path/to/extension2

nifi.registry.extension.dir.aws=${nifi.registry.extension.dir.aws}

# Identity Mapping Properties #
# These properties allow normalizing user identities such that identities coming from different identity providers
# (certificates, LDAP, Kerberos) can be treated the same internally in NiFi. The following example demonstrates normalizing
# DNs from certificates and principals from Kerberos into a common identity string:
#
# nifi.registry.security.identity.mapping.pattern.dn=^CN=(.*?), OU=(.*?), O=(.*?), L=(.*?), ST=(.*?), C=(.*?)$
# nifi.registry.security.identity.mapping.value.dn=$1@$2
# nifi.registry.security.identity.mapping.transform.dn=NONE

# nifi.registry.security.identity.mapping.pattern.kerb=^(.*?)/instance@(.*?)$
# nifi.registry.security.identity.mapping.value.kerb=$1@$2
# nifi.registry.security.identity.mapping.transform.kerb=UPPER

# Group Mapping Properties #
# These properties allow normalizing group names coming from external sources like LDAP. The following example
# lowercases any group name.
#
# nifi.registry.security.group.mapping.pattern.anygroup=^(.*)$
# nifi.registry.security.group.mapping.value.anygroup=$1
# nifi.registry.security.group.mapping.transform.anygroup=LOWER


# kerberos properties #
nifi.registry.kerberos.krb5.file=${nifi.registry.kerberos.krb5.file}
nifi.registry.kerberos.spnego.principal=${nifi.registry.kerberos.spnego.principal}
nifi.registry.kerberos.spnego.keytab.location=${nifi.registry.kerberos.spnego.keytab.location}
nifi.registry.kerberos.spnego.authentication.expiration=${nifi.registry.kerberos.spnego.authentication.expiration}
