001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.service.impl;
016    
017    import com.liferay.portal.DuplicatePasswordPolicyException;
018    import com.liferay.portal.NoSuchPasswordPolicyRelException;
019    import com.liferay.portal.PasswordPolicyNameException;
020    import com.liferay.portal.RequiredPasswordPolicyException;
021    import com.liferay.portal.kernel.exception.PortalException;
022    import com.liferay.portal.kernel.exception.SystemException;
023    import com.liferay.portal.kernel.util.OrderByComparator;
024    import com.liferay.portal.kernel.util.StringPool;
025    import com.liferay.portal.kernel.util.Validator;
026    import com.liferay.portal.model.Organization;
027    import com.liferay.portal.model.PasswordPolicy;
028    import com.liferay.portal.model.PasswordPolicyRel;
029    import com.liferay.portal.model.ResourceConstants;
030    import com.liferay.portal.model.User;
031    import com.liferay.portal.security.ldap.LDAPSettingsUtil;
032    import com.liferay.portal.service.base.PasswordPolicyLocalServiceBaseImpl;
033    import com.liferay.portal.util.PropsValues;
034    
035    import java.util.Date;
036    import java.util.List;
037    
038    /**
039     * @author Scott Lee
040     */
041    public class PasswordPolicyLocalServiceImpl
042            extends PasswordPolicyLocalServiceBaseImpl {
043    
044            public PasswordPolicy addPasswordPolicy(
045                            long userId, boolean defaultPolicy, String name, String description,
046                            boolean changeable, boolean changeRequired, long minAge,
047                            boolean checkSyntax, boolean allowDictionaryWords,
048                            int minAlphanumeric, int minLength, int minLowerCase,
049                            int minNumbers, int minSymbols, int minUpperCase, boolean history,
050                            int historyCount, boolean expireable, long maxAge, long warningTime,
051                            int graceLimit, boolean lockout, int maxFailure,
052                            long lockoutDuration, long resetFailureCount,
053                            long resetTicketMaxAge)
054                    throws PortalException, SystemException {
055    
056                    // Password policy
057    
058                    User user = userPersistence.findByPrimaryKey(userId);
059                    Date now = new Date();
060    
061                    validate(0, user.getCompanyId(), name);
062    
063                    long passwordPolicyId = counterLocalService.increment();
064    
065                    PasswordPolicy passwordPolicy = passwordPolicyPersistence.create(
066                            passwordPolicyId);
067    
068                    passwordPolicy.setUserId(userId);
069                    passwordPolicy.setCompanyId(user.getCompanyId());
070                    passwordPolicy.setUserName(user.getFullName());
071                    passwordPolicy.setCreateDate(now);
072                    passwordPolicy.setModifiedDate(now);
073                    passwordPolicy.setDefaultPolicy(defaultPolicy);
074                    passwordPolicy.setName(name);
075                    passwordPolicy.setDescription(description);
076                    passwordPolicy.setChangeable(changeable);
077                    passwordPolicy.setChangeRequired(changeRequired);
078                    passwordPolicy.setMinAge(minAge);
079                    passwordPolicy.setCheckSyntax(checkSyntax);
080                    passwordPolicy.setAllowDictionaryWords(allowDictionaryWords);
081                    passwordPolicy.setMinAlphanumeric(minAlphanumeric);
082                    passwordPolicy.setMinLength(minLength);
083                    passwordPolicy.setMinLowerCase(minLowerCase);
084                    passwordPolicy.setMinNumbers(minNumbers);
085                    passwordPolicy.setMinSymbols(minSymbols);
086                    passwordPolicy.setMinUpperCase(minUpperCase);
087                    passwordPolicy.setHistory(history);
088                    passwordPolicy.setHistoryCount(historyCount);
089                    passwordPolicy.setExpireable(expireable);
090                    passwordPolicy.setMaxAge(maxAge);
091                    passwordPolicy.setWarningTime(warningTime);
092                    passwordPolicy.setGraceLimit(graceLimit);
093                    passwordPolicy.setLockout(lockout);
094                    passwordPolicy.setMaxFailure(maxFailure);
095                    passwordPolicy.setLockoutDuration(lockoutDuration);
096                    passwordPolicy.setRequireUnlock(lockoutDuration == 0);
097                    passwordPolicy.setResetFailureCount(resetFailureCount);
098                    passwordPolicy.setResetTicketMaxAge(resetTicketMaxAge);
099    
100                    passwordPolicyPersistence.update(passwordPolicy, false);
101    
102                    // Resources
103    
104                    if (!user.isDefaultUser()) {
105                            resourceLocalService.addResources(
106                                    user.getCompanyId(), 0, userId, PasswordPolicy.class.getName(),
107                                    passwordPolicy.getPasswordPolicyId(), false, false, false);
108                    }
109    
110                    return passwordPolicy;
111            }
112    
113            public void checkDefaultPasswordPolicy(long companyId)
114                    throws PortalException, SystemException {
115    
116                    String defaultPasswordPolicyName =
117                            PropsValues.PASSWORDS_DEFAULT_POLICY_NAME;
118    
119                    PasswordPolicy defaultPasswordPolicy =
120                            passwordPolicyPersistence.fetchByC_N(
121                                    companyId, defaultPasswordPolicyName);
122    
123                    if (defaultPasswordPolicy == null) {
124                            long defaultUserId = userLocalService.getDefaultUserId(companyId);
125    
126                            addPasswordPolicy(
127                                    defaultUserId, true, defaultPasswordPolicyName,
128                                    defaultPasswordPolicyName, true, false, 0, false, true, 0, 6,
129                                    0, 1, 0, 1, false, 6, false, 8640000, 86400, 0, false, 3, 0,
130                                    600, 86400);
131                    }
132            }
133    
134            public void deletePasswordPolicy(long passwordPolicyId)
135                    throws PortalException, SystemException {
136    
137                    PasswordPolicy passwordPolicy =
138                            passwordPolicyPersistence.findByPrimaryKey(passwordPolicyId);
139    
140                    if (passwordPolicy.isDefaultPolicy()) {
141                            throw new RequiredPasswordPolicyException();
142                    }
143    
144                    // Password policy relations
145    
146                    passwordPolicyRelLocalService.deletePasswordPolicyRels(
147                            passwordPolicyId);
148    
149                    // Resources
150    
151                    resourceLocalService.deleteResource(
152                            passwordPolicy.getCompanyId(), PasswordPolicy.class.getName(),
153                            ResourceConstants.SCOPE_INDIVIDUAL,
154                            passwordPolicy.getPasswordPolicyId());
155    
156                    // Password policy
157    
158                    passwordPolicyPersistence.remove(passwordPolicy);
159            }
160    
161            public PasswordPolicy getDefaultPasswordPolicy(long companyId)
162                    throws PortalException, SystemException {
163    
164                    if (LDAPSettingsUtil.isPasswordPolicyEnabled(companyId)) {
165                            return null;
166                    }
167    
168                    return passwordPolicyPersistence.findByC_DP(companyId, true);
169            }
170    
171            public PasswordPolicy getPasswordPolicy(long passwordPolicyId)
172                    throws PortalException, SystemException {
173    
174                    return passwordPolicyPersistence.findByPrimaryKey(passwordPolicyId);
175            }
176    
177            /**
178             * @deprecated
179             */
180            public PasswordPolicy getPasswordPolicy(
181                            long companyId, long organizationId, long locationId)
182                    throws PortalException, SystemException {
183    
184                    return getPasswordPolicy(
185                            companyId, new long[] {organizationId, locationId});
186            }
187    
188            public PasswordPolicy getPasswordPolicy(
189                            long companyId, long[] organizationIds)
190                    throws PortalException, SystemException {
191    
192                    if (LDAPSettingsUtil.isPasswordPolicyEnabled(companyId)) {
193                            return null;
194                    }
195    
196                    if ((organizationIds == null) || (organizationIds.length == 0)) {
197                            return getDefaultPasswordPolicy(companyId);
198                    }
199    
200                    PasswordPolicyRel passwordPolicyRel = null;
201    
202                    for (int i = 0; i < organizationIds.length; i++) {
203                            long organizationId = organizationIds[i];
204    
205                            try {
206                                    passwordPolicyRel =
207                                            passwordPolicyRelLocalService.getPasswordPolicyRel(
208                                                    Organization.class.getName(), organizationId);
209    
210                                    return getPasswordPolicy(
211                                            passwordPolicyRel.getPasswordPolicyId());
212                            }
213                            catch (NoSuchPasswordPolicyRelException nsppre) {
214                            }
215                    }
216    
217                    return getDefaultPasswordPolicy(companyId);
218            }
219    
220            public PasswordPolicy getPasswordPolicyByUserId(long userId)
221                    throws PortalException, SystemException {
222    
223                    User user = userPersistence.findByPrimaryKey(userId);
224    
225                    if (LDAPSettingsUtil.isPasswordPolicyEnabled(user.getCompanyId())) {
226                            return null;
227                    }
228    
229                    PasswordPolicyRel passwordPolicyRel = null;
230    
231                    // Check for password policy specifically assigned to this user
232    
233                    try {
234                            passwordPolicyRel =
235                                    passwordPolicyRelLocalService.getPasswordPolicyRel(
236                                            User.class.getName(), userId);
237    
238                            return getPasswordPolicy(passwordPolicyRel.getPasswordPolicyId());
239                    }
240                    catch (NoSuchPasswordPolicyRelException nsppre) {
241                    }
242    
243                    long[] organizationIds = user.getOrganizationIds();
244    
245                    return getPasswordPolicy(user.getCompanyId(), organizationIds);
246            }
247    
248            public List<PasswordPolicy> search(
249                            long companyId, String name, int start, int end,
250                            OrderByComparator obc)
251                    throws SystemException {
252    
253                    return passwordPolicyFinder.findByC_N(companyId, name, start, end, obc);
254            }
255    
256            public int searchCount(long companyId, String name)
257                    throws SystemException {
258    
259                    return passwordPolicyFinder.countByC_N(companyId, name);
260            }
261    
262            public PasswordPolicy updatePasswordPolicy(
263                            long passwordPolicyId, String name, String description,
264                            boolean changeable, boolean changeRequired, long minAge,
265                            boolean checkSyntax, boolean allowDictionaryWords,
266                            int minAlphanumeric, int minLength, int minLowerCase,
267                            int minNumbers, int minSymbols, int minUpperCase, boolean history,
268                            int historyCount, boolean expireable, long maxAge,
269                            long warningTime, int graceLimit, boolean lockout, int maxFailure,
270                            long lockoutDuration, long resetFailureCount,
271                            long resetTicketMaxAge)
272                    throws PortalException, SystemException {
273    
274                    Date now = new Date();
275    
276                    PasswordPolicy passwordPolicy =
277                            passwordPolicyPersistence.findByPrimaryKey(
278                                    passwordPolicyId);
279    
280                    if (!passwordPolicy.getDefaultPolicy()) {
281                            validate(passwordPolicyId, passwordPolicy.getCompanyId(), name);
282    
283                            passwordPolicy.setName(name);
284                    }
285    
286                    passwordPolicy.setModifiedDate(now);
287                    passwordPolicy.setDescription(description);
288                    passwordPolicy.setChangeable(changeable);
289                    passwordPolicy.setChangeRequired(changeRequired);
290                    passwordPolicy.setMinAge(minAge);
291                    passwordPolicy.setCheckSyntax(checkSyntax);
292                    passwordPolicy.setAllowDictionaryWords(allowDictionaryWords);
293                    passwordPolicy.setMinAlphanumeric(minAlphanumeric);
294                    passwordPolicy.setMinLength(minLength);
295                    passwordPolicy.setMinLowerCase(minLowerCase);
296                    passwordPolicy.setMinNumbers(minNumbers);
297                    passwordPolicy.setMinSymbols(minSymbols);
298                    passwordPolicy.setMinUpperCase(minUpperCase);
299                    passwordPolicy.setHistory(history);
300                    passwordPolicy.setHistoryCount(historyCount);
301                    passwordPolicy.setExpireable(expireable);
302                    passwordPolicy.setMaxAge(maxAge);
303                    passwordPolicy.setWarningTime(warningTime);
304                    passwordPolicy.setGraceLimit(graceLimit);
305                    passwordPolicy.setLockout(lockout);
306                    passwordPolicy.setMaxFailure(maxFailure);
307                    passwordPolicy.setLockoutDuration(lockoutDuration);
308                    passwordPolicy.setRequireUnlock(lockoutDuration == 0);
309                    passwordPolicy.setResetFailureCount(resetFailureCount);
310                    passwordPolicy.setResetTicketMaxAge(resetTicketMaxAge);
311    
312                    passwordPolicyPersistence.update(passwordPolicy, false);
313    
314                    return passwordPolicy;
315            }
316    
317            protected void validate(long passwordPolicyId, long companyId, String name)
318                    throws PortalException, SystemException {
319    
320                    if ((Validator.isNull(name)) || (Validator.isNumber(name)) ||
321                            (name.indexOf(StringPool.COMMA) != -1) ||
322                            (name.indexOf(StringPool.STAR) != -1)) {
323    
324                            throw new PasswordPolicyNameException();
325                    }
326    
327                    PasswordPolicy passwordPolicy = passwordPolicyPersistence.fetchByC_N(
328                            companyId, name);
329    
330                    if (passwordPolicy != null) {
331                            if ((passwordPolicyId <= 0) ||
332                                    (passwordPolicy.getPasswordPolicyId() != passwordPolicyId)) {
333    
334                                    throw new DuplicatePasswordPolicyException();
335                            }
336                    }
337            }
338    
339    }