1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.portal.service.securityheader;
35
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.Collections;
39 import java.util.Comparator;
40 import java.util.HashMap;
41 import java.util.List;
42 import java.util.Locale;
43 import java.util.Map;
44 import java.util.stream.Collectors;
45
46 import org.apache.logging.log4j.LogManager;
47 import org.apache.logging.log4j.Logger;
48
49 import fr.paris.lutece.portal.business.securityheader.SecurityHeader;
50 import fr.paris.lutece.portal.business.securityheader.SecurityHeaderHome;
51 import fr.paris.lutece.portal.business.securityheader.SecurityHeaderPageCategory;
52 import fr.paris.lutece.portal.business.securityheader.SecurityHeaderType;
53 import fr.paris.lutece.util.ReferenceList;
54
55
56
57
58 public class SecurityHeaderService
59 {
60
61
62
63
64 private Map<String, SecurityHeader> _mapSecurityHeaders = new HashMap<String, SecurityHeader>( );
65
66 Map<String, Map<String, List<SecurityHeader>>> _mapActiveSecurityHeadersForFilters = new HashMap<String, Map<String, List<SecurityHeader>>>( );
67
68
69
70 private boolean _bMapRefreshDone = false;
71
72 private Logger _logger = LogManager.getLogger( "lutece.securityHeader" );
73
74
75
76
77
78
79
80
81
82
83
84
85
86 public List<SecurityHeader> find( String strName, String strType, String pageCategory )
87 {
88 ArrayList<SecurityHeader> securityHeadersResultList = new ArrayList<SecurityHeader>( );
89
90 for( SecurityHeader securityHeader : findAll( ) )
91 {
92 if( securityHeader.getName( ).equals( strName ) && securityHeader.getType( ).equals( strType ) )
93 {
94 if( pageCategory == null || securityHeader.getPageCategory( ).equals( pageCategory ) )
95 {
96 securityHeadersResultList.add( securityHeader );
97 }
98 }
99 }
100
101 return securityHeadersResultList;
102 }
103
104
105
106
107
108
109
110
111
112 public Collection<SecurityHeader> findActive( String strType, String strPageCategory )
113 {
114 if( !_bMapRefreshDone )
115 {
116 refreshSecurityHeadersMap( SecurityHeaderHome.findAll() );
117 }
118 if( _mapActiveSecurityHeadersForFilters.get(strType) != null )
119 {
120 return _mapActiveSecurityHeadersForFilters.get( strType ).get( strPageCategory );
121 }
122 return null;
123 }
124
125
126
127
128
129
130
131 public Collection<SecurityHeader> findAll( )
132 {
133 Collection<SecurityHeader> securityHeadersList = null;
134
135 if( _bMapRefreshDone )
136 {
137 securityHeadersList = _mapSecurityHeaders.values( );
138 }
139 else
140 {
141 securityHeadersList = SecurityHeaderHome.findAll( );
142 refreshSecurityHeadersMap( securityHeadersList );
143 }
144
145 return securityHeadersList;
146 }
147
148
149
150
151
152
153
154
155 public List<SecurityHeader> findAllSorted( Locale locale )
156 {
157 List<SecurityHeader> securityHeadersList = findAll( ).stream().collect( Collectors.toList( ) );
158 Collections.sort( securityHeadersList, Comparator.comparing( SecurityHeader::getType )
159 .thenComparing( SecurityHeader::getPageCategory, Comparator.nullsLast( Comparator.naturalOrder( ) ) )
160 .thenComparing( SecurityHeader::getName ) );
161
162 return securityHeadersList;
163 }
164
165
166
167
168
169
170 public ReferenceList getTypeList( )
171 {
172 ReferenceList listTypes = new ReferenceList( );
173
174 for (SecurityHeaderType type : SecurityHeaderType.values()) {
175 listTypes.addItem( type.getCode(), type.getCode() );
176 }
177
178 return listTypes;
179 }
180
181
182
183
184
185
186 public ReferenceList getPageCategoryList( )
187 {
188 ReferenceList listPageCategory = new ReferenceList( );
189
190 for (SecurityHeaderPageCategory pageCategory : SecurityHeaderPageCategory.values()) {
191 listPageCategory.addItem( pageCategory.getCode(), pageCategory.getCode() );
192 }
193
194 return listPageCategory;
195 }
196
197
198
199
200
201
202
203 public void create( SecurityHeader securityHeader )
204 {
205 _logger.debug( "Security header to create : name : {}, value : {}, type : {}, page category : {}", securityHeader.getName( ), securityHeader.getValue( ), securityHeader.getType( ), securityHeader.getPageCategory( ) );
206 SecurityHeaderHome.create( securityHeader );
207 clearMapSecurityHeaders( );
208 _logger.debug( "Security header created" );
209 }
210
211
212
213
214
215
216
217 public void update( SecurityHeader securityHeader )
218 {
219 _logger.debug( "Security header to update : id : {}, name : {}, value : {}, type : {}, page category : {}", securityHeader.getId( ), securityHeader.getName( ), securityHeader.getValue( ), securityHeader.getType( ), securityHeader.getPageCategory( ) );
220 SecurityHeaderHome.update( securityHeader );
221 clearMapSecurityHeaders( );
222 _logger.debug( "Security header updated" );
223 }
224
225
226
227
228
229
230
231 public void remove( int nSecurityHeaderId )
232 {
233 SecurityHeader securityHeader = _mapSecurityHeaders.get( String.valueOf( nSecurityHeaderId ) );
234 _logger.debug( "Security header to delete : id : {}, name : {}, value : {}, type : {}, page category : {}", securityHeader.getId( ), securityHeader.getName( ), securityHeader.getValue( ), securityHeader.getType( ), securityHeader.getPageCategory( ) );
235 SecurityHeaderHome.remove( nSecurityHeaderId );
236 clearMapSecurityHeaders( );
237 _logger.debug( "Security header deleted" );
238 }
239
240
241
242
243
244
245
246 public void enable( int nSecurityHeaderId )
247 {
248 SecurityHeader securityHeader = _mapSecurityHeaders.get( String.valueOf( nSecurityHeaderId ) );
249 _logger.debug( "Security header to enable : id : {}, name : {}, value : {}, type : {}, page category : {}", securityHeader.getId( ), securityHeader.getName( ), securityHeader.getValue( ), securityHeader.getType( ), securityHeader.getPageCategory( ) );
250 SecurityHeaderHome.updateIsActive( nSecurityHeaderId, true );
251 clearMapSecurityHeaders( );
252 _logger.debug( "Security header enabled" );
253 }
254
255
256
257
258
259
260
261 public void disable( int nSecurityHeaderId )
262 {
263 SecurityHeader securityHeader = _mapSecurityHeaders.get( String.valueOf( nSecurityHeaderId ) );
264 _logger.debug( "Security header to disable : id : {}, name : {}, value : {}, type : {}, page category : {}", securityHeader.getId( ), securityHeader.getName( ), securityHeader.getValue( ), securityHeader.getType( ), securityHeader.getPageCategory( ) );
265 SecurityHeaderHome.updateIsActive( nSecurityHeaderId, false );
266 clearMapSecurityHeaders( );
267 _logger.debug( "Security header disabled" );
268 }
269
270
271
272
273
274 private void clearMapSecurityHeaders( )
275 {
276 _mapSecurityHeaders.clear( );
277 _mapActiveSecurityHeadersForFilters.clear( );
278 _bMapRefreshDone = false;
279 _logger.debug( "Security header maps cleared" );
280 }
281
282
283
284
285
286
287
288 private void refreshSecurityHeadersMap( Collection<SecurityHeader> securityHeadersList )
289 {
290 for( SecurityHeader securityHeader : securityHeadersList )
291 {
292 _mapSecurityHeaders.put( String.valueOf( securityHeader.getId( ) ), securityHeader );
293
294 if( securityHeader.isActive() )
295 {
296 _mapActiveSecurityHeadersForFilters.put( securityHeader.getType( ), addHeaderToTypeMap( securityHeader ) );
297 }
298 }
299 _bMapRefreshDone = true;
300 _logger.debug( "Security header map refreshed" );
301 }
302
303
304
305
306
307
308
309 private Map<String, List<SecurityHeader>> addHeaderToTypeMap( SecurityHeader securityHeader )
310 {
311
312
313
314
315 String firstKey = securityHeader.getType( );
316 Map<String, List<SecurityHeader>> mapHeadersForType = _mapActiveSecurityHeadersForFilters.get( firstKey );
317 List<SecurityHeader> headersListToUpdate = null;
318
319 String secondKey = null;
320 if( securityHeader.getType( ).equals( SecurityHeaderType.PAGE.getCode( ) ) )
321 {
322 secondKey = securityHeader.getPageCategory( );
323 }
324
325 if( mapHeadersForType == null )
326 {
327 mapHeadersForType = new HashMap<String, List<SecurityHeader>>( );
328 headersListToUpdate = new ArrayList<SecurityHeader>( );
329 }
330 else
331 {
332 headersListToUpdate = mapHeadersForType.get( secondKey );
333 if( headersListToUpdate == null )
334 {
335 headersListToUpdate = new ArrayList<SecurityHeader>( );
336 }
337 }
338 headersListToUpdate.add( securityHeader );
339 mapHeadersForType.put( secondKey, headersListToUpdate );
340
341 return mapHeadersForType;
342 }
343 }