Skip to content

Commit 7a91e19

Browse files
committed
Do not allow for CRM role invitations
1 parent aa68c68 commit 7a91e19

File tree

3 files changed

+51
-11
lines changed

3 files changed

+51
-11
lines changed

server/src/main/java/invite/api/InvitationController.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
import java.util.Map;
8282
import java.util.Optional;
8383
import java.util.Set;
84+
import java.util.concurrent.atomic.AtomicBoolean;
8485
import java.util.stream.Collectors;
8586

8687
import static invite.SwaggerOpenIdConfig.API_TOKENS_SCHEME_NAME;
@@ -557,17 +558,29 @@ private void checkEmailEquality(User user, Invitation invitation) {
557558
}
558559

559560
private void checkCrmUniqueOrganisation(User user, Invitation invitation) {
560-
if (StringUtils.hasText(invitation.getCrmContactId()) &&
561-
StringUtils.hasText(user.getCrmContactId()) &&
562-
user.getCrmContactId().equals(invitation.getCrmContactId()) &&
563-
!user.getCrmOrganisationId().equals(invitation.getCrmOrganisationId())) {
564-
throw new InvitationUniqueCrmOrganisationException(
565-
String.format("User %s is not allowed to accept an invitation from Organisation %s, because it already has roles for Organisation %s",
566-
user.getEmail(),
567-
invitation.getCrmOrganisationId(),
568-
user.getCrmOrganisationId()
569-
));
570-
561+
String invitationCrmContactId = invitation.getCrmContactId();
562+
if (StringUtils.hasText(invitationCrmContactId)) {
563+
String userCrmOrganisationId = user.getCrmOrganisationId();
564+
AtomicBoolean throwException = new AtomicBoolean(false);
565+
if (StringUtils.hasText(userCrmOrganisationId) &&
566+
!userCrmOrganisationId.equals(invitation.getCrmOrganisationId())) {
567+
throwException.set(true);
568+
}
569+
Optional<User> optionalUser = userRepository.findByCrmContactIdAndCrmOrganisationId(
570+
invitationCrmContactId, invitation.getCrmOrganisationId());
571+
optionalUser.ifPresent(userFromDB -> {
572+
if (!userFromDB.getId().equals(user.getId())) {
573+
throwException.set(true);
574+
}
575+
});
576+
if (throwException.get()) {
577+
throw new InvitationUniqueCrmOrganisationException(
578+
String.format("User %s is not allowed to accept an invitation from Organisation %s, because it already has roles for Organisation %s",
579+
user.getEmail(),
580+
invitation.getCrmOrganisationId(),
581+
userCrmOrganisationId
582+
));
583+
}
571584
}
572585
}
573586
}

server/src/main/java/invite/api/InvitationOperations.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.springframework.http.HttpStatus;
2020
import org.springframework.http.ResponseEntity;
2121
import org.springframework.util.CollectionUtils;
22+
import org.springframework.util.StringUtils;
2223

2324
import java.time.Instant;
2425
import java.time.Period;
@@ -51,6 +52,7 @@ public ResponseEntity<InvitationResponse> sendInvitation(InvitationRequest invit
5152
//We need to assert validations on the roles soo we need to load them
5253
List<Role> requestedRoles = invitationRequest.getRoleIdentifiers().stream()
5354
.map(id -> invitationResource.getRoleRepository().findById(id)
55+
.filter(role -> !StringUtils.hasText(role.getCrmRoleId()))
5456
.orElseThrow(() -> new NotFoundException("Role not found"))).toList();
5557

5658
if (user != null) {

server/src/test/java/invite/api/InvitationControllerTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ void accept() throws Exception {
303303
@Test
304304
void acceptWithCRMConstraint() throws Exception {
305305
AccessCookieFilter accessCookieFilter = openIDConnectFlow("/api/v1/users/login", KB_USER_SUB);
306+
306307
String hash = Authority.GUEST.name();
307308
Invitation invitation = invitationRepository.findByHash(hash).get();
308309
invitation.setCrmOrganisationId(UUID.randomUUID().toString());
@@ -321,6 +322,30 @@ void acceptWithCRMConstraint() throws Exception {
321322
.then()
322323
.statusCode(HttpStatus.NOT_ACCEPTABLE.value());
323324
}
325+
326+
@Test
327+
void acceptWithCRMConstraintDuplicateProfile() throws Exception {
328+
AccessCookieFilter accessCookieFilter = openIDConnectFlow("/api/v1/users/login", GUEST_SUB);
329+
330+
String hash = Authority.GUEST.name();
331+
Invitation invitation = invitationRepository.findByHash(hash).get();
332+
invitation.setCrmOrganisationId(CRM_ORGANIZATION_ID);
333+
invitation.setCrmContactId(CRM_CONTACT_ID);
334+
invitationRepository.save(invitation);
335+
336+
AcceptInvitation acceptInvitation = new AcceptInvitation(hash, invitation.getId());
337+
given()
338+
.when()
339+
.filter(accessCookieFilter.cookieFilter())
340+
.accept(ContentType.JSON)
341+
.header(accessCookieFilter.csrfToken().getHeaderName(), accessCookieFilter.csrfToken().getToken())
342+
.contentType(ContentType.JSON)
343+
.body(acceptInvitation)
344+
.post("/api/v1/invitations/accept")
345+
.then()
346+
.statusCode(HttpStatus.NOT_ACCEPTABLE.value());
347+
}
348+
324349
@Test
325350
void acceptGraph() throws Exception {
326351
AccessCookieFilter accessCookieFilter = openIDConnectFlow("/api/v1/users/login", "graph@new.com");

0 commit comments

Comments
 (0)