// Path: src/main/java/org/osiam/auth/exception/LdapAuthenticationProcessException.java
// public class LdapAuthenticationProcessException extends AuthenticationException {
//     
//     public LdapAuthenticationProcessException(String s) {
//         super(s);
//     }
// }
// 
// Path: src/main/java/org/osiam/security/helper/LoginDecisionFilter.java
// public class LoginDecisionFilter extends AbstractAuthenticationProcessingFilter {
// 
//     public static final String USERNAME_PARAMETER = "username";
//     private static final String PASSWORD_PARAMETER = "password";
// 
//     private boolean postOnly = true;
// 
//     public LoginDecisionFilter() {
//         super("/login/check");
//     }
// 
//     @Override
//     public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {
//         if (postOnly && !request.getMethod().equals("POST")) {
//             throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
//         }
// 
//         String username = request.getParameter(getUsernameParameter());
//         String password = request.getParameter(getPasswordParameter());
// 
//         if (username == null) {
//             username = "";
//         }
// 
//         if (password == null) {
//             password = "";
//         }
// 
//         username = username.trim();
// 
//         String provider = request.getParameter("provider");
// 
//         UsernamePasswordAuthenticationToken authRequest;
//         if (!Strings.isNullOrEmpty(provider) && provider.equals("ldap")) {
//             authRequest = new OsiamLdapAuthentication(username, password);
//         } else {
//             authRequest = new InternalAuthentication(username, password);
//         }
// 
//         setDetails(request, authRequest);
//         return this.getAuthenticationManager().authenticate(authRequest);
//     }
// 
//     /**
//      * Provided so that subclasses may configure what is put into the authentication request's details property.
//      *
//      * @param request
//      *         that an authentication request is being created for
//      * @param authRequest
//      *         the authentication request object that should have its details set
//      */
//     protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {
//         authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
//     }
// 
//     /**
//      * Defines whether only HTTP POST requests will be allowed by this filter. If set to true, and an authentication
//      * request is received which is not a POST request, an exception will be raised immediately and authentication will
//      * not be attempted. The <tt>unsuccessfulAuthentication()</tt> method will be called as if handling a failed
//      * authentication.
//      * <p>
//      * Defaults to <tt>true</tt> but may be overridden by subclasses.
//      */
//     public void setPostOnly(boolean postOnly) {
//         this.postOnly = postOnly;
//     }
// 
//     public final String getUsernameParameter() {
//         return USERNAME_PARAMETER;
//     }
// 
//     public final String getPasswordParameter() {
//         return PASSWORD_PARAMETER;
//     }
// }


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import com.google.common.base.Strings;
import org.osiam.auth.exception.LdapAuthenticationProcessException;
import org.osiam.security.helper.LoginDecisionFilter;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
/*
 * Copyright (C) 2013 tarent AG
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

package org.osiam.auth.login;



public class OsiamCachingAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    private static final String LAST_USERNAME_KEY = "LAST_USERNAME";
    private static final String LAST_PROVIDER_KEY = "LAST_PROVIDER";
    private static final String ERROR_KEY = "ERROR_KEY";
    private static final String IS_LOCKED = "IS_LOCKED";

    public OsiamCachingAuthenticationFailureHandler(String defaultFailureUrl) {
        super(defaultFailureUrl);
    }

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException exception) throws IOException, ServletException {

        super.onAuthenticationFailure(request, response, exception);

        if (request.getSession(false) == null && !isAllowSessionCreation()) {
            return;
        }

        request.getSession().setAttribute(
                LAST_USERNAME_KEY, request.getParameter(LoginDecisionFilter.USERNAME_PARAMETER)
        );
        request.getSession().setAttribute(
                LAST_PROVIDER_KEY,
                Strings.isNullOrEmpty(request.getParameter("provider"))
                        ? "internal"
                        : request.getParameter("provider")
        );
        request.getSession().setAttribute(IS_LOCKED, false);
// Path: src/main/java/org/osiam/auth/exception/LdapAuthenticationProcessException.java
// public class LdapAuthenticationProcessException extends AuthenticationException {
//     
//     public LdapAuthenticationProcessException(String s) {
//         super(s);
//     }
// }
// 
// Path: src/main/java/org/osiam/security/helper/LoginDecisionFilter.java
// public class LoginDecisionFilter extends AbstractAuthenticationProcessingFilter {
// 
//     public static final String USERNAME_PARAMETER = "username";
//     private static final String PASSWORD_PARAMETER = "password";
// 
//     private boolean postOnly = true;
// 
//     public LoginDecisionFilter() {
//         super("/login/check");
//     }
// 
//     @Override
//     public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {
//         if (postOnly && !request.getMethod().equals("POST")) {
//             throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
//         }
// 
//         String username = request.getParameter(getUsernameParameter());
//         String password = request.getParameter(getPasswordParameter());
// 
//         if (username == null) {
//             username = "";
//         }
// 
//         if (password == null) {
//             password = "";
//         }
// 
//         username = username.trim();
// 
//         String provider = request.getParameter("provider");
// 
//         UsernamePasswordAuthenticationToken authRequest;
//         if (!Strings.isNullOrEmpty(provider) && provider.equals("ldap")) {
//             authRequest = new OsiamLdapAuthentication(username, password);
//         } else {
//             authRequest = new InternalAuthentication(username, password);
//         }
// 
//         setDetails(request, authRequest);
//         return this.getAuthenticationManager().authenticate(authRequest);
//     }
// 
//     /**
//      * Provided so that subclasses may configure what is put into the authentication request's details property.
//      *
//      * @param request
//      *         that an authentication request is being created for
//      * @param authRequest
//      *         the authentication request object that should have its details set
//      */
//     protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {
//         authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
//     }
// 
//     /**
//      * Defines whether only HTTP POST requests will be allowed by this filter. If set to true, and an authentication
//      * request is received which is not a POST request, an exception will be raised immediately and authentication will
//      * not be attempted. The <tt>unsuccessfulAuthentication()</tt> method will be called as if handling a failed
//      * authentication.
//      * <p>
//      * Defaults to <tt>true</tt> but may be overridden by subclasses.
//      */
//     public void setPostOnly(boolean postOnly) {
//         this.postOnly = postOnly;
//     }
// 
//     public final String getUsernameParameter() {
//         return USERNAME_PARAMETER;
//     }
// 
//     public final String getPasswordParameter() {
//         return PASSWORD_PARAMETER;
//     }
// }


