Skip to content

Commit 448224e

Browse files
LUT-27605: Use forms' workgroups to restrict their access (and the access to their responses) to users part of the same workgroups
1 parent 382bab3 commit 448224e

17 files changed

+397
-8
lines changed

src/java/fr/paris/lutece/plugins/forms/business/form/list/FormListFacade.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.list;
3535

36+
import fr.paris.lutece.api.user.User;
3637
import fr.paris.lutece.plugins.forms.business.form.FormItemSortConfig;
3738
import java.util.Comparator;
3839
import java.util.List;
@@ -88,4 +89,30 @@ public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listForm
8889

8990
_formListDAO.populateFormColumns( formPanel, listFormColumn, listFormFilter, nStartIndex, nPageSize, sortConfig );
9091
}
92+
93+
/**
94+
* Populate the given FormPanel with the information of the given FormColumns and FormFilters
95+
*
96+
* @param formPanel
97+
* The FormPanel to populate
98+
* @param listFormColumn
99+
* The list of all FormColumn to use to be populated
100+
* @param listFormFilter
101+
* The list of FormFilter to use for retrieving the data of the columns to populate
102+
* @param nStartIndex
103+
* The start index of doc
104+
* @param nPageSize
105+
* The number of docs to load for pagination purpose
106+
* @param sortConfig
107+
* The comparator config
108+
* @param user
109+
* The current user
110+
*/
111+
public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
112+
FormItemSortConfig sortConfig, User user )
113+
{
114+
listFormColumn.sort( Comparator.comparing( IFormColumn::getFormColumnPosition ) );
115+
116+
_formListDAO.populateFormColumns( formPanel, listFormColumn, listFormFilter, nStartIndex, nPageSize, sortConfig, user );
117+
}
91118
}

src/java/fr/paris/lutece/plugins/forms/business/form/list/FormListLuceneDAO.java

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
4343
import fr.paris.lutece.plugins.forms.business.form.FormResponseItem;
44+
import fr.paris.lutece.api.user.User;
4445
import fr.paris.lutece.plugins.forms.business.form.FormItemSortConfig;
4546
import fr.paris.lutece.plugins.forms.business.form.column.FormColumnCell;
4647
import fr.paris.lutece.plugins.forms.business.form.column.IFormColumn;
@@ -85,6 +86,22 @@ public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listForm
8586
formPanel.setFormResponseItemList( listFormResponseItem );
8687
}
8788

89+
@Override
90+
public void populateFormColumns( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
91+
FormItemSortConfig sortConfig, User user )
92+
{
93+
// To retrieve the values to display on the table we must have a FormPanel and a list of FormColumn
94+
if ( formPanel == null || CollectionUtils.isEmpty( listFormColumn ) )
95+
{
96+
return;
97+
}
98+
99+
List<FormResponseItem> listFormResponseItem = searchFormResponseItem( formPanel, listFormColumn, listFormFilter, nStartIndex, nPageSize, sortConfig,
100+
user );
101+
102+
formPanel.setFormResponseItemList( listFormResponseItem );
103+
}
104+
88105
@Override
89106
public List<FormResponseItem> searchAllFormResponseItem( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter,
90107
FormItemSortConfig sortConfig )
@@ -122,6 +139,103 @@ private List<FormResponseItem> searchFormResponseItem( FormPanel formPanel, List
122139
return listFormResponseItem;
123140
}
124141

