/*******************************************************************************
* Copyright (c) 2015 IBH SYSTEMS GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.sec.web.filter;
import java.security.Principal;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;
import org.eclipse.packagedrone.sec.UserInformation;
import org.eclipse.packagedrone.sec.UserInformationPrincipal;
import org.eclipse.packagedrone.sec.service.LoginException;
import org.eclipse.packagedrone.sec.service.SecurityService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SecurityHttpRequestWrapper extends HttpServletRequestWrapper
{
private final static Logger logger = LoggerFactory.getLogger ( SecurityHttpRequestWrapper.class );
private final SecurityService service;
private final HttpServletRequest parent;
public SecurityHttpRequestWrapper ( final SecurityService service, final HttpServletRequest request )
{
super ( request );
this.parent = request;
this.service = service;
}
@Override
public void login ( final String username, final String password ) throws ServletException
{
final Object value = getSession ().getAttribute ( SecurityFilter.ATTR_USER_INFORMATION );
if ( value != null )
{
logger.warn ( "Already logged in as: {}", value );
throw new ServletException ( "Already logged in" );
}
try
{
if ( this.service == null )
{
throw new LoginException ( "No security service" );
}
final boolean rememberMe = Boolean.TRUE.equals ( getAttribute ( SecurityFilter.ATTR_REMEMBER_ME ) );
final UserInformation user = this.service.login ( username, password, rememberMe );
SecurityFilter.applyUserInformation ( this, user );
}
catch ( final Exception e )
{
throw new ServletException ( e );
}
}
@Override
public Principal getUserPrincipal ()
{
final UserInformation user = getUserDetails ( this.service, getSession ( false ) );
if ( user == null )
{
return null;
}
return new UserInformationPrincipal ( user );
}
@Override
public String getAuthType ()
{
final Principal user = getUserPrincipal ();
if ( user != null )
{
return HttpServletRequest.FORM_AUTH;
}
else
{
return null;
}
}
@Override
public String getRemoteUser ()
{
final Principal user = getUserPrincipal ();
if ( user == null )
{
return null;
}
return user.getName ();
}
@Override
public boolean isUserInRole ( final String role )
{
final UserInformation user = getUserDetails ( this.service, getSession ( false ) );
if ( user == null )
{
return false;
}
final Set<String> roles = user.getRoles ();
if ( roles == null )
{
return false;
}
return roles.contains ( role );
}
@Override
public void logout () throws ServletException
{
getSession ().removeAttribute ( SecurityFilter.ATTR_USER_INFORMATION );
}
private static UserInformation getUserDetails ( final SecurityService service, final HttpSession session )
{
if ( session == null )
{
return null;
}
final Object user = session.getAttribute ( SecurityFilter.ATTR_USER_INFORMATION );
if ( ! ( user instanceof UserInformation ) )
{
return null;
}
if ( session.getAttribute ( SecurityFilter.ATTR_USER_RELOAD ) != null )
{
session.removeAttribute ( SecurityFilter.ATTR_USER_RELOAD );
// reload
final UserInformation result = service.refresh ( (UserInformation)user );
session.setAttribute ( SecurityFilter.ATTR_USER_INFORMATION, result );
return result;
}
else
{
return (UserInformation)user;
}
}
@Override
public String toString ()
{
return String.format ( "[Security Wrapped Request: %s]", this.parent );
}
}