RoleJspBean.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.role;

  35. import fr.paris.lutece.portal.business.rbac.RBACRole;
  36. import fr.paris.lutece.portal.business.rbac.RBACRoleHome;
  37. import fr.paris.lutece.portal.business.role.Role;
  38. import fr.paris.lutece.portal.business.role.RoleHome;
  39. import fr.paris.lutece.portal.service.admin.AccessDeniedException;
  40. import fr.paris.lutece.portal.service.message.AdminMessage;
  41. import fr.paris.lutece.portal.service.message.AdminMessageService;
  42. import fr.paris.lutece.portal.service.role.RoleRemovalListenerService;
  43. import fr.paris.lutece.portal.service.security.SecurityTokenService;
  44. import fr.paris.lutece.portal.service.template.AppTemplateService;
  45. import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
  46. import fr.paris.lutece.portal.web.admin.AdminFeaturesPageJspBean;
  47. import fr.paris.lutece.portal.web.constants.Messages;
  48. import fr.paris.lutece.util.html.HtmlTemplate;
  49. import fr.paris.lutece.util.string.StringUtil;

  50. import java.util.ArrayList;
  51. import java.util.Collection;
  52. import java.util.HashMap;
  53. import java.util.Map;
  54. import java.util.stream.Collectors;

  55. import javax.servlet.http.HttpServletRequest;

  56. import org.apache.commons.lang3.StringUtils;
  57. import org.apache.james.mime4j.io.LineReaderInputStreamAdaptor;

  58. /**
  59.  * JspBean for Role management
  60.  */
  61. public class RoleJspBean extends AdminFeaturesPageJspBean
  62. {
  63.     // //////////////////////////////////////////////////////////////////////////////
  64.     // Constant

  65.     // Right
  66.     /**
  67.      * Right to manage roles
  68.      */
  69.     public static final String RIGHT_ROLES_MANAGEMENT = "CORE_ROLES_MANAGEMENT";

  70.     /**
  71.      * Serial version UID
  72.      */
  73.     private static final long serialVersionUID = -764350969432795013L;

  74.     // Markers
  75.     private static final String MARK_ROLES_LIST = "roles_list";
  76.     private static final String MARK_EXIST_RBAC_MAP = "exist_rbac_map";

  77.     private static final String MARK_ROLE = "role";
  78.     private static final String MARK_DEFAULT_VALUE_WORKGROUP_KEY = "workgroup_key_default_value";
  79.     private static final String MARK_WORKGROUP_KEY_LIST = "workgroup_key_list";

  80.     // Parameters
  81.     private static final String PARAMETER_PAGE_ROLE = "role";
  82.     private static final String PARAMETER_PAGE_ROLE_DESCRIPTION = "role_description";
  83.     private static final String PARAMETER_PAGE_WORKGROUP = "workgroup_key";

  84.     // Templates
  85.     private static final String TEMPLATE_MANAGE_ROLES = "admin/role/manage_roles.html";
  86.     private static final String TEMPLATE_PAGE_ROLE_MODIFY = "admin/role/modify_page_role.html";
  87.     private static final String TEMPLATE_CREATE_PAGE_ROLE = "admin/role/create_page_role.html";

  88.     // Jsp
  89.     private static final String PATH_JSP = "jsp/admin/role/";
  90.     private static final String JSP_REMOVE_ROLE = "DoRemovePageRole.jsp";

  91.     // Properties
  92.     private static final String PROPERTY_PAGE_TITLE_CREATE_ROLE = "portal.role.create_role.pageTitle";
  93.     private static final String PROPERTY_PAGE_TITLE_MODIFY_ROLE = "portal.role.modify_role.pageTitle";

  94.     // Message
  95.     private static final String MESSAGE_ROLE_EXIST = "portal.role.message.roleexist";
  96.     private static final String MESSAGE_ROLE_FORMAT = "portal.role.message.roleformat";
  97.     private static final String MESSAGE_CONFIRM_REMOVE = "portal.role.message.confirmRemoveRole";
  98.     private static final String MESSAGE_CANNOT_REMOVE_ROLE = "portal.role.message.cannotRemoveRole";

  99.     /**
  100.      * Creates a new RoleJspBean object.
  101.      */
  102.     public RoleJspBean( )
  103.     {
  104.         // Ctor
  105.     }

  106.     /**
  107.      * Returns Page Role management form
  108.      *
  109.      * @param request
  110.      *            The Http request
  111.      * @return Html form
  112.      */
  113.     public String getManagePageRole( HttpServletRequest request )
  114.     {
  115.         setPageTitleProperty( null );

  116.         Map<String, Object> model = new HashMap<>( );
  117.         Collection<Role> listRoles = RoleHome.findAll( );
  118.         listRoles = AdminWorkgroupService.getAuthorizedCollection( listRoles, getUser( ) );
  119.         Map<String, Boolean> mapExistRbac = listRoles.stream( ).collect( Collectors.toMap( Role::getRole, x -> RBACRoleHome.checkExistRole( x.getRole( ) ) ) );

  120.         model.put( MARK_ROLES_LIST, listRoles );
  121.         model.put( MARK_EXIST_RBAC_MAP, mapExistRbac );

  122.         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_ROLES, getLocale( ), model );

  123.         return getAdminPage( template.getHtml( ) );
  124.     }

  125.     /**
  126.      * Insert a new PageRole
  127.      *
  128.      * @param request
  129.      *            The HTTP request
  130.      * @return String The html code page
  131.      */
  132.     public String getCreatePageRole( HttpServletRequest request )
  133.     {
  134.         setPageTitleProperty( PROPERTY_PAGE_TITLE_CREATE_ROLE );

  135.         Map<String, Object> model = new HashMap<>( );

  136.         model.put( MARK_DEFAULT_VALUE_WORKGROUP_KEY, AdminWorkgroupService.ALL_GROUPS );
  137.         model.put( MARK_WORKGROUP_KEY_LIST, AdminWorkgroupService.getUserWorkgroups( getUser( ), getLocale( ) ) );
  138.         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_CREATE_PAGE_ROLE ) );

  139.         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_PAGE_ROLE, getLocale( ), model );

  140.         return getAdminPage( template.getHtml( ) );
  141.     }

  142.     /**
  143.      * Create PageRole
  144.      *
  145.      * @param request
  146.      *            The HTTP request
  147.      * @return String The url page
  148.      * @throws AccessDeniedException
  149.      *             if the security token is invalid
  150.      */
  151.     public String doCreatePageRole( HttpServletRequest request ) throws AccessDeniedException
  152.     {
  153.         String strPageRole = request.getParameter( PARAMETER_PAGE_ROLE );
  154.         String strPageRoleDescription = request.getParameter( PARAMETER_PAGE_ROLE_DESCRIPTION );
  155.         String strPageWorkgroup = request.getParameter( PARAMETER_PAGE_WORKGROUP );

  156.         // Mandatory field

  157.         if ( StringUtil.isAnyEmpty( strPageRole, strPageRoleDescription ) || ( strPageWorkgroup == null ) )
  158.         {
  159.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
  160.         }

  161.         // Check if code is valid
  162.         if ( !StringUtil.checkCodeKey( strPageRole ) )
  163.         {
  164.             return AdminMessageService.getMessageUrl( request, MESSAGE_ROLE_FORMAT, AdminMessage.TYPE_STOP );
  165.         }

  166.         // Check if role exist
  167.         if ( RoleHome.findExistRole( strPageRole ) )
  168.         {
  169.             return AdminMessageService.getMessageUrl( request, MESSAGE_ROLE_EXIST, AdminMessage.TYPE_STOP );
  170.         }

  171.         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_CREATE_PAGE_ROLE ) )
  172.         {
  173.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  174.         }
  175.         Role role = new Role( );
  176.         role.setRole( strPageRole );
  177.         role.setRoleDescription( strPageRoleDescription );
  178.         role.setWorkgroup( strPageWorkgroup );
  179.         RoleHome.create( role );

  180.         return getHomeUrl( request );
  181.     }

  182.     /**
  183.      *
  184.      * @param request
  185.      *            The HTTP request
  186.      * @return String The html code page
  187.      */
  188.     public String getModifyPageRole( HttpServletRequest request )
  189.     {
  190.         setPageTitleProperty( PROPERTY_PAGE_TITLE_MODIFY_ROLE );

  191.         Map<String, Object> model = new HashMap<>( );

  192.         String strPageRole = request.getParameter( PARAMETER_PAGE_ROLE );

  193.         Role role = RoleHome.findByPrimaryKey( strPageRole );

  194.         if ( role == null )
  195.         {
  196.             return getManagePageRole( request );
  197.         }

  198.         model.put( MARK_ROLE, role );
  199.         model.put( MARK_WORKGROUP_KEY_LIST, AdminWorkgroupService.getUserWorkgroups( getUser( ), getLocale( ) ) );
  200.         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_PAGE_ROLE_MODIFY ) );

  201.         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_PAGE_ROLE_MODIFY, getLocale( ), model );

  202.         return getAdminPage( template.getHtml( ) );
  203.     }

  204.     /**
  205.      * Modify PageRole
  206.      *
  207.      * @param request
  208.      *            The HTTP request
  209.      * @return String The url page
  210.      * @throws AccessDeniedException
  211.      *             if the security token is invalid
  212.      */
  213.     public String doModifyPageRole( HttpServletRequest request ) throws AccessDeniedException
  214.     {
  215.         String strPageRole = request.getParameter( PARAMETER_PAGE_ROLE );
  216.         String strPageRoleDescription = request.getParameter( PARAMETER_PAGE_ROLE_DESCRIPTION );
  217.         String strPageWorkgroup = request.getParameter( PARAMETER_PAGE_WORKGROUP );

  218.         // Mandatory field
  219.         if ( ( strPageRoleDescription == null ) || strPageRoleDescription.equals( "" ) || ( strPageWorkgroup == null ) )
  220.         {
  221.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
  222.         }

  223.         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_PAGE_ROLE_MODIFY ) )
  224.         {
  225.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  226.         }

  227.         Role role = new Role( );
  228.         role.setRole( strPageRole );
  229.         role.setRoleDescription( strPageRoleDescription );
  230.         role.setWorkgroup( strPageWorkgroup );
  231.         RoleHome.update( role );

  232.         return getHomeUrl( request );
  233.     }

  234.     /**
  235.      * confirm Delete PageRole
  236.      *
  237.      * @param request
  238.      *            The HTTP request
  239.      * @return String The html code page
  240.      */
  241.     public String getRemovePageRole( HttpServletRequest request )
  242.     {
  243.         String strPageRole = request.getParameter( PARAMETER_PAGE_ROLE );
  244.         if ( StringUtils.isBlank( strPageRole ) )
  245.         {
  246.             return AdminMessageService.getMessageUrl( request, Messages.MESSAGE_INVALID_ENTRY, new Object [ ] {
  247.                     PARAMETER_PAGE_ROLE
  248.             }, AdminMessage.TYPE_STOP );
  249.         }
  250.         Role role = RoleHome.findByPrimaryKey( strPageRole );
  251.         if ( role == null || !strPageRole.equals( role.getRole( ) ) )
  252.         {
  253.             return AdminMessageService.getMessageUrl( request, Messages.MESSAGE_INVALID_ENTRY, new Object [ ] {
  254.                     strPageRole
  255.             }, AdminMessage.TYPE_STOP );
  256.         }
  257.         String strURL = PATH_JSP + JSP_REMOVE_ROLE;
  258.         Map<String, Object> parameters = new HashMap<>( );
  259.         parameters.put( PARAMETER_PAGE_ROLE, request.getParameter( PARAMETER_PAGE_ROLE ) );
  260.         parameters.put( SecurityTokenService.PARAMETER_TOKEN, SecurityTokenService.getInstance( ).getToken( request, JSP_REMOVE_ROLE ) );

  261.         return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE, new Object [ ] {
  262.                 strPageRole
  263.         }, null, strURL, null, AdminMessage.TYPE_CONFIRMATION, parameters );
  264.     }

  265.     /**
  266.      * Delete PageRole
  267.      *
  268.      * @param request
  269.      *            The HTTP request
  270.      * @return String The url page
  271.      * @throws AccessDeniedException
  272.      *             if the security token is invalid
  273.      */
  274.     public String doRemovePageRole( HttpServletRequest request ) throws AccessDeniedException
  275.     {
  276.         String strPageRole = request.getParameter( PARAMETER_PAGE_ROLE );
  277.         ArrayList<String> listErrors = new ArrayList<>( );

  278.         if ( !RoleRemovalListenerService.getService( ).checkForRemoval( strPageRole, listErrors, getLocale( ) ) )
  279.         {
  280.             String strCause = AdminMessageService.getFormattedList( listErrors, getLocale( ) );
  281.             Object [ ] args = {
  282.                     strPageRole, strCause
  283.             };

  284.             return AdminMessageService.getMessageUrl( request, MESSAGE_CANNOT_REMOVE_ROLE, args, AdminMessage.TYPE_STOP );
  285.         }
  286.         if ( !SecurityTokenService.getInstance( ).validate( request, JSP_REMOVE_ROLE ) )
  287.         {
  288.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  289.         }
  290.         RoleHome.remove( strPageRole );

  291.         return getHomeUrl( request );
  292.     }
  293. }