Skip to content

Commit ae28a5c

Browse files
committed
UY-1126 fix searching by email used in upman
1 parent d445264 commit ae28a5c

File tree

4 files changed

+176
-67
lines changed

4 files changed

+176
-67
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* Copyright (c) 2021 Bixbit - Krzysztof Benedyczak. All rights reserved.
3+
* See LICENCE.txt file for licensing information.
4+
*/
5+
package pl.edu.icm.unity.engine.project;
6+
7+
import java.util.Map;
8+
import java.util.stream.Collectors;
9+
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.beans.factory.annotation.Qualifier;
12+
import org.springframework.stereotype.Component;
13+
14+
import pl.edu.icm.unity.engine.api.bulk.BulkGroupQueryService;
15+
import pl.edu.icm.unity.engine.api.bulk.EntityInGroupData;
16+
import pl.edu.icm.unity.engine.api.bulk.GroupMembershipData;
17+
import pl.edu.icm.unity.exceptions.EngineException;
18+
import pl.edu.icm.unity.stdext.identity.EmailIdentity;
19+
import pl.edu.icm.unity.stdext.utils.ContactEmailMetadataProvider;
20+
import pl.edu.icm.unity.types.basic.Attribute;
21+
import pl.edu.icm.unity.types.basic.Identity;
22+
import pl.edu.icm.unity.types.basic.VerifiableElementBase;
23+
import pl.edu.icm.unity.types.basic.VerifiableEmail;
24+
25+
26+
@Component
27+
class ExistingUserFinder
28+
{
29+
private final BulkGroupQueryService bulkService;
30+
private final ProjectAttributeHelper attrHelper;
31+
32+
@Autowired
33+
ExistingUserFinder(@Qualifier("insecure") BulkGroupQueryService bulkService, ProjectAttributeHelper attrHelper)
34+
{
35+
this.bulkService = bulkService;
36+
this.attrHelper = attrHelper;
37+
}
38+
39+
Long getEntityIdByContactAddress(String contactAddress) throws EngineException
40+
{
41+
GroupMembershipData bulkMembershipData = bulkService.getBulkMembershipData("/");
42+
Map<Long, EntityInGroupData> members = bulkService.getMembershipInfo(bulkMembershipData);
43+
44+
VerifiableEmail searchedEmail = new VerifiableEmail(contactAddress);
45+
String searchedComparable = searchedEmail.getComparableValue();
46+
47+
for (EntityInGroupData info : members.values())
48+
{
49+
Identity emailId = info.entity.getIdentities().stream()
50+
.filter(id -> id.getTypeId().equals(EmailIdentity.ID))
51+
.filter(id -> emailsEqual(searchedComparable, id))
52+
.findAny().orElse(null);
53+
if (emailId != null)
54+
return info.entity.getId();
55+
}
56+
57+
return searchEntityByEmailAttr(members, searchedComparable);
58+
}
59+
60+
private boolean emailsEqual(String comparableEmail1, Identity emailIdentity)
61+
{
62+
VerifiableEmail verifiableEmail = EmailIdentity.fromIdentityParam(emailIdentity);
63+
return comparableEmail1.equals(verifiableEmail.getComparableValue());
64+
}
65+
66+
private Long searchEntityByEmailAttr(Map<Long, EntityInGroupData> membersWithGroups, String comparableContactAddress)
67+
throws EngineException
68+
{
69+
for (EntityInGroupData info : membersWithGroups.values())
70+
{
71+
VerifiableElementBase contactEmail = attrHelper.searchVerifiableAttributeValueByMeta(ContactEmailMetadataProvider.NAME,
72+
info.groupAttributesByName.values().stream().map(e -> (Attribute) e)
73+
.collect(Collectors.toList()));
74+
if (contactEmail != null && contactEmail.getValue() != null)
75+
{
76+
VerifiableEmail verifiableEmail = (VerifiableEmail)contactEmail;
77+
if (verifiableEmail.getComparableValue().equals(comparableContactAddress))
78+
return info.entity.getId();
79+
}
80+
}
81+
82+
return null;
83+
}
84+
}

