/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.vertical.adminweb;
import java.io.IOException;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.enonic.esl.containers.ExtendedMap;
import com.enonic.esl.net.URLUtil;
import com.enonic.vertical.engine.VerticalSecurityException;
import com.enonic.cms.core.content.contenttype.ContentHandlerName;
import com.enonic.cms.core.security.AdminSecurityHolder;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.security.user.UserSpecification;
import com.enonic.cms.core.security.userstore.UserStoreKey;
import com.enonic.cms.core.service.AdminService;
/**
* Routes a request for a page in the administration web to the correct servlet.
*/
public class AdminPage
extends AbstractAdminwebServlet
{
private static final Logger LOG = LoggerFactory.getLogger( AdminPage.class );
public void doGet( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException
{
performTask( request, response );
}
public void doPost( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException
{
performTask( request, response );
}
public void performTask( HttpServletRequest request, HttpServletResponse response )
{
// Dirty hack so that it can respond to /admin not only /admin/.
if ( ( request.getPathInfo() == null ) || request.getPathInfo().endsWith( "/admin" ) )
{
try
{
redirectClientToAdminPath( "adminpage", request, response );
return;
}
catch ( VerticalAdminException vae )
{
String message = "Failed to redirect to admin page: %t";
VerticalAdminLogger.errorAdmin( message, vae );
}
}
HttpSession session = request.getSession( false );
// lookup admin bean
AdminService admin = lookupAdminBean();
User user = null;
if ( session != null )
{
user = securityService.getLoggedInAdminConsoleUser();
}
if ( user == null )
{
String remoteUserUID = request.getRemoteUser();
if ( remoteUserUID != null )
{
try
{
UserStoreKey userStoreKey = userStoreService.getDefaultUserStore().getKey();
UserSpecification remoteUserSpec = new UserSpecification();
remoteUserSpec.setDeletedStateNotDeleted();
remoteUserSpec.setUserStoreKey( userStoreKey );
remoteUserSpec.setName( remoteUserUID );
User remoteUser = userDao.findSingleBySpecification( remoteUserSpec );
if ( remoteUser != null )
{
if ( adminConsoleLoginAccessResolver.hasAccess( securityService.getUser( remoteUser ) ) )
{
if ( session == null )
{
session = request.getSession( true );
}
user = remoteUser;
AdminSecurityHolder.setUser( user.getKey() );
String message = "Logged in remote user {0} automatically";
VerticalAdminLogger.info( message, remoteUserUID );
}
else
{
String message = "User {0} is not authorized to use administration console.";
VerticalAdminLogger.error( message, remoteUserUID, null );
}
}
else
{
String message = "Failed to log in remote user with uid {0}";
VerticalAdminLogger.error( message, remoteUserUID, null );
}
}
catch ( VerticalSecurityException vse )
{
String message = "Failed to log in remote user with uid {0}: %t";
VerticalAdminLogger.error( message, remoteUserUID, vse );
}
}
}
if ( user == null )
{
// not logged in, redirect to login
try
{
// ren: VS-1970
Map queryValues = URLUtil.decodeParameterMap( request.getParameterMap() );
ExtendedMap params = new ExtendedMap( queryValues );
int editContent = params.getInt( "editContent", -1 );
ExtendedMap editContentParam = new ExtendedMap();
if ( editContent > -1 )
{
editContentParam.putInt( "editContent", editContent );
}
redirectClientToAdminPath( "login", editContentParam, request, response );
// end: VS-1970
//redirectClientToAdminPath( "login", request, response );
}
catch ( VerticalAdminException vae )
{
String message = "Failed to redirect to login page: %t";
VerticalAdminLogger.errorAdmin( message, vae );
}
}
else
{
String pageStr = null;
String enctype = request.getContentType();
if ( enctype != null && enctype.startsWith( "multipart/form-data" ) )
{
// Handle multipart forms
try
{
Map queryValues = URLUtil.decodeParameterMap( request.getParameterMap() );
if ( queryValues.containsKey( "page" ) )
{
pageStr = ( (String[]) queryValues.get( "page" ) )[0];
}
else
{
pageStr = null;
}
}
catch ( IllegalArgumentException iae )
{
String message = "Failed to parse multi-part request";
VerticalAdminLogger.errorAdmin( message, iae );
}
}
else
{
pageStr = request.getParameter( "page" );
}
int page = -1;
try
{
if ( pageStr != null )
{
page = Integer.parseInt( pageStr );
}
else
{
page = 0;
}
}
catch ( NumberFormatException nfe )
{
String message = "Failed to parse page number: {0}";
VerticalAdminLogger.error( message, pageStr, nfe );
ErrorPageServlet.Error error = new ErrorPageServlet.ThrowableError( nfe );
session.setAttribute( "com.enonic.vertical.error", error );
try
{
redirectClientToAdminPath( "errorpage", request, response );
}
catch ( VerticalAdminException vae )
{
message = "Failed to redirect to error page: %t";
VerticalAdminLogger.errorAdmin( message, vae );
}
}
if ( "true".equals( request.getParameter( "waitscreen" ) ) )
{
page = 5;
}
if ( page == 993 )
{
int contentKey = -1;
String contentKeyStr = request.getParameter( "key" );
if ( contentKeyStr != null )
{
contentKey = Integer.parseInt( contentKeyStr );
}
if ( contentKey == -1 )
{
String versionKeyStr = request.getParameter( "versionkey" );
if ( versionKeyStr != null )
{
int versionKey = Integer.parseInt( versionKeyStr );
contentKey = admin.getContentKeyByVersionKey( versionKey );
}
}
if ( contentKey != -1 )
{
int contentTypeKey = admin.getContentTypeKey( contentKey );
page = contentTypeKey + 999;
}
}
String servlet = null;
switch ( page )
{
// Framework
case 0:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.FramesetServlet";
break;
case 1:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.NavigatorServlet";
break;
case 2:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.MainMenuServlet";
break;
case 3:
servlet = "/admin/logout";
break;
case 4:
servlet = "/admin/login";
break;
case 5:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.SplashServlet";
break;
case 10:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.SystemHandlerServlet";
break;
case 50:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.AdminFrontPageServlet";
break;
case 200:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.CategoryHandlerServlet";
break;
case 275:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.ObjectClassHandlerServlet";
break;
case 280:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.LDAPServerHandlerServlet";
break;
case 290:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.UserStoreHandlerServlet";
break;
case 350:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.LogHandlerServlet";
break;
case 360:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.LanguageHandlerServlet";
break;
case 400:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.ContentTypeHandlerServlet";
break;
case 500:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.PageHandlerServlet";
break;
case 510:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.handlers.PagelinkHandlerServlet";
break;
case 550:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.PageTemplateHandlerServlet";
break;
case 600:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.ArchiveHandlerServlet";
break;
case 700:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.UserHandlerServlet";
break;
case 701:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.GroupHandlerServlet";
break;
case 800:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.ResourceHandlerServlet";
break;
case 850:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.MenuHandlerServlet";
break;
case 851:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.PresentationLayerServlet";
break;
case 855:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.ContentTemplateHandlerServlet";
break;
case 900:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.ContentObjectHandlerServlet";
break;
case 950:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.SectionHandlerServlet";
break;
case 960:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.MyPageServlet";
break;
case 990:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.DatabaseServlet";
break;
case 991:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.handlers.ContentBaseHandlerServlet";
break;
case 370:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.SchedulerServlet";
break;
// Try-out: A fixed way of reaching the image handler servlet. Needed by html-editor edit-image functionality.
case 992:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.handlers.ContentEnhancedImageHandlerServlet";
break;
// Try-out: A fixed way of (dirty hack) for reaching simple content handler servlet?
case 994:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.handlers.SimpleContentHandlerServlet";
break;
case 1048:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.EditorHandlerServlet";
break;
case 1050:
servlet = "/admin/servlet/com.enonic.vertical.adminweb.ContentHandlerHandlerServlet";
break;
case 1060:
servlet = "/admin/servlet/tools/com.enonic.vertical.adminweb.ContentHandlerHandlerServlet";
break;
}
try
{
if ( servlet == null )
{
// Find the right handler
String handlerClass = admin.getContentHandlerClassForContentType( page - 999 );
ContentHandlerName handlerName = ContentHandlerName.parse( handlerClass );
if ( handlerName == null )
{
String message = "No handler set for content type.";
VerticalAdminLogger.errorAdmin( message );
}
servlet = "/admin/servlet/" + handlerClass;
}
forwardRequest( servlet, request, response );
}
catch ( Exception e )
{
String message = "Forward failed: {0} %t";
VerticalAdminLogger.error( message, servlet, e );
ErrorPageServlet.Error error = new ErrorPageServlet.ThrowableError( e );
session.setAttribute( "com.enonic.vertical.error", error );
try
{
redirectClientToAdminPath( "errorpage", request, response );
}
catch ( VerticalAdminException vae )
{
message = "Failed to redirect to error page: %t";
VerticalAdminLogger.errorAdmin( message, vae );
}
}
}
}
protected void forwardRequest( String servletPath, HttpServletRequest request, HttpServletResponse response )
{
try
{
RequestDispatcher dispatcher = request.getRequestDispatcher( servletPath );
dispatcher.forward( request, response );
}
catch ( IOException ioe )
{
}
catch ( ServletException se )
{
// Do nothing
LOG.warn( "Unable to forward ", se );
}
}
}