###############################################################################
# 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.
###############################################################################
####
# OFBiz LDAP Authentication Settings
####

# JNDI LDAP settings. Change the following line to
# point to your LDAP server.
java.naming.provider.url=ldap://localhost:389
java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
java.naming.security.authentication=simple
com.sun.jndi.ldap.connect.timeout=5000

# Distinguished Name template. This is used as a default if
# UserLogin.userLdapDn is empty.
# The %u placeholder will be replaced by the user's login name,
# then the resulting string will be used to authenticate the user.
ldap.dn.template=cn=%u,ou=system

# The following property controls whether the user's OFBiz password
# is synchronized with the user's LDAP password.
ldap.synchronize.passwords=true
