diff --git a/bootstrap/sql/migrations/native/1.5.0/mysql/postDataMigrationSQLScript.sql b/bootstrap/sql/migrations/native/1.5.0/mysql/postDataMigrationSQLScript.sql index 306fdd27d6d..740cbab52e0 100644 --- a/bootstrap/sql/migrations/native/1.5.0/mysql/postDataMigrationSQLScript.sql +++ b/bootstrap/sql/migrations/native/1.5.0/mysql/postDataMigrationSQLScript.sql @@ -23,3 +23,47 @@ WHERE name IN ( 'columnValuesToBeBetween', 'tableRowCountToBeBetween' ); + +-- Remove Duplicate Usernames and Lowercase Them +WITH cte AS ( + SELECT + id, + ROW_NUMBER() OVER (PARTITION BY LOWER(JSON_UNQUOTE(JSON_EXTRACT(json, '$.name'))) ORDER BY id) as rn + FROM + user_entity +) +DELETE FROM user_entity +WHERE id IN ( + SELECT id + FROM cte + WHERE rn > 1 +); + +UPDATE user_entity +SET json = JSON_SET( + json, + '$.name', + LOWER(JSON_UNQUOTE(JSON_EXTRACT(json, '$.name'))) +); + +-- Remove Duplicate Emails and Lowercase Them +WITH cte AS ( + SELECT + id, + ROW_NUMBER() OVER (PARTITION BY LOWER(JSON_UNQUOTE(JSON_EXTRACT(json, '$.email'))) ORDER BY id) as rn + FROM + user_entity +) +DELETE FROM user_entity +WHERE id IN ( + SELECT id + FROM cte + WHERE rn > 1 +); + +UPDATE user_entity +SET json = JSON_SET( + json, + '$.email', + LOWER(JSON_UNQUOTE(JSON_EXTRACT(json, '$.email'))) +); diff --git a/bootstrap/sql/migrations/native/1.5.0/postgres/postDataMigrationSQLScript.sql b/bootstrap/sql/migrations/native/1.5.0/postgres/postDataMigrationSQLScript.sql index 2c578286e40..3ac2106b72a 100644 --- a/bootstrap/sql/migrations/native/1.5.0/postgres/postDataMigrationSQLScript.sql +++ b/bootstrap/sql/migrations/native/1.5.0/postgres/postDataMigrationSQLScript.sql @@ -22,3 +22,47 @@ WHERE name IN ( 'columnValuesToBeBetween', 'tableRowCountToBeBetween' ); + +-- Remove Duplicate UserNames and lowercase them +WITH cte AS ( + SELECT + id, + ROW_NUMBER() OVER (PARTITION BY to_jsonb(LOWER(json->>'name')) ORDER BY id) as rn + FROM + user_entity +) +DELETE from user_entity +WHERE id IN ( + SELECT id + FROM cte + WHERE rn > 1 +); + +UPDATE user_entity +SET json = jsonb_set( + json, + '{name}', + to_jsonb(LOWER(json->>'name')) +); + +-- Remove Duplicate Emails and lowercase them +WITH cte AS ( + SELECT + id, + ROW_NUMBER() OVER (PARTITION BY to_jsonb(LOWER(json->>'email')) ORDER BY id) as rn + FROM + user_entity +) +DELETE from user_entity +WHERE id IN ( + SELECT id + FROM cte + WHERE rn > 1 +); + +UPDATE user_entity +SET json = jsonb_set( + json, + '{email}', + to_jsonb(LOWER(json->>'email')) +); diff --git a/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java b/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java index d954688c7c2..26a9d1be056 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java +++ b/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java @@ -77,7 +77,7 @@ public abstract class EntityCsv { protected final CsvImportResult importResult = new CsvImportResult(); protected boolean processRecord; // When set to false record processing is discontinued protected final Map dryRunCreatedEntities = new HashMap<>(); - private final String importedBy; + protected final String importedBy; protected int recordIndex = 0; protected EntityCsv(String entityType, List csvHeaders, String importedBy) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java index a80fd38680c..90869fa5c55 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java @@ -1,7 +1,7 @@ package org.openmetadata.service.jdbi3; import static org.openmetadata.service.exception.AppException.APP_RUN_RECORD_NOT_FOUND; -import static org.openmetadata.service.resources.teams.UserResource.getUser; +import static org.openmetadata.service.util.UserUtil.getUser; import java.util.ArrayList; import java.util.List; @@ -118,12 +118,12 @@ public class AppRepository extends EntityRepository { Bot appBot = new Bot() .withId(UUID.randomUUID()) - .withName(botUser.getName()) + .withName(botName) .withUpdatedBy("admin") .withUpdatedAt(System.currentTimeMillis()) .withBotUser(botUser.getEntityReference()) .withProvider(ProviderType.USER) - .withFullyQualifiedName(botUser.getName()); + .withFullyQualifiedName(botName); // Create Bot with above user bot = botRepository.createInternal(appBot); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java index efcbf82b20a..0288722922b 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java @@ -42,6 +42,7 @@ import org.apache.commons.csv.CSVRecord; import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.csv.EntityCsv; import org.openmetadata.schema.api.teams.CreateTeam.TeamType; +import org.openmetadata.schema.api.teams.CreateUser; import org.openmetadata.schema.entity.teams.AuthenticationMechanism; import org.openmetadata.schema.entity.teams.Team; import org.openmetadata.schema.entity.teams.User; @@ -338,7 +339,10 @@ public class UserRepository extends EntityRepository { public void validateLoggedInUserNameAndEmailMatches( String username, String email, User storedUser) { - if (!(username.equals(storedUser.getName()) && email.equals(storedUser.getEmail()))) { + String lowerCasedName = username.toLowerCase(); + String lowerCasedEmail = email.toLowerCase(); + if (!(lowerCasedName.equals(storedUser.getName().toLowerCase()) + && lowerCasedEmail.equals(storedUser.getEmail().toLowerCase()))) { throw EntityNotFoundException.byMessage(CatalogExceptionMessage.entityNotFound(USER, email)); } } @@ -436,13 +440,15 @@ public class UserRepository extends EntityRepository { CSVRecord csvRecord = getNextRecord(printer, csvRecords); // Field 1, 2, 3, 4, 5, 6 - name, displayName, description, email, timezone, isAdmin User user = - new User() - .withName(csvRecord.get(0)) - .withDisplayName(csvRecord.get(1)) - .withDescription(csvRecord.get(2)) - .withEmail(csvRecord.get(3)) - .withTimezone(csvRecord.get(4)) - .withIsAdmin(getBoolean(printer, csvRecord, 5)) + UserUtil.getUser( + importedBy, + new CreateUser() + .withName(csvRecord.get(0)) + .withDisplayName(csvRecord.get(1)) + .withDescription(csvRecord.get(2)) + .withEmail(csvRecord.get(3)) + .withTimezone(csvRecord.get(4)) + .withIsAdmin(getBoolean(printer, csvRecord, 5))) .withTeams(getTeams(printer, csvRecord, csvRecord.get(0))) .withRoles(getEntityReferences(printer, csvRecord, 7, ROLE)); if (processRecord) { @@ -542,6 +548,10 @@ public class UserRepository extends EntityRepository { @Transaction @Override public void entitySpecificUpdate() { + // LowerCase Email + updated.setEmail(updated.getEmail().toLowerCase()); + + // Updates updateRoles(original, updated); updateTeams(original, updated); updatePersonas(original, updated); @@ -551,7 +561,7 @@ public class UserRepository extends EntityRepository { recordChange("timezone", original.getTimezone(), updated.getTimezone()); recordChange("isBot", original.getIsBot(), updated.getIsBot()); recordChange("isAdmin", original.getIsAdmin(), updated.getIsAdmin()); - recordChange("email", original.getEmail(), updated.getEmail()); + recordChange("email", original.getEmail(), updated.getEmail().toLowerCase()); recordChange("isEmailVerified", original.getIsEmailVerified(), updated.getIsEmailVerified()); updateAuthenticationMechanism(original, updated); } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/teams/UserResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/teams/UserResource.java index dbfd14bd6ac..f7e5a042503 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/teams/UserResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/teams/UserResource.java @@ -29,6 +29,7 @@ import static org.openmetadata.service.secrets.ExternalSecretsManager.NULL_SECRE import static org.openmetadata.service.security.jwt.JWTTokenGenerator.getExpiryDate; import static org.openmetadata.service.util.UserUtil.getRoleListFromUser; import static org.openmetadata.service.util.UserUtil.getRolesFromAuthorizationToken; +import static org.openmetadata.service.util.UserUtil.getUser; import static org.openmetadata.service.util.UserUtil.reSyncUserRolesFromToken; import static org.openmetadata.service.util.UserUtil.validateAndGetRolesRef; @@ -1450,26 +1451,6 @@ public class UserResource extends EntityResource { return importCsvInternal(securityContext, team, csv, dryRun); } - public static User getUser(String updatedBy, CreateUser create) { - return new User() - .withId(UUID.randomUUID()) - .withName(create.getName()) - .withFullyQualifiedName(create.getName()) - .withEmail(create.getEmail()) - .withDescription(create.getDescription()) - .withDisplayName(create.getDisplayName()) - .withIsBot(create.getIsBot()) - .withIsAdmin(create.getIsAdmin()) - .withProfile(create.getProfile()) - .withPersonas(create.getPersonas()) - .withDefaultPersona(create.getDefaultPersona()) - .withTimezone(create.getTimezone()) - .withUpdatedBy(updatedBy) - .withUpdatedAt(System.currentTimeMillis()) - .withTeams(EntityUtil.toEntityReferences(create.getTeams(), Entity.TEAM)) - .withRoles(EntityUtil.toEntityReferences(create.getRoles(), Entity.ROLE)); - } - public void validateEmailAlreadyExists(String email) { if (repository.checkEmailAlreadyExists(email)) { throw new CustomExceptionMessage( diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/security/CatalogPrincipal.java b/openmetadata-service/src/main/java/org/openmetadata/service/security/CatalogPrincipal.java index 416df9e2cc8..39c72f15664 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/security/CatalogPrincipal.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/security/CatalogPrincipal.java @@ -16,14 +16,14 @@ package org.openmetadata.service.security; import java.security.Principal; import lombok.Getter; -public record CatalogPrincipal(@Getter String name, @Getter String email) implements Principal { - @Override - public String getName() { - return name; - } +@Getter +public class CatalogPrincipal implements Principal { + private final String name; + private final String email; - public String getEmail() { - return email; + public CatalogPrincipal(String name, String email) { + this.name = name.toLowerCase(); + this.email = email.toLowerCase(); } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/security/NoopAuthorizer.java b/openmetadata-service/src/main/java/org/openmetadata/service/security/NoopAuthorizer.java index 5942557bf8a..22a8bcf3ccd 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/security/NoopAuthorizer.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/security/NoopAuthorizer.java @@ -14,9 +14,9 @@ package org.openmetadata.service.security; import java.util.List; -import java.util.UUID; import javax.ws.rs.core.SecurityContext; import lombok.extern.slf4j.Slf4j; +import org.openmetadata.schema.api.teams.CreateUser; import org.openmetadata.schema.entity.teams.User; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.Include; @@ -30,6 +30,7 @@ import org.openmetadata.service.security.policyevaluator.OperationContext; import org.openmetadata.service.security.policyevaluator.PolicyEvaluator; import org.openmetadata.service.security.policyevaluator.ResourceContextInterface; import org.openmetadata.service.util.RestUtil.PutResponse; +import org.openmetadata.service.util.UserUtil; @Slf4j public class NoopAuthorizer implements Authorizer { @@ -70,12 +71,8 @@ public class NoopAuthorizer implements Authorizer { Entity.getEntityByName(Entity.USER, username, "", Include.NON_DELETED); } catch (EntityNotFoundException ex) { User user = - new User() - .withId(UUID.randomUUID()) - .withName(username) - .withEmail(username + "@domain.com") - .withUpdatedBy(username) - .withUpdatedAt(System.currentTimeMillis()); + UserUtil.getUser( + username, new CreateUser().withName(username).withEmail(username + "@domain.com")); addOrUpdateUser(user); } catch (Exception e) { LOG.error("Failed to create anonymous user {}", username, e); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/security/SecurityUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/security/SecurityUtil.java index c5ad60f725c..cef0c608dee 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/security/SecurityUtil.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/security/SecurityUtil.java @@ -81,25 +81,21 @@ public final class SecurityUtil { Map jwtPrincipalClaimsMapping, List jwtPrincipalClaimsOrder, Map claims) { + String userName; if (!nullOrEmpty(jwtPrincipalClaimsMapping)) { // We have a mapping available so we will use that String usernameClaim = jwtPrincipalClaimsMapping.get(USERNAME_CLAIM_KEY); String userNameClaimValue = getClaimOrObject(claims.get(usernameClaim)); if (!nullOrEmpty(userNameClaimValue)) { - return userNameClaimValue; + userName = userNameClaimValue; } else { throw new AuthenticationException("Invalid JWT token, 'username' claim is not present"); } } else { String jwtClaim = getFirstMatchJwtClaim(jwtPrincipalClaimsOrder, claims); - String userName; - if (jwtClaim.contains("@")) { - userName = jwtClaim.split("@")[0]; - } else { - userName = jwtClaim; - } - return userName; + userName = jwtClaim.contains("@") ? jwtClaim.split("@")[0] : jwtClaim; } + return userName.toLowerCase(); } public static String findEmailFromClaims( @@ -107,12 +103,13 @@ public final class SecurityUtil { List jwtPrincipalClaimsOrder, Map claims, String defaulPrincipalClaim) { + String email; if (!nullOrEmpty(jwtPrincipalClaimsMapping)) { // We have a mapping available so we will use that String emailClaim = jwtPrincipalClaimsMapping.get(EMAIL_CLAIM_KEY); String emailClaimValue = getClaimOrObject(claims.get(emailClaim)); if (!nullOrEmpty(emailClaimValue) && emailClaimValue.contains("@")) { - return emailClaimValue; + email = emailClaimValue; } else { throw new AuthenticationException( String.format( @@ -121,12 +118,12 @@ public final class SecurityUtil { } } else { String jwtClaim = getFirstMatchJwtClaim(jwtPrincipalClaimsOrder, claims); - if (jwtClaim.contains("@")) { - return jwtClaim; - } else { - return String.format("%s@%s", jwtClaim, defaulPrincipalClaim); - } + email = + jwtClaim.contains("@") + ? jwtClaim + : String.format("%s@%s", jwtClaim, defaulPrincipalClaim); } + return email.toLowerCase(); } public static String getClaimOrObject(Object obj) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/security/auth/BasicAuthenticator.java b/openmetadata-service/src/main/java/org/openmetadata/service/security/auth/BasicAuthenticator.java index 441c88603e0..bc5e433aca7 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/security/auth/BasicAuthenticator.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/security/auth/BasicAuthenticator.java @@ -39,6 +39,7 @@ import static org.openmetadata.service.exception.CatalogExceptionMessage.TOKEN_E import static org.openmetadata.service.resources.teams.UserResource.USER_PROTECTED_FIELDS; import static org.openmetadata.service.util.EmailUtil.getSmtpSettings; import static org.openmetadata.service.util.UserUtil.getRoleListFromUser; +import static org.openmetadata.service.util.UserUtil.getUser; import at.favre.lib.crypto.bcrypt.BCrypt; import freemarker.template.TemplateException; @@ -449,17 +450,14 @@ public class BasicAuthenticator implements AuthenticatorHandler { BCrypt.withDefaults().hashToString(HASHING_COST, create.getPassword().toCharArray()); BasicAuthMechanism newAuthMechanism = new BasicAuthMechanism().withPassword(hashedPwd); - return new User() - .withId(UUID.randomUUID()) - .withName(username) - .withFullyQualifiedName(username) - .withEmail(create.getEmail()) - .withDisplayName(create.getFirstName() + create.getLastName()) - .withIsBot(false) - .withIsAdmin(false) - .withUpdatedBy(username) - .withUpdatedAt(System.currentTimeMillis()) - .withIsEmailVerified(false) + return getUser( + username, + new CreateUser() + .withName(username) + .withEmail(create.getEmail()) + .withDisplayName(String.format("%s%s", create.getFirstName(), create.getLastName())) + .withIsBot(false) + .withIsAdmin(false)) .withAuthenticationMechanism( new AuthenticationMechanism() .withAuthType(AuthenticationMechanism.AuthType.BASIC) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/security/auth/LdapAuthenticator.java b/openmetadata-service/src/main/java/org/openmetadata/service/security/auth/LdapAuthenticator.java index 4480b4f8692..81565d4db10 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/security/auth/LdapAuthenticator.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/security/auth/LdapAuthenticator.java @@ -34,6 +34,7 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.openmetadata.common.utils.CommonUtil; import org.openmetadata.schema.api.configuration.LoginConfiguration; +import org.openmetadata.schema.api.teams.CreateUser; import org.openmetadata.schema.auth.LdapConfiguration; import org.openmetadata.schema.auth.LoginRequest; import org.openmetadata.schema.auth.RefreshToken; @@ -254,31 +255,18 @@ public class LdapAuthenticator implements AuthenticatorHandler { private User getUserForLdap(String email) { String userName = email.split("@")[0]; - return new User() - .withId(UUID.randomUUID()) - .withName(userName) - .withFullyQualifiedName(userName) - .withEmail(email) - .withIsBot(false) - .withUpdatedBy(userName) - .withUpdatedAt(System.currentTimeMillis()) + return UserUtil.getUser( + userName, new CreateUser().withName(userName).withEmail(email).withIsBot(false)) .withIsEmailVerified(false) .withAuthenticationMechanism(null); } private User getUserForLdap(String email, String userName, String userDn) { User user = - new User() - .withId(UUID.randomUUID()) - .withName(userName) - .withFullyQualifiedName(userName) - .withEmail(email) - .withIsBot(false) - .withUpdatedBy(userName) - .withUpdatedAt(System.currentTimeMillis()) + UserUtil.getUser( + userName, new CreateUser().withName(userName).withEmail(email).withIsBot(false)) .withIsEmailVerified(false) .withAuthenticationMechanism(null); - try { getRoleForLdap(user, userDn, false); } catch (LDAPException | JsonProcessingException e) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/util/UserUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/util/UserUtil.java index 69f884a1d80..cdbe9a61287 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/util/UserUtil.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/util/UserUtil.java @@ -32,6 +32,7 @@ import java.util.stream.Collectors; import javax.json.JsonPatch; import javax.ws.rs.core.UriInfo; import lombok.extern.slf4j.Slf4j; +import org.openmetadata.schema.api.teams.CreateUser; import org.openmetadata.schema.auth.BasicAuthMechanism; import org.openmetadata.schema.auth.JWTAuthMechanism; import org.openmetadata.schema.auth.JWTTokenExpiry; @@ -161,14 +162,8 @@ public final class UserUtil { } public static User user(String name, String domain, String updatedBy) { - return new User() - .withId(UUID.randomUUID()) - .withName(name) - .withFullyQualifiedName(EntityInterfaceUtil.quoteName(name)) - .withEmail(name + "@" + domain) - .withUpdatedBy(updatedBy) - .withUpdatedAt(System.currentTimeMillis()) - .withIsBot(false); + return getUser( + updatedBy, new CreateUser().withName(name).withEmail(name + "@" + domain).withIsBot(false)); } /** @@ -330,4 +325,24 @@ public final class UserUtil { return syncUser; } + + public static User getUser(String updatedBy, CreateUser create) { + return new User() + .withId(UUID.randomUUID()) + .withName(create.getName().toLowerCase()) + .withFullyQualifiedName(EntityInterfaceUtil.quoteName(create.getName().toLowerCase())) + .withEmail(create.getEmail().toLowerCase()) + .withDescription(create.getDescription()) + .withDisplayName(create.getDisplayName()) + .withIsBot(create.getIsBot()) + .withIsAdmin(create.getIsAdmin()) + .withProfile(create.getProfile()) + .withPersonas(create.getPersonas()) + .withDefaultPersona(create.getDefaultPersona()) + .withTimezone(create.getTimezone()) + .withUpdatedBy(updatedBy.toLowerCase()) + .withUpdatedAt(System.currentTimeMillis()) + .withTeams(EntityUtil.toEntityReferences(create.getTeams(), Entity.TEAM)) + .withRoles(EntityUtil.toEntityReferences(create.getRoles(), Entity.ROLE)); + } } diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java index 043f705dcd6..623023fe9d5 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java @@ -2925,7 +2925,7 @@ public abstract class EntityResourceTest { entityNotFound("user", user.getId())); } + protected void validateCommonEntityFields(User entity, CreateEntity create, String updatedBy) { + assertListNotNull(entity.getId(), entity.getHref(), entity.getFullyQualifiedName()); + assertEquals(create.getName().toLowerCase(), entity.getName()); + assertEquals(create.getDisplayName(), entity.getDisplayName()); + assertEquals(create.getDescription(), entity.getDescription()); + assertEquals( + JsonUtils.valueToTree(create.getExtension()), JsonUtils.valueToTree(entity.getExtension())); + assertReference(create.getOwner(), entity.getOwner()); + assertEquals(updatedBy, entity.getUpdatedBy()); + } + @Test void put_generateToken_bot_user_200_ok() throws HttpResponseException { AuthenticationMechanism authMechanism = @@ -940,7 +952,7 @@ public class UserResourceTest extends EntityResourceTest { // jwtAuth Response should be null always user = getEntity(user.getId(), ADMIN_AUTH_HEADERS); assertNull(user.getAuthenticationMechanism()); - assertEquals(name, user.getName()); + assertEquals(name.toLowerCase(), user.getName()); assertEquals(name.toLowerCase(), user.getFullyQualifiedName()); // Login With Correct Password @@ -1006,9 +1018,9 @@ public class UserResourceTest extends EntityResourceTest { getResource("users/signup"), newRegistrationRequest, String.class, ADMIN_AUTH_HEADERS); // jwtAuth Response should be null always - User user = getEntityByName("testBasicAuth123", null, ADMIN_AUTH_HEADERS); + User user = getEntityByName(name, null, ADMIN_AUTH_HEADERS); assertNull(user.getAuthenticationMechanism()); - assertEquals(name, user.getName()); + assertEquals(name.toLowerCase(), user.getName()); assertEquals(name.toLowerCase(), user.getFullyQualifiedName()); // Login With Correct Password @@ -1024,7 +1036,7 @@ public class UserResourceTest extends EntityResourceTest { OK.getStatusCode(), ADMIN_AUTH_HEADERS); - validateJwtBasicAuth(jwtResponse, "testBasicAuth123"); + validateJwtBasicAuth(jwtResponse, name); // Login With Wrong email LoginRequest failedLoginWithWrongEmail = @@ -1157,36 +1169,36 @@ public class UserResourceTest extends EntityResourceTest { // Create users in the team hierarchy // Headers - name,displayName,description,email,timezone,isAdmin,teams,roles String user = - "userImportExport,d,s,userImportExport@domain.com,America/Los_Angeles,true,teamImportExport,"; + "userimportexport,d,s,userimportexport@domain.com,America/Los_Angeles,true,teamImportExport,"; String user1 = - "userImportExport1,,,userImportExport1@domain.com,,false,teamImportExport1,DataConsumer"; - String user11 = "userImportExport11,,,userImportExport11@domain.com,,false,teamImportExport11,"; + "userimportexport1,,,userimportexport1@domain.com,,false,teamImportExport1,DataConsumer"; + String user11 = "userimportexport11,,,userimportexport11@domain.com,,false,teamImportExport11,"; List createRecords = listOf(user, user1, user11); // Update user descriptions - user = "userImportExport,displayName,,userImportExport@domain.com,,false,teamImportExport,"; + user = "userimportexport,displayName,,userimportexport@domain.com,,false,teamImportExport,"; user1 = - "userImportExport1,displayName1,,userImportExport1@domain.com,,false,teamImportExport1,"; + "userimportexport1,displayName1,,userimportexport1@domain.com,,false,teamImportExport1,"; user11 = - "userImportExport11,displayName11,,userImportExport11@domain.com,,false,teamImportExport11,"; + "userimportexport11,displayName11,,userimportexport11@domain.com,,false,teamImportExport11,"; List updateRecords = listOf(user, user1, user11); // Add new users String user2 = - "userImportExport2,displayName2,,userImportExport2@domain.com,,false,teamImportExport1,"; + "userimportexport2,displayName2,,userimportexport2@domain.com,,false,teamImportExport1,"; String user21 = - "userImportExport21,displayName21,,userImportExport21@domain.com,,false,teamImportExport11,"; + "userimportexport21,displayName21,,userimportexport21@domain.com,,false,teamImportExport11,"; List newRecords = listOf(user2, user21); testImportExport("teamImportExport", UserCsv.HEADERS, createRecords, updateRecords, newRecords); // Import to team11 a user in team1 - since team1 is not under team11 hierarchy, import should // fail String user3 = - "userImportExport3,displayName3,,userImportExport3@domain.com,,false,teamImportExport1,"; + "userimportexport3,displayName3,,userimportexport3@domain.com,,false,teamImportExport1,"; csv = EntityCsvTest.createCsv(UserCsv.HEADERS, listOf(user3), null); result = importCsv("teamImportExport11", csv, false); String error = - UserCsv.invalidTeam(6, "teamImportExport11", "userImportExport3", "teamImportExport1"); + UserCsv.invalidTeam(6, "teamImportExport11", "userimportexport3", "teamImportExport1"); assertTrue(result.getImportResultsCsv().contains(error)); } @@ -1200,7 +1212,7 @@ public class UserResourceTest extends EntityResourceTest { Date date = jwt.getExpiresAt(); long hours = ((date.getTime() - jwt.getIssuedAt().getTime()) / (1000 * 60 * 60)); assertEquals(1, hours); - assertEquals(username, jwt.getClaims().get("sub").asString()); + assertEquals(username.toLowerCase(), jwt.getClaims().get("sub").asString().toLowerCase()); assertEquals(false, jwt.getClaims().get("isBot").asBoolean()); } @@ -1404,7 +1416,7 @@ public class UserResourceTest extends EntityResourceTest { @Override public void validateCreatedEntity( User user, CreateUser createRequest, Map authHeaders) { - assertEquals(createRequest.getName(), user.getName()); + assertEquals(createRequest.getName().toLowerCase(), user.getName()); assertEquals(createRequest.getDisplayName(), user.getDisplayName()); assertEquals(createRequest.getTimezone(), user.getTimezone()); assertEquals(createRequest.getIsBot(), user.getIsBot()); diff --git a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Bots.spec.ts b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Bots.spec.ts index e0ac49276a8..e456dce3b1f 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Bots.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Bots.spec.ts @@ -23,7 +23,7 @@ import { import { DELETE_TERM } from '../../constants/constants'; import { GlobalSettingOptions } from '../../constants/settings.constant'; -const botName = `Bot-ct-test-${uuid()}`; +const botName = `bot-ct-test-${uuid()}`; const botEmail = `${botName}@mail.com`; const description = 'This is bot description'; const updatedDescription = 'This is updated bot description'; diff --git a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Users.spec.ts b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Users.spec.ts index 80a4e391979..f798e8d1d52 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Users.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Users.spec.ts @@ -57,7 +57,7 @@ const expirationTime = { twomonths: '60', threemonths: '90', }; -const name = `Usercttest${uuid()}`; +const name = `usercttest${uuid()}`; const owner = generateRandomUser(); let userId = ''; const ownerName = `${owner.firstName}${owner.lastName}`; diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/ActivityFeed.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/ActivityFeed.spec.ts index 44f4805a3ce..4b1524de1fd 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/ActivityFeed.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/ActivityFeed.spec.ts @@ -57,7 +57,7 @@ test.describe('Activity feed', () => { test('Assigned task should appear to task tab', async ({ page }) => { const value: TaskDetails = { term: entity.entity.name, - assignee: `${user.data.firstName}.${user.data.lastName}`, + assignee: user.responseData.name, }; await entity.visitEntityPage(page); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx index 8a50e332213..64d7c43f2dd 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AppRouter/AppRouter.tsx @@ -29,9 +29,8 @@ const AppRouter = () => { // web analytics instance const analytics = useAnalytics(); - const { currentUser } = useApplicationStore(); - - const { isAuthenticated, isApplicationLoading } = useApplicationStore(); + const { currentUser, isAuthenticated, isApplicationLoading } = + useApplicationStore(); useEffect(() => { const { pathname } = location; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/BasicAuthProvider.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/BasicAuthProvider.tsx index fda2d9d9335..2f3dd982ad8 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/BasicAuthProvider.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/BasicAuthProvider.tsx @@ -115,7 +115,7 @@ const BasicAuthProvider = ({ onLoginSuccess({ id_token: response.accessToken, profile: { - email, + email: response.email, name: '', picture: '', sub: '', diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/SignUp/BasicSignup.component.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/SignUp/BasicSignup.component.tsx index 84bbef7f479..78b45249740 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/SignUp/BasicSignup.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/SignUp/BasicSignup.component.tsx @@ -17,7 +17,6 @@ import React, { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useHistory } from 'react-router-dom'; import loginBG from '../../assets/img/login-bg.png'; - import { useBasicAuth } from '../../components/Auth/AuthProviders/BasicAuthProvider'; import BrandImage from '../../components/common/BrandImage/BrandImage'; import { ROUTES, VALIDATION_MESSAGES } from '../../constants/constants';