diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile index 9311ca4e67f32650f288bae11b8b3c0660b59380..6b8c732e4c4000aec630e1eb5bdb23b0afd45b41 100644 --- a/dbrepo-metadata-service/Dockerfile +++ b/dbrepo-metadata-service/Dockerfile @@ -34,8 +34,9 @@ MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> ENV ADMIN_MAIL="noreply@localhost" ENV BASE_URL="http://localhost" +ENV GRANT_PRIVILEGES="ALL PRIVILEGES" ENV BROKER_CONSUMERS=2 -ENV BROKER_ENDPOINT=http://broker-service:15672 +ENV BROKER_ENDPOINT="http://broker-service:15672" ENV BROKER_USERNAME=fda ENV CLIENT_ID="dbrepo-client" ENV DBREPO_CLIENT_SECRET="MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG" @@ -54,7 +55,8 @@ ENV REPOSITORY_NAME="Example Repository" ENV SEARCH_USERNAME=admin ENV SHARED_FILESYSTEM=/tmp ENV USER_NETWORK=userdb -ENV WEBSITE=http://localhost +ENV WEBSITE="http://localhost" +ENV KEYCLOAK_HOST="http://authentication-service:8080/api/auth" ENV KEYCLOAK_ADMIN=fda ENV KEYCLOAK_ADMIN_PASSWORD=fda diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java index c5fc2b0797dbf255546694ba5d84f9909c963ce8..21fa777910d21d3ef71d1ffdd1de90d3c63b7f7f 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java @@ -22,11 +22,13 @@ import java.util.UUID; @AllArgsConstructor @Jacksonized @ToString +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @Document(indexName = "user") public class UserDto { @Id @NotNull + @EqualsAndHashCode.Include @Schema(example = "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4") @Field(name = "id", type = FieldType.Keyword) private UUID id; diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java index 7b73daf49f5a8d45c05dd2d62cc0e32d480b377b..2550f1a846760e766318b5d15f5841021232f3cc 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java @@ -84,6 +84,10 @@ public interface DatabaseMapper { Database databaseCreateDtoToDatabase(DatabaseCreateDto data); default PreparedStatement userToRawCreateUserQuery(Connection connection, UserDto data) throws QueryMalformedException { + if (data.getAttributes().getMariadbPassword() == null) { + log.error("Failed to map create user query: attribute 'mariadb_password' is empty"); + throw new QueryMalformedException("Failed to map create user query: attribute 'mariadb_password' is empty"); + } final StringBuilder statement = new StringBuilder("CREATE USER IF NOT EXISTS `") .append(data.getUsername()) .append("`@`%` IDENTIFIED BY PASSWORD '") @@ -98,6 +102,25 @@ public interface DatabaseMapper { } } + default PreparedStatement userToRawUpdateUserQuery(Connection connection, UserDto data) throws QueryMalformedException { + if (data.getAttributes().getMariadbPassword() == null) { + log.error("Failed to map create user query: attribute 'mariadb_password' is empty"); + throw new QueryMalformedException("Failed to map create user query: attribute 'mariadb_password' is empty"); + } + final StringBuilder statement = new StringBuilder("SET PASSWORD FOR `") + .append(data.getUsername()) + .append("`@`%` = '") + .append(data.getAttributes().getMariadbPassword()) + .append("';"); + log.trace("statement={}", statement); + try { + return connection.prepareStatement(statement.toString()); + } catch (SQLException e) { + log.error("Failed to prepare statement {}, reason: {}", statement, e.getMessage()); + throw new QueryMalformedException("Failed to prepare statement", e); + } + } + default PreparedStatement userToRawDropUserQuery(Connection connection, String username) throws QueryMalformedException { final StringBuilder statement = new StringBuilder("DROP USER IF EXISTS `") .append(username) @@ -138,8 +161,13 @@ public interface DatabaseMapper { .build(); } - default PreparedStatement rawGrantCreatorAccessQuery(Connection connection, String username) throws QueryMalformedException { - final StringBuilder statement = new StringBuilder("GRANT ALL PRIVILEGES ON *.* TO `") + default PreparedStatement rawGrantCreatorAccessQuery(Connection connection, String databaseName, String username, + String priviliges) throws QueryMalformedException { + final StringBuilder statement = new StringBuilder("GRANT ") + .append(priviliges) + .append(" ON ") + .append(databaseName) + .append(".* TO `") .append(username) .append("`@`%`;"); log.trace("statement={}", statement); diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/utils/UserUtil.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/utils/UserUtil.java index 433dcded1c69ee32222718bbd6c9bb860c675d1a..4073e95081c82c4c7f3a0ed078b9f9de1d3b24ae 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/utils/UserUtil.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/utils/UserUtil.java @@ -23,7 +23,7 @@ public class UserUtil { return null; } final Authentication authentication = (Authentication) principal; - final UserDetailsDto user = (UserDetailsDto) authentication.getDetails(); + final UserDetailsDto user = (UserDetailsDto) authentication.getPrincipal(); return UUID.fromString(user.getId()); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java index e78686f788c3f7a37341602149cecc034d55ecb2..db2b793cbfa20a09a92adcdfe515fc3e20eae7c7 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java @@ -245,7 +245,8 @@ public class UserEndpoint { public ResponseEntity<?> password(@NotNull @PathVariable("id") UUID id, @NotNull @Valid @RequestBody UserPasswordDto data, @NotNull Principal principal) - throws UserNotFoundException, ForeignUserException, KeycloakRemoteException, AccessDeniedException { + throws UserNotFoundException, ForeignUserException, KeycloakRemoteException, AccessDeniedException, + QueryMalformedException, DatabaseMalformedException { log.debug("endpoint modify a user password, id={}, data={}, principal={}", id, data, principal); /* check */ if (!id.equals(UserUtil.getId(principal))) { diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml index caab719e8f3100c64fbde4c0c4d1ae7ac813de38..0d3c040d253b1e34ad104f301c0a63e2de90f560 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml @@ -47,6 +47,7 @@ logging: at.tuwien.: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug fda: + privileges: ALL PRIVILEGES pid: base: https://example.com/pid/ broker: @@ -55,6 +56,7 @@ fda: issuer: http://localhost/realms/dbrepo public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB keycloak: + endpoint: "http://authentication-service:8080/api/auth" username: fda password: fda consumers: 2 diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml index f8eff0c28c3a779160e21b4c7eaeca050ed199e1..66f1cb64cf5de896aa936030de5aa4b8cc38fb3d 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml @@ -60,6 +60,7 @@ logging: at.tuwien.: "${LOG_LEVEL}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug fda: + privileges: "${GRANT_PRIVILEGES}" pid: base: "${PID_BASE}" broker: @@ -68,6 +69,7 @@ fda: issuer: "${JWT_ISSUER}" public_key: "${JWT_PUBKEY}" keycloak: + endpoint: "${KEYCLOAK_HOST}" username: "${KEYCLOAK_ADMIN}" password: "${KEYCLOAK_ADMIN_PASSWORD}" consumers: "${BROKER_CONSUMERS}" diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java index bcf8c86eb11679f8e0fd3b27d99f38354f1d1d91..9277a146f9691a440b7d2322fc46b0d6a3bf3036 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java @@ -1,7 +1,6 @@ package at.tuwien.config; import at.tuwien.api.database.AccessTypeDto; -import at.tuwien.api.database.DatabaseGiveAccessDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; import at.tuwien.entities.container.Container; import at.tuwien.entities.database.Database; @@ -75,7 +74,7 @@ public class MariaDbConfig { final String jdbc = "jdbc:mariadb://" + container.getHost() + ":" + container.getPort(); log.trace("connect to database {}", jdbc); try (Connection connection = DriverManager.getConnection(jdbc, container.getPrivilegedUsername(), container.getPrivilegedPassword())) { - ResourceDatabasePopulator populator = new ResourceDatabasePopulator(new ClassPathResource("init/" + database.getInternalName() + ".sql"), new ClassPathResource("init/querystore.sql")); + ResourceDatabasePopulator populator = new ResourceDatabasePopulator(new ClassPathResource("init/" + database.getInternalName() + ".sql"), new ClassPathResource("init/users.sql"), new ClassPathResource("init/querystore.sql")); populator.setSeparator(";\n"); populator.populate(connection); } @@ -119,15 +118,11 @@ public class MariaDbConfig { } } - public void mockGrantUserPermissions(Container container, Database database, String username, UUID userId) throws SQLException, + public void mockGrantUserPermissions(Container container, Database database, String username) throws SQLException, QueryMalformedException { final String jdbc = "jdbc:mariadb://" + container.getHost() + ":" + container.getPort() + "/" + database.getInternalName(); log.trace("connect to database {}", jdbc); try (Connection connection = DriverManager.getConnection(jdbc, container.getPrivilegedUsername(), container.getPrivilegedPassword())) { - final DatabaseGiveAccessDto access = DatabaseGiveAccessDto.builder() - .userId(userId) - .type(AccessTypeDto.WRITE_ALL) - .build(); final PreparedStatement statement1 = databaseMapper.rawGrantUserAccessQuery(connection, username, AccessTypeDto.WRITE_ALL); statement1.executeUpdate(); final PreparedStatement statement2 = databaseMapper.rawGrantUserProcedure(connection, username); @@ -156,13 +151,13 @@ public class MariaDbConfig { } } - public static String getPrivileges(String hostname, String database, String user, String username, String password) + public static String getPrivileges(String hostname, Integer port, String database, String username, String password) throws Exception { - final String jdbc = "jdbc:mariadb://" + hostname + "/" + database; + final String jdbc = "jdbc:mariadb://" + hostname + ":" + port + "/" + database; log.trace("connect to database {}", jdbc); final List<String> usernames = new LinkedList<>(); try (Connection connection = DriverManager.getConnection(jdbc, username, password)) { - final String query = "SHOW GRANTS FOR `" + user + "`;"; + final String query = "SHOW GRANTS FOR `" + username + "`;"; log.trace("prepare statement '{}'", query); final PreparedStatement statement = connection.prepareStatement(query); final ResultSet set = statement.executeQuery(); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java index d467a7936075c7531b1d36cea049a62fe8c8567c..be2861cfd0609f3c7ad0ef6b357aadbbe16dc4c9 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java @@ -271,7 +271,7 @@ public class UserEndpointUnitTest extends BaseUnitTest { @Test @WithMockUser(username = USER_1_USERNAME) public void password_succeeds() throws UserNotFoundException, ForeignUserException, KeycloakRemoteException, - at.tuwien.exception.AccessDeniedException { + at.tuwien.exception.AccessDeniedException, QueryMalformedException, DatabaseMalformedException { final UserPasswordDto request = UserPasswordDto.builder() .password(USER_1_PASSWORD) .build(); @@ -377,7 +377,7 @@ public class UserEndpointUnitTest extends BaseUnitTest { protected void password_generic(UUID id, UserDto user, Principal principal, UserPasswordDto data) throws UserNotFoundException, ForeignUserException, KeycloakRemoteException, - at.tuwien.exception.AccessDeniedException { + at.tuwien.exception.AccessDeniedException, QueryMalformedException, DatabaseMalformedException { /* mock */ if (user != null) { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMapperTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..427d46091de37806f48096f1ce7fb8fde789ffc6 --- /dev/null +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMapperTest.java @@ -0,0 +1,52 @@ + +package at.tuwien.mapper; + +import at.tuwien.BaseUnitTest; +import at.tuwien.annotations.MockAmqp; +import at.tuwien.annotations.MockOpensearch; +import at.tuwien.api.database.DatabaseDto; +import at.tuwien.api.user.UserBriefDto; +import at.tuwien.api.user.UserDto; +import at.tuwien.entities.container.Container; +import at.tuwien.exception.QueryMalformedException; +import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.*; + +@Log4j2 +@SpringBootTest +@ExtendWith(SpringExtension.class) +@MockAmqp +@MockOpensearch +public class ContainerMapperTest extends BaseUnitTest { + + @Test + public void equals_fails() { + + /* test */ + assertNotEquals(CONTAINER_1, CONTAINER_2); + } + + @Test + public void equals_identity_succeeds() { + + /* test */ + assertEquals(CONTAINER_1, CONTAINER_1); + } + + @Test + public void equals_similar_succeeds() { + final Container tmp = Container.builder() + .id(CONTAINER_1_ID) + .build(); + + /* test */ + assertEquals(CONTAINER_1, tmp); + } + +} diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseMapperTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseMapperTest.java index 73e17f82b88365ed4b6275a6bde94d19651f8bc2..34bf4677b1ba2d90837d5ef74de3da553bd81bca 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseMapperTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseMapperTest.java @@ -5,6 +5,8 @@ import at.tuwien.annotations.MockAmqp; import at.tuwien.annotations.MockOpensearch; import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.user.UserBriefDto; +import at.tuwien.api.user.UserDto; +import at.tuwien.exception.QueryMalformedException; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -13,6 +15,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; @Log4j2 @SpringBootTest @@ -43,4 +46,16 @@ public class DatabaseMapperTest extends BaseUnitTest { assertEquals(USER_1_USERNAME, owner.getUsername()); } + @Test + public void userToRawCreateUserQuery_fails () { + final UserDto request = UserDto.builder() + .username("mock") + .build(); + + /* test */ + assertThrows(QueryMalformedException.class, () -> { + databaseMapper.userToRawCreateUserQuery(null, request); + }); + } + } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java index 410add53338a7d635d7f35b105aab86b5cad54f8..9903d8377d8a247f8792be19a962da440b3f542a 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java @@ -3,13 +3,13 @@ package at.tuwien.service; import at.tuwien.BaseUnitTest; import at.tuwien.annotations.MockAmqp; import at.tuwien.annotations.MockOpensearch; -import at.tuwien.api.database.DatabaseCreateDto; -import at.tuwien.api.database.DatabaseDto; -import at.tuwien.api.database.DatabaseModifyVisibilityDto; -import at.tuwien.api.database.DatabaseTransferDto; +import at.tuwien.api.database.*; +import at.tuwien.api.user.UserAttributesDto; +import at.tuwien.api.user.UserDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.entities.database.Database; import at.tuwien.exception.*; +import at.tuwien.gateway.KeycloakGateway; import at.tuwien.repository.mdb.*; import at.tuwien.repository.sdb.DatabaseIdxRepository; import at.tuwien.service.impl.MariaDbServiceImpl; @@ -27,6 +27,8 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import java.sql.SQLException; +import java.sql.SQLInvalidAuthorizationSpecException; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; @@ -44,6 +46,15 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { @MockBean private DatabaseIdxRepository databaseIdxRepository; + @MockBean + private KeycloakGateway keycloakGateway; + + @MockBean + private UserService userService; + + @Autowired + private DatabaseAccessRepository databaseAccessRepository; + @Autowired private ContainerRepository containerRepository; @@ -68,8 +79,10 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* metadata database */ imageRepository.save(IMAGE_1); containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_3_SIMPLE); + databaseRepository.saveAll(List.of(DATABASE_1_SIMPLE, DATABASE_2_SIMPLE, DATABASE_3_SIMPLE)); MariaDbConfig.dropAllDatabases(CONTAINER_1); + MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_1); + MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_2); MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_3); } @@ -99,6 +112,8 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { .thenReturn(DATABASE_1_DTO); when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_1_DTO); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1_DTO); /* test */ generic_create(DATABASE_1_CREATE, DATABASE_1); @@ -113,6 +128,8 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { .thenReturn(DATABASE_1_DTO); when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_1_DTO); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1_DTO); /* test */ generic_create(DATABASE_1_CREATE, DATABASE_1); @@ -129,6 +146,8 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_2_DTO) .thenReturn(DATABASE_3_DTO); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1_DTO); /* test */ generic_create(DATABASE_2_CREATE, DATABASE_2); @@ -145,12 +164,58 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_3_DTO) .thenReturn(DATABASE_2_DTO); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1_DTO); /* test */ generic_create(DATABASE_3_CREATE, DATABASE_3); generic_create(DATABASE_2_CREATE, DATABASE_2); } + @Test + public void create_canLogin_succeeds() throws Exception { + + /* mock */ + MariaDbConfig.dropDatabase(CONTAINER_1, DATABASE_1_INTERNALNAME); + databaseRepository.deleteAll(); + when(databaseIdxRepository.save(any(DatabaseDto.class))) + .thenReturn(DATABASE_1_DTO); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1_DTO); + final Database database = generic_create(DATABASE_1_CREATE, DATABASE_1); + + + /* test */ + MariaDbConfig.getPrivileges(mariaDBContainer.getHost(), mariaDBContainer.getMappedPort(3306), database.getInternalName(), USER_1_USERNAME, USER_1_PASSWORD); + } + + @Test + public void updatePassword_canLogin_succeeds() throws Exception { + final UserDto request = UserDto.builder() + .id(USER_1_ID) + .username(USER_1_USERNAME) + .attributes(UserAttributesDto.builder() + .mariadbPassword(USER_2_DATABASE_PASSWORD) + .build()) + .build(); + + /* mock */ + MariaDbConfig.dropDatabase(CONTAINER_1, DATABASE_1_INTERNALNAME); + MariaDbConfig.createDatabase(CONTAINER_1, DATABASE_1_INTERNALNAME); + databaseAccessRepository.save(DATABASE_1_USER_1_READ_ACCESS); + when(databaseIdxRepository.save(any(DatabaseDto.class))) + .thenReturn(DATABASE_1_DTO); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1_DTO); + databaseService.updatePassword(request); + + /* test */ + assertThrows(SQLInvalidAuthorizationSpecException.class, () -> { + MariaDbConfig.getPrivileges(mariaDBContainer.getHost(), mariaDBContainer.getMappedPort(3306), DATABASE_1_INTERNALNAME, USER_1_USERNAME, USER_1_PASSWORD); + }); + MariaDbConfig.getPrivileges(mariaDBContainer.getHost(), mariaDBContainer.getMappedPort(3306), DATABASE_1_INTERNALNAME, USER_1_USERNAME, USER_2_PASSWORD); + } + @Test public void create_queryStore_succeeds() throws Exception { @@ -193,17 +258,19 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { @Test public void create_userProcedureUser_succeeds() throws SQLException, QueryMalformedException { + /* mock */ + databaseAccessRepository.save(DATABASE_3_USER_1_WRITE_ALL_ACCESS); + /* test */ generic_user_insert("junit1", "junit1"); } @Test public void delete_succeeds() throws QueryMalformedException, UserNotFoundException, DatabaseConnectionException, - DatabaseNotFoundException, ImageNotSupportedException, DatabaseMalformedException, SQLException { + DatabaseNotFoundException, ImageNotSupportedException, DatabaseMalformedException { /* mock */ databaseRepository.save(DATABASE_1_SIMPLE); - MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_1); /* test */ databaseService.delete(DATABASE_1_ID, USER_1_ID); @@ -231,8 +298,11 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { .build(); /* mock */ - MariaDbConfig.createInitDatabase(CONTAINER_1, DATABASE_1); databaseRepository.save(DATABASE_1_SIMPLE); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1_DTO); + when(userService.findByUsername(USER_2_USERNAME)) + .thenReturn(USER_2_DTO); /* test */ final Database response = databaseService.transfer(DATABASE_1_ID, request); @@ -246,7 +316,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { protected void generic_insert(String query, Long assertQueryId) throws SQLException, QueryMalformedException { /* mock */ - mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME, USER_1_ID); + mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME); /* test */ final Long response = MariaDbConfig.mockSystemQueryInsert(DATABASE_3, query); @@ -254,19 +324,19 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { assertEquals(assertQueryId, response); } - protected void generic_create(DatabaseCreateDto createDto, Database database) - throws Exception { + protected Database generic_create(DatabaseCreateDto createDto, Database database) throws Exception { /* test */ final Database response = databaseService.create(createDto, USER_1_PRINCIPAL); assertEquals(database.getName(), response.getName()); assertTrue(response.getInternalName().startsWith(database.getInternalName())); + return response; } protected void generic_system_insert(String username, String password) throws SQLException, QueryMalformedException { /* mock */ - mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME, USER_1_ID); + mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME); /* test */ final Long queryId = MariaDbConfig.mockSystemQueryInsert(DATABASE_3, QUERY_4_STATEMENT, username, password); @@ -276,7 +346,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { protected void generic_user_insert(String username, String password) throws SQLException, QueryMalformedException { /* mock */ - mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME, USER_1_ID); + mariaDbConfig.mockGrantUserPermissions(CONTAINER_1, DATABASE_3, USER_1_USERNAME); /* test */ final Long queryId = MariaDbConfig.mockUserQueryInsert(DATABASE_3, QUERY_4_STATEMENT, username, password); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java index a45007cafb1bd004ce11d248639b5ed235fe1b30..18817fad4388681da423710b20761a76760a3127 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java @@ -137,7 +137,8 @@ public class UserServiceIntegrationTest extends BaseUnitTest { } @Test - public void updatePassword_succeeds() throws UserNotFoundException, KeycloakRemoteException, AccessDeniedException { + public void updatePassword_succeeds() throws UserNotFoundException, KeycloakRemoteException, AccessDeniedException, + QueryMalformedException, DatabaseMalformedException { final UserPasswordDto request = UserPasswordDto.builder() .password(USER_1_PASSWORD) .build(); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java index 1c6f82290583d3618af9143696540a8f30d44a67..241ea9c4b538c3670f58a5807067cb2db4d35113 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java @@ -1,17 +1,32 @@ package at.tuwien.config; +import at.tuwien.interceptor.KeycloakInterceptor; import lombok.Getter; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.DefaultUriBuilderFactory; @Getter @Configuration public class KeycloakConfig { + @Value("${fda.keycloak.endpoint}") + private String keycloakEndpoint; + @Value("${fda.keycloak.username}") - private String username; + private String keycloakUsername; @Value("${fda.keycloak.password}") - private String password; + private String keycloakPassword; + + @Bean("keycloakRestTemplate") + public RestTemplate brokerRestTemplate() { + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(keycloakEndpoint)); + restTemplate.getInterceptors() + .add(new KeycloakInterceptor(keycloakUsername, keycloakPassword, keycloakEndpoint)); + return restTemplate; + } } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/QueryConfig.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/QueryConfig.java index 3b9be44361f26dcba516db7629fee55ad7046d0e..e3bcf500207d61f8dfacff2f5be61bf4e2e75975 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/QueryConfig.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/config/QueryConfig.java @@ -8,6 +8,9 @@ import org.springframework.context.annotation.Configuration; @Configuration public class QueryConfig { + @Value("${fda.privileges}") + private String grantPrivileges; + @Value("${fda.unsupported}") private String[] notSupportedKeywords; diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java index f5542abffecacda9b9b2f6735632a9407a17933c..3ab32919efadd0ecd1271b33d704baebd8cc32bc 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java @@ -9,6 +9,7 @@ import at.tuwien.exception.UserNotFoundException; import at.tuwien.gateway.KeycloakGateway; import at.tuwien.mapper.UserMapper; import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; @@ -29,9 +30,9 @@ public class KeycloakGatewayImpl implements KeycloakGateway { private final RestTemplate restTemplate; private final KeycloakConfig keycloakConfig; - public KeycloakGatewayImpl(UserMapper userMapper, KeycloakConfig keycloakConfig) { + public KeycloakGatewayImpl(UserMapper userMapper, @Qualifier("keycloakRestTemplate") RestTemplate restTemplate, KeycloakConfig keycloakConfig) { this.userMapper = userMapper; - this.restTemplate = new RestTemplate(); + this.restTemplate = restTemplate; this.keycloakConfig = keycloakConfig; } @@ -39,8 +40,8 @@ public class KeycloakGatewayImpl implements KeycloakGateway { final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); final MultiValueMap<String, String> payload = new LinkedMultiValueMap<>(); - payload.add("username", keycloakConfig.getUsername()); - payload.add("password", keycloakConfig.getPassword()); + payload.add("username", keycloakConfig.getKeycloakUsername()); + payload.add("password", keycloakConfig.getKeycloakPassword()); payload.add("grant_type", "password"); payload.add("client_id", "admin-cli"); final ResponseEntity<TokenDto> response; diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..f9e9e1d69db037a8e0402b6bb2e6ec358862b7f5 --- /dev/null +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java @@ -0,0 +1,58 @@ +package at.tuwien.interceptor; + +import at.tuwien.api.keycloak.TokenDto; +import at.tuwien.exception.AccessDeniedException; +import lombok.extern.log4j.Log4j2; +import org.springframework.http.*; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; + +import java.io.IOException; + +@Log4j2 +public class KeycloakInterceptor implements ClientHttpRequestInterceptor { + + private final String adminUsername; + private final String adminPassword; + private final String keycloakEndpoint; + + public KeycloakInterceptor(String adminUsername, String adminPassword, String keycloakEndpoint) { + this.adminUsername = adminUsername; + this.adminPassword = adminPassword; + this.keycloakEndpoint = keycloakEndpoint; + } + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) + throws IOException { + log.trace("intercept keycloak request for admin username {}", adminUsername); + request.getHeaders().set("Authorization", "Bearer " + obtainToken().getAccessToken()); + return execution.execute(request, body); + } + + public TokenDto obtainToken() throws AccessDeniedException { + final RestTemplate restTemplate = new RestTemplate(); + final HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + final MultiValueMap<String, String> payload = new LinkedMultiValueMap<>(); + payload.add("username", adminUsername); + payload.add("password", adminPassword); + payload.add("grant_type", "password"); + payload.add("client_id", "admin-cli"); + final ResponseEntity<TokenDto> response; + try { + response = restTemplate.exchange(keycloakEndpoint + "/api/auth/realms/master/protocol/openid-connect/token", + HttpMethod.POST, new HttpEntity<>(payload, headers), TokenDto.class); + } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { + log.error("Failed to obtain admin token: {}", e.getMessage()); + throw new AccessDeniedException("Failed to obtain admin token: " + e.getMessage()); + } + return response.getBody(); + } +} diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java index 573941b00a110ef5a60ed2a703627d848a51b08a..db43743d78d1276a3bdb02595964cdd09d25bfb8 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java @@ -3,6 +3,7 @@ package at.tuwien.service; import at.tuwien.api.database.DatabaseCreateDto; import at.tuwien.api.database.DatabaseModifyVisibilityDto; import at.tuwien.api.database.DatabaseTransferDto; +import at.tuwien.api.user.UserDto; import at.tuwien.entities.database.Database; import at.tuwien.exception.*; import org.springframework.stereotype.Service; @@ -88,6 +89,8 @@ public interface DatabaseService { DatabaseMalformedException, AmqpException, ContainerConnectionException, UserNotFoundException, DatabaseNameExistsException, DatabaseConnectionException, QueryMalformedException, KeycloakRemoteException, AccessDeniedException; + void updatePassword(UserDto user) throws DatabaseMalformedException, QueryMalformedException; + /** * Updates the visibility of the database. * diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java index 0cbf5ef091e93c1ce67e947b11a7624f7ea639c4..7aee0608b04e7c150a5b772b11e954c69fa93fd0 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java @@ -62,7 +62,7 @@ public interface UserService { * @param data The new password. * @throws UserNotFoundException The user was not found. */ - void updatePassword(UUID id, UserPasswordDto data) throws UserNotFoundException, KeycloakRemoteException, AccessDeniedException; + void updatePassword(UUID id, UserPasswordDto data) throws UserNotFoundException, KeycloakRemoteException, AccessDeniedException, QueryMalformedException, DatabaseMalformedException; /** * Updates the user theme for a user with given id. diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java index 24b6de07cbd6296a5260f2f0199afcb5b1ce2fab..016bb85c43a93d7441e909572a44208268a024e8 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java @@ -4,6 +4,7 @@ import at.tuwien.api.database.DatabaseCreateDto; import at.tuwien.api.database.DatabaseModifyVisibilityDto; import at.tuwien.api.database.DatabaseTransferDto; import at.tuwien.api.user.UserDto; +import at.tuwien.config.QueryConfig; import at.tuwien.entities.container.Container; import at.tuwien.entities.database.Database; import at.tuwien.exception.*; @@ -27,10 +28,13 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import static java.util.stream.Collectors.groupingBy; + @Log4j2 @Service public class MariaDbServiceImpl extends HibernateConnector implements DatabaseService { + private final QueryConfig queryConfig; private final UserService userService; private final DatabaseMapper databaseMapper; private final ContainerService containerService; @@ -38,9 +42,10 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe private final DatabaseIdxRepository databaseIdxRepository; @Autowired - public MariaDbServiceImpl(UserService userService, DatabaseMapper databaseMapper, + public MariaDbServiceImpl(QueryConfig queryConfig, UserService userService, DatabaseMapper databaseMapper, ContainerService containerService, DatabaseRepository databaseRepository, DatabaseIdxRepository databaseIdxRepository) { + this.queryConfig = queryConfig; this.userService = userService; this.databaseMapper = databaseMapper; this.containerService = containerService; @@ -132,7 +137,6 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe throws ImageNotSupportedException, ContainerNotFoundException, DatabaseMalformedException, AmqpException, ContainerConnectionException, UserNotFoundException, DatabaseNameExistsException, DatabaseConnectionException, QueryMalformedException, KeycloakRemoteException, AccessDeniedException { - final UserDto user = userService.findByUsername(principal.getName()); /* start the object */ final Database database = databaseMapper.databaseCreateDtoToDatabase(createDto); final Container container = containerService.find(database.getCid()); @@ -149,15 +153,18 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe final PreparedStatement preparedStatement1 = databaseMapper.databaseToRawCreateDatabaseQuery(connection, database); preparedStatement1.executeUpdate(); /* create user */ - final PreparedStatement preparedStatement2 = databaseMapper.userToRawCreateUserQuery(connection, user); + final PreparedStatement preparedStatement2 = databaseMapper.userToRawCreateUserQuery(connection, owner); preparedStatement2.executeUpdate(); + /* give access */ + final PreparedStatement preparedStatement3 = databaseMapper.rawGrantCreatorAccessQuery(connection, database.getInternalName(), principal.getName(), queryConfig.getGrantPrivileges()); + preparedStatement3.executeUpdate(); } catch (SQLException e) { log.error("Failed to create database with internal name {}, reason: {}", database.getInternalName(), e.getMessage()); throw new DatabaseMalformedException("Failed to create database: " + e.getMessage(), e); } finally { dataSource.close(); } - log.info("Created user {} on database with owner access", user.getUsername()); + log.info("Created user {} on database with owner access", owner.getUsername()); /* save in metadata database */ final Database entity = databaseRepository.save(database); log.info("Created database with id {} in metadata database", entity.getId()); @@ -167,6 +174,32 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe return entity; } + @Override + @Transactional(readOnly = true) + public void updatePassword(UserDto user) throws DatabaseMalformedException, QueryMalformedException { + /* start the object */ + final List<Database> databases = databaseRepository.findReadAccess(user.getId()) + .stream() + .distinct() + .toList(); + log.trace("found {} distinct databases", databases.size()); + for (Database database : databases) { + final ComboPooledDataSource dataSource = getPrivilegedDataSource(database.getContainer().getImage(), database.getContainer()); + try { + final Connection connection = dataSource.getConnection(); + /* update password database */ + final PreparedStatement preparedStatement = databaseMapper.userToRawUpdateUserQuery(connection, user); + preparedStatement.executeUpdate(); + } catch (SQLException e) { + log.error("Failed to update user password in database with internal name {}: {}", database.getInternalName(), e.getMessage()); + throw new DatabaseMalformedException("Failed to update user password in database with internal name " + database.getInternalName() + ": " + e.getMessage(), e); + } finally { + dataSource.close(); + } + log.debug("updated user password in database with internal name {}", database.getInternalName()); + } + } + @Override @Transactional public Database visibility(Long databaseId, DatabaseModifyVisibilityDto data) throws DatabaseNotFoundException { diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java index d0223155279fe7ac24031f253f92248bcc2d9b5b..9ee82a910669b26c61bf3b1b3577db48a570bc48 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java @@ -6,6 +6,7 @@ import at.tuwien.exception.*; import at.tuwien.gateway.KeycloakGateway; import at.tuwien.mapper.UserMapper; import at.tuwien.repository.sdb.UserIdxRepository; +import at.tuwien.service.DatabaseService; import at.tuwien.service.UserService; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; @@ -20,13 +21,15 @@ public class UserServiceImpl implements UserService { private final UserMapper userMapper; private final KeycloakGateway keycloakGateway; + private final DatabaseService databaseService; private final UserIdxRepository userIdxRepository; @Autowired - public UserServiceImpl(UserMapper userMapper, KeycloakGateway keycloakGateway, + public UserServiceImpl(UserMapper userMapper, KeycloakGateway keycloakGateway, DatabaseService databaseService, UserIdxRepository userIdxRepository) { this.userMapper = userMapper; this.keycloakGateway = keycloakGateway; + this.databaseService = databaseService; this.userIdxRepository = userIdxRepository; } @@ -76,9 +79,12 @@ public class UserServiceImpl implements UserService { @Override public void updatePassword(UUID id, UserPasswordDto data) throws KeycloakRemoteException, AccessDeniedException, - UserNotFoundException { + UserNotFoundException, QueryMalformedException, DatabaseMalformedException { /* save */ keycloakGateway.updateUserCredentials(id, data); + final UserDto user = userMapper.keycloakUserDtoToUserDto(keycloakGateway.findById(id)); + /* update in containers */ + databaseService.updatePassword(user); log.info("Updated user password with id {}", id); } diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 54f56a8ff25863b2e6018c4c28a4ee0fa9e9cff9..fb6568c9a0592634ff481a47814a0a37465611c2 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -223,7 +223,7 @@ public abstract class BaseTest { public final static UUID USER_1_ID = UUID.fromString("cd5bab0d-7799-4069-85fb-c5d738572a0b"); public final static String USER_1_EMAIL = "john.doe@example.com"; public final static String USER_1_USERNAME = "junit1"; - public final static String USER_1_PASSWORD = "s3cr3t1nf0rm4t10n"; + public final static String USER_1_PASSWORD = "junit1"; public final static String USER_1_PASSWORD_ENCODED = "$2a$10$0dtdedA/RLTrFbUsvpbUw.I73AXOKeQP3t5UXj96OvnDEaDb3d3M6"; public final static String USER_1_DATABASE_PASSWORD = "*440BA4FD1A87A0999647DB67C0EE258198B247BA" /* junit1 */; public final static String USER_1_FIRSTNAME = "John"; @@ -256,6 +256,7 @@ public abstract class BaseTest { .themeDark(USER_1_THEME_DARK) .orcid(USER_1_ORCID_UNCOMPRESSED) .affiliation(USER_1_AFFILIATION) + .mariadbPassword(USER_1_DATABASE_PASSWORD) .build(); public final static UserDto USER_1_DTO = UserDto.builder() @@ -277,6 +278,7 @@ public abstract class BaseTest { .build(); public final static UserDetails USER_1_DETAILS = UserDetailsDto.builder() + .id(USER_1_ID.toString()) .username(USER_1_USERNAME) .email(USER_1_EMAIL) .password(USER_1_PASSWORD) @@ -311,7 +313,7 @@ public abstract class BaseTest { public final static String USER_2_ORCID = "0000000292726225"; public final static String USER_2_ORCID_UNCOMPRESSED = "0000-0002-9272-6225"; public final static String USER_2_ORCID_URL = "https://orcid.org/" + USER_2_ORCID_UNCOMPRESSED; - public final static String USER_2_PASSWORD = "s3cr3t1nf0rm4t10n"; + public final static String USER_2_PASSWORD = "junit2"; public final static String USER_2_DATABASE_PASSWORD = "*9AA70A8B0EEFAFCB5BED5BDEF6EE264D5DA915AE" /* junit2 */; public final static Boolean USER_2_VERIFIED = true; public final static Boolean USER_2_ENABLED = true; @@ -324,6 +326,7 @@ public abstract class BaseTest { .themeDark(USER_2_THEME_DARK) .orcid(USER_2_ORCID_UNCOMPRESSED) .affiliation(USER_2_AFFILIATION) + .mariadbPassword(USER_2_DATABASE_PASSWORD) .build(); public final static UserDto USER_2_DTO = UserDto.builder() @@ -384,6 +387,7 @@ public abstract class BaseTest { .themeDark(USER_3_THEME_DARK) .orcid(USER_3_ORCID_UNCOMPRESSED) .affiliation(USER_3_AFFILIATION) + .mariadbPassword(USER_3_DATABASE_PASSWORD) .build(); public final static UserDto USER_3_DTO = UserDto.builder() @@ -396,6 +400,7 @@ public abstract class BaseTest { .build(); public final static UserDetails USER_3_DETAILS = UserDetailsDto.builder() + .id(USER_3_ID.toString()) .username(USER_3_USERNAME) .email(USER_3_EMAIL) .password(USER_3_PASSWORD) @@ -429,6 +434,7 @@ public abstract class BaseTest { .themeDark(USER_4_THEME_DARK) .orcid(USER_4_ORCID_UNCOMPRESSED) .affiliation(USER_4_AFFILIATION) + .mariadbPassword(USER_4_DATABASE_PASSWORD) .build(); public final static UserDto USER_4_DTO = UserDto.builder() @@ -452,6 +458,7 @@ public abstract class BaseTest { .build(); public final static UserDetails USER_4_DETAILS = UserDetailsDto.builder() + .id(USER_4_ID.toString()) .username(USER_4_USERNAME) .email(USER_4_EMAIL) .password(USER_4_PASSWORD) @@ -486,6 +493,7 @@ public abstract class BaseTest { .build(); public final static UserDetails USER_5_DETAILS = UserDetailsDto.builder() + .id(USER_5_ID.toString()) .username(USER_5_USERNAME) .email(USER_5_EMAIL) .password(USER_5_PASSWORD) @@ -520,6 +528,7 @@ public abstract class BaseTest { .build(); public final static UserDetails USER_6_DETAILS = UserDetailsDto.builder() + .id(USER_6_ID.toString()) .username(USER_6_USERNAME) .email(USER_6_EMAIL) .password(USER_6_PASSWORD)