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.filter;
35
36 import fr.paris.lutece.portal.service.util.AppLogService;
37 import fr.paris.lutece.util.sql.TransactionManager;
38
39 import java.io.IOException;
40
41 import javax.servlet.Filter;
42 import javax.servlet.FilterChain;
43 import javax.servlet.FilterConfig;
44 import javax.servlet.ServletException;
45 import javax.servlet.ServletRequest;
46 import javax.servlet.ServletResponse;
47 import javax.servlet.http.HttpServletRequest;
48 import javax.servlet.http.HttpServletResponse;
49
50
51
52
53
54 public class MainFilter implements Filter
55 {
56
57
58
59 public void init( FilterConfig config ) throws ServletException
60 {
61 FilterService.setServletContext( config.getServletContext( ) );
62 }
63
64
65
66
67 public void doFilter( ServletRequest requestServlet, ServletResponse responseServlet, FilterChain chain )
68 throws IOException, ServletException
69 {
70 AppLogService.debug( "MainFilter : doFilter()" );
71
72 HttpServletRequest request = (HttpServletRequest) requestServlet;
73 HttpServletResponse response = (HttpServletResponse) responseServlet;
74 LuteceFilterChain chainPluginsFilters = new LuteceFilterChain( );
75
76 for ( LuteceFilter filter : FilterService.getInstance( ).getFilters( ) )
77 {
78 AppLogService.debug( "PluginFilter : " + filter.getName( ) + " - url pattern : " +
79 filter.getMappingUrlPattern( ) );
80
81
82 try
83 {
84
85 if ( matchMapping( filter, request ) && filter.getPlugin( ).isInstalled( ) )
86 {
87 chainPluginsFilters.setFollowChain( false );
88 filter.getFilter( ).doFilter( request, response, chainPluginsFilters );
89
90 if ( !chainPluginsFilters.shouldFollowChain( ) )
91 {
92
93 return;
94 }
95
96
97 request = (HttpServletRequest) chainPluginsFilters.getRequest( );
98 response = (HttpServletResponse) chainPluginsFilters.getResponse( );
99 }
100 }
101 catch ( Exception e )
102 {
103 AppLogService.error( "Error execution doFilter method - Filter " + filter.getName( ), e );
104 }
105 }
106
107
108 chain.doFilter( request, response );
109
110 TransactionManager.rollBackEveryTransaction( );
111 }
112
113
114
115
116 public void destroy( )
117 {
118 for ( LuteceFilter filter : FilterService.getInstance( ).getFilters( ) )
119 {
120
121 try
122 {
123
124 if ( filter.getPlugin( ).isInstalled( ) )
125 {
126 filter.getFilter( ).destroy( );
127 }
128 }
129 catch ( Exception e )
130 {
131 AppLogService.error( "Error execution destroy() method - Filter " + filter.getName( ), e );
132 }
133 }
134 }
135
136
137
138
139
140
141
142 boolean matchMapping( LuteceFilter filter, HttpServletRequest request )
143 {
144 return matchFilterUrl( filter.getMappingUrlPattern( ), request.getServletPath( ) );
145 }
146
147
148
149
150
151
152
153
154
155
156 boolean matchFilterUrl( String strUrlPattern, String strRequestUrl )
157 {
158 if ( strUrlPattern == null )
159 {
160 return ( false );
161 }
162
163 if ( strUrlPattern.equals( strRequestUrl ) )
164 {
165 return ( true );
166 }
167
168 if ( strUrlPattern.equals( "/*" ) )
169 {
170 return ( true );
171 }
172
173 if ( strUrlPattern.endsWith( "/*" ) )
174 {
175 if ( strUrlPattern.regionMatches( 0, strRequestUrl, 0, strUrlPattern.length( ) - 2 ) )
176 {
177 if ( strRequestUrl.length( ) == ( strUrlPattern.length( ) - 2 ) )
178 {
179 return ( true );
180 }
181 else if ( '/' == strRequestUrl.charAt( strUrlPattern.length( ) - 2 ) )
182 {
183 return ( true );
184 }
185 }
186
187 return ( false );
188 }
189
190
191 if ( strUrlPattern.startsWith( "*." ) )
192 {
193 int slash = strRequestUrl.lastIndexOf( '/' );
194 int period = strRequestUrl.lastIndexOf( '.' );
195
196 if ( ( slash >= 0 ) && ( period > slash ) && ( period != ( strRequestUrl.length( ) - 1 ) ) &&
197 ( ( strRequestUrl.length( ) - period ) == ( strUrlPattern.length( ) - 1 ) ) )
198 {
199 return ( strUrlPattern.regionMatches( 2, strRequestUrl, period + 1, strUrlPattern.length( ) - 2 ) );
200 }
201 }
202
203
204 return ( false );
205 }
206 }