142+
private List<FormResponseItem> searchFormResponseItem( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter,
143+
int nStartIndex, int nPageSize, FormItemSortConfig sortConfig, User user )
144+
{
145+
// Create the list of all values of the parameter to used
146+
List<String> listQueryParametersValues = new ArrayList<>( );
147+
148+
// Build the list of query part from the formPanel, the list of columns and the list of filters
149+
List<IFormPanelInitializerQueryPart> listFormPanelInitializerQueryPart = buildFormPanelInitializerQueryPartList( formPanel, listQueryParametersValues,
150+
user );
151+
List<IFormColumnQueryPart> listFormColumnQueryPart = buildformColumnQueryPartList( listFormColumn );
152+
List<IFormFilterQueryPart> listFormFilterQueryPart = buildFormFilterQueryPartList( listFormFilter, listQueryParametersValues );
153+
154+
List<FormResponseItem> listFormResponseItem = new ArrayList<>( );
155+
156+
for ( FormResponseSearchItem formResponseSearchItem : _formSearchEngine.getSearchResults( listFormPanelInitializerQueryPart, listFormColumnQueryPart,
157+
listFormFilterQueryPart, sortConfig, nStartIndex, nPageSize, formPanel ) )
158+
{
159+
// Create a FormResponseItem for the current result line
160+
FormResponseItem formResponseItem = createFormResponseItem( formResponseSearchItem );
161+
listFormResponseItem.add( formResponseItem );
162+
163+
for ( IFormColumnQueryPart formColumnQueryPart : listFormColumnQueryPart )
164+
{
165+
FormColumnCell formColumnCell = formColumnQueryPart.getFormColumnCell( formResponseSearchItem );
166+
formResponseItem.addFormColumnCell( formColumnCell );
167+
}
168+
}
169+
return listFormResponseItem;
170+
}
171+
172+
/**
173+
* Build the list of all FormPanelInitializerQueryPart associate to all the FormPanelInitializer to retrieve from the given FormPanel
174+
*
175+
* @param formPanel
176+
* The FormPanel used to retrieve the list of all FormPanelInitializer to retrieve the list of FormPanelInitializerQueryPart
177+
* @param listQueryParametersValue
178+
* The list of all parameter values to used to fill the DAOUtil statement
179+
* @param user
180+
* The current user
181+
* @return the list of all FormPanelInitializerQueryPart associate to all the FormPanelInitializer to retrieve from the given FormPanel
182+
*/
183+
private static List<IFormPanelInitializerQueryPart> buildFormPanelInitializerQueryPartList( FormPanel formPanel, List<String> listQueryParametersValue,
184+
User user )
185+
{
186+
List<IFormPanelInitializerQueryPart> listFormPanelInitializerQueryPart = new ArrayList<>( );
187+
188+
IFormPanelConfiguration formPanelConfiguration = formPanel.getFormPanelConfiguration( );
189+
190+
if ( formPanelConfiguration != null && !CollectionUtils.isEmpty( formPanel.getListFormPanelInitializer( ) ) )
191+
{
192+
List<IFormPanelInitializer> listFormPanelInitializer = formPanel.getListFormPanelInitializer( );
193+
194+
for ( IFormPanelInitializer formPanelInitializer : listFormPanelInitializer )
195+
{
196+
IFormPanelInitializerQueryPart formPanelInitializerQueryPart = retrieveFormPanelInitializerQueryPart( formPanelInitializer,
197+
listQueryParametersValue, user );
198+
if ( formPanelInitializerQueryPart != null )
199+
{
200+
listFormPanelInitializerQueryPart.add( formPanelInitializerQueryPart );
201+
}
202+
}
203+
}
204+
return listFormPanelInitializerQueryPart;
205+
}
206+
207+
/**
208+
* Retrieve the IformPanelInitializerQueryPart associate to the givenFormPanelInitializer
209+
*
210+
* @param formPanelInitializer
211+
* The formPanelInitializer used to retrieve the associated IFormPanelInitializerQueryPart
212+
* @param listQueryParametersPositionValue
213+
* The list of all parameter values to used to fill the DAOUtil statement
214+
* @param user
215+
* The current user
216+
* @return the IFormPanelInitializerQueryPart associate to the given FormPanelInitializer or null if not found
217+
*/
218+
private static IFormPanelInitializerQueryPart retrieveFormPanelInitializerQueryPart( IFormPanelInitializer formPanelInitializer,
219+
List<String> listQueryParametersPositionValue, User user )
220+
{
221+
IFormPanelInitializerQueryPart formPanelInitializerQueryPartResult = null;
222+
223+
if ( formPanelInitializer != null )
224+
{
225+
formPanelInitializerQueryPartResult = formPanelInitializer.getIFormPanelInitializerQueryPart( user );
226+
227+
if ( formPanelInitializerQueryPartResult != null )
228+
{
229+
FormParameters formParameters = formPanelInitializer.getFormParameters( );
230+
formPanelInitializerQueryPartResult.buildFormPanelInitializerQuery( formParameters );
231+
232+
List<String> listUsedParametersValues = formParameters.getListUsedParametersValue( );
233+
listQueryParametersPositionValue.addAll( listUsedParametersValues );
234+
}
235+
}
236+
return formPanelInitializerQueryPartResult;
237+
}
238+
125239
/**
126240
* Create a FormResponseItem from a DAOUtil
127241
*

src/java/fr/paris/lutece/plugins/forms/business/form/list/IFormListDAO.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
package fr.paris.lutece.plugins.forms.business.form.list;
3535

3636
import fr.paris.lutece.plugins.forms.business.form.FormResponseItem;
37+
import fr.paris.lutece.api.user.User;
3738
import fr.paris.lutece.plugins.forms.business.form.FormItemSortConfig;
3839
import java.util.List;
3940

@@ -65,6 +66,27 @@ public interface IFormListDAO
6566
void populateFormColumns( FormPanel formPanel, List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
6667
FormItemSortConfig sortConfig );
6768

69+
/**
70+
* Populate the FormPanel with the values returned by the SQL query results
71+
*
72+
* @param formPanel
73+
* The FormPanel used to retrieve the values of the FormColumn
74+
* @param listFormColumn
75+
* The list of FormColumn to populate
76+
* @param listFormFilter
77+
* The list of FormFilter used for filtering the data to retrieve
78+
* @param nStartIndex
79+
* The start index of doc that all will become FormResponseItem
80+
* @param nPageSize
81+
* The number of doc to load for pagination purpose
82+
* @param sortConfig
83+
* The comparator config
84+
* @param user
85+
* The current user
86+
*/
87+
void populateFormColumns( FormPanel formPanel, java.util.List<IFormColumn> listFormColumn, List<FormFilter> listFormFilter, int nStartIndex, int nPageSize,
88+
FormItemSortConfig sortConfig, User user );
89+
6890
/**
6991
* Search the Lucene Index.
7092
*

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/IFormPanelInitializer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer;
3535

36+
import fr.paris.lutece.api.user.User;
3637
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
3738
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.IFormPanelInitializerQueryPart;
3839
import fr.paris.lutece.plugins.forms.web.form.panel.display.initializer.IFormPanelDisplayInitializer;
@@ -64,6 +65,15 @@ public interface IFormPanelInitializer
6465
*/
6566
IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( );
6667