engine/src/main/java/pl/edu/icm/unity/engine/project/ProjectInvitationsManagementImpl.java

Lines changed: 5 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,18 @@
2424
import pl.edu.icm.unity.engine.api.GroupsManagement;
2525
import pl.edu.icm.unity.engine.api.InvitationManagement;
2626
import pl.edu.icm.unity.engine.api.RegistrationsManagement;
27-
import pl.edu.icm.unity.engine.api.bulk.BulkGroupQueryService;
28-
import pl.edu.icm.unity.engine.api.bulk.GroupMembershipData;
29-
import pl.edu.icm.unity.engine.api.bulk.EntityInGroupData;
3027
import pl.edu.icm.unity.engine.api.endpoint.SharedEndpointManagement;
3128
import pl.edu.icm.unity.engine.api.project.ProjectInvitation;
3229
import pl.edu.icm.unity.engine.api.project.ProjectInvitationParam;
3330
import pl.edu.icm.unity.engine.api.project.ProjectInvitationsManagement;
3431
import pl.edu.icm.unity.engine.api.registration.PublicRegistrationURLSupport;
3532
import pl.edu.icm.unity.exceptions.EngineException;
3633
import pl.edu.icm.unity.stdext.identity.EmailIdentity;
37-
import pl.edu.icm.unity.stdext.utils.ContactEmailMetadataProvider;
38-
import pl.edu.icm.unity.types.basic.Attribute;
3934
import pl.edu.icm.unity.types.basic.EntityParam;
4035
import pl.edu.icm.unity.types.basic.GroupContents;
4136
import pl.edu.icm.unity.types.basic.GroupDelegationConfiguration;
4237
import pl.edu.icm.unity.types.basic.GroupMembership;
43-
import pl.edu.icm.unity.types.basic.Identity;
4438
import pl.edu.icm.unity.types.basic.IdentityParam;
45-
import pl.edu.icm.unity.types.basic.VerifiableElementBase;
4639
import pl.edu.icm.unity.types.confirmation.ConfirmationInfo;
4740
import pl.edu.icm.unity.types.registration.BaseForm;
4841
import pl.edu.icm.unity.types.registration.EnquiryForm;
@@ -56,11 +49,6 @@
5649
import pl.edu.icm.unity.types.registration.invite.PrefilledEntryMode;
5750
import pl.edu.icm.unity.types.registration.invite.RegistrationInvitationParam;
5851

59-
/**
60-
* Implementation of {@link ProjectInvitationsManagement}
61-
*
62-
* @author P.Piernik
63-
*/
6452
@Component
6553
@Primary
6654
public class ProjectInvitationsManagementImpl implements ProjectInvitationsManagement
@@ -71,37 +59,34 @@ public class ProjectInvitationsManagementImpl implements ProjectInvitationsManag
7159
private final SharedEndpointManagement sharedEndpointMan;
7260
private final RegistrationsManagement registrationMan;
7361
private final EnquiryManagement enquiryMan;
74-
private final BulkGroupQueryService bulkService;
75-
private final ProjectAttributeHelper attrHelper;
7662
private final EntityManagement entityMan;
63+
private final ExistingUserFinder existingUserFinder;
7764

7865
public ProjectInvitationsManagementImpl(@Qualifier("insecure") InvitationManagement invitationMan,
7966
@Qualifier("insecure") GroupsManagement groupMan,
8067
@Qualifier("insecure") RegistrationsManagement registrationMan,
8168
@Qualifier("insecure") EnquiryManagement enquiryMan,
82-
@Qualifier("insecure") BulkGroupQueryService bulkService,
8369
@Qualifier("insecure") EntityManagement entityMan,
84-
ProjectAttributeHelper attrHelper,
8570
SharedEndpointManagement sharedEndpointMan,
86-
ProjectAuthorizationManager authz)
71+
ProjectAuthorizationManager authz,
72+
ExistingUserFinder existingUserFinder)
8773
{
8874
this.invitationMan = invitationMan;
8975
this.groupMan = groupMan;
9076
this.entityMan = entityMan;
9177
this.sharedEndpointMan = sharedEndpointMan;
9278
this.registrationMan = registrationMan;
9379
this.enquiryMan = enquiryMan;
94-
this.bulkService = bulkService;
95-
this.attrHelper = attrHelper;
9680
this.authz = authz;
81+
this.existingUserFinder = existingUserFinder;
9782
}
9883

