diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6028862ea5145d9084a6fedb341eac3aadad192e..66bb59f7ec1322671cfe70feb003a4c37095ae84 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -130,6 +130,7 @@ test-default-deployment: - "make teardown" - "rm -f .env" - "docker compose up -d || docker compose down" + - "make teardown" coverage: '/TOTAL.*?([0-9]{1,3})%/' test-env-deployment: @@ -140,6 +141,7 @@ test-env-deployment: - "make teardown" - "cp .env.unix.example .env" - "docker compose up -d || docker compose down" + - "make teardown" scan-analyse-service: stage: scan-docker 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 ced4aa34104430d9e31cb96d6adaab026ce4bf92..ecd68ec53e613be9739ebbf80b20958aafb4cf28 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 @@ -106,7 +106,7 @@ public class UserEndpoint { }) public ResponseEntity<UserBriefDto> create(@NotNull @Valid @RequestBody SignupRequestDto data) throws UserAlreadyExistsException, UserEmailAlreadyExistsException, UserNotFoundException, - KeycloakRemoteException, AccessDeniedException, BrokerRemoteException { + KeycloakRemoteException, AccessDeniedException, BrokerRemoteException, BrokerVirtualHostCreationException { log.debug("endpoint create a user, data={}", data); /* check */ userService.validateUsernameNotExists(data.getUsername()); 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 e783f9b1ca9b2411eb46c45f896731c66d504334..030f8e3c446fd9bd02aa1cc604803c651bc9207f 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 @@ -67,7 +67,7 @@ public class UserEndpointUnitTest extends BaseUnitTest { @WithAnonymousUser public void create_anonymous_succeeds() throws UserNotFoundException, UserEmailAlreadyExistsException, RealmNotFoundException, UserAlreadyExistsException, KeycloakRemoteException, - at.tuwien.exception.AccessDeniedException, BrokerRemoteException { + at.tuwien.exception.AccessDeniedException, BrokerRemoteException, BrokerVirtualHostCreationException { final SignupRequestDto request = SignupRequestDto.builder() .email(USER_1_EMAIL) .username(USER_1_USERNAME) @@ -304,7 +304,7 @@ public class UserEndpointUnitTest extends BaseUnitTest { protected void create_generic(SignupRequestDto data, User user) throws UserEmailAlreadyExistsException, RealmNotFoundException, UserAlreadyExistsException, UserNotFoundException, KeycloakRemoteException, - AccessDeniedException, BrokerRemoteException { + AccessDeniedException, BrokerRemoteException, BrokerVirtualHostCreationException { /* mock */ when(userService.create(data)) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/BrokerServiceGatewayTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/BrokerServiceGatewayTest.java index bfa22db2fb4cdbc2e42ed45e28fbc49898a2fe8f..567e9cbbc7d3fb9b1b4f953d8f57352cad636e9b 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/BrokerServiceGatewayTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/BrokerServiceGatewayTest.java @@ -107,7 +107,7 @@ public class BrokerServiceGatewayTest extends BaseUnitTest { } @Test - public void grantPermission_virtualHostNoRightsBefore_succeeds() throws BrokerRemoteException { + public void grantPermission_virtualHostNoRightsBefore_succeeds() throws BrokerRemoteException, BrokerVirtualHostGrantException { final ResponseEntity<Void> mock = ResponseEntity.status(HttpStatus.CREATED) .build(); @@ -120,7 +120,7 @@ public class BrokerServiceGatewayTest extends BaseUnitTest { } @Test - public void grantPermission_virtualHostRightsSame_succeeds() throws BrokerRemoteException { + public void grantPermission_virtualHostRightsSame_succeeds() throws BrokerRemoteException, BrokerVirtualHostGrantException { final ResponseEntity<Void> mock = ResponseEntity.status(HttpStatus.NO_CONTENT) .build(); @@ -148,7 +148,7 @@ public class BrokerServiceGatewayTest extends BaseUnitTest { } @Test - public void createUser_succeeds() throws BrokerRemoteException { + public void createUser_succeeds() throws BrokerRemoteException, BrokerVirtualHostCreationException { final ResponseEntity<Void> mock = ResponseEntity.status(HttpStatus.NO_CONTENT) .build(); 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 426f086caa7b394f7171d3c6fd8b48629883b6de..20aadf3a08e66db1846bd8bf37357b0fd0a3de93 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 @@ -117,7 +117,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_1_DTO); when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ generic_create(DATABASE_1_CREATE, DATABASE_1); @@ -133,7 +133,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_1_DTO); when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ generic_create(DATABASE_1_CREATE, DATABASE_1); @@ -151,7 +151,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { .thenReturn(DATABASE_2_DTO) .thenReturn(DATABASE_3_DTO); when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ generic_create(DATABASE_2_CREATE, DATABASE_2); @@ -169,7 +169,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { .thenReturn(DATABASE_3_DTO) .thenReturn(DATABASE_2_DTO); when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ generic_create(DATABASE_3_CREATE, DATABASE_3); @@ -185,7 +185,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_1_DTO); when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); final Database database = generic_create(DATABASE_1_CREATE, DATABASE_1); @@ -202,7 +202,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_1_DTO); when(queryConfig.getGrantPrivileges()) - .thenReturn("" /* (1) */, "ALL"/* (2) */); + .thenReturn("" /* (1) */, "SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"/* (2) */); /* test */ assertThrows(DatabaseMalformedException.class, () -> { @@ -220,7 +220,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { when(databaseIdxRepository.save(any(DatabaseDto.class))) .thenReturn(DATABASE_1_DTO); when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ assertThrows(SQLInvalidAuthorizationSpecException.class, () -> { @@ -239,7 +239,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ generic_insert(QUERY_4_STATEMENT, 1L); @@ -250,7 +250,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ generic_insert(QUERY_4_STATEMENT, 1L); @@ -263,7 +263,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ generic_system_insert(CONTAINER_1_PRIVILEGED_USERNAME, CONTAINER_1_PRIVILEGED_PASSWORD); @@ -274,7 +274,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ assertThrows(SQLException.class, () -> { @@ -287,7 +287,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { /* mock */ when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ generic_user_insert(CONTAINER_1_PRIVILEGED_USERNAME, CONTAINER_1_PRIVILEGED_PASSWORD); @@ -302,7 +302,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { mariaDbConfig.grantUserPermissions(CONTAINER_1, DATABASE_3, "junit1"); databaseAccessRepository.save(DATABASE_3_USER_1_WRITE_ALL_ACCESS); when(queryConfig.getGrantPrivileges()) - .thenCallRealMethod(); + .thenReturn("SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE"); /* test */ generic_user_insert("junit1", "junit1"); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java index a2059e3539defdbed471eea16cf665b3054690bc..7c0c8c5b5cafa57a37a87ffa2b498dbeb6093bf5 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java @@ -86,14 +86,14 @@ public class MessageQueueServiceIntegrationTest extends BaseUnitTest { } @Test - public void createUser_succeeds() throws BrokerRemoteException { + public void createUser_succeeds() throws BrokerRemoteException, BrokerVirtualHostCreationException { /* test */ messageQueueService.createUser(USER_1_USERNAME); } @Test - public void updatePermissions_empty_succeeds() throws BrokerRemoteException { + public void updatePermissions_empty_succeeds() throws BrokerRemoteException, BrokerVirtualHostGrantException { /* test */ final PermissionDto permissions = updatePermissions_generic(); @@ -105,7 +105,7 @@ public class MessageQueueServiceIntegrationTest extends BaseUnitTest { } @Test - public void updatePermissions_owner_succeeds() throws BrokerRemoteException { + public void updatePermissions_owner_succeeds() throws BrokerRemoteException, BrokerVirtualHostGrantException { /* mock */ when(databaseRepository.findConfigureAccess(USER_1_ID)) @@ -125,7 +125,7 @@ public class MessageQueueServiceIntegrationTest extends BaseUnitTest { } @Test - public void updatePermissions_ownerNoAccess_succeeds() throws BrokerRemoteException { + public void updatePermissions_ownerNoAccess_succeeds() throws BrokerRemoteException, BrokerVirtualHostGrantException { /* mock */ when(databaseRepository.findConfigureAccess(USER_1_ID)) @@ -164,7 +164,7 @@ public class MessageQueueServiceIntegrationTest extends BaseUnitTest { /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ - protected PermissionDto updatePermissions_generic() throws BrokerRemoteException { + protected PermissionDto updatePermissions_generic() throws BrokerRemoteException, BrokerVirtualHostGrantException { /* mock */ amqpUtils.createUser(USER_1_USERNAME, USER_1_RABBITMQ_CREATE_DTO); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/BrokerServiceGateway.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/BrokerServiceGateway.java index e1d3f15b8b872fbca4ee2564a8653ad12a76601f..0484e1c29a30970f2a003b485c33a34ece164bb5 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/BrokerServiceGateway.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/BrokerServiceGateway.java @@ -43,16 +43,18 @@ public interface BrokerServiceGateway { * Create user on the broker service * * @param username The new username. - * @throws BrokerRemoteException The Broker Service did not respond within the 3s timeout. + * @throws BrokerRemoteException The Broker Service did not respond within the 3s timeout. + * @throws BrokerVirtualHostCreationException The user could not be created. */ - void createUser(String username) throws BrokerRemoteException; + void createUser(String username) throws BrokerRemoteException, BrokerVirtualHostCreationException; /** * Grants a user permission at a virtual host in the queue service. * * @param username The username of the user. * @param data The grant data. - * @throws BrokerRemoteException The Broker Service did not respond within the 3s timeout. + * @throws BrokerRemoteException The Broker Service did not respond within the 3s timeout. + * @throws BrokerVirtualHostGrantException The permissions could not be granted. */ - void grantPermission(String username, GrantVirtualHostPermissionsDto data) throws BrokerRemoteException; + void grantPermission(String username, GrantVirtualHostPermissionsDto data) throws BrokerRemoteException, BrokerVirtualHostGrantException; } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java index 1e44ecec628e86676d2d4b546f848c7188fb38c3..23ab2985a1db6482a7c37fa1f07431d0ca13fa52 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java @@ -85,7 +85,7 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { } @Override - public void createUser(String username) throws BrokerRemoteException { + public void createUser(String username) throws BrokerRemoteException, BrokerVirtualHostCreationException { final CreateUserDto data = CreateUserDto.builder() .passwordHash("") .tags("") @@ -101,13 +101,14 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { } if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) { log.error("Failed to create user: {}", response.getStatusCode()); - throw new BrokerRemoteException("Failed to create user"); + throw new BrokerVirtualHostCreationException("Failed to create user"); } log.info("Created user with username {}", username); } @Override - public void grantPermission(String username, GrantVirtualHostPermissionsDto data) throws BrokerRemoteException { + public void grantPermission(String username, GrantVirtualHostPermissionsDto data) throws BrokerRemoteException, + BrokerVirtualHostGrantException { final String url = "/api/permissions/dbrepo/" + username; log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url); final ResponseEntity<Void> response; @@ -119,7 +120,7 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { } if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) { log.error("Failed to grant virtual host: {}", response.getStatusCode()); - throw new BrokerRemoteException("Failed to grant virtual host"); + throw new BrokerVirtualHostGrantException("Failed to grant virtual host"); } log.info("Grant permission for user with username {}", username); } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/MessageQueueService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/MessageQueueService.java index 63d5bd064a168343586aae5be63bf052572d62bf..50fe5233773cff80774be54bb3c09f7ceb68ef74 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/MessageQueueService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/MessageQueueService.java @@ -49,7 +49,7 @@ public interface MessageQueueService { * @param username The username. * @throws BrokerRemoteException The user could not be created. */ - void createUser(String username) throws BrokerRemoteException; + void createUser(String username) throws BrokerRemoteException, BrokerVirtualHostCreationException; /** diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/RabbitMqServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/RabbitMqServiceImpl.java index 320c321614c4fc8d152ec8263d2eecb5ef32bd38..56c102131aa3a79b72f8b9c18f9f233902bac584 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/RabbitMqServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/RabbitMqServiceImpl.java @@ -10,6 +10,7 @@ import at.tuwien.entities.user.User; import at.tuwien.exception.AmqpException; import at.tuwien.exception.BrokerRemoteException; import at.tuwien.exception.BrokerVirtualHostCreationException; +import at.tuwien.exception.BrokerVirtualHostGrantException; import at.tuwien.gateway.BrokerServiceGateway; import at.tuwien.mapper.AmqpMapper; import at.tuwien.repository.mdb.DatabaseRepository; @@ -103,12 +104,12 @@ public class RabbitMqServiceImpl implements MessageQueueService { } @Override - public void createUser(String username) throws BrokerRemoteException { + public void createUser(String username) throws BrokerRemoteException, BrokerVirtualHostCreationException { brokerServiceGateway.createUser(username); } @Override - public void updatePermissions(User user) throws BrokerRemoteException { + public void updatePermissions(User user) throws BrokerRemoteException, BrokerVirtualHostGrantException { final GrantVirtualHostPermissionsDto permissions = GrantVirtualHostPermissionsDto.builder() .configure(amqpMapper.databaseListToPermissionString(databaseRepository.findConfigureAccess(user.getId()))) .write(amqpMapper.databaseListToPermissionString(databaseRepository.findWriteAccess(user.getId())))