68+
/**
69+
* Get an {@link IFormPanelInitializerQueryPart} associated with this IFormPanelInitializer.
70+
*
71+
* @param user
72+
* The current user
73+
* @return the IFormPanelInitializerQueryPart Object
74+
*/
75+
IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( User user );
76+
6777
/**
6878
* Get an {@link IFormPanelDisplayInitializer} associated with this IFormPanelInitializer.
6979
*

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/impl/FormPanelFormResponseInitializer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.impl;
3535

36+
import fr.paris.lutece.api.user.User;
3637
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.IFormPanelInitializerQueryPart;
3738
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl.FormPanelFormResponseInitializerQueryPart;
3839
import fr.paris.lutece.plugins.forms.web.form.panel.display.initializer.IFormPanelDisplayInitializer;
@@ -54,4 +55,10 @@ public IFormPanelDisplayInitializer getFormPanelDisplayInitializer( )
5455
{
5556
return new FormPanelFormResponseDisplayInitializer( );
5657
}
58+
59+
@Override
60+
public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( User user )
61+
{
62+
return new FormPanelFormResponseInitializerQueryPart( user );
63+
}
5764
}

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/impl/FormPanelFormsInitializer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.impl;
3535

36+
import fr.paris.lutece.api.user.User;
3637
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.IFormPanelInitializerQueryPart;
3738
import fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl.FormPanelFormsInitializerQueryPart;
3839
import fr.paris.lutece.plugins.forms.web.form.panel.display.initializer.IFormPanelDisplayInitializer;
@@ -49,6 +50,12 @@ public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( )
4950
return new FormPanelFormsInitializerQueryPart( );
5051
}
5152

53+
@Override
54+
public IFormPanelInitializerQueryPart getIFormPanelInitializerQueryPart( User user )
55+
{
56+
return new FormPanelFormsInitializerQueryPart( user );
57+
}
58+
5259
@Override
5360
public IFormPanelDisplayInitializer getFormPanelDisplayInitializer( )
5461
{

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/querypart/impl/FormPanelFormResponseInitializerQueryPart.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,24 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl;
3535

36+
import fr.paris.lutece.api.user.User;
3637
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
3738

3839
/**
3940
* Implementation of the IFormFilterQueryPart for a FormFilterPanelFormResponse filter
4041
*/
4142
public class FormPanelFormResponseInitializerQueryPart extends AbstractFormPanelInitializerQueryPart
4243
{
44+
public FormPanelFormResponseInitializerQueryPart( User user )
45+
{
46+
super( );
47+
}
48+
49+
public FormPanelFormResponseInitializerQueryPart( )
50+
{
51+
super( );
52+
}
53+
4354
/**
4455
* {@inheritDoc}
4556
*/

src/java/fr/paris/lutece/plugins/forms/business/form/panel/initializer/querypart/impl/FormPanelFormsInitializerQueryPart.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,24 @@
3333
*/
3434
package fr.paris.lutece.plugins.forms.business.form.panel.initializer.querypart.impl;
3535

36+
import fr.paris.lutece.api.user.User;
37+
import fr.paris.lutece.plugins.forms.business.Form;
38+
import fr.paris.lutece.plugins.forms.business.FormHome;
3639
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
40+
import fr.paris.lutece.plugins.forms.util.FormsConstants;
41+
import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
42+
43+
import java.util.ArrayList;
44+
import java.util.Collections;
45+
import java.util.List;
46+
import java.util.stream.Collectors;
47+
48+
import org.apache.lucene.document.IntPoint;
49+
import org.apache.lucene.search.BooleanClause;
50+
import org.apache.lucene.search.BooleanQuery;
51+
import org.apache.lucene.search.BooleanQuery.Builder;
3752
import org.apache.lucene.search.MatchAllDocsQuery;
53+
import org.apache.lucene.search.Query;
3854

3955
/**
4056
* Implementation of the FormPanelInitializerQueryPart associate to the FormPanelFormsInitializer
@@ -50,6 +66,36 @@ public FormPanelFormsInitializerQueryPart( )
5066
setFormPanelInitializerSelectQuery( new MatchAllDocsQuery( ) );
5167
}
5268

69+
/**
70+
* Constructor used to build a query that selects the Forms that the user can access
71+
*
72+
* @param user
73+
* The HTTP user
74+
*/
75+
public FormPanelFormsInitializerQueryPart( User user )
76+
{
77+
super( );
78+
79+
// Get the List of all available Forms
80+
List<Form> listForms = FormHome.getFormList( );
81+
// Only keep the Forms that can be accessed by the current user
82+
listForms = (List<Form>) AdminWorkgroupService.getAuthorizedCollection( listForms, user );
83+
84+
// Create Lucene queries to retrieve the Forms that match the specified IDs
85+
List<Query> queries = listForms.stream( ).map( form -> IntPoint.newExactQuery( FormsConstants.PARAMETER_ID_FORM, form.getId( ) ) )
86+
.collect( Collectors.toList( ) );
87+
88+
// Create a Lucene Builder for Boolean Queries
89+
Builder builder = new BooleanQuery.Builder( );
90+
// Add all the created queries that will be applied
91+
queries.forEach( query -> builder.add( query, BooleanClause.Occur.SHOULD ) );
92+
93+
// Initialize the Query used to retrieve specific Forms
94+
Query queryForms = builder.build( );
95+
96+
setFormPanelInitializerSelectQuery( queryForms );
97+
}
98+
5399
/**
54100
* {@inheritDoc}
55101
*/

src/java/fr/paris/lutece/plugins/forms/service/FormsMultiviewAuthorizationService.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
package fr.paris.lutece.plugins.forms.service;
3535

3636
import fr.paris.lutece.api.user.User;
37+
import fr.paris.lutece.plugins.forms.business.Form;
3738
import fr.paris.lutece.plugins.forms.business.form.FormParameters;
3839
import java.util.ArrayList;
3940
import java.util.List;
@@ -56,6 +57,7 @@
5657
import fr.paris.lutece.plugins.forms.util.FormsConstants;
5758
import fr.paris.lutece.plugins.forms.web.form.FormDisplayFactory;
5859
import fr.paris.lutece.portal.service.admin.AdminUserService;
60+
import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
5961

6062
import java.util.HashMap;
6163
import java.util.Map;
@@ -126,6 +128,22 @@ public boolean isUserAuthorizedOnFormResponse( HttpServletRequest request, int n
126128
return bIsUserAuthorizedOnFormResponse;
127129
}
128130

131+
/**
132+
* Check if the user is authorized to access the form response within workgroup constraints
133+
*
134+
* @param request
135+
* The request to use to determine if the user can access the details of the given form response
136+
* @param form
137+
* The Form
138+
* @return true if the user is authorized to access the form response, false otherwise
139+
*/
140+
@Override
141+
public boolean isUserAuthorizedOnFormResponseWithinWorkgroup( HttpServletRequest request, Form form )
142+
{
143+
User user = AdminUserService.getAdminUser( request );
144+
return AdminWorkgroupService.isAuthorized( form, user );
145+
}
146+
129147
/**
130148
* Build a form response id filter from an id response
131149
*

0 commit comments

Comments
 (0)