|
|
@ -15,17 +15,13 @@ |
|
|
*/ |
|
|
*/ |
|
|
package org.thingsboard.server.dao.user; |
|
|
package org.thingsboard.server.dao.user; |
|
|
|
|
|
|
|
|
import static org.thingsboard.server.dao.DaoUtil.convertDataList; |
|
|
|
|
|
import static org.thingsboard.server.dao.DaoUtil.getData; |
|
|
|
|
|
import static org.thingsboard.server.dao.service.Validator.validateId; |
|
|
|
|
|
import static org.thingsboard.server.dao.service.Validator.validatePageLink; |
|
|
|
|
|
import static org.thingsboard.server.dao.service.Validator.validateString; |
|
|
|
|
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import org.apache.commons.lang3.RandomStringUtils; |
|
|
import org.apache.commons.lang3.RandomStringUtils; |
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
import org.thingsboard.server.common.data.Customer; |
|
|
|
|
|
import org.thingsboard.server.common.data.Tenant; |
|
|
import org.thingsboard.server.common.data.User; |
|
|
import org.thingsboard.server.common.data.User; |
|
|
import org.thingsboard.server.common.data.id.CustomerId; |
|
|
import org.thingsboard.server.common.data.id.CustomerId; |
|
|
import org.thingsboard.server.common.data.id.TenantId; |
|
|
import org.thingsboard.server.common.data.id.TenantId; |
|
|
@ -37,19 +33,21 @@ import org.thingsboard.server.common.data.security.UserCredentials; |
|
|
import org.thingsboard.server.dao.customer.CustomerDao; |
|
|
import org.thingsboard.server.dao.customer.CustomerDao; |
|
|
import org.thingsboard.server.dao.exception.DataValidationException; |
|
|
import org.thingsboard.server.dao.exception.DataValidationException; |
|
|
import org.thingsboard.server.dao.exception.IncorrectParameterException; |
|
|
import org.thingsboard.server.dao.exception.IncorrectParameterException; |
|
|
import org.thingsboard.server.dao.model.*; |
|
|
import org.thingsboard.server.dao.model.ModelConstants; |
|
|
import org.thingsboard.server.dao.service.DataValidator; |
|
|
import org.thingsboard.server.dao.service.DataValidator; |
|
|
import org.thingsboard.server.dao.service.PaginatedRemover; |
|
|
import org.thingsboard.server.dao.service.PaginatedRemover; |
|
|
import org.thingsboard.server.dao.tenant.TenantDao; |
|
|
import org.thingsboard.server.dao.tenant.TenantDao; |
|
|
import org.slf4j.Logger; |
|
|
|
|
|
import org.slf4j.LoggerFactory; |
|
|
import java.util.List; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
import static org.thingsboard.server.dao.service.Validator.*; |
|
|
|
|
|
|
|
|
@Service |
|
|
@Service |
|
|
@Slf4j |
|
|
@Slf4j |
|
|
public class UserServiceImpl implements UserService { |
|
|
public class UserServiceImpl implements UserService { |
|
|
|
|
|
|
|
|
|
|
|
private static final int DEFAULT_TOKEN_LENGTH = 30; |
|
|
|
|
|
|
|
|
@Autowired |
|
|
@Autowired |
|
|
private UserDao userDao; |
|
|
private UserDao userDao; |
|
|
|
|
|
|
|
|
@ -66,63 +64,57 @@ public class UserServiceImpl implements UserService { |
|
|
public User findUserByEmail(String email) { |
|
|
public User findUserByEmail(String email) { |
|
|
log.trace("Executing findUserByEmail [{}]", email); |
|
|
log.trace("Executing findUserByEmail [{}]", email); |
|
|
validateString(email, "Incorrect email " + email); |
|
|
validateString(email, "Incorrect email " + email); |
|
|
UserEntity userEntity = userDao.findByEmail(email); |
|
|
return userDao.findByEmail(email); |
|
|
return getData(userEntity); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public User findUserById(UserId userId) { |
|
|
public User findUserById(UserId userId) { |
|
|
log.trace("Executing findUserById [{}]", userId); |
|
|
log.trace("Executing findUserById [{}]", userId); |
|
|
validateId(userId, "Incorrect userId " + userId); |
|
|
validateId(userId, "Incorrect userId " + userId); |
|
|
UserEntity userEntity = userDao.findById(userId.getId()); |
|
|
return userDao.findById(userId.getId()); |
|
|
return getData(userEntity); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public User saveUser(User user) { |
|
|
public User saveUser(User user) { |
|
|
log.trace("Executing saveUser [{}]", user); |
|
|
log.trace("Executing saveUser [{}]", user); |
|
|
userValidator.validate(user); |
|
|
userValidator.validate(user); |
|
|
UserEntity userEntity = userDao.save(user); |
|
|
User savedUser = userDao.save(user); |
|
|
if (user.getId() == null) { |
|
|
if (user.getId() == null) { |
|
|
UserCredentials userCredentials = new UserCredentials(); |
|
|
UserCredentials userCredentials = new UserCredentials(); |
|
|
userCredentials.setEnabled(false); |
|
|
userCredentials.setEnabled(false); |
|
|
userCredentials.setActivateToken(RandomStringUtils.randomAlphanumeric(30)); |
|
|
userCredentials.setActivateToken(RandomStringUtils.randomAlphanumeric(DEFAULT_TOKEN_LENGTH)); |
|
|
userCredentials.setUserId(new UserId(userEntity.getId())); |
|
|
userCredentials.setUserId(new UserId(savedUser.getUuidId())); |
|
|
userCredentialsDao.save(userCredentials); |
|
|
userCredentialsDao.save(userCredentials); |
|
|
} |
|
|
} |
|
|
return getData(userEntity); |
|
|
return savedUser; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public UserCredentials findUserCredentialsByUserId(UserId userId) { |
|
|
public UserCredentials findUserCredentialsByUserId(UserId userId) { |
|
|
log.trace("Executing findUserCredentialsByUserId [{}]", userId); |
|
|
log.trace("Executing findUserCredentialsByUserId [{}]", userId); |
|
|
validateId(userId, "Incorrect userId " + userId); |
|
|
validateId(userId, "Incorrect userId " + userId); |
|
|
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByUserId(userId.getId()); |
|
|
return userCredentialsDao.findByUserId(userId.getId()); |
|
|
return getData(userCredentialsEntity); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public UserCredentials findUserCredentialsByActivateToken(String activateToken) { |
|
|
public UserCredentials findUserCredentialsByActivateToken(String activateToken) { |
|
|
log.trace("Executing findUserCredentialsByActivateToken [{}]", activateToken); |
|
|
log.trace("Executing findUserCredentialsByActivateToken [{}]", activateToken); |
|
|
validateString(activateToken, "Incorrect activateToken " + activateToken); |
|
|
validateString(activateToken, "Incorrect activateToken " + activateToken); |
|
|
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByActivateToken(activateToken); |
|
|
return userCredentialsDao.findByActivateToken(activateToken); |
|
|
return getData(userCredentialsEntity); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public UserCredentials findUserCredentialsByResetToken(String resetToken) { |
|
|
public UserCredentials findUserCredentialsByResetToken(String resetToken) { |
|
|
log.trace("Executing findUserCredentialsByResetToken [{}]", resetToken); |
|
|
log.trace("Executing findUserCredentialsByResetToken [{}]", resetToken); |
|
|
validateString(resetToken, "Incorrect resetToken " + resetToken); |
|
|
validateString(resetToken, "Incorrect resetToken " + resetToken); |
|
|
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByResetToken(resetToken); |
|
|
return userCredentialsDao.findByResetToken(resetToken); |
|
|
return getData(userCredentialsEntity); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public UserCredentials saveUserCredentials(UserCredentials userCredentials) { |
|
|
public UserCredentials saveUserCredentials(UserCredentials userCredentials) { |
|
|
log.trace("Executing saveUserCredentials [{}]", userCredentials); |
|
|
log.trace("Executing saveUserCredentials [{}]", userCredentials); |
|
|
userCredentialsValidator.validate(userCredentials); |
|
|
userCredentialsValidator.validate(userCredentials); |
|
|
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.save(userCredentials); |
|
|
return userCredentialsDao.save(userCredentials); |
|
|
return getData(userCredentialsEntity); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
@ -130,11 +122,10 @@ public class UserServiceImpl implements UserService { |
|
|
log.trace("Executing activateUserCredentials activateToken [{}], password [{}]", activateToken, password); |
|
|
log.trace("Executing activateUserCredentials activateToken [{}], password [{}]", activateToken, password); |
|
|
validateString(activateToken, "Incorrect activateToken " + activateToken); |
|
|
validateString(activateToken, "Incorrect activateToken " + activateToken); |
|
|
validateString(password, "Incorrect password " + password); |
|
|
validateString(password, "Incorrect password " + password); |
|
|
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByActivateToken(activateToken); |
|
|
UserCredentials userCredentials = userCredentialsDao.findByActivateToken(activateToken); |
|
|
if (userCredentialsEntity == null) { |
|
|
if (userCredentials == null) { |
|
|
throw new IncorrectParameterException(String.format("Unable to find user credentials by activateToken [%s]", activateToken)); |
|
|
throw new IncorrectParameterException(String.format("Unable to find user credentials by activateToken [%s]", activateToken)); |
|
|
} |
|
|
} |
|
|
UserCredentials userCredentials = getData(userCredentialsEntity); |
|
|
|
|
|
if (userCredentials.isEnabled()) { |
|
|
if (userCredentials.isEnabled()) { |
|
|
throw new IncorrectParameterException("User credentials already activated"); |
|
|
throw new IncorrectParameterException("User credentials already activated"); |
|
|
} |
|
|
} |
|
|
@ -149,16 +140,15 @@ public class UserServiceImpl implements UserService { |
|
|
public UserCredentials requestPasswordReset(String email) { |
|
|
public UserCredentials requestPasswordReset(String email) { |
|
|
log.trace("Executing requestPasswordReset email [{}]", email); |
|
|
log.trace("Executing requestPasswordReset email [{}]", email); |
|
|
validateString(email, "Incorrect email " + email); |
|
|
validateString(email, "Incorrect email " + email); |
|
|
UserEntity userEntity = userDao.findByEmail(email); |
|
|
User user = userDao.findByEmail(email); |
|
|
if (userEntity == null) { |
|
|
if (user == null) { |
|
|
throw new IncorrectParameterException(String.format("Unable to find user by email [%s]", email)); |
|
|
throw new IncorrectParameterException(String.format("Unable to find user by email [%s]", email)); |
|
|
} |
|
|
} |
|
|
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByUserId(userEntity.getId()); |
|
|
UserCredentials userCredentials = userCredentialsDao.findByUserId(user.getUuidId()); |
|
|
UserCredentials userCredentials = getData(userCredentialsEntity); |
|
|
|
|
|
if (!userCredentials.isEnabled()) { |
|
|
if (!userCredentials.isEnabled()) { |
|
|
throw new IncorrectParameterException("Unable to reset password for inactive user"); |
|
|
throw new IncorrectParameterException("Unable to reset password for inactive user"); |
|
|
} |
|
|
} |
|
|
userCredentials.setResetToken(RandomStringUtils.randomAlphanumeric(30)); |
|
|
userCredentials.setResetToken(RandomStringUtils.randomAlphanumeric(DEFAULT_TOKEN_LENGTH)); |
|
|
return saveUserCredentials(userCredentials); |
|
|
return saveUserCredentials(userCredentials); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -167,8 +157,8 @@ public class UserServiceImpl implements UserService { |
|
|
public void deleteUser(UserId userId) { |
|
|
public void deleteUser(UserId userId) { |
|
|
log.trace("Executing deleteUser [{}]", userId); |
|
|
log.trace("Executing deleteUser [{}]", userId); |
|
|
validateId(userId, "Incorrect userId " + userId); |
|
|
validateId(userId, "Incorrect userId " + userId); |
|
|
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByUserId(userId.getId()); |
|
|
UserCredentials userCredentials = userCredentialsDao.findByUserId(userId.getId()); |
|
|
userCredentialsDao.removeById(userCredentialsEntity.getId()); |
|
|
userCredentialsDao.removeById(userCredentials.getUuidId()); |
|
|
userDao.removeById(userId.getId()); |
|
|
userDao.removeById(userId.getId()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -177,9 +167,8 @@ public class UserServiceImpl implements UserService { |
|
|
log.trace("Executing findTenantAdmins, tenantId [{}], pageLink [{}]", tenantId, pageLink); |
|
|
log.trace("Executing findTenantAdmins, tenantId [{}], pageLink [{}]", tenantId, pageLink); |
|
|
validateId(tenantId, "Incorrect tenantId " + tenantId); |
|
|
validateId(tenantId, "Incorrect tenantId " + tenantId); |
|
|
validatePageLink(pageLink, "Incorrect page link " + pageLink); |
|
|
validatePageLink(pageLink, "Incorrect page link " + pageLink); |
|
|
List<UserEntity> userEntities = userDao.findTenantAdmins(tenantId.getId(), pageLink); |
|
|
List<User> users = userDao.findTenantAdmins(tenantId.getId(), pageLink); |
|
|
List<User> users = convertDataList(userEntities); |
|
|
return new TextPageData<>(users, pageLink); |
|
|
return new TextPageData<User>(users, pageLink); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
@ -195,9 +184,8 @@ public class UserServiceImpl implements UserService { |
|
|
validateId(tenantId, "Incorrect tenantId " + tenantId); |
|
|
validateId(tenantId, "Incorrect tenantId " + tenantId); |
|
|
validateId(customerId, "Incorrect customerId " + customerId); |
|
|
validateId(customerId, "Incorrect customerId " + customerId); |
|
|
validatePageLink(pageLink, "Incorrect page link " + pageLink); |
|
|
validatePageLink(pageLink, "Incorrect page link " + pageLink); |
|
|
List<UserEntity> userEntities = userDao.findCustomerUsers(tenantId.getId(), customerId.getId(), pageLink); |
|
|
List<User> users = userDao.findCustomerUsers(tenantId.getId(), customerId.getId(), pageLink); |
|
|
List<User> users = convertDataList(userEntities); |
|
|
return new TextPageData<>(users, pageLink); |
|
|
return new TextPageData<User>(users, pageLink); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
@ -266,16 +254,16 @@ public class UserServiceImpl implements UserService { |
|
|
+ " already present in database!"); |
|
|
+ " already present in database!"); |
|
|
} |
|
|
} |
|
|
if (!tenantId.getId().equals(ModelConstants.NULL_UUID)) { |
|
|
if (!tenantId.getId().equals(ModelConstants.NULL_UUID)) { |
|
|
TenantEntity tenant = tenantDao.findById(user.getTenantId().getId()); |
|
|
Tenant tenant = tenantDao.findById(user.getTenantId().getId()); |
|
|
if (tenant == null) { |
|
|
if (tenant == null) { |
|
|
throw new DataValidationException("User is referencing to non-existent tenant!"); |
|
|
throw new DataValidationException("User is referencing to non-existent tenant!"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if (!customerId.getId().equals(ModelConstants.NULL_UUID)) { |
|
|
if (!customerId.getId().equals(ModelConstants.NULL_UUID)) { |
|
|
CustomerEntity customer = customerDao.findById(user.getCustomerId().getId()); |
|
|
Customer customer = customerDao.findById(user.getCustomerId().getId()); |
|
|
if (customer == null) { |
|
|
if (customer == null) { |
|
|
throw new DataValidationException("User is referencing to non-existent customer!"); |
|
|
throw new DataValidationException("User is referencing to non-existent customer!"); |
|
|
} else if (!customer.getTenantId().equals(tenantId.getId())) { |
|
|
} else if (!customer.getTenantId().getId().equals(tenantId.getId())) { |
|
|
throw new DataValidationException("User can't be assigned to customer from different tenant!"); |
|
|
throw new DataValidationException("User can't be assigned to customer from different tenant!"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -303,7 +291,7 @@ public class UserServiceImpl implements UserService { |
|
|
throw new DataValidationException("Enabled user credentials can't have activate token!"); |
|
|
throw new DataValidationException("Enabled user credentials can't have activate token!"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
UserCredentialsEntity existingUserCredentialsEntity = userCredentialsDao.findById(userCredentials.getId().getId()); |
|
|
UserCredentials existingUserCredentialsEntity = userCredentialsDao.findById(userCredentials.getId().getId()); |
|
|
if (existingUserCredentialsEntity == null) { |
|
|
if (existingUserCredentialsEntity == null) { |
|
|
throw new DataValidationException("Unable to update non-existent user credentials!"); |
|
|
throw new DataValidationException("Unable to update non-existent user credentials!"); |
|
|
} |
|
|
} |
|
|
@ -314,21 +302,21 @@ public class UserServiceImpl implements UserService { |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
private PaginatedRemover<TenantId, UserEntity> tenantAdminsRemover = |
|
|
private PaginatedRemover<TenantId, User> tenantAdminsRemover = |
|
|
new PaginatedRemover<TenantId, UserEntity>() { |
|
|
new PaginatedRemover<TenantId, User>() { |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
protected List<UserEntity> findEntities(TenantId id, TextPageLink pageLink) { |
|
|
protected List<User> findEntities(TenantId id, TextPageLink pageLink) { |
|
|
return userDao.findTenantAdmins(id.getId(), pageLink); |
|
|
return userDao.findTenantAdmins(id.getId(), pageLink); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
protected void removeEntity(UserEntity entity) { |
|
|
protected void removeEntity(User entity) { |
|
|
deleteUser(new UserId(entity.getId())); |
|
|
deleteUser(new UserId(entity.getUuidId())); |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
class CustomerUsersRemover extends PaginatedRemover<CustomerId, UserEntity> { |
|
|
private class CustomerUsersRemover extends PaginatedRemover<CustomerId, User> { |
|
|
|
|
|
|
|
|
private TenantId tenantId; |
|
|
private TenantId tenantId; |
|
|
|
|
|
|
|
|
@ -337,14 +325,14 @@ public class UserServiceImpl implements UserService { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
protected List<UserEntity> findEntities(CustomerId id, TextPageLink pageLink) { |
|
|
protected List<User> findEntities(CustomerId id, TextPageLink pageLink) { |
|
|
return userDao.findCustomerUsers(tenantId.getId(), id.getId(), pageLink); |
|
|
return userDao.findCustomerUsers(tenantId.getId(), id.getId(), pageLink); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
protected void removeEntity(UserEntity entity) { |
|
|
protected void removeEntity(User entity) { |
|
|
deleteUser(new UserId(entity.getId())); |
|
|
deleteUser(new UserId(entity.getUuidId())); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|