9984
@Override
10085
public String addInvitation(ProjectInvitationParam param) throws EngineException
10186
{
10287
authz.assertManagerAuthorization(param.project);
10388

104-
Long entity = getEntityByContactAddress(param.contactAddress);
89+
Long entity = existingUserFinder.getEntityIdByContactAddress(param.contactAddress);
10590
String code = null;
10691
if (entity == null)
10792
{
@@ -123,45 +108,6 @@ private void assertNotMemberAlready(long entityId, String projectGroup) throws E
123108
throw new AlreadyMemberException();
124109
}
125110

126-
private Long getEntityByContactAddress(String contactAddress) throws EngineException
127-
{
128-
GroupMembershipData bulkMembershipData = bulkService.getBulkMembershipData("/");
129-
Map<Long, EntityInGroupData> members = bulkService.getMembershipInfo(bulkMembershipData);
130-
131-
for (EntityInGroupData info : members.values())
132-
{
133-
Identity emailId = info.entity.getIdentities().stream()
134-
.filter(id -> id.getTypeId().equals(EmailIdentity.ID)
135-
&& id.getValue().equals(contactAddress))
136-
.findAny().orElse(null);
137-
if (emailId != null)
138-
{
139-
return info.entity.getId();
140-
}
141-
142-
}
143-
144-
return searchEntityByEmailAttr(members, contactAddress);
145-
}
146-
147-
private Long searchEntityByEmailAttr(Map<Long, EntityInGroupData> membersWithGroups, String contactAddress)
148-
throws EngineException
149-
{
150-
for (EntityInGroupData info : membersWithGroups.values())
151-
{
152-
VerifiableElementBase contactEmail = attrHelper.searchVerifiableAttributeValueByMeta(ContactEmailMetadataProvider.NAME,
153-
info.groupAttributesByName.values().stream().map(e -> (Attribute) e)
154-
.collect(Collectors.toList()));
155-
if (contactEmail != null && contactEmail.getValue() != null
156-
&& contactEmail.getValue().equals(contactAddress))
157-
{
158-
return info.entity.getId();
159-
}
160-
}
161-
162-
return null;
163-
}
164-
165111
private EnquiryInvitationParam getEnquiryInvitation(ProjectInvitationParam param, Long entityId)
166112
throws EngineException
167113
{
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright (c) 2021 Bixbit - Krzysztof Benedyczak. All rights reserved.
3+
* See LICENCE.txt file for licensing information.
4+
*/
5+
package pl.edu.icm.unity.engine.project;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
import static org.mockito.ArgumentMatchers.any;
9+
import static org.mockito.ArgumentMatchers.eq;
10+
import static org.mockito.Mockito.mock;
11+
import static org.mockito.Mockito.when;
12+
13+
import org.junit.Test;
14+
15+
import com.google.common.collect.ImmutableMap;
16+
import com.google.common.collect.Lists;
17+
18+
import pl.edu.icm.unity.engine.api.bulk.BulkGroupQueryService;
19+
import pl.edu.icm.unity.engine.api.bulk.EntityInGroupData;
20+
import pl.edu.icm.unity.exceptions.EngineException;
21+
import pl.edu.icm.unity.exceptions.IllegalIdentityValueException;
22+
import pl.edu.icm.unity.stdext.attr.VerifiableEmailAttribute;
23+
import pl.edu.icm.unity.stdext.identity.EmailIdentity;
24+
import pl.edu.icm.unity.stdext.utils.ContactEmailMetadataProvider;
25+
import pl.edu.icm.unity.types.basic.AttributeExt;
26+
import pl.edu.icm.unity.types.basic.Entity;
27+
import pl.edu.icm.unity.types.basic.EntityInformation;
28+
import pl.edu.icm.unity.types.basic.Identity;
29+
import pl.edu.icm.unity.types.basic.IdentityParam;
30+
import pl.edu.icm.unity.types.basic.VerifiableEmail;
31+
32+
public class ExistingUserFinderTest
33+
{
34+
private static final EmailIdentity emailIdType = new EmailIdentity();
35+
private BulkGroupQueryService bulkService = mock(BulkGroupQueryService.class);
36+
private ProjectAttributeHelper attrHelper = mock(ProjectAttributeHelper.class);
37+
38+
@Test
39+
public void shouldFindByIdentityCaseInsensitive() throws EngineException
40+
{
41+
EntityInGroupData entityData = new EntityInGroupData(
42+
createEmailEntity("[email protected]", 13),
43+
null,
44+
null,
45+
null,
46+
null,
47+
null);
48+
when(bulkService.getMembershipInfo(any())).thenReturn(ImmutableMap.of(13l, entityData));
49+
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper);
50+
51+
Long entityIdByContactAddress = userFinder.getEntityIdByContactAddress("[email protected]");
52+
53+
assertThat(entityIdByContactAddress).isEqualTo(13);
54+
}
55+
56+
@Test
57+
public void shouldFindByAttributeCaseInsensitive() throws EngineException
58+
{
59+
AttributeExt emailAttr = new AttributeExt(VerifiableEmailAttribute.of("email", "/", "[email protected]"), true);
60+
EntityInGroupData entityData = new EntityInGroupData(
61+
createEmailEntity("[email protected]", 13),
62+
null,
63+
null,
64+
ImmutableMap.of("email", emailAttr),
65+
null,
66+
null);
67+
when(bulkService.getMembershipInfo(any())).thenReturn(ImmutableMap.of(13l, entityData));
68+
when(attrHelper.searchVerifiableAttributeValueByMeta(eq(ContactEmailMetadataProvider.NAME), any()))
69+
.thenReturn(VerifiableEmail.fromJsonString(emailAttr.getValues().get(0)));
70+
ExistingUserFinder userFinder = new ExistingUserFinder(bulkService, attrHelper);
71+
72+
Long entityIdByContactAddress = userFinder.getEntityIdByContactAddress("[email protected]");
73+
74+
assertThat(entityIdByContactAddress).isEqualTo(13);
75+
}
76+
77+
private Entity createEmailEntity(String email, long entityId) throws IllegalIdentityValueException
78+
{
79+
IdentityParam idParam = emailIdType.convertFromString(email, "ridp", null);
80+
Identity identity = new Identity(idParam, entityId, emailIdType.getComparableValue(idParam.getValue(), "realm", null));
81+
return new Entity(Lists.newArrayList(identity), new EntityInformation(13), null);
82+
}
83+
}

engine/src/test/java/pl/edu/icm/unity/engine/project/TestProjectInvitationManagement.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,6 @@
5050
import pl.edu.icm.unity.types.registration.invite.InvitationWithCode;
5151
import pl.edu.icm.unity.types.registration.invite.RegistrationInvitationParam;
5252

53-
/**
54-
*
55-
* @author P.Piernik
56-
*
57-
*/
5853
@RunWith(MockitoJUnitRunner.class)
5954
public class TestProjectInvitationManagement extends TestProjectBase
6055
{
@@ -66,11 +61,12 @@ public class TestProjectInvitationManagement extends TestProjectBase
6661
@Before
6762
public void initProjectInvitationMan()
6863
{
64+
ExistingUserFinder userFinder = new ExistingUserFinder(mockBulkQueryService,
65+
new ProjectAttributeHelper(mockAttrMan, mockAttrHelper, mockAtHelper));
6966
projectInvMan = new ProjectInvitationsManagementImpl(mockInvitationMan, mockGroupMan,
70-
mockRegistrationMan, mockEnquiryMan, mockBulkQueryService,
67+
mockRegistrationMan, mockEnquiryMan,
7168
mockIdMan,
72-
new ProjectAttributeHelper(mockAttrMan, mockAttrHelper, mockAtHelper),
73-
mockSharedEndpointMan, mockAuthz);
69+
mockSharedEndpointMan, mockAuthz, userFinder);
7470
}
7571

7672
@Test

0 commit comments

Comments
 (0)