diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantController.java b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantController.java index 9cfd6482..89fe83e1 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantController.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantController.java @@ -60,4 +60,22 @@ public class RbacGrantController implements RbacgrantsApi { return ResponseEntity.created(uri).build(); } + @Override + @Transactional + public ResponseEntity revokeRoleFromUser( + final String currentUser, + final String assumedRoles, + final UUID grantedRoleUuid, + final UUID granteeUserUuid) { + + context.setCurrentUser(currentUser); + if (assumedRoles != null && !assumedRoles.isBlank()) { + context.assumeRoles(assumedRoles); + } + + rbacGrantRepository.deleteByRbacGrantId(new RbacGrantId(granteeUserUuid, grantedRoleUuid)); + + return ResponseEntity.noContent().build(); + } + } diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantEntity.java b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantEntity.java index 72d4c711..5520f396 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantEntity.java @@ -53,6 +53,10 @@ public class RbacGrantEntity { @Enumerated(EnumType.STRING) private RbacRoleType grantedRoleType; + RbacGrantId getRbacGrantId() { + return new RbacGrantId(granteeUserUuid, grantedRoleUuid); + } + public String toDisplay() { return "{ grant " + (assumed ? "assumed " : "") + "role " + grantedRoleIdName + " to user " + granteeUserName + " by role " + grantedByRoleIdName + " }"; diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantId.java b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantId.java index bc87a2b8..4c3449e7 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantId.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantId.java @@ -1,5 +1,6 @@ package net.hostsharing.hsadminng.rbac.rbacgrant; +import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,6 +11,7 @@ import java.util.UUID; @Getter @EqualsAndHashCode @NoArgsConstructor +@AllArgsConstructor public class RbacGrantId implements Serializable { private UUID granteeUserUuid; diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantRepository.java b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantRepository.java index ae589e7e..079beb09 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantRepository.java @@ -1,5 +1,7 @@ package net.hostsharing.hsadminng.rbac.rbacgrant; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import java.util.List; @@ -10,5 +12,11 @@ public interface RbacGrantRepository extends Repository findAllGrantsOfUser(final String userName) { return jpaAttempt.transacted(() -> { context.setCurrentUser(userName); diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantRepositoryIntegrationTest.java index 0e324e9d..6350c7fd 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantRepositoryIntegrationTest.java @@ -132,7 +132,9 @@ class RbacGrantRepositoryIntegrationTest { @Transactional(propagation = Propagation.NEVER) public void packageAdmin_canNotGrantPackageOwnerRole() { // given - record Given(RbacUserEntity arbitraryUser, UUID packageOwnerRoleUuid) {} + record Given(RbacUserEntity arbitraryUser, UUID packageOwnerRoleUuid) { + + } final var given = jpaAttempt.transacted(() -> { // to find the uuids of we need to have access rights to these currentUser("admin@aaa.example.com"); @@ -184,7 +186,7 @@ class RbacGrantRepositoryIntegrationTest { currentUser("admin@aaa.example.com"); assumedRoles("customer#aaa.admin"); final var revokeAttempt = attempt(em, () -> { - rbacGrantRepository.delete(grant); + rbacGrantRepository.deleteByRbacGrantId(grant.getRbacGrantId()); }); // then @@ -207,7 +209,7 @@ class RbacGrantRepositoryIntegrationTest { currentUser("aaa00@aaa.example.com"); assumedRoles("package#aaa00.admin"); final var revokeAttempt = attempt(em, () -> { - rbacGrantRepository.delete(grant); + rbacGrantRepository.deleteByRbacGrantId(grant.getRbacGrantId()); }); // then @@ -231,7 +233,7 @@ class RbacGrantRepositoryIntegrationTest { currentUser("aaa00@aaa.example.com"); assumedRoles("package#aaa00.admin"); final var revokeAttempt = attempt(em, () -> { - rbacGrantRepository.delete(grant); + rbacGrantRepository.deleteByRbacGrantId(grant.getRbacGrantId()); }); // then