/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.web.portal.services; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.elasticsearch.common.collect.Maps; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.enonic.cms.core.Path; import com.enonic.cms.core.portal.InvalidParameterValueException; import com.enonic.cms.core.portal.ticket.InvalidTicketException; import com.enonic.cms.core.portal.ticket.TicketValidator; import com.enonic.cms.core.structure.SitePath; import com.enonic.cms.core.structure.SitePropertyNames; import com.enonic.cms.web.portal.PortalWebContext; import com.enonic.cms.web.portal.handler.WebHandlerBase; @Component public final class ServicesHandler extends WebHandlerBase { private final Map<String, ServicesProcessor> processorMap; public ServicesHandler() { this.processorMap = Maps.newHashMap(); } @Override protected boolean canHandle( final Path localPath ) { return localPath.containsSubPath( "_services" ); } @Override protected void doHandle( final PortalWebContext context ) throws Exception { final HttpServletRequest request = context.getRequest(); final SitePath sitePath = context.getSitePath(); if ( ticketIsRequired( sitePath ) && !ticketIsValid( request ) ) { throw new InvalidTicketException(); } if ( sitePropertiesService.getSiteProperties( sitePath.getSiteKey() ).getPropertyAsBoolean( SitePropertyNames.AUTOLOGIN_HTTP_REMOTE_USER_ENABLED ) ) { autoLoginService.autologinWithRemoteUser( request, siteDao.findByKey( context.getSiteKey() ) ); } final String handlerName = UserServicesParameterResolver.resolveHandlerFromSitePath( sitePath ); final ServicesProcessor processor = this.processorMap.get( handlerName ); if ( processor == null ) { throw new InvalidParameterValueException( "handler", handlerName ); } processor.handle( context ); } private boolean ticketIsRequired( SitePath sitePath ) { String handler = UserServicesParameterResolver.resolveHandlerFromSitePath( sitePath ); String operation = UserServicesParameterResolver.resolveOperationFromSitePath( sitePath ); if ( "user".equals( handler ) ) { if ( "login".equals( operation ) || "logout".equals( operation ) ) { return false; } } else if ( "portal".equals( handler ) && "forceDeviceClass".equals( operation ) ) { return false; } else if ( "portal".equals( handler ) && "resetDeviceClass".equals( operation ) ) { return false; } else if ( "portal".equals( handler ) && "forceLocale".equals( operation ) ) { return false; } else if ( "portal".equals( handler ) && "resetLocale".equals( operation ) ) { return false; } return true; } private boolean ticketIsValid( HttpServletRequest request ) { return TicketValidator.isValid( request ); } private void addProcessor( final ServicesProcessor processor ) { this.processorMap.put( processor.getHandlerName(), processor ); } @Autowired public void setContentSendMailServicesProcessor( final ContentSendMailServicesProcessor processor ) { addProcessor( processor ); } @Autowired public void setContentServicesProcessor( final ContentServicesProcessor processor ) { addProcessor( processor ); } @Autowired public void setFormServicesProcessor( final FormServicesProcessor processor ) { addProcessor( processor ); } @Autowired public void setPollServicesProcessor( final PollServicesProcessor processor ) { addProcessor( processor ); } @Autowired public void setPortalServicesProcessor( final PortalServicesProcessor processor ) { addProcessor( processor ); } @Autowired public void setSendMailServicesProcessor( final SendMailServicesProcessor processor ) { addProcessor( processor ); } @Autowired public void setSessionServicesProcessor( final SessionServicesProcessor processor ) { addProcessor( processor ); } @Autowired public void setUserServicesProcessor( final UserServicesProcessor processor ) { addProcessor( processor ); } }