/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.service.impl;
import com.liferay.portal.kernel.cache.thread.local.ThreadLocalCachable;
import com.liferay.portal.kernel.exception.DuplicatePasswordPolicyException;
import com.liferay.portal.kernel.exception.PasswordPolicyNameException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.RequiredPasswordPolicyException;
import com.liferay.portal.kernel.model.Organization;
import com.liferay.portal.kernel.model.PasswordPolicy;
import com.liferay.portal.kernel.model.PasswordPolicyRel;
import com.liferay.portal.kernel.model.ResourceConstants;
import com.liferay.portal.kernel.model.SystemEventConstants;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.security.auth.CompanyThreadLocal;
import com.liferay.portal.kernel.security.ldap.LDAPSettingsUtil;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.systemevent.SystemEvent;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.service.base.PasswordPolicyLocalServiceBaseImpl;
import com.liferay.portal.util.PropsValues;
import java.util.List;
/**
* @author Scott Lee
*/
public class PasswordPolicyLocalServiceImpl
extends PasswordPolicyLocalServiceBaseImpl {
@Override
public PasswordPolicy addPasswordPolicy(
long userId, boolean defaultPolicy, String name, String description,
boolean changeable, boolean changeRequired, long minAge,
boolean checkSyntax, boolean allowDictionaryWords,
int minAlphanumeric, int minLength, int minLowerCase,
int minNumbers, int minSymbols, int minUpperCase, String regex,
boolean history, int historyCount, boolean expireable, long maxAge,
long warningTime, int graceLimit, boolean lockout, int maxFailure,
long lockoutDuration, long resetFailureCount,
long resetTicketMaxAge, ServiceContext serviceContext)
throws PortalException {
// Password policy
User user = userPersistence.findByPrimaryKey(userId);
validate(0, user.getCompanyId(), name);
long passwordPolicyId = counterLocalService.increment();
PasswordPolicy passwordPolicy = passwordPolicyPersistence.create(
passwordPolicyId);
passwordPolicy.setUuid(serviceContext.getUuid());
passwordPolicy.setCompanyId(user.getCompanyId());
passwordPolicy.setUserId(userId);
passwordPolicy.setUserName(user.getFullName());
passwordPolicy.setDefaultPolicy(defaultPolicy);
passwordPolicy.setName(name);
passwordPolicy.setDescription(description);
passwordPolicy.setChangeable(changeable);
passwordPolicy.setChangeRequired(changeRequired);
passwordPolicy.setMinAge(minAge);
passwordPolicy.setCheckSyntax(checkSyntax);
passwordPolicy.setAllowDictionaryWords(allowDictionaryWords);
passwordPolicy.setMinAlphanumeric(minAlphanumeric);
passwordPolicy.setMinLength(minLength);
passwordPolicy.setMinLowerCase(minLowerCase);
passwordPolicy.setMinNumbers(minNumbers);
passwordPolicy.setMinSymbols(minSymbols);
passwordPolicy.setMinUpperCase(minUpperCase);
passwordPolicy.setRegex(regex);
passwordPolicy.setHistory(history);
passwordPolicy.setHistoryCount(historyCount);
passwordPolicy.setExpireable(expireable);
passwordPolicy.setMaxAge(maxAge);
passwordPolicy.setWarningTime(warningTime);
passwordPolicy.setGraceLimit(graceLimit);
passwordPolicy.setLockout(lockout);
passwordPolicy.setMaxFailure(maxFailure);
passwordPolicy.setLockoutDuration(lockoutDuration);
passwordPolicy.setRequireUnlock(lockoutDuration == 0);
passwordPolicy.setResetFailureCount(resetFailureCount);
passwordPolicy.setResetTicketMaxAge(resetTicketMaxAge);
passwordPolicy.setExpandoBridgeAttributes(serviceContext);
passwordPolicyPersistence.update(passwordPolicy);
// Resources
long ownerId = userId;
if (user.isDefaultUser()) {
ownerId = 0;
}
resourceLocalService.addResources(
user.getCompanyId(), 0, ownerId, PasswordPolicy.class.getName(),
passwordPolicy.getPasswordPolicyId(), false, false, false);
return passwordPolicy;
}
@Override
public void checkDefaultPasswordPolicy(long companyId)
throws PortalException {
String defaultPasswordPolicyName =
PropsValues.PASSWORDS_DEFAULT_POLICY_NAME;
PasswordPolicy defaultPasswordPolicy =
passwordPolicyPersistence.fetchByC_N(
companyId, defaultPasswordPolicyName);
if (defaultPasswordPolicy == null) {
long defaultUserId = userLocalService.getDefaultUserId(companyId);
addPasswordPolicy(
defaultUserId, true, defaultPasswordPolicyName,
defaultPasswordPolicyName,
PropsValues.PASSWORDS_DEFAULT_POLICY_CHANGEABLE,
PropsValues.PASSWORDS_DEFAULT_POLICY_CHANGE_REQUIRED,
PropsValues.PASSWORDS_DEFAULT_POLICY_MIN_AGE,
PropsValues.PASSWORDS_DEFAULT_POLICY_CHECK_SYNTAX,
PropsValues.PASSWORDS_DEFAULT_POLICY_ALLOW_DICTIONARY_WORDS,
PropsValues.PASSWORDS_DEFAULT_POLICY_MIN_ALPHANUMERIC,
PropsValues.PASSWORDS_DEFAULT_POLICY_MIN_LENGTH,
PropsValues.PASSWORDS_DEFAULT_POLICY_MIN_LOWERCASE,
PropsValues.PASSWORDS_DEFAULT_POLICY_MIN_NUMBERS,
PropsValues.PASSWORDS_DEFAULT_POLICY_MIN_SYMBOLS,
PropsValues.PASSWORDS_DEFAULT_POLICY_MIN_UPPERCASE,
PropsValues.PASSWORDS_DEFAULT_POLICY_REGEX,
PropsValues.PASSWORDS_DEFAULT_POLICY_HISTORY,
PropsValues.PASSWORDS_DEFAULT_POLICY_HISTORY_COUNT,
PropsValues.PASSWORDS_DEFAULT_POLICY_EXPIREABLE,
PropsValues.PASSWORDS_DEFAULT_POLICY_MAX_AGE,
PropsValues.PASSWORDS_DEFAULT_POLICY_WARNING_TIME,
PropsValues.PASSWORDS_DEFAULT_POLICY_GRACE_LIMIT,
PropsValues.PASSWORDS_DEFAULT_POLICY_LOCKOUT,
PropsValues.PASSWORDS_DEFAULT_POLICY_MAX_FAILURE,
PropsValues.PASSWORDS_DEFAULT_POLICY_LOCKOUT_DURATION,
PropsValues.PASSWORDS_DEFAULT_POLICY_RESET_FAILURE_COUNT,
PropsValues.PASSWORDS_DEFAULT_POLICY_RESET_TICKET_MAX_AGE,
new ServiceContext());
}
}
@Override
public void deleteNondefaultPasswordPolicies(long companyId)
throws PortalException {
List<PasswordPolicy> passwordPolicies =
passwordPolicyPersistence.findByCompanyId(companyId);
for (PasswordPolicy passwordPolicy : passwordPolicies) {
if (!passwordPolicy.isDefaultPolicy()) {
passwordPolicyLocalService.deletePasswordPolicy(passwordPolicy);
}
}
}
@Override
public PasswordPolicy deletePasswordPolicy(long passwordPolicyId)
throws PortalException {
PasswordPolicy passwordPolicy =
passwordPolicyPersistence.findByPrimaryKey(passwordPolicyId);
return passwordPolicyLocalService.deletePasswordPolicy(passwordPolicy);
}
@Override
@SystemEvent(
action = SystemEventConstants.ACTION_SKIP,
type = SystemEventConstants.TYPE_DELETE
)
public PasswordPolicy deletePasswordPolicy(PasswordPolicy passwordPolicy)
throws PortalException {
if (passwordPolicy.isDefaultPolicy() &&
!CompanyThreadLocal.isDeleteInProcess()) {
throw new RequiredPasswordPolicyException();
}
// Password policy relations
passwordPolicyRelLocalService.deletePasswordPolicyRels(
passwordPolicy.getPasswordPolicyId());
// Resources
resourceLocalService.deleteResource(
passwordPolicy.getCompanyId(), PasswordPolicy.class.getName(),
ResourceConstants.SCOPE_INDIVIDUAL,
passwordPolicy.getPasswordPolicyId());
// Password policy
return passwordPolicyPersistence.remove(passwordPolicy);
}
@Override
public PasswordPolicy fetchPasswordPolicy(long companyId, String name) {
return passwordPolicyPersistence.fetchByC_N(companyId, name);
}
@Override
public PasswordPolicy getDefaultPasswordPolicy(long companyId)
throws PortalException {
if (LDAPSettingsUtil.isPasswordPolicyEnabled(companyId)) {
return null;
}
return passwordPolicyPersistence.findByC_DP(companyId, true);
}
@Override
public PasswordPolicy getPasswordPolicy(
long companyId, long[] organizationIds)
throws PortalException {
if (LDAPSettingsUtil.isPasswordPolicyEnabled(companyId)) {
return null;
}
if (ArrayUtil.isEmpty(organizationIds)) {
return getDefaultPasswordPolicy(companyId);
}
long classNameId = classNameLocalService.getClassNameId(
Organization.class.getName());
PasswordPolicyRel passwordPolicyRel = null;
for (int i = 0; i < organizationIds.length; i++) {
long organizationId = organizationIds[i];
passwordPolicyRel = passwordPolicyRelPersistence.fetchByC_C(
classNameId, organizationId);
if (passwordPolicyRel != null) {
return passwordPolicyPersistence.findByPrimaryKey(
passwordPolicyRel.getPasswordPolicyId());
}
}
return getDefaultPasswordPolicy(companyId);
}
@Override
public PasswordPolicy getPasswordPolicyByUser(User user)
throws PortalException {
if (LDAPSettingsUtil.isPasswordPolicyEnabled(user.getCompanyId())) {
return null;
}
long classNameId = classNameLocalService.getClassNameId(
User.class.getName());
PasswordPolicyRel passwordPolicyRel =
passwordPolicyRelPersistence.fetchByC_C(
classNameId, user.getUserId());
if (passwordPolicyRel != null) {
return getPasswordPolicy(passwordPolicyRel.getPasswordPolicyId());
}
long[] organizationIds = userPersistence.getOrganizationPrimaryKeys(
user.getUserId());
if (organizationIds.length == 0) {
return passwordPolicyPersistence.findByC_DP(
user.getCompanyId(), true);
}
return getPasswordPolicy(user.getCompanyId(), organizationIds);
}
@Override
@ThreadLocalCachable
public PasswordPolicy getPasswordPolicyByUserId(long userId)
throws PortalException {
return getPasswordPolicyByUser(
userPersistence.findByPrimaryKey(userId));
}
@Override
public List<PasswordPolicy> search(
long companyId, String name, int start, int end,
OrderByComparator<PasswordPolicy> obc) {
return passwordPolicyFinder.findByC_N(companyId, name, start, end, obc);
}
@Override
public int searchCount(long companyId, String name) {
return passwordPolicyFinder.countByC_N(companyId, name);
}
@Override
public PasswordPolicy updatePasswordPolicy(
long passwordPolicyId, String name, String description,
boolean changeable, boolean changeRequired, long minAge,
boolean checkSyntax, boolean allowDictionaryWords,
int minAlphanumeric, int minLength, int minLowerCase,
int minNumbers, int minSymbols, int minUpperCase, String regex,
boolean history, int historyCount, boolean expireable, long maxAge,
long warningTime, int graceLimit, boolean lockout, int maxFailure,
long lockoutDuration, long resetFailureCount,
long resetTicketMaxAge, ServiceContext serviceContext)
throws PortalException {
PasswordPolicy passwordPolicy =
passwordPolicyPersistence.findByPrimaryKey(passwordPolicyId);
if (!passwordPolicy.getDefaultPolicy()) {
validate(passwordPolicyId, passwordPolicy.getCompanyId(), name);
passwordPolicy.setName(name);
}
passwordPolicy.setDescription(description);
passwordPolicy.setChangeable(changeable);
passwordPolicy.setChangeRequired(changeRequired);
passwordPolicy.setMinAge(minAge);
passwordPolicy.setCheckSyntax(checkSyntax);
passwordPolicy.setAllowDictionaryWords(allowDictionaryWords);
passwordPolicy.setMinAlphanumeric(minAlphanumeric);
passwordPolicy.setMinLength(minLength);
passwordPolicy.setMinLowerCase(minLowerCase);
passwordPolicy.setMinNumbers(minNumbers);
passwordPolicy.setMinSymbols(minSymbols);
passwordPolicy.setMinUpperCase(minUpperCase);
passwordPolicy.setRegex(regex);
passwordPolicy.setHistory(history);
passwordPolicy.setHistoryCount(historyCount);
passwordPolicy.setExpireable(expireable);
passwordPolicy.setMaxAge(maxAge);
passwordPolicy.setWarningTime(warningTime);
passwordPolicy.setGraceLimit(graceLimit);
passwordPolicy.setLockout(lockout);
passwordPolicy.setMaxFailure(maxFailure);
passwordPolicy.setLockoutDuration(lockoutDuration);
passwordPolicy.setRequireUnlock(lockoutDuration == 0);
passwordPolicy.setResetFailureCount(resetFailureCount);
passwordPolicy.setResetTicketMaxAge(resetTicketMaxAge);
passwordPolicy.setExpandoBridgeAttributes(serviceContext);
passwordPolicyPersistence.update(passwordPolicy);
return passwordPolicy;
}
protected void validate(long passwordPolicyId, long companyId, String name)
throws PortalException {
if (Validator.isNull(name) || Validator.isNumber(name) ||
(name.indexOf(CharPool.COMMA) != -1) ||
(name.indexOf(CharPool.STAR) != -1)) {
throw new PasswordPolicyNameException();
}
PasswordPolicy passwordPolicy = passwordPolicyPersistence.fetchByC_N(
companyId, name);
if ((passwordPolicy != null) &&
(passwordPolicy.getPasswordPolicyId() != passwordPolicyId)) {
throw new DuplicatePasswordPolicyException(
"{passwordPolicyId=" + passwordPolicyId + "}");
}
}
}