Browse Source

Refactor

pull/14040/head
Yevhenii 1 year ago
parent
commit
c1b5febc75
  1. 13
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java
  2. 2
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java
  3. 311
      application/src/test/java/org/thingsboard/server/edge/UserEdgeTest.java
  4. 1
      dao/src/main/java/org/thingsboard/server/dao/service/validator/UserDataValidator.java
  5. 3
      dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java

13
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/BaseUserProcessor.java

@ -43,16 +43,12 @@ public abstract class BaseUserProcessor extends BaseEdgeProcessor {
try { try {
User user = JacksonUtil.fromString(userUpdateMsg.getEntity(), User.class, true); User user = JacksonUtil.fromString(userUpdateMsg.getEntity(), User.class, true);
if (user == null) { if (user == null) {
throw new RuntimeException("[{" + tenantId + "}] userUpdateMsg {" + userUpdateMsg + "} cannot be converted to user"); throw new IllegalArgumentException(String.format("[%s] Failed to parse User from UserUpdateMsg: %s", tenantId, userUpdateMsg));
} }
User userById = edgeCtx.getUserService().findUserById(tenantId, userId); User userById = edgeCtx.getUserService().findUserById(tenantId, userId);
if (userById == null) { isCreated = userById == null;
isCreated = true; user.setId(isCreated ? null : userId);
user.setId(null);
} else {
user.setId(userId);
}
String userEmail = user.getEmail(); String userEmail = user.getEmail();
User existing = edgeCtx.getUserService().findUserByTenantIdAndEmail(tenantId, user.getEmail()); User existing = edgeCtx.getUserService().findUserByTenantIdAndEmail(tenantId, user.getEmail());
@ -85,7 +81,7 @@ public abstract class BaseUserProcessor extends BaseEdgeProcessor {
protected void updateUserCredentials(TenantId tenantId, UserCredentialsUpdateMsg updateMsg) { protected void updateUserCredentials(TenantId tenantId, UserCredentialsUpdateMsg updateMsg) {
UserCredentials userCredentialsFromUpdateMsg = JacksonUtil.fromString(updateMsg.getEntity(), UserCredentials.class, true); UserCredentials userCredentialsFromUpdateMsg = JacksonUtil.fromString(updateMsg.getEntity(), UserCredentials.class, true);
if (userCredentialsFromUpdateMsg == null) { if (userCredentialsFromUpdateMsg == null) {
throw new RuntimeException(String.format("[%s] Failed to parse UserCredentials from updateMsg: %s", tenantId, updateMsg)); throw new IllegalArgumentException(String.format("[%s] Failed to parse UserCredentials from updateMsg: %s", tenantId, updateMsg));
} }
User user = edgeCtx.getUserService().findUserById(tenantId, userCredentialsFromUpdateMsg.getUserId()); User user = edgeCtx.getUserService().findUserById(tenantId, userCredentialsFromUpdateMsg.getUserId());
@ -111,7 +107,6 @@ public abstract class BaseUserProcessor extends BaseEdgeProcessor {
updated.setPassword(userCredentialsFromUpdateMsg.getPassword()); updated.setPassword(userCredentialsFromUpdateMsg.getPassword());
updated.setResetToken(userCredentialsFromUpdateMsg.getResetToken()); updated.setResetToken(userCredentialsFromUpdateMsg.getResetToken());
if (created) { if (created) {
edgeCtx.getUserService().saveUserCredentials(tenantId, updated, false); edgeCtx.getUserService().saveUserCredentials(tenantId, updated, false);
} else { } else {

2
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java

@ -96,7 +96,7 @@ public class UserEdgeProcessor extends BaseUserProcessor implements UserProcesso
pushUserCreatedEventToRuleEngine(tenantId, edge, userId); pushUserCreatedEventToRuleEngine(tenantId, edge, userId);
} }
Boolean userEmailUpdated = resultPair.getSecond(); boolean userEmailUpdated = resultPair.getSecond();
if (userEmailUpdated) { if (userEmailUpdated) {
saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.UPDATED, userId, null); saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.UPDATED, userId, null);

311
application/src/test/java/org/thingsboard/server/edge/UserEdgeTest.java

@ -53,188 +53,75 @@ public class UserEdgeTest extends AbstractEdgeTest {
private BCryptPasswordEncoder passwordEncoder; private BCryptPasswordEncoder passwordEncoder;
private static final String DEFAULT_FIRST_NAME = "Boris"; private static final String DEFAULT_FIRST_NAME = "Boris";
private static final String DEFAULT_LAST_NAME = "Johnson";
private static final String UPDATED_LAST_NAME = "Borisov"; private static final String UPDATED_LAST_NAME = "Borisov";
private static final String DEFAULT_TENANT_ADMIN_EMAIL = "tenantAdmin@thingsboard.org";
private static final String DEFAULT_CUSTOMER_USER_EMAIL = "customerUser@thingsboard.org";
@Test @Test
public void testCreateUpdateDeleteTenantUser() throws Exception { public void testCreateUpdateDeleteTenantUser() throws Exception {
// create user // create user
edgeImitator.expectMessageAmount(3); User newTenantAdmin = buildUser(Authority.TENANT_ADMIN, null);
User newTenantAdmin = buildUser(Authority.TENANT_ADMIN, null, "tenantAdmin@thingsboard.org", DEFAULT_FIRST_NAME, "Johnson"); User savedTenantAdmin = createAndVerifyUserOnEdge(newTenantAdmin);
User savedTenantAdmin = createUser(newTenantAdmin, "tenant");
Assert.assertTrue(edgeImitator.waitForMessages()); // wait 3 messages - x1 user update msg and x2 user credentials update msgs (create + authenticate user)
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(UserUpdateMsg.class).size());
Assert.assertEquals(2, edgeImitator.findAllMessagesByType(UserCredentialsUpdateMsg.class).size());
UserUpdateMsg userUpdateMsg = getLatestUserUpdateMsg();
User userMsg = JacksonUtil.fromString(userUpdateMsg.getEntity(), User.class, true);
Assert.assertNotNull(userMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
// update user // update user
edgeImitator.expectMessageAmount(2); updateAndVerifyUserLastName(savedTenantAdmin);
savedTenantAdmin.setLastName(UPDATED_LAST_NAME);
savedTenantAdmin = doPost("/api/user", savedTenantAdmin, User.class);
Assert.assertTrue(edgeImitator.waitForMessages());
userUpdateMsg = getLatestUserUpdateMsg();
User userFromMsg = JacksonUtil.fromString(userUpdateMsg.getEntity(), User.class, true);
Assert.assertNotNull(userFromMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
Assert.assertEquals(UPDATED_LAST_NAME, userFromMsg.getLastName());
// update user credentials // update user credentials
login(savedTenantAdmin.getEmail(), "tenant"); login(savedTenantAdmin.getEmail(), "tenant");
updateAndVerifyUserCredentials(savedTenantAdmin);
edgeImitator.expectMessageAmount(1);
ChangePasswordRequest changePasswordRequest = new ChangePasswordRequest();
changePasswordRequest.setCurrentPassword("tenant");
changePasswordRequest.setNewPassword("newTenant");
doPost("/api/auth/changePassword", changePasswordRequest);
Assert.assertTrue(edgeImitator.waitForMessages());
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
UserCredentialsUpdateMsg userCredentialsUpdateMsg = (UserCredentialsUpdateMsg) latestMessage;
UserCredentials userCredentialsMsg = JacksonUtil.fromString(userCredentialsUpdateMsg.getEntity(), UserCredentials.class, true);
Assert.assertNotNull(userCredentialsMsg);
Assert.assertEquals(savedTenantAdmin.getId(), userCredentialsMsg.getUserId());
Assert.assertTrue(passwordEncoder.matches(changePasswordRequest.getNewPassword(), userCredentialsMsg.getPassword()));
loginTenantAdmin(); loginTenantAdmin();
// delete user // delete user
edgeImitator.expectMessageAmount(1); deleteAndVerifyUser(savedTenantAdmin);
doDelete("/api/user/" + savedTenantAdmin.getUuidId())
.andExpect(status().isOk());
Assert.assertTrue(edgeImitator.waitForMessages());
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserUpdateMsg);
userUpdateMsg = (UserUpdateMsg) latestMessage;
Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, userUpdateMsg.getMsgType());
Assert.assertEquals(savedTenantAdmin.getUuidId().getMostSignificantBits(), userUpdateMsg.getIdMSB());
Assert.assertEquals(savedTenantAdmin.getUuidId().getLeastSignificantBits(), userUpdateMsg.getIdLSB());
} }
@Test @Test
public void testCreateUpdateDeleteCustomerUser() throws Exception { public void testCreateUpdateDeleteCustomerUser() throws Exception {
// create customer // create customer
Customer savedCustomer = createAndAssignCustomerToEdge("Edge Customer"); Customer savedCustomer = createAndAssignCustomerToEdge();
// create user // create user
edgeImitator.expectMessageAmount(3); User customerUser = buildUser(Authority.CUSTOMER_USER, savedCustomer.getId());
User customerUser = buildUser(Authority.CUSTOMER_USER, savedCustomer.getId(), "customerUser@thingsboard.org", "John", "Edwards"); User savedCustomerUser = createAndVerifyUserOnEdge(customerUser);
User savedCustomerUser = createUser(customerUser, "customer");
Assert.assertTrue(edgeImitator.waitForMessages()); // wait 3 messages - x1 user update msg and x2 user credentials update msgs (create + authenticate user)
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(UserUpdateMsg.class).size());
Assert.assertEquals(2, edgeImitator.findAllMessagesByType(UserCredentialsUpdateMsg.class).size());
Optional<UserUpdateMsg> userUpdateMsgOpt = edgeImitator.findMessageByType(UserUpdateMsg.class);
Assert.assertTrue(userUpdateMsgOpt.isPresent());
UserUpdateMsg userUpdateMsg = userUpdateMsgOpt.get();
User userMsg = JacksonUtil.fromString(userUpdateMsg.getEntity(), User.class, true);
Assert.assertNotNull(userMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
Assert.assertEquals(savedCustomerUser.getId(), userMsg.getId());
Assert.assertEquals(savedCustomerUser.getCustomerId(), userMsg.getCustomerId());
Assert.assertEquals(savedCustomerUser.getAuthority(), userMsg.getAuthority());
Assert.assertEquals(savedCustomerUser.getEmail(), userMsg.getEmail());
Assert.assertEquals(savedCustomerUser.getFirstName(), userMsg.getFirstName());
Assert.assertEquals(savedCustomerUser.getLastName(), userMsg.getLastName());
// update user // update user
edgeImitator.expectMessageAmount(2); updateAndVerifyUserLastName(savedCustomerUser);
savedCustomerUser.setLastName("Addams");
savedCustomerUser = doPost("/api/user", savedCustomerUser, User.class);
Assert.assertTrue(edgeImitator.waitForMessages());
userUpdateMsgOpt = edgeImitator.findMessageByType(UserUpdateMsg.class);
Assert.assertTrue(userUpdateMsgOpt.isPresent());
userUpdateMsg = userUpdateMsgOpt.get();
userMsg = JacksonUtil.fromString(userUpdateMsg.getEntity(), User.class, true);
Assert.assertNotNull(userMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
Assert.assertEquals(savedCustomerUser.getLastName(), userMsg.getLastName());
// update user credentials // update user credentials
login(savedCustomerUser.getEmail(), "customer"); login(savedCustomerUser.getEmail(), "customer");
updateAndVerifyUserCredentials(savedCustomerUser);
edgeImitator.expectMessageAmount(1);
ChangePasswordRequest changePasswordRequest = new ChangePasswordRequest();
changePasswordRequest.setCurrentPassword("customer");
changePasswordRequest.setNewPassword("newCustomer");
doPost("/api/auth/changePassword", changePasswordRequest);
Assert.assertTrue(edgeImitator.waitForMessages());
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
UserCredentialsUpdateMsg userCredentialsUpdateMsg = (UserCredentialsUpdateMsg) latestMessage;
UserCredentials userCredentialsMsg = JacksonUtil.fromString(userCredentialsUpdateMsg.getEntity(), UserCredentials.class, true);
Assert.assertNotNull(userCredentialsMsg);
Assert.assertEquals(savedCustomerUser.getId(), userCredentialsMsg.getUserId());
Assert.assertTrue(passwordEncoder.matches(changePasswordRequest.getNewPassword(), userCredentialsMsg.getPassword()));
loginTenantAdmin(); loginTenantAdmin();
// delete user // delete user
edgeImitator.expectMessageAmount(1); deleteAndVerifyUser(savedCustomerUser);
doDelete("/api/user/" + savedCustomerUser.getUuidId())
.andExpect(status().isOk());
Assert.assertTrue(edgeImitator.waitForMessages());
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserUpdateMsg);
userUpdateMsg = (UserUpdateMsg) latestMessage;
Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, userUpdateMsg.getMsgType());
Assert.assertEquals(savedCustomerUser.getUuidId().getMostSignificantBits(), userUpdateMsg.getIdMSB());
Assert.assertEquals(savedCustomerUser.getUuidId().getLeastSignificantBits(), userUpdateMsg.getIdLSB());
} }
@Test @Test
public void testSendUserToCloudFromEdge() throws Exception { public void testSendUserToCloudFromEdge() throws Exception {
// create customer // create customer
Customer savedCustomer = createAndAssignCustomerToEdge("Edge Customer"); Customer savedCustomer = createAndAssignCustomerToEdge();
// create user
User customerUser = buildUser(Authority.CUSTOMER_USER, savedCustomer.getId(), "customerUser@thingsboard.org", DEFAULT_FIRST_NAME, "Johnson");
UUID uuid = UUID.randomUUID();
customerUser.setId(new UserId(uuid));
UUID userCredentialsUuid = UUID.randomUUID();
UplinkMsg uplinkMsg = constructUserUplinkMsg(customerUser, UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, userCredentialsUuid);
edgeImitator.expectResponsesAmount(1); // create uplinkMsg with user and userCredentials
edgeImitator.sendUplinkMsg(uplinkMsg); UserId userId = new UserId(UUID.randomUUID());
Assert.assertTrue(edgeImitator.waitForResponses()); UserCredentialsId userCredentialsId = new UserCredentialsId(UUID.randomUUID());
UplinkMsg uplinkMsg = buildUserUplinkMsg(userId, savedCustomer.getId(), userCredentialsId);
User userFromCloud = doGet("/api/user/" + uuid, User.class);
Assert.assertNotNull(userFromCloud);
Assert.assertEquals(customerUser.getEmail(), userFromCloud.getEmail());
//check user with existing email
User userWithExistingEmail = buildUser(Authority.CUSTOMER_USER, savedCustomer.getId(), "customerUser@thingsboard.org", DEFAULT_FIRST_NAME, "Johnson");
UUID uuidForExistingEmail = UUID.randomUUID();
userWithExistingEmail.setId(new UserId(uuidForExistingEmail));
UUID userCredentialsUuidForExistingEmail = UUID.randomUUID();
UplinkMsg uplinkMsgForExistingEmail = constructUserUplinkMsg(userWithExistingEmail, UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, userCredentialsUuidForExistingEmail);
edgeImitator.expectResponsesAmount(1);
edgeImitator.sendUplinkMsg(uplinkMsgForExistingEmail);
Assert.assertTrue(edgeImitator.waitForResponses());
User userFromCloudWithExistingEmail = doGet("/api/user/" + uuidForExistingEmail, User.class);
Assert.assertNotNull(userFromCloudWithExistingEmail);
Assert.assertNotEquals(userWithExistingEmail.getEmail(), userFromCloudWithExistingEmail.getEmail());
User userFromCloud = verifyMsgOnCloud(uplinkMsg, userId, false);
assertUserCredentialsFlags(userFromCloud, false, false); assertUserCredentialsFlags(userFromCloud, false, false);
UplinkMsg enabledCredentialsUplinkMsg = constructUserCredentialsUplinkMsg(customerUser.getId(), "password", true, userCredentialsUuid); // create uplinkMsg with enabled userCredentials
UplinkMsg uplinkMsgWithEnabledCredentials = constructUserCredentialsUplinkMsg(userCredentialsId, userId);
edgeImitator.expectResponsesAmount(1); User cloudUserWithCredentials = verifyMsgOnCloud(uplinkMsgWithEnabledCredentials, userId, false);
edgeImitator.sendUplinkMsg(enabledCredentialsUplinkMsg); assertUserCredentialsFlags(cloudUserWithCredentials, true, true);
Assert.assertTrue(edgeImitator.waitForResponses());
User cloudUserWithCredentials = doGet("/api/user/" + uuid, User.class); // create uplinkMsg with user the same email
Assert.assertNotNull(cloudUserWithCredentials); UserId secondUserId = new UserId(UUID.randomUUID());
UserCredentialsId secondCredentialsId = new UserCredentialsId(UUID.randomUUID());
UplinkMsg uplinkMsgForUserExistingEmail = buildUserUplinkMsg(secondUserId, savedCustomer.getId(), secondCredentialsId);
assertUserCredentialsFlags(cloudUserWithCredentials, true, true); verifyMsgOnCloud(uplinkMsgForUserExistingEmail, secondUserId, true);
} }
@Test @Test
@ -264,40 +151,111 @@ public class UserEdgeTest extends AbstractEdgeTest {
testAutoGeneratedCodeByProtobuf(userCredentialsUpdateMsg); testAutoGeneratedCodeByProtobuf(userCredentialsUpdateMsg);
} }
private User buildUser(Authority authority, CustomerId customerId, String email, String firstName, String lastName) { private Customer createAndAssignCustomerToEdge() throws Exception {
edgeImitator.expectMessageAmount(1);
Customer customer = new Customer();
customer.setTitle("Edge Customer");
Customer savedCustomer = doPost("/api/customer", customer, Customer.class);
Assert.assertFalse(edgeImitator.waitForMessages(5));
edgeImitator.expectMessageAmount(2);
doPost("/api/customer/" + savedCustomer.getUuidId() + "/edge/" + edge.getUuidId(), Edge.class);
Assert.assertTrue(edgeImitator.waitForMessages());
return savedCustomer;
}
private User buildUser(Authority authority, CustomerId customerId) {
User customerUser = new User(); User customerUser = new User();
customerUser.setAuthority(authority); customerUser.setAuthority(authority);
customerUser.setTenantId(tenantId); customerUser.setTenantId(tenantId);
customerUser.setCustomerId(customerId); customerUser.setCustomerId(customerId);
customerUser.setEmail(email); customerUser.setEmail(authority == Authority.TENANT_ADMIN ? DEFAULT_TENANT_ADMIN_EMAIL : DEFAULT_CUSTOMER_USER_EMAIL);
customerUser.setFirstName(firstName); customerUser.setFirstName(DEFAULT_FIRST_NAME);
customerUser.setLastName(lastName); customerUser.setLastName(DEFAULT_LAST_NAME);
return customerUser; return customerUser;
} }
private Customer createAndAssignCustomerToEdge(String title) throws Exception { private User createAndVerifyUserOnEdge(User user) throws Exception {
edgeImitator.expectMessageAmount(1); // wait 3 messages - x1 user update msg and x2 user credentials update msgs (create + authenticate user)
Customer customer = new Customer(); edgeImitator.expectMessageAmount(3);
customer.setTitle(title); User savedUser = createUser(user, user.getAuthority() == Authority.TENANT_ADMIN ? "tenant" : "customer");
Customer savedCustomer = doPost("/api/customer", customer, Customer.class); Assert.assertTrue(edgeImitator.waitForMessages());
Assert.assertFalse(edgeImitator.waitForMessages(5));
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(UserUpdateMsg.class).size());
Assert.assertEquals(2, edgeImitator.findAllMessagesByType(UserCredentialsUpdateMsg.class).size());
UserUpdateMsg userUpdateMsg = getLatestUserUpdateMsg();
User userMsg = JacksonUtil.fromString(userUpdateMsg.getEntity(), User.class, true);
Assert.assertNotNull(userMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
Assert.assertEquals(savedUser.getId(), userMsg.getId());
Assert.assertEquals(savedUser.getCustomerId(), userMsg.getCustomerId());
Assert.assertEquals(savedUser.getAuthority(), userMsg.getAuthority());
Assert.assertEquals(savedUser.getEmail(), userMsg.getEmail());
Assert.assertEquals(savedUser.getFirstName(), userMsg.getFirstName());
Assert.assertEquals(savedUser.getLastName(), userMsg.getLastName());
return savedUser;
}
private void updateAndVerifyUserLastName(User user) throws Exception {
user.setLastName(UPDATED_LAST_NAME);
edgeImitator.expectMessageAmount(2); edgeImitator.expectMessageAmount(2);
doPost("/api/customer/" + savedCustomer.getUuidId() + "/edge/" + edge.getUuidId(), Edge.class); doPost("/api/user", user, User.class);
Assert.assertTrue(edgeImitator.waitForMessages()); Assert.assertTrue(edgeImitator.waitForMessages());
return savedCustomer; UserUpdateMsg userUpdateMsg = getLatestUserUpdateMsg();
User userFromMsg = JacksonUtil.fromString(userUpdateMsg.getEntity(), User.class, true);
Assert.assertNotNull(userFromMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
Assert.assertEquals(UPDATED_LAST_NAME, userFromMsg.getLastName());
} }
private UplinkMsg constructUserUplinkMsg(User user, UpdateMsgType msgType, UUID userCredentialsUuid) { private void updateAndVerifyUserCredentials(User user) throws Exception {
UserUpdateMsg userUpdateMsg = EdgeMsgConstructorUtils.constructUserUpdatedMsg(msgType, user); String password = user.getAuthority() == Authority.TENANT_ADMIN ? "tenant" : "customer";
String newPassword = "new" + password;
UserCredentials userCredentials = new UserCredentials(); edgeImitator.expectMessageAmount(1);
userCredentials.setId(new UserCredentialsId(userCredentialsUuid)); ChangePasswordRequest changePasswordRequest = new ChangePasswordRequest();
userCredentials.setUserId(user.getId()); changePasswordRequest.setCurrentPassword(password);
userCredentials.setEnabled(false); changePasswordRequest.setNewPassword(newPassword);
userCredentials.setAdditionalInfo(JacksonUtil.newObjectNode()); doPost("/api/auth/changePassword", changePasswordRequest);
Assert.assertTrue(edgeImitator.waitForMessages());
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
UserCredentialsUpdateMsg msg = (UserCredentialsUpdateMsg) latestMessage;
UserCredentials creds = JacksonUtil.fromString(msg.getEntity(), UserCredentials.class, true);
Assert.assertNotNull(creds);
Assert.assertEquals(user.getId(), creds.getUserId());
Assert.assertTrue(passwordEncoder.matches(newPassword, creds.getPassword()));
}
private void deleteAndVerifyUser(User savedTenantAdmin) throws Exception {
edgeImitator.expectMessageAmount(1);
doDelete("/api/user/" + savedTenantAdmin.getUuidId())
.andExpect(status().isOk());
Assert.assertTrue(edgeImitator.waitForMessages());
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserUpdateMsg);
UserUpdateMsg userUpdateMsg = (UserUpdateMsg) latestMessage;
Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, userUpdateMsg.getMsgType());
Assert.assertEquals(savedTenantAdmin.getUuidId().getMostSignificantBits(), userUpdateMsg.getIdMSB());
Assert.assertEquals(savedTenantAdmin.getUuidId().getLeastSignificantBits(), userUpdateMsg.getIdLSB());
}
private UplinkMsg buildUserUplinkMsg(UserId userId, CustomerId customerId, UserCredentialsId userCredentialsUuid) {
User customerUser = buildUser(Authority.CUSTOMER_USER, customerId);
customerUser.setId(userId);
UserCredentials userCredentials = buildCredentials(userCredentialsUuid, userId, false);
userCredentials.setActivateToken(StringUtils.randomAlphanumeric(DEFAULT_TOKEN_LENGTH)); userCredentials.setActivateToken(StringUtils.randomAlphanumeric(DEFAULT_TOKEN_LENGTH));
UserUpdateMsg userUpdateMsg = EdgeMsgConstructorUtils.constructUserUpdatedMsg(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, customerUser);
UserCredentialsUpdateMsg userCredentialsMsg = EdgeMsgConstructorUtils.constructUserCredentialsUpdatedMsg(userCredentials); UserCredentialsUpdateMsg userCredentialsMsg = EdgeMsgConstructorUtils.constructUserCredentialsUpdatedMsg(userCredentials);
return UplinkMsg.newBuilder() return UplinkMsg.newBuilder()
@ -306,13 +264,38 @@ public class UserEdgeTest extends AbstractEdgeTest {
.build(); .build();
} }
private UplinkMsg constructUserCredentialsUplinkMsg(UserId userId, String password, boolean enabled, UUID userCredentialsUuid) { private UserCredentials buildCredentials(UserCredentialsId userCredentialsUuid, UserId userId, boolean enabled) {
UserCredentials userCredentials = new UserCredentials(); UserCredentials userCredentials = new UserCredentials();
userCredentials.setId(new UserCredentialsId(userCredentialsUuid));
userCredentials.setId(userCredentialsUuid);
userCredentials.setUserId(userId); userCredentials.setUserId(userId);
userCredentials.setEnabled(enabled); userCredentials.setEnabled(enabled);
userCredentials.setPassword(password); userCredentials.setAdditionalInfo(JacksonUtil.newObjectNode());
return userCredentials;
}
private User verifyMsgOnCloud(UplinkMsg uplinkMsg, UserId userId, boolean emailExist) throws Exception {
edgeImitator.expectResponsesAmount(1);
edgeImitator.sendUplinkMsg(uplinkMsg);
Assert.assertTrue(edgeImitator.waitForResponses());
User userFromCloud = doGet("/api/user/" + userId, User.class);
Assert.assertNotNull(userFromCloud);
if (emailExist) {
Assert.assertNotEquals(DEFAULT_CUSTOMER_USER_EMAIL, userFromCloud.getEmail());
} else {
Assert.assertEquals(DEFAULT_CUSTOMER_USER_EMAIL, userFromCloud.getEmail());
}
return userFromCloud;
}
private UplinkMsg constructUserCredentialsUplinkMsg(UserCredentialsId userCredentialsUuid, UserId userId) {
UserCredentials userCredentials = buildCredentials(userCredentialsUuid, userId, true);
userCredentials.setPassword("password");
UserCredentialsUpdateMsg credsMsg = EdgeMsgConstructorUtils.constructUserCredentialsUpdatedMsg(userCredentials); UserCredentialsUpdateMsg credsMsg = EdgeMsgConstructorUtils.constructUserCredentialsUpdatedMsg(userCredentials);
return UplinkMsg.newBuilder() return UplinkMsg.newBuilder()
.addUserCredentialsUpdateMsg(credsMsg) .addUserCredentialsUpdateMsg(credsMsg)
.build(); .build();

1
dao/src/main/java/org/thingsboard/server/dao/service/validator/UserDataValidator.java

@ -136,5 +136,4 @@ public class UserDataValidator extends DataValidator<User> {
} }
} }
} }
} }

