001    /**
002     * Copyright (c) 2000-2013 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.PasswordPolicyNameException;
019    import com.liferay.portal.RequiredPasswordPolicyException;
020    import com.liferay.portal.kernel.cache.ThreadLocalCachable;
021    import com.liferay.portal.kernel.exception.PortalException;
022    import com.liferay.portal.kernel.exception.SystemException;
023    import com.liferay.portal.kernel.util.CharPool;
024    import com.liferay.portal.kernel.util.OrderByComparator;
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            @Override
045            public PasswordPolicy addPasswordPolicy(
046                            long userId, boolean defaultPolicy, String name, String description,
047                            boolean changeable, boolean changeRequired, long minAge,
048                            boolean checkSyntax, boolean allowDictionaryWords,
049                            int minAlphanumeric, int minLength, int minLowerCase,
050                            int minNumbers, int minSymbols, int minUpperCase, boolean history,
051                            int historyCount, boolean expireable, long maxAge, long warningTime,
052                            int graceLimit, boolean lockout, int maxFailure,
053                            long lockoutDuration, long resetFailureCount,
054                            long resetTicketMaxAge)
055                    throws PortalException, SystemException {
056    
057                    // Password policy
058    
059                    User user = userPersistence.findByPrimaryKey(userId);
060                    Date now = new Date();
061    
062                    validate(0, user.getCompanyId(), name);
063    
064                    long passwordPolicyId = counterLocalService.increment();
065    
066                    PasswordPolicy passwordPolicy = passwordPolicyPersistence.create(
067                            passwordPolicyId);
068    
069                    passwordPolicy.setUserId(userId);
070                    passwordPolicy.setCompanyId(user.getCompanyId());
071                    passwordPolicy.setUserName(user.getFullName());
072                    passwordPolicy.setCreateDate(now);
073                    passwordPolicy.setModifiedDate(now);
074                    passwordPolicy.setDefaultPolicy(defaultPolicy);
075                    passwordPolicy.setName(name);
076                    passwordPolicy.setDescription(description);
077                    passwordPolicy.setChangeable(changeable);
078                    passwordPolicy.setChangeRequired(changeRequired);
079                    passwordPolicy.setMinAge(minAge);
080                    passwordPolicy.setCheckSyntax(checkSyntax);
081                    passwordPolicy.setAllowDictionaryWords(allowDictionaryWords);
082                    passwordPolicy.setMinAlphanumeric(minAlphanumeric);
083                    passwordPolicy.setMinLength(minLength);
084                    passwordPolicy.setMinLowerCase(minLowerCase);
085                    passwordPolicy.setMinNumbers(minNumbers);
086                    passwordPolicy.setMinSymbols(minSymbols);
087                    passwordPolicy.setMinUpperCase(minUpperCase);
088                    passwordPolicy.setHistory(history);
089                    passwordPolicy.setHistoryCount(historyCount);
090                    passwordPolicy.setExpireable(expireable);
091                    passwordPolicy.setMaxAge(maxAge);
092                    passwordPolicy.setWarningTime(warningTime);
093                    passwordPolicy.setGraceLimit(graceLimit);
094                    passwordPolicy.setLockout(lockout);
095                    passwordPolicy.setMaxFailure(maxFailure);
096                    passwordPolicy.setLockoutDuration(lockoutDuration);
097                    passwordPolicy.setRequireUnlock(lockoutDuration == 0);
098                    passwordPolicy.setResetFailureCount(resetFailureCount);
099                    passwordPolicy.setResetTicketMaxAge(resetTicketMaxAge);
100    
101                    passwordPolicyPersistence.update(passwordPolicy, false);
102    
103                    // Resources
104    
105                    if (!user.isDefaultUser()) {
106                            resourceLocalService.addResources(
107                                    user.getCompanyId(), 0, userId, PasswordPolicy.class.getName(),
108                                    passwordPolicy.getPasswordPolicyId(), false, false, false);
109                    }
110    
111                    return passwordPolicy;
112            }
113    
114            @Override
115            public void checkDefaultPasswordPolicy(long companyId)
116                    throws PortalException, SystemException {
117    
118                    String defaultPasswordPolicyName =
119                            PropsValues.PASSWORDS_DEFAULT_POLICY_NAME;
120    
121                    PasswordPolicy defaultPasswordPolicy =
122                            passwordPolicyPersistence.fetchByC_N(
123                                    companyId, defaultPasswordPolicyName);
124    
125                    if (defaultPasswordPolicy == null) {
126                            long defaultUserId = userLocalService.getDefaultUserId(companyId);
127    
128                            addPasswordPolicy(
129                                    defaultUserId, true, defaultPasswordPolicyName,
130                                    defaultPasswordPolicyName, true, true, 0, false, true, 0, 6, 0,
131                                    1, 0, 1, false, 6, false, 8640000, 86400, 0, false, 3, 0, 600,
132                                    86400);
133                    }
134            }
135    
136            @Override
137            public PasswordPolicy deletePasswordPolicy(long passwordPolicyId)
138                    throws PortalException, SystemException {
139    
140                    PasswordPolicy passwordPolicy =
141                            passwordPolicyPersistence.findByPrimaryKey(passwordPolicyId);
142    
143                    return deletePasswordPolicy(passwordPolicy);
144            }
145    
146            @Override
147            public PasswordPolicy deletePasswordPolicy(PasswordPolicy passwordPolicy)
148                    throws PortalException, SystemException {
149    
150                    if (passwordPolicy.isDefaultPolicy()) {
151                            throw new RequiredPasswordPolicyException();
152                    }
153    
154                    // Password policy relations
155    
156                    passwordPolicyRelLocalService.deletePasswordPolicyRels(
157                            passwordPolicy.getPasswordPolicyId());
158    
159                    // Resources
160    
161                    resourceLocalService.deleteResource(
162                            passwordPolicy.getCompanyId(), PasswordPolicy.class.getName(),
163                            ResourceConstants.SCOPE_INDIVIDUAL,
164                            passwordPolicy.getPasswordPolicyId());
165    
166                    // Password policy
167    
168                    return passwordPolicyPersistence.remove(passwordPolicy);
169            }
170    
171            @Override
172            public PasswordPolicy getDefaultPasswordPolicy(long companyId)
173                    throws PortalException, SystemException {
174    
175                    if (LDAPSettingsUtil.isPasswordPolicyEnabled(companyId)) {
176                            return null;
177                    }
178    
179                    return passwordPolicyPersistence.findByC_DP(companyId, true);
180            }
181    
182            /**
183             * @deprecated
184             */
185            @Override
186            public PasswordPolicy getPasswordPolicy(
187                            long companyId, long organizationId, long locationId)
188                    throws PortalException, SystemException {
189    
190                    return getPasswordPolicy(
191                            companyId, new long[] {organizationId, locationId});
192            }
193    
194            @Override
195            public PasswordPolicy getPasswordPolicy(
196                            long companyId, long[] organizationIds)
197                    throws PortalException, SystemException {
198    
199                    if (LDAPSettingsUtil.isPasswordPolicyEnabled(companyId)) {
200                            return null;
201                    }
202    
203                    if ((organizationIds == null) || (organizationIds.length == 0)) {
204                            return getDefaultPasswordPolicy(companyId);
205                    }
206    
207                    long classNameId = classNameLocalService.getClassNameId(
208                            Organization.class.getName());
209    
210                    PasswordPolicyRel passwordPolicyRel = null;
211    
212                    for (int i = 0; i < organizationIds.length; i++) {
213                            long organizationId = organizationIds[i];
214    
215                            passwordPolicyRel = passwordPolicyRelPersistence.fetchByC_C(
216                                    classNameId, organizationId);
217    
218                            if (passwordPolicyRel != null) {
219                                    return passwordPolicyPersistence.findByPrimaryKey(
220                                            passwordPolicyRel.getPasswordPolicyId());
221                            }
222                    }
223    
224                    return getDefaultPasswordPolicy(companyId);
225            }
226    
227            @Override
228            @ThreadLocalCachable
229            public PasswordPolicy getPasswordPolicyByUserId(long userId)
230                    throws PortalException, SystemException {
231    
232                    User user = userPersistence.findByPrimaryKey(userId);
233    
234                    if (LDAPSettingsUtil.isPasswordPolicyEnabled(user.getCompanyId())) {
235                            return null;
236                    }
237    
238                    long classNameId = classNameLocalService.getClassNameId(
239                            User.class.getName());
240    
241                    PasswordPolicyRel passwordPolicyRel =
242                            passwordPolicyRelPersistence.fetchByC_C(classNameId, userId);
243    
244                    if (passwordPolicyRel != null) {
245                            return getPasswordPolicy(passwordPolicyRel.getPasswordPolicyId());
246                    }
247                    else {
248                            List<Organization> organizations = userPersistence.getOrganizations(
249                                    userId);
250    
251                            if (organizations.isEmpty()) {
252                                    return passwordPolicyPersistence.findByC_DP(
253                                            user.getCompanyId(), true);
254                            }
255    
256                            long[] organizationIds = new long[organizations.size()];
257    
258                            for (int i = 0; i < organizationIds.length; i++) {
259                                    Organization organization = organizations.get(i);
260    
261                                    organizationIds[i] = organization.getOrganizationId();
262                            }
263    
264                            return getPasswordPolicy(user.getCompanyId(), organizationIds);
265                    }
266            }
267    
268            @Override
269            public List<PasswordPolicy> search(
270                            long companyId, String name, int start, int end,
271                            OrderByComparator obc)
272                    throws SystemException {
273    
274                    return passwordPolicyFinder.findByC_N(companyId, name, start, end, obc);
275            }
276    
277            @Override
278            public int searchCount(long companyId, String name) throws SystemException {
279                    return passwordPolicyFinder.countByC_N(companyId, name);
280            }
281    
282            @Override
283            public PasswordPolicy updatePasswordPolicy(
284                            long passwordPolicyId, String name, String description,
285                            boolean changeable, boolean changeRequired, long minAge,
286                            boolean checkSyntax, boolean allowDictionaryWords,
287                            int minAlphanumeric, int minLength, int minLowerCase,
288                            int minNumbers, int minSymbols, int minUpperCase, boolean history,
289                            int historyCount, boolean expireable, long maxAge, long warningTime,
290                            int graceLimit, boolean lockout, int maxFailure,
291                            long lockoutDuration, long resetFailureCount,
292                            long resetTicketMaxAge)
293                    throws PortalException, SystemException {
294    
295                    Date now = new Date();
296    
297                    PasswordPolicy passwordPolicy =
298                            passwordPolicyPersistence.findByPrimaryKey(passwordPolicyId);
299    
300                    if (!passwordPolicy.getDefaultPolicy()) {
301                            validate(passwordPolicyId, passwordPolicy.getCompanyId(), name);
302    
303                            passwordPolicy.setName(name);
304                    }
305    
306                    passwordPolicy.setModifiedDate(now);
307                    passwordPolicy.setDescription(description);
308                    passwordPolicy.setChangeable(changeable);
309                    passwordPolicy.setChangeRequired(changeRequired);
310                    passwordPolicy.setMinAge(minAge);
311                    passwordPolicy.setCheckSyntax(checkSyntax);
312                    passwordPolicy.setAllowDictionaryWords(allowDictionaryWords);
313                    passwordPolicy.setMinAlphanumeric(minAlphanumeric);
314                    passwordPolicy.setMinLength(minLength);
315                    passwordPolicy.setMinLowerCase(minLowerCase);
316                    passwordPolicy.setMinNumbers(minNumbers);
317                    passwordPolicy.setMinSymbols(minSymbols);
318                    passwordPolicy.setMinUpperCase(minUpperCase);
319                    passwordPolicy.setHistory(history);
320                    passwordPolicy.setHistoryCount(historyCount);
321                    passwordPolicy.setExpireable(expireable);
322                    passwordPolicy.setMaxAge(maxAge);
323                    passwordPolicy.setWarningTime(warningTime);
324                    passwordPolicy.setGraceLimit(graceLimit);
325                    passwordPolicy.setLockout(lockout);
326                    passwordPolicy.setMaxFailure(maxFailure);
327                    passwordPolicy.setLockoutDuration(lockoutDuration);
328                    passwordPolicy.setRequireUnlock(lockoutDuration == 0);
329                    passwordPolicy.setResetFailureCount(resetFailureCount);
330                    passwordPolicy.setResetTicketMaxAge(resetTicketMaxAge);
331    
332                    passwordPolicyPersistence.update(passwordPolicy, false);
333    
334                    return passwordPolicy;
335            }
336    
337            protected void validate(long passwordPolicyId, long companyId, String name)
338                    throws PortalException, SystemException {
339    
340                    if (Validator.isNull(name) || Validator.isNumber(name) ||
341                            (name.indexOf(CharPool.COMMA) != -1) ||
342                            (name.indexOf(CharPool.STAR) != -1)) {
343    
344                            throw new PasswordPolicyNameException();
345                    }
346    
347                    PasswordPolicy passwordPolicy = passwordPolicyPersistence.fetchByC_N(
348                            companyId, name);
349    
350                    if (passwordPolicy != null) {
351                            if ((passwordPolicyId <= 0) ||
352                                    (passwordPolicy.getPasswordPolicyId() != passwordPolicyId)) {
353    
354                                    throw new DuplicatePasswordPolicyException();
355                            }
356                    }
357            }
358    
359    }