AdminPagePortletJspBean.java

  1. /*
  2.  * Copyright (c) 2002-2022, City of Paris
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  *  1. Redistributions of source code must retain the above copyright notice
  10.  *     and the following disclaimer.
  11.  *
  12.  *  2. Redistributions in binary form must reproduce the above copyright notice
  13.  *     and the following disclaimer in the documentation and/or other materials
  14.  *     provided with the distribution.
  15.  *
  16.  *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
  17.  *     contributors may be used to endorse or promote products derived from
  18.  *     this software without specific prior written permission.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
  24.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30.  * POSSIBILITY OF SUCH DAMAGE.
  31.  *
  32.  * License 1.0
  33.  */
  34. package fr.paris.lutece.portal.web.admin;

  35. import java.util.ArrayList;
  36. import java.util.HashMap;
  37. import java.util.Locale;
  38. import java.util.Map;

  39. import javax.servlet.http.HttpServletRequest;

  40. import org.apache.commons.lang3.StringUtils;

  41. import fr.paris.lutece.portal.business.portlet.Portlet;
  42. import fr.paris.lutece.portal.business.portlet.PortletHome;
  43. import fr.paris.lutece.portal.business.portlet.PortletType;
  44. import fr.paris.lutece.portal.business.portlet.PortletTypeHome;
  45. import fr.paris.lutece.portal.business.user.AdminUser;
  46. import fr.paris.lutece.portal.service.admin.AccessDeniedException;
  47. import fr.paris.lutece.portal.service.admin.AdminUserService;
  48. import fr.paris.lutece.portal.service.message.AdminMessage;
  49. import fr.paris.lutece.portal.service.message.AdminMessageService;
  50. import fr.paris.lutece.portal.service.portlet.PortletRemovalListenerService;
  51. import fr.paris.lutece.portal.service.portlet.PortletResourceIdService;
  52. import fr.paris.lutece.portal.service.rbac.RBACService;
  53. import fr.paris.lutece.portal.service.security.SecurityTokenService;
  54. import fr.paris.lutece.portal.service.util.AppLogService;
  55. import fr.paris.lutece.portal.web.constants.Messages;
  56. import fr.paris.lutece.portal.web.constants.Parameters;
  57. import fr.paris.lutece.util.url.UrlItem;

  58. /**
  59.  * This class provides the admin interface to manage administration of portlet on the pages
  60.  */
  61. public class AdminPagePortletJspBean extends AdminFeaturesPageJspBean
  62. {
  63.     private static final long serialVersionUID = -7578155683931873195L;
  64.     // Right
  65.     public static final String RIGHT_MANAGE_ADMIN_SITE = "CORE_ADMIN_SITE";
  66.     private static final String MSG_ERROR_PORTLET = "Error looking for portlet with id {}";
  67.     private static final String PROPERTY_MESSAGE_WARNING_PORTLET_ALIAS = "portal.site.message.warningPortletAlias";
  68.     private static final String PROPERTY_MESSAGE_CONFIRM_REMOVE_PORTLET = "portal.site.message.confirmRemovePortlet";
  69.     private static final String MESSAGE_CANNOT_REMOVE_PORTLET = "portal.site.message.cannotRemovePortlet";
  70.     private static final String MESSAGE_CANNOT_REMOVE_PORTLET_TITLE = "portal.site.message.cannotRemovePortlet.title";
  71.     private static final String PROPERTY_MESSAGE_CONFIRM_MODIFY_STATUS = "portal.site.message.confirmModifyStatus";
  72.     private static final String PORTLET_STATUS = "status";
  73.     private static final String JSP_REMOVE_PORTLET = "jsp/admin/site/DoRemovePortlet.jsp";
  74.     private static final String JSP_DO_MODIFY_POSITION = "jsp/admin/site/DoModifyPortletPosition.jsp";
  75.     private static final String JSP_DO_MODIFY_STATUS = "jsp/admin/site/DoModifyPortletStatus.jsp";
  76.     private static final String JSP_ADMIN_SITE = "AdminSite.jsp";

  77.     /**
  78.      * Processes the modification of a portlet whose identifier is stored in the http request
  79.      *
  80.      * @param request
  81.      *            The http request
  82.      * @return The jsp url of the process result
  83.      */
  84.     public String doModifyPortlet( HttpServletRequest request )
  85.     {
  86.         String strUrl = null;
  87.         String strPortletId = request.getParameter( Parameters.PORTLET_ID );

  88.         int nPortletId = Integer.parseInt( strPortletId );
  89.         Portlet portlet = PortletHome.findByPrimaryKey( nPortletId );

  90.         for ( PortletType portletType : PortletTypeHome.getPortletTypesList( getLocale( ) ) )
  91.         {
  92.             if ( portletType.getId( ).equals( portlet.getPortletTypeId( ) ) )
  93.             {
  94.                 UrlItem url = new UrlItem( portletType.getUrlUpdate( ) );
  95.                 url.addParameter( Parameters.PORTLET_ID, nPortletId );
  96.                 strUrl = url.getUrl( );

  97.                 break;
  98.             }
  99.         }

  100.         return strUrl;
  101.     }

  102.     /**
  103.      * Redirects towards the url of the process creation of a portlet according to its type or null if the portlet type doesn't exist.
  104.      *
  105.      * @param request
  106.      *            The http request
  107.      * @return The jsp url of the portlet type process creation
  108.      */
  109.     public String doCreatePortlet( HttpServletRequest request )
  110.     {
  111.         String strUrl = null;
  112.         String strPortletTypeId = request.getParameter( Parameters.PORTLET_TYPE_ID );

  113.         for ( PortletType portletType : PortletTypeHome.getPortletTypesList( getLocale( ) ) )
  114.         {
  115.             if ( portletType.getId( ).equals( strPortletTypeId ) )
  116.             {
  117.                 strUrl = portletType.getUrlCreation( );

  118.                 break;
  119.             }
  120.         }

  121.         return strUrl;
  122.     }

  123.     /**
  124.      * Displays the confirm message for deleting the portlet
  125.      *
  126.      * @param request
  127.      *            The http request
  128.      * @return The confirm page
  129.      * @throws AccessDeniedException
  130.      *             if the user is not authorized to manage the portlet
  131.      */
  132.     public String getRemovePortlet( HttpServletRequest request ) throws AccessDeniedException
  133.     {
  134.         String strPortletId = request.getParameter( Parameters.PORTLET_ID );
  135.         if ( !StringUtils.isNumeric( strPortletId ) )
  136.         {
  137.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_ERROR );
  138.         }
  139.         int nPortletId = Integer.parseInt( strPortletId );
  140.         Portlet portlet = null;
  141.         try
  142.         {
  143.             portlet = PortletHome.findByPrimaryKey( nPortletId );
  144.         }
  145.         catch( NullPointerException e )
  146.         {
  147.             AppLogService.error( MSG_ERROR_PORTLET, nPortletId, e );
  148.         }
  149.         if ( portlet == null || portlet.getId( ) != nPortletId )
  150.         {
  151.             return AdminMessageService.getMessageUrl( request, Messages.MESSAGE_INVALID_ENTRY, new Object [ ] {
  152.                     nPortletId
  153.             }, AdminMessage.TYPE_ERROR );
  154.         }
  155.         AdminUser user = AdminUserService.getAdminUser( request );
  156.         if ( !RBACService.isAuthorized( PortletType.RESOURCE_TYPE, portlet.getPortletTypeId( ), PortletResourceIdService.PERMISSION_MANAGE, user ) )
  157.         {
  158.             throw new AccessDeniedException( getMessageErrorAuthorization( user, PortletResourceIdService.PERMISSION_MANAGE, nPortletId ) );
  159.         }
  160.         String strUrl = JSP_REMOVE_PORTLET;
  161.         String strTarget = "_top";
  162.         Map<String, Object> parameters = new HashMap<>( );
  163.         parameters.put( Parameters.PORTLET_ID, strPortletId );
  164.         parameters.put( SecurityTokenService.PARAMETER_TOKEN, SecurityTokenService.getInstance( ).getToken( request, JSP_REMOVE_PORTLET ) );

  165.         if ( PortletHome.hasAlias( nPortletId ) )
  166.         {
  167.             return AdminMessageService.getMessageUrl( request, PROPERTY_MESSAGE_WARNING_PORTLET_ALIAS, new Object [ ] {
  168.                     portlet.getName( )
  169.             }, null, strUrl, strTarget, AdminMessage.TYPE_CONFIRMATION, parameters );
  170.         }

  171.         ArrayList<String> listErrors = new ArrayList<>( );
  172.         Locale locale = AdminUserService.getLocale( request );
  173.         if ( !PortletRemovalListenerService.getService( ).checkForRemoval( strPortletId, listErrors, locale ) )
  174.         {
  175.             String strCause = AdminMessageService.getFormattedList( listErrors, locale );
  176.             Object [ ] args = {
  177.                     strCause, portlet.getName( )
  178.             };

  179.             return AdminMessageService.getMessageUrl( request, MESSAGE_CANNOT_REMOVE_PORTLET, args, MESSAGE_CANNOT_REMOVE_PORTLET_TITLE, strUrl, strTarget,
  180.                     AdminMessage.TYPE_STOP, parameters );
  181.         }

  182.         return AdminMessageService.getMessageUrl( request, PROPERTY_MESSAGE_CONFIRM_REMOVE_PORTLET, new Object [ ] {
  183.                 portlet.getName( )
  184.         }, null, strUrl, strTarget, AdminMessage.TYPE_CONFIRMATION, parameters );
  185.     }

  186.     /**
  187.      * Processes the removal of the portlet
  188.      *
  189.      * @param request
  190.      *            The http request
  191.      * @return The Jsp URL of the process result
  192.      * @throws AccessDeniedException
  193.      *             if the user is not authorized to manage the portlet
  194.      */
  195.     public String doRemovePortlet( HttpServletRequest request ) throws AccessDeniedException
  196.     {
  197.         String strPortletId = request.getParameter( Parameters.PORTLET_ID );
  198.         if ( !StringUtils.isNumeric( strPortletId ) )
  199.         {
  200.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_ERROR );
  201.         }
  202.         int nPortletId = Integer.parseInt( strPortletId );
  203.         Portlet portlet = null;
  204.         try
  205.         {
  206.             portlet = PortletHome.findByPrimaryKey( nPortletId );
  207.         }
  208.         catch( NullPointerException e )
  209.         {
  210.             AppLogService.error( MSG_ERROR_PORTLET, nPortletId, e );
  211.         }
  212.         if ( portlet == null || portlet.getId( ) != nPortletId )
  213.         {
  214.             return AdminMessageService.getMessageUrl( request, Messages.MESSAGE_INVALID_ENTRY, new Object [ ] {
  215.                     nPortletId
  216.             }, AdminMessage.TYPE_ERROR );
  217.         }
  218.         if ( !SecurityTokenService.getInstance( ).validate( request, JSP_REMOVE_PORTLET ) )
  219.         {
  220.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  221.         }
  222.         AdminUser user = AdminUserService.getAdminUser( request );
  223.         if ( !RBACService.isAuthorized( PortletType.RESOURCE_TYPE, portlet.getPortletTypeId( ), PortletResourceIdService.PERMISSION_MANAGE, user ) )
  224.         {
  225.             throw new AccessDeniedException( getMessageErrorAuthorization( user, PortletResourceIdService.PERMISSION_MANAGE, nPortletId ) );
  226.         }
  227.         ArrayList<String> listErrors = new ArrayList<>( );
  228.         Locale locale = AdminUserService.getLocale( request );

  229.         if ( PortletRemovalListenerService.getService( ).checkForRemoval( strPortletId, listErrors, locale ) )
  230.         {
  231.             portlet.remove( );
  232.         }

  233.         return JSP_ADMIN_SITE + "?" + Parameters.PAGE_ID + "=" + portlet.getPageId( );
  234.     }

  235.     /**
  236.      * Displays the portlet status modification page
  237.      *
  238.      * @param request
  239.      *            The http request
  240.      * @return The confirm page
  241.      * @throws AccessDeniedException
  242.      *             if the user is not authorized to manage the portlet
  243.      */
  244.     public String getModifyPortletStatus( HttpServletRequest request ) throws AccessDeniedException
  245.     {
  246.         String strPortletId = request.getParameter( Parameters.PORTLET_ID );
  247.         String strStatus = request.getParameter( PORTLET_STATUS );
  248.         if ( !StringUtils.isNumeric( strPortletId ) || !StringUtils.isNumeric( strStatus ) )
  249.         {
  250.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_ERROR );
  251.         }
  252.         int nPortletId = Integer.parseInt( strPortletId );
  253.         Portlet portlet = null;
  254.         try
  255.         {
  256.             portlet = PortletHome.findByPrimaryKey( nPortletId );
  257.         }
  258.         catch( NullPointerException e )
  259.         {
  260.             AppLogService.error( MSG_ERROR_PORTLET, nPortletId, e );
  261.         }
  262.         if ( portlet == null || portlet.getId( ) != nPortletId )
  263.         {
  264.             return AdminMessageService.getMessageUrl( request, Messages.MESSAGE_INVALID_ENTRY, new Object [ ] {
  265.                     nPortletId
  266.             }, AdminMessage.TYPE_ERROR );
  267.         }
  268.         int nStatus = Integer.parseInt( strStatus );
  269.         if ( nStatus != Portlet.STATUS_PUBLISHED && nStatus != Portlet.STATUS_UNPUBLISHED )
  270.         {
  271.             return AdminMessageService.getMessageUrl( request, Messages.MESSAGE_INVALID_ENTRY, new Object [ ] {
  272.                     nStatus
  273.             }, AdminMessage.TYPE_ERROR );
  274.         }
  275.         AdminUser user = AdminUserService.getAdminUser( request );
  276.         if ( !RBACService.isAuthorized( PortletType.RESOURCE_TYPE, portlet.getPortletTypeId( ), PortletResourceIdService.PERMISSION_MANAGE, user ) )
  277.         {
  278.             throw new AccessDeniedException( getMessageErrorAuthorization( user, PortletResourceIdService.PERMISSION_MANAGE, nPortletId ) );
  279.         }
  280.         String strUrl = JSP_DO_MODIFY_STATUS;
  281.         String strTarget = "_top";

  282.         Map<String, Object> parameters = new HashMap<>( );
  283.         parameters.put( Parameters.PORTLET_ID, strPortletId );
  284.         parameters.put( PORTLET_STATUS, strStatus );
  285.         parameters.put( SecurityTokenService.PARAMETER_TOKEN, SecurityTokenService.getInstance( ).getToken( request, JSP_DO_MODIFY_STATUS ) );
  286.         return AdminMessageService.getMessageUrl( request, PROPERTY_MESSAGE_CONFIRM_MODIFY_STATUS, null, null, strUrl, strTarget,
  287.                 AdminMessage.TYPE_CONFIRMATION, parameters );
  288.     }

  289.     /**
  290.      * Processes the status definition for portlet : suspended or activated
  291.      *
  292.      * @param request
  293.      *            The http request
  294.      * @return The Jsp URL of the process result
  295.      * @throws AccessDeniedException
  296.      *             if the user is not authorized to manage the portlet
  297.      */
  298.     public String doModifyPortletStatus( HttpServletRequest request ) throws AccessDeniedException
  299.     {
  300.         if ( !SecurityTokenService.getInstance( ).validate( request, JSP_DO_MODIFY_STATUS ) )
  301.         {
  302.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  303.         }
  304.         String strPortletId = request.getParameter( Parameters.PORTLET_ID );
  305.         String strStatus = request.getParameter( PORTLET_STATUS );
  306.         if ( !StringUtils.isNumeric( strPortletId ) || !StringUtils.isNumeric( strStatus ) )
  307.         {
  308.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_ERROR );
  309.         }
  310.         int nPortletId = Integer.parseInt( strPortletId );
  311.         Portlet portlet = null;
  312.         try
  313.         {
  314.             portlet = PortletHome.findByPrimaryKey( nPortletId );
  315.         }
  316.         catch( NullPointerException e )
  317.         {
  318.             AppLogService.error( MSG_ERROR_PORTLET, nPortletId, e );
  319.         }
  320.         if ( portlet == null || portlet.getId( ) != nPortletId )
  321.         {
  322.             return AdminMessageService.getMessageUrl( request, Messages.MESSAGE_INVALID_ENTRY, new Object [ ] {
  323.                     nPortletId
  324.             }, AdminMessage.TYPE_ERROR );
  325.         }
  326.         int nStatus = Integer.parseInt( strStatus );
  327.         if ( nStatus != Portlet.STATUS_PUBLISHED && nStatus != Portlet.STATUS_UNPUBLISHED )
  328.         {
  329.             return AdminMessageService.getMessageUrl( request, Messages.MESSAGE_INVALID_ENTRY, new Object [ ] {
  330.                     nStatus
  331.             }, AdminMessage.TYPE_ERROR );
  332.         }
  333.         AdminUser user = AdminUserService.getAdminUser( request );
  334.         if ( !RBACService.isAuthorized( PortletType.RESOURCE_TYPE, portlet.getPortletTypeId( ), PortletResourceIdService.PERMISSION_MANAGE, user ) )
  335.         {
  336.             throw new AccessDeniedException( getMessageErrorAuthorization( user, PortletResourceIdService.PERMISSION_MANAGE, nPortletId ) );
  337.         }

  338.         PortletHome.updateStatus( portlet, nStatus );

  339.         return JSP_ADMIN_SITE + "?" + Parameters.PAGE_ID + "=" + portlet.getPageId( );
  340.     }
  341.    
  342.     /**
  343.      * Processes the Order and Column Update of the portlet
  344.      *
  345.      * @param request
  346.      *            The http request
  347.      * @return The Jsp URL of the process result
  348.      * @throws AccessDeniedException
  349.      *             if the user is not authorized to manage the portlet
  350.      */
  351.     public String doUpdatePortletPosition( HttpServletRequest request ) throws AccessDeniedException
  352.     {
  353.         String strPortletId = request.getParameter( Parameters.PORTLET_ID );
  354.         String strColumnId = request.getParameter( Parameters.COLUMN );
  355.         String strOrder = request.getParameter( Parameters.ORDER );

  356.         if ( !StringUtils.isNumeric( strPortletId ) || !StringUtils.isNumeric( strColumnId ) || !StringUtils.isNumeric( strOrder )  )
  357.         {
  358.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_ERROR );
  359.         }
  360.         int nPortletId = Integer.parseInt( strPortletId );
  361.         int nColumnId = Integer.parseInt( strColumnId );
  362.         int nOrder = Integer.parseInt( strOrder );
  363.         Portlet portlet = null;
  364.         try
  365.         {
  366.             portlet = PortletHome.findByPrimaryKey( nPortletId );
  367.         }
  368.         catch( NullPointerException e )
  369.         {
  370.             AppLogService.error( MSG_ERROR_PORTLET, nPortletId, e );
  371.         }
  372.         if ( portlet == null || portlet.getId( ) != nPortletId )
  373.         {
  374.             return AdminMessageService.getMessageUrl( request, Messages.MESSAGE_INVALID_ENTRY, new Object [ ] {
  375.                     nPortletId
  376.             }, AdminMessage.TYPE_ERROR );
  377.         }
  378.        
  379.         PortletHome.updatePosition( portlet, nColumnId, nOrder );

  380.        return JSP_ADMIN_SITE + "?" + Parameters.PAGE_ID + "=" + portlet.getPageId( );
  381.        
  382.     }

  383.     private static String getMessageErrorAuthorization( AdminUser user, String permission, int nPortletId )
  384.     {
  385.         return "User " + user + " is not authorized to permission " + permission + " on portlet " + nPortletId;
  386.     }
  387. }