3
dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java

@ -166,7 +166,6 @@ public class UserServiceImpl extends AbstractCachedEntityService<UserCacheKey, U
@Override @Override
@Transactional @Transactional
public User saveUser(TenantId tenantId, User user, boolean doValidate) { public User saveUser(TenantId tenantId, User user, boolean doValidate) {
boolean isCreatedOnCloud = doValidate;
log.trace("Executing saveUser [{}]", user); log.trace("Executing saveUser [{}]", user);
User oldUser = null; User oldUser = null;
if (doValidate) { if (doValidate) {
@ -182,7 +181,7 @@ public class UserServiceImpl extends AbstractCachedEntityService<UserCacheKey, U
try { try {
savedUser = userDao.saveAndFlush(user.getTenantId(), user); savedUser = userDao.saveAndFlush(user.getTenantId(), user);
publishEvictEvent(evictEvent); publishEvictEvent(evictEvent);
if (user.getId() == null && isCreatedOnCloud) { if (user.getId() == null) {
countService.publishCountEntityEvictEvent(savedUser.getTenantId(), EntityType.USER); countService.publishCountEntityEvictEvent(savedUser.getTenantId(), EntityType.USER);
UserCredentials userCredentials = new UserCredentials(); UserCredentials userCredentials = new UserCredentials();
userCredentials.setEnabled(false); userCredentials.setEnabled(false);

Loading…
Cancel
Save