<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:sec="http://www.springframework.org/schema/security"
       xmlns:ldaptive="http://www.ldaptive.org/schema/spring-ext"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
       http://www.ldaptive.org/schema/spring-ext http://www.ldaptive.org/schema/spring-ext.xsd">

    <bean id="ad-ldapAuthenticationHandler"
          class="org.jasig.cas.authentication.LdapAuthenticationHandler"
          p:principalIdAttribute="sAMAccountName"
          c:authenticator-ref="ad-authenticator">
          <property name="principalAttributeMap">
              <map>
                  <entry key="mail" value="email" />
                  <entry key="sn" value="name" />
                  <entry key="givenName" value="firstname" />
              </map>
          </property>
    </bean>

    <bean id="supann-ldapAuthenticationHandler"
          class="org.jasig.cas.authentication.LdapAuthenticationHandler"
          p:principalIdAttribute="uid"
          c:authenticator-ref="supann-authenticator">
          <property name="principalAttributeMap">
              <map>
                  <entry key="mail" value="email" />
                  <entry key="sn" value="name" />
                  <entry key="givenName" value="firstname" />
              </map>
          </property>
    </bean>

    <util:map id="authenticationHandlersResolvers">
        <entry key-ref="ad-ldapAuthenticationHandler" value="#{null}" />
        <entry key-ref="supann-ldapAuthenticationHandler" value="#{null}" />
        <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
        <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
    </util:map>

    <util:list id="authenticationMetadataPopulators">
        <ref bean="successfulHandlerMetaDataPopulator" />
        <ref bean="rememberMeAuthenticationMetaDataPopulator" />
        <ref bean="cacheCredentialsMetaDataPopulator" />
    </util:list>

    <bean id="attributeRepository"
          class="org.jasig.services.persondir.support.ldap.LdaptivePersonAttributeDao"
          p:connectionFactory-ref="AttributesConnectionFactory"
          p:baseDN="${supann-ldap.baseDn}"
          p:searchControls-ref="searchControls"
          p:searchFilter="uid={0}">
        <property name="resultAttributeMapping">
            <map>
                <entry key="mail" value="email" />
                <entry key="sn" value="name" />
                <entry key="givenName" value="firstname" />
                <entry key="eduPersonAffiliation" value="affiliation" />
            </map>
        </property>
    </bean>

    <!--
    <bean id="attributeRepository" class="org.jasig.services.persondir.support.NamedStubPersonAttributeDao"
          p:backingMap-ref="attrRepoBackingMap" />
    -->

    <alias name="acceptUsersAuthenticationHandler" alias="primaryAuthenticationHandler" />
    <alias name="personDirectoryPrincipalResolver" alias="primaryPrincipalResolver" />

    <!--
    <util:map id="attrRepoBackingMap">
        <entry key="uid" value="uid" />
        <entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
        <entry key="groupMembership" value="groupMembership" />
        <entry>
            <key><value>memberOf</value></key>
            <list>
                <value>faculty</value>
                <value>staff</value>
                <value>org</value>
            </list>
        </entry>
    </util:map>
    -->

    <alias name="serviceThemeResolver" alias="themeResolver" />

    <alias name="jsonServiceRegistryDao" alias="serviceRegistryDao" />

    <alias name="defaultTicketRegistry" alias="ticketRegistry" />
    
    <!--alias name="neverExpiresExpirationPolicy" alias="grantingTicketExpirationPolicy" /-->

    <alias name="rememberMeDelegatingExpirationPolicy" alias="grantingTicketExpirationPolicy" />
    <alias name="timeoutExpirationPolicy" alias="rememberMeExpirationPolicy" />
    <alias name="ticketGrantingTicketExpirationPolicy" alias="sessionExpirationPolicy" />
    
    <alias name="multiTimeUseOrTimeoutExpirationPolicy" alias="serviceTicketExpirationPolicy" />

    <alias name="anyAuthenticationPolicy" alias="authenticationPolicy" />
    <alias name="acceptAnyAuthenticationPolicyFactory" alias="authenticationPolicyFactory" />

    <bean id="auditTrailManager"
          class="org.jasig.inspektr.audit.support.Slf4jLoggingAuditTrailManager"
          p:entrySeparator="${cas.audit.singleline.separator:|}"
          p:useSingleLine="${cas.audit.singleline:false}"/>

    <alias name="inMemoryIpAddressThrottle" alias="authenticationThrottle" />

    <util:list id="monitorsList">
        <ref bean="memoryMonitor" />
        <ref bean="sessionMonitor" />
    </util:list>

    <alias name="defaultPrincipalFactory" alias="principalFactory" />
    <alias name="defaultAuthenticationTransactionManager" alias="authenticationTransactionManager" />
    <alias name="defaultPrincipalElectionStrategy" alias="principalElectionStrategy" />
    <alias name="tgcCipherExecutor" alias="defaultCookieCipherExecutor" />

    <ldaptive:ad-authenticator id="ad-authenticator"
            ldapUrl="${ldap.url}"
            userFilter="${ldap.authn.searchFilter}"
            bindDn="${ldap.managerDn}"
            bindCredential="${ldap.managerPassword}"
            allowMultipleDns="${ldap.allowMultipleDns:false}"
            connectTimeout="${ldap.connectTimeout}"
            validateOnCheckOut="${ldap.pool.validateOnCheckout}"
            failFastInitialize="true"
            blockWaitTime="${ldap.pool.blockWaitTime}"
            idleTime="${ldap.pool.idleTime}"
            baseDn="${ldap.baseDn}"
            maxPoolSize="${ldap.pool.maxSize}"
            minPoolSize="${ldap.pool.minSize}"
            validatePeriodically="${ldap.pool.validatePeriodically}"
            validatePeriod="${ldap.pool.validatePeriod}"
            prunePeriod="${ldap.pool.prunePeriod}"
            useSSL="${ldap.use.ssl:true}"
            subtreeSearch="${ldap.subtree.search:true}"
            useStartTLS="${ldap.useStartTLS}" />

    <ldaptive:bind-search-authenticator id="supann-authenticator"
            ldapUrl="${supann-ldap.url}"
            baseDn="${supann-ldap.baseDn}"
            userFilter="${supann-ldap.authn.searchFilter}"
            bindDn="${supann-ldap.managerDn}"
            bindCredential="${supann-ldap.managerPassword}"
            connectTimeout="${supann-ldap.connectTimeout}"
            useStartTLS="${supann-ldap.useStartTLS}"
            blockWaitTime="${supann-ldap.pool.blockWaitTime}"
            maxPoolSize="${supann-ldap.pool.maxSize}"
            allowMultipleDns="${supann-ldap.allowMultipleDns:false}"
            usePasswordPolicy="${supann-ldap.usePpolicy:false}"
            minPoolSize="${supann-ldap.pool.minSize}"
            validateOnCheckOut="${supann-ldap.pool.validateOnCheckout}"
            validatePeriodically="${supann-ldap.pool.validatePeriodically}"
            validatePeriod="${supann-ldap.pool.validatePeriod}"
            idleTime="${supann-ldap.pool.idleTime}"
            prunePeriod="${supann-ldap.pool.prunePeriod}"
            failFastInitialize="true"
            subtreeSearch="${supann-ldap.subtree.search:true}"
            useSSL="${supann-ldap.use.ssl:false}" />

    <bean id="AttributesConnectionFactory"
          class="org.ldaptive.pool.PooledConnectionFactory"
          p:connectionPool-ref="AttributesConnectionPool" />

    <bean id="AttributesConnectionPool"
          class="org.ldaptive.pool.BlockingConnectionPool"
          init-method="initialize"
          destroy-method="close"
          p:poolConfig-ref="ldapPoolConfig"
          p:blockWaitTime="${supann-ldap.pool.blockWaitTime}"
          p:validator-ref="searchValidator"
          p:pruneStrategy-ref="pruneStrategy"
          p:connectionFactory-ref="connectionFactory" />

    <bean id="ldapPoolConfig" class="org.ldaptive.pool.PoolConfig"
          p:minPoolSize="${supann-ldap.pool.minSize}"
          p:maxPoolSize="${supann-ldap.pool.maxSize}"
          p:validateOnCheckOut="${supann-ldap.pool.validateOnCheckout}"
          p:validatePeriodically="${supann-ldap.pool.validatePeriodically}"
          p:validatePeriod="${supann-ldap.pool.validatePeriod}" />

    <bean id="connectionFactory" class="org.ldaptive.DefaultConnectionFactory"
          p:connectionConfig-ref="connectionConfig" />

    <bean id="connectionConfig" class="org.ldaptive.ConnectionConfig"
          p:ldapUrl="${supann-ldap.url}"
          p:connectTimeout="${supann-ldap.connectTimeout}"
          p:connectionInitializer-ref="bindConnectionInitializer" />

    <bean id="bindConnectionInitializer"
            class="org.ldaptive.BindConnectionInitializer"
            p:bindDn="${supann-ldap.managerDn}">
          <property name="bindCredential">
              <bean class="org.ldaptive.Credential"
                    c:password="${supann-ldap.managerPassword}" />
          </property>
    </bean>

    <bean id="pruneStrategy" class="org.ldaptive.pool.IdlePruneStrategy"
          p:prunePeriod="${ldap.pool.prunePeriod}"
          p:idleTime="${ldap.pool.idleTime}" />
    
    <bean id="searchValidator" class="org.ldaptive.pool.SearchValidator" />

    <bean id="searchControls" class="javax.naming.directory.SearchControls" />

</beans>