// Path: src/main/java/org/osiam/auth/login/OsiamCachingAuthenticationFailureHandler.java
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import com.google.common.base.Strings;
import org.osiam.auth.exception.LdapAuthenticationProcessException;
import org.osiam.security.helper.LoginDecisionFilter;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;

/*
 * Copyright (C) 2013 tarent AG
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

package org.osiam.auth.login;



public class OsiamCachingAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    private static final String LAST_USERNAME_KEY = "LAST_USERNAME";
    private static final String LAST_PROVIDER_KEY = "LAST_PROVIDER";
    private static final String ERROR_KEY = "ERROR_KEY";
    private static final String IS_LOCKED = "IS_LOCKED";

    public OsiamCachingAuthenticationFailureHandler(String defaultFailureUrl) {
        super(defaultFailureUrl);
    }

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException exception) throws IOException, ServletException {

        super.onAuthenticationFailure(request, response, exception);

        if (request.getSession(false) == null && !isAllowSessionCreation()) {
            return;
        }

        request.getSession().setAttribute(
                LAST_USERNAME_KEY, request.getParameter(LoginDecisionFilter.USERNAME_PARAMETER)
        );
        request.getSession().setAttribute(
                LAST_PROVIDER_KEY,
                Strings.isNullOrEmpty(request.getParameter("provider"))
                        ? "internal"
                        : request.getParameter("provider")
        );
        request.getSession().setAttribute(IS_LOCKED, false);
        if (exception instanceof LdapAuthenticationProcessException) {