View Javadoc
1   /*
2    * Copyright (c) 2002-2021, 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.plugins.mylutece.modules.database.authentication.service;
35  
36  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseUser;
37  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseUserHome;
38  import fr.paris.lutece.plugins.mylutece.service.IAccountLifeTimeService;
39  import fr.paris.lutece.portal.service.plugin.Plugin;
40  import fr.paris.lutece.portal.service.plugin.PluginService;
41  import fr.paris.lutece.portal.service.spring.SpringContextService;
42  import fr.paris.lutece.portal.service.template.DatabaseTemplateService;
43  import fr.paris.lutece.portal.service.util.AppPathService;
44  import fr.paris.lutece.portal.service.util.AppPropertiesService;
45  import fr.paris.lutece.portal.service.util.CryptoService;
46  
47  import java.sql.Timestamp;
48  
49  import java.text.DateFormat;
50  
51  import java.util.Date;
52  import java.util.List;
53  import java.util.Locale;
54  import java.util.Map;
55  
56  /**
57   * Service to handle account life time
58   *
59   */
60  public class DatabaseAccountLifeTimeService implements IAccountLifeTimeService
61  {
62      public static final String BEAN_DATABASE_ACCOUNT_LIFE_TIME_SERVICE = "mylutece-database.databaseAccountLifeTimeService";
63      private static final String PARAMETER_MYLUTECE_DATABASE_EXPIRATION_MAIL = "mylutece_database_expiration_mail";
64      private static final String PARAMETER_MYLUTECE_DATABASE_FIRST_ALERT_MAIL = "mylutece_database_first_alert_mail";
65      private static final String PARAMETER_MYLUTECE_DATABASE_OTHER_ALERT_MAIL = "mylutece_database_other_alert_mail";
66      private static final String PARAMETER_NOTIFY_PASSWORD_EXPIRED = "mylutece_database_password_expired";
67      private static final String MARK_LAST_NAME = "last_name";
68      private static final String MARK_FIRST_NAME = "first_name";
69      private static final String MARK_DATE_VALID = "date_valid";
70      private static final String MARK_URL = "url";
71      private static final String MARK_USER_ID = "user_id";
72      private static final String MARK_REF = "ref";
73      private static final String PROPERTY_ACCOUNT_REF_ENCRYPT_ALGO = "mylutece-database.account_life_time.refEncryptionAlgorythm";
74      private static final String JSP_URL_REACTIVATE_ACCOUNT = "/jsp/site/Portal.jsp?page=mylutecedatabase&action=reactivateAccount";
75      private static final String CONSTANT_AND = "&";
76      private static final String CONSTANT_EQUAL = "=";
77      private Plugin _plugin = PluginService.getPlugin( DatabasePlugin.PLUGIN_NAME );
78  
79      /**
80       * Get an instance of the service
81       * 
82       * @return An instance of the service
83       */
84      public static DatabaseAccountLifeTimeService getService( )
85      {
86          return SpringContextService.getBean( BEAN_DATABASE_ACCOUNT_LIFE_TIME_SERVICE );
87      }
88  
89      /**
90       * {@inheritDoc}
91       */
92      @Override
93      public Plugin getPlugin( )
94      {
95          return _plugin;
96      }
97  
98      /**
99       * {@inheritDoc}
100      */
101     @Override
102     public List<Integer> getIdUsersWithExpiredLifeTimeList( Timestamp currentTimestamp )
103     {
104         return DatabaseUserHome.getIdUsersWithExpiredLifeTimeList( currentTimestamp, _plugin );
105     }
106 
107     /**
108      * {@inheritDoc}
109      */
110     @Override
111     public List<Integer> getIdUsersToSendFirstAlert( Timestamp alertMaxDate )
112     {
113         return DatabaseUserHome.getIdUsersToSendFirstAlert( alertMaxDate, _plugin );
114     }
115 
116     /**
117      * {@inheritDoc}
118      */
119     @Override
120     public List<Integer> getIdUsersToSendOtherAlert( Timestamp alertMaxDate, Timestamp timeBetweenAlerts, int maxNumberAlerts )
121     {
122         return DatabaseUserHome.getIdUsersToSendOtherAlert( alertMaxDate, timeBetweenAlerts, maxNumberAlerts, _plugin );
123     }
124 
125     /**
126      * {@inheritDoc}
127      */
128     @Override
129     public void updateNbAlert( List<Integer> listIdUser )
130     {
131         DatabaseUserHome.updateNbAlert( listIdUser, _plugin );
132     }
133 
134     /**
135      * {@inheritDoc}
136      */
137     @Override
138     public void updateChangePassword( List<Integer> listIdUser )
139     {
140         DatabaseUserHome.updateChangePassword( listIdUser, _plugin );
141     }
142 
143     /**
144      * {@inheritDoc}
145      */
146     @Override
147     public void setUserStatusExpired( List<Integer> listIdUser )
148     {
149         DatabaseUserHome.updateUserStatus( listIdUser, DatabaseUser.STATUS_EXPIRED, _plugin );
150     }
151 
152     /**
153      * {@inheritDoc}
154      */
155     @Override
156     public String getExpirationtMailBody( )
157     {
158         return DatabaseTemplateService.getTemplateFromKey( PARAMETER_MYLUTECE_DATABASE_EXPIRATION_MAIL );
159     }
160 
161     /**
162      * {@inheritDoc}
163      */
164     @Override
165     public String getFirstAlertMailBody( )
166     {
167         return DatabaseTemplateService.getTemplateFromKey( PARAMETER_MYLUTECE_DATABASE_FIRST_ALERT_MAIL );
168     }
169 
170     /**
171      * {@inheritDoc}
172      */
173     @Override
174     public String getOtherAlertMailBody( )
175     {
176         return DatabaseTemplateService.getTemplateFromKey( PARAMETER_MYLUTECE_DATABASE_OTHER_ALERT_MAIL );
177     }
178 
179     /**
180      * {@inheritDoc}
181      */
182     @Override
183     public String getPasswordExpiredMailBody( )
184     {
185         return DatabaseTemplateService.getTemplateFromKey( PARAMETER_NOTIFY_PASSWORD_EXPIRED );
186     }
187 
188     /**
189      * {@inheritDoc}
190      */
191     @Override
192     public void addParametersToModel( Map<String, String> model, Integer nIdUser )
193     {
194         DatabaseUser user = DatabaseUserHome.findByPrimaryKey( nIdUser, _plugin );
195         DateFormat dateFormat = DateFormat.getDateInstance( DateFormat.SHORT, Locale.getDefault( ) );
196 
197         String accountMaxValidDate = dateFormat.format( new Date( user.getAccountMaxValidDate( ).getTime( ) ) );
198 
199         StringBuilder sbUrl = new StringBuilder( );
200         // FIXME : get base URL in case the prod URL is null
201         sbUrl.append( AppPathService.getProdUrl( "" ) );
202         sbUrl.append( JSP_URL_REACTIVATE_ACCOUNT );
203         sbUrl.append( CONSTANT_AND );
204         sbUrl.append( MARK_USER_ID );
205         sbUrl.append( CONSTANT_EQUAL );
206         sbUrl.append( nIdUser.toString( ) );
207         sbUrl.append( CONSTANT_AND );
208         sbUrl.append( MARK_REF );
209         sbUrl.append( CONSTANT_EQUAL );
210         sbUrl.append( CryptoService.encrypt( Long.toString( user.getAccountMaxValidDate( ).getTime( ) ),
211                 AppPropertiesService.getProperty( PROPERTY_ACCOUNT_REF_ENCRYPT_ALGO ) ) );
212 
213         String activationURL = sbUrl.toString( );
214 
215         model.put( MARK_DATE_VALID, accountMaxValidDate );
216         model.put( MARK_URL, activationURL );
217         model.put( MARK_LAST_NAME, user.getLastName( ) );
218         model.put( MARK_FIRST_NAME, user.getFirstName( ) );
219     }
220 
221     /**
222      * {@inheritDoc}
223      */
224     @Override
225     public String getUserMainEmail( int nIdUser )
226     {
227         DatabaseUser user = DatabaseUserHome.findByPrimaryKey( nIdUser, _plugin );
228 
229         return user.getEmail( );
230     }
231 
232     @Override
233     public List<Integer> getIdUsersWithExpiredPasswordsList( Timestamp currentTimestamp )
234     {
235         return DatabaseUserHome.getIdUsersWithExpiredPasswordsList( currentTimestamp, _plugin );
236     }
237 }