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.plugins.newsletter.service;
35
36 import java.sql.Timestamp;
37 import java.util.Date;
38 import java.util.HashMap;
39 import java.util.Map;
40 import java.util.Random;
41 import java.util.Collection;
42 import javax.servlet.http.HttpServletRequest;
43 import org.apache.commons.lang3.StringUtils;
44
45 import static fr.paris.lutece.portal.service.admin.AdminUserService.getLocale;
46 import static fr.paris.lutece.portal.service.portal.PortalService.getSiteName;
47 import fr.paris.lutece.plugins.newsletter.business.AwaitingActivationHome;
48 import fr.paris.lutece.plugins.newsletter.business.NewsLetter;
49 import fr.paris.lutece.plugins.newsletter.business.NewsLetterHome;
50 import fr.paris.lutece.plugins.newsletter.business.NewsLetterProperties;
51 import fr.paris.lutece.plugins.newsletter.business.NewsletterPropertiesHome;
52 import fr.paris.lutece.plugins.newsletter.business.Subscriber;
53 import fr.paris.lutece.plugins.newsletter.business.SubscriberHome;
54 import fr.paris.lutece.plugins.newsletter.util.NewsLetterConstants;
55 import fr.paris.lutece.plugins.newsletter.util.NewsletterUtils;
56 import fr.paris.lutece.portal.service.captcha.CaptchaSecurityService;
57 import fr.paris.lutece.portal.service.i18n.I18nService;
58 import fr.paris.lutece.portal.service.mail.MailService;
59 import fr.paris.lutece.portal.service.message.SiteMessage;
60 import fr.paris.lutece.portal.service.message.SiteMessageException;
61 import fr.paris.lutece.portal.service.message.SiteMessageService;
62 import fr.paris.lutece.portal.service.plugin.Plugin;
63 import fr.paris.lutece.portal.service.plugin.PluginService;
64 import fr.paris.lutece.portal.service.template.AppTemplateService;
65 import fr.paris.lutece.portal.service.util.AppLogService;
66 import fr.paris.lutece.portal.service.util.AppPathService;
67 import fr.paris.lutece.portal.service.util.AppPropertiesService;
68 import fr.paris.lutece.util.html.HtmlTemplate;
69 import fr.paris.lutece.util.string.StringUtil;
70 import fr.paris.lutece.util.url.UrlItem;
71
72
73
74
75 public final class NewsLetterRegistrationService
76 {
77 private static final String PARAMETER_TOS = "tos";
78 private static final String TEMPLATE_CONFIRM_MAIL = "admin/plugins/newsletter/confirm_mail.html";
79 private static final String JSP_PORTAL = "/jsp/site/Portal.jsp";
80
81
82 private static final String PROPERTY_MESSAGE_CONFIRM_MAIL_TITLE = "newsletter.confirm_mail.title";
83 private static final String PROPERTY_LIMIT_CONFIRM_DAYS = "newsletter.confirm.limit";
84 private static final String REGEX_ID = "^[\\d]+$";
85 private static final String JCAPTCHA_PLUGIN = "jcaptcha";
86
87
88 private static final int DEFAULT_LIMIT = 7;
89
90
91
92
93 private static NewsLetterRegistrationServicetterRegistrationService.html#NewsLetterRegistrationService">NewsLetterRegistrationService _singleton = new NewsLetterRegistrationService( );
94
95
96 private CaptchaSecurityService _captchaService;
97
98 private Plugin _plugin;
99
100
101
102
103 private NewsLetterRegistrationService( )
104 {
105 if ( _singleton == null )
106 {
107 _singleton = this;
108 }
109 }
110
111
112
113
114
115
116 public static NewsLetterRegistrationService getInstance( )
117 {
118 return _singleton;
119 }
120
121
122
123
124
125
126
127
128
129 public void doSubscription( HttpServletRequest request ) throws SiteMessageException
130 {
131 String strEmail = request.getParameter( NewsLetterConstants.PARAMETER_EMAIL );
132 String [ ] arrayNewsletters = request.getParameterValues( NewsLetterConstants.PARAMETER_NEWSLETTER_ID );
133 String strTOS = request.getParameter( PARAMETER_TOS );
134
135 if ( ( strEmail == null ) || !StringUtil.checkEmail( strEmail ) )
136 {
137 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_INVALID_MAIL_ERROR_MESSAGE,
138 NewsLetterConstants.PROPERTY_INVALID_MAIL_TITLE_MESSAGE, SiteMessage.TYPE_STOP );
139 }
140
141 if ( arrayNewsletters == null )
142 {
143 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_NO_NEWSLETTER_CHOSEN_ERROR_MESSAGE,
144 NewsLetterConstants.PROPERTY_NO_NEWSLETTER_CHOSEN_TITLE_MESSAGE, SiteMessage.TYPE_STOP );
145 }
146 else
147 {
148 NewsLetterProperties properties = NewsletterPropertiesHome.find( getPlugin( ) );
149
150
151 if ( properties.getTOS( ) != null )
152 {
153 if ( strTOS == null )
154 {
155 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_NO_TOS_MESSAGE, NewsLetterConstants.PROPERTY_NO_TOS_TITLE_MESSAGE,
156 SiteMessage.TYPE_STOP );
157 }
158 }
159
160
161 if ( PluginService.isPluginEnable( JCAPTCHA_PLUGIN ) && properties.isCaptchaActive( ) )
162 {
163 _captchaService = new CaptchaSecurityService( );
164
165 if ( !_captchaService.validate( request ) )
166 {
167 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_NO_JCAPTCHA_MESSAGE,
168 NewsLetterConstants.PROPERTY_NO_JCAPTCHA_TITLE_MESSAGE, SiteMessage.TYPE_STOP );
169 }
170 }
171
172
173 Subscriber subscriber = SubscriberHome.findByEmail( strEmail, getPlugin( ) );
174
175 if ( subscriber == null )
176 {
177
178 subscriber = new Subscriber( );
179 subscriber.setEmail( strEmail );
180 subscriber = SubscriberHome.create( subscriber, getPlugin( ) );
181 }
182
183 for ( String strId : arrayNewsletters )
184 {
185 NewsLetterHome.addSubscriber( Integer.parseInt( strId ), subscriber.getId( ), !properties.isValidationActive( ),
186 new Timestamp( new Date( ).getTime( ) ), getPlugin( ) );
187 }
188
189 if ( properties.isValidationActive( ) )
190 {
191
192 Random random = new Random( );
193 int nAlea = random.nextInt( );
194
195 AwaitingActivationHome.create( subscriber.getId( ), nAlea, getPlugin( ) );
196
197 StringBuilder sbUrl = new StringBuilder( AppPathService.getBaseUrl( request ) );
198 sbUrl.append( JSP_PORTAL );
199
200 UrlItem urlItem = new UrlItem( sbUrl.toString( ) );
201 urlItem.addParameter( NewsLetterConstants.PARAMETER_PAGE, NewsletterPlugin.PLUGIN_NAME );
202 urlItem.addParameter( NewsLetterConstants.PARAMETER_ACTION, NewsLetterConstants.ACTION_CONFIRM_SUBSCRIBE );
203 urlItem.addParameter( NewsLetterConstants.PARAMETER_KEY, nAlea );
204 urlItem.addParameter( NewsLetterConstants.PARAMETER_EMAIL, strEmail );
205 urlItem.addParameter( NewsLetterConstants.PARAMETER_USER_ID, subscriber.getId( ) );
206 NewsletterUtils.addParameters( urlItem, NewsLetterConstants.PARAMETER_NEWSLETTER_ID,
207 request.getParameterValues( NewsLetterConstants.PARAMETER_NEWSLETTER_ID ) );
208 Collection<NewsLetter> listNewsLetter = NewsLetterHome.findAll( PluginService.getPlugin( NewsletterPlugin.PLUGIN_NAME ) );
209 Map<String, Object> model = new HashMap<String, Object>( );
210 model.put( NewsLetterConstants.MARK_CONFIRM_URL, urlItem.getUrl( ) );
211 model.put( NewsLetterConstants.MARK_NEWSLETTER_LIST, listNewsLetter);
212 model.put(NewsLetterConstants.MARK_SITE_NAME , getSiteName( ));
213
214 HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CONFIRM_MAIL, getLocale( request ), model );
215 MailService.sendMailHtml( subscriber.getEmail( ), NewsLetterConstants.PROPERTY_CONFIRM_MAIL_SENDER_NAME,
216 NewsLetterConstants.PROPERTY_CONFIRM_MAIL_SENDER_ADDRESS,
217 I18nService.getLocalizedString( PROPERTY_MESSAGE_CONFIRM_MAIL_TITLE, request.getLocale( ) ), template.getHtml( ) );
218 }
219
220 String strMessage;
221
222 if ( properties.isValidationActive( ) )
223 {
224 strMessage = NewsLetterConstants.PROPERTY_SUBSCRIPTION_OK_ALERT_MESSAGE_CONFIRM;
225 }
226 else
227 {
228 strMessage = NewsLetterConstants.PROPERTY_SUBSCRIPTION_OK_ALERT_MESSAGE;
229 }
230
231 SiteMessageService.setMessage( request, strMessage, NewsLetterConstants.PROPERTY_SUBSCRIPTION_OK_TITLE_MESSAGE, SiteMessage.TYPE_INFO );
232 }
233 }
234
235
236
237
238
239
240
241
242
243 public void doConfirmSubscribe( HttpServletRequest request ) throws SiteMessageException
244 {
245 String [ ] arrayNewsletters = request.getParameterValues( NewsLetterConstants.PARAMETER_NEWSLETTER_ID );
246
247 String strEmail = request.getParameter( NewsLetterConstants.PARAMETER_EMAIL );
248
249 if ( StringUtils.isBlank( strEmail ) || !StringUtil.checkEmail( strEmail ) )
250 {
251 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_INVALID_MAIL_ERROR_MESSAGE,
252 NewsLetterConstants.PROPERTY_INVALID_MAIL_TITLE_MESSAGE, SiteMessage.TYPE_STOP );
253 }
254
255 String strIdUser = request.getParameter( NewsLetterConstants.PARAMETER_USER_ID );
256 int nIdUser = -1;
257
258 try
259 {
260 nIdUser = Integer.parseInt( strIdUser );
261 }
262 catch( NumberFormatException nfe )
263 {
264 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_SUBSCRIPTION_INVALID_USER_ERROR_MESSAGE,
265 NewsLetterConstants.PROPERTY_SUBSCRIPTION_INVALID_USER_TITLE_MESSAGE, SiteMessage.TYPE_STOP );
266 }
267
268 String strKey = request.getParameter( NewsLetterConstants.PARAMETER_KEY );
269 int nKey = 0;
270
271 try
272 {
273 nKey = Integer.parseInt( strKey );
274 }
275 catch( NumberFormatException nfe )
276 {
277 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_SUBSCRIPTION_INVALID_KEY_ERROR_MESSAGE,
278 NewsLetterConstants.PROPERTY_SUBSCRIPTION_INVALID_KEY_TITLE_MESSAGE, SiteMessage.TYPE_STOP );
279 }
280
281 if ( arrayNewsletters == null )
282 {
283 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_NO_NEWSLETTER_CHOSEN_ERROR_MESSAGE,
284 NewsLetterConstants.PROPERTY_NO_NEWSLETTER_CHOSEN_TITLE_MESSAGE, SiteMessage.TYPE_STOP );
285 }
286 else
287 {
288
289 Subscriber subscriber = SubscriberHome.findByEmail( strEmail, getPlugin( ) );
290
291 if ( subscriber == null )
292 {
293 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_SUBSCRIPTION_INVALID_USER_ERROR_MESSAGE,
294 NewsLetterConstants.PROPERTY_SUBSCRIPTION_INVALID_USER_TITLE_MESSAGE, SiteMessage.TYPE_STOP );
295 return;
296 }
297
298 boolean bValidKey = AwaitingActivationHome.checkKey( nIdUser, nKey, getPlugin( ) );
299
300 if ( !bValidKey )
301 {
302 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_SUBSCRIPTION_INVALID_KEY_ERROR_MESSAGE,
303 NewsLetterConstants.PROPERTY_SUBSCRIPTION_INVALID_KEY_TITLE_MESSAGE, SiteMessage.TYPE_STOP );
304 }
305
306 for ( String strIdNewsLetter : arrayNewsletters )
307 {
308 try
309 {
310 NewsLetterHome.validateSubscriber( Integer.parseInt( strIdNewsLetter ), subscriber.getId( ), getPlugin( ) );
311 }
312 catch( NumberFormatException nfe )
313 {
314 AppLogService.error( "NewsLetterRegistrationService.doConfirmSubscribe() " + nfe );
315 }
316 }
317
318
319 AwaitingActivationHome.remove( nIdUser, nKey, getPlugin( ) );
320 }
321
322 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_SUBSCRIPTION_CONFIRM_ALERT_MESSAGE, SiteMessage.TYPE_INFO,
323 request.getRequestURI( ), NewsLetterConstants.PROPERTY_SUBSCRIPTION_CONFIRM_TITLE_MESSAGE, null );
324 }
325
326
327
328
329
330
331
332
333
334 public void doUnSubscribe( HttpServletRequest request ) throws SiteMessageException
335 {
336 String strEmail = request.getParameter( NewsLetterConstants.PARAMETER_EMAIL );
337 String strKey = request.getParameter( NewsLetterConstants.MARK_UNSUBSCRIBE_KEY );
338
339 if ( ( strEmail == null ) || !StringUtil.checkEmail( strEmail )
340 || !StringUtils.equals( strKey, NewsletterService.getService( ).getUnsubscriptionKey( strEmail ) ) )
341 {
342 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_INVALID_MAIL_ERROR_MESSAGE, SiteMessage.TYPE_ERROR );
343 }
344
345 String strNewsletterId = request.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_ID );
346
347 if ( ( strNewsletterId == null ) || !strNewsletterId.matches( REGEX_ID ) )
348 {
349 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_NO_NEWSLETTER_CHOSEN_ERROR_MESSAGE, SiteMessage.TYPE_ERROR );
350 return;
351 }
352
353
354 int nNewsletterId = Integer.parseInt( strNewsletterId );
355 Plugin plugin = PluginService.getPlugin( NewsletterPlugin.PLUGIN_NAME );
356 Subscriber subscriber = SubscriberHome.findByEmail( strEmail, plugin );
357 NewsLetter newsletter = NewsLetterHome.findByPrimaryKey( nNewsletterId, plugin );
358
359 if ( ( subscriber != null ) && ( newsletter != null ) )
360 {
361 int nSubscriberId = subscriber.getId( );
362
363 if ( NewsLetterHome.findRegistration( nNewsletterId, nSubscriberId, plugin ) )
364 {
365 NewsLetterHome.removeSubscriber( nNewsletterId, nSubscriberId, plugin );
366 }
367
368 if ( SubscriberHome.findNewsLetters( nSubscriberId, plugin ) == 0 )
369 {
370 SubscriberHome.remove( nSubscriberId, plugin );
371 }
372 }
373
374 UrlItem urlItem = new UrlItem( request.getRequestURI( ) );
375 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_UNSUBSCRIPTION_OK_ALERT_MESSAGE, null,
376 NewsLetterConstants.PROPERTY_UNSUBSCRIPTION_OK_TITLE_MESSAGE, urlItem.getUrl( ), null, SiteMessage.TYPE_INFO );
377 }
378
379
380
381
382
383
384
385
386
387 public void doConfirmUnSubscribe( HttpServletRequest request ) throws SiteMessageException
388 {
389 UrlItem urlItem = new UrlItem( request.getRequestURI( ) );
390 urlItem.addParameter( NewsLetterConstants.PARAMETER_PAGE, NewsletterPlugin.PLUGIN_NAME );
391 urlItem.addParameter( NewsLetterConstants.PARAMETER_ACTION, NewsLetterConstants.ACTION_UNSUBSCRIBE );
392 urlItem.addParameter( NewsLetterConstants.PARAMETER_EMAIL, request.getParameter( NewsLetterConstants.MARK_SUBSCRIBER_EMAIL ) );
393 urlItem.addParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_ID, request.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_ID ) );
394 urlItem.addParameter( NewsLetterConstants.MARK_UNSUBSCRIBE_KEY, request.getParameter( NewsLetterConstants.MARK_UNSUBSCRIBE_KEY ) );
395 SiteMessageService.setMessage( request, NewsLetterConstants.PROPERTY_CONFIRM_UNSUBSCRIPTION_ALERT_MESSAGE, null,
396 NewsLetterConstants.PROPERTY_CONFIRM_UNSUBSCRIPTION_TITLE_MESSAGE, urlItem.getUrl( ), null, SiteMessage.TYPE_INFO );
397 }
398
399
400
401
402
403
404 public String doRemoveOldUnconfirmed( )
405 {
406 StringBuffer sbLogs = new StringBuffer( );
407 sbLogs.append( "\r\n[Start] Starting cleaning newsletter subscribers daemon...\r\n" );
408
409 long lDuration = System.currentTimeMillis( );
410 Plugin plugin = PluginService.getPlugin( NewsletterPlugin.PLUGIN_NAME );
411 int nConfirmLimit = AppPropertiesService.getPropertyInt( PROPERTY_LIMIT_CONFIRM_DAYS, DEFAULT_LIMIT );
412 NewsLetterHome.removeOldUnconfirmed( nConfirmLimit, plugin );
413 sbLogs.append( "\r\n[End] Duration : " + ( System.currentTimeMillis( ) - lDuration ) + " milliseconds\r\n" );
414
415 return sbLogs.toString( );
416 }
417
418
419
420
421
422
423 private Plugin getPlugin( )
424 {
425 if ( _plugin == null )
426 {
427 _plugin = PluginService.getPlugin( NewsletterPlugin.PLUGIN_NAME );
428 }
429 return _plugin;
430 }
431 }