Skip to content

Commit 847bfdd

Browse files
authored
fix: prevent NPE and correct process manager group condition - EXO-82244 (#456)
prevent NPE and correct process manager group condition
1 parent e759868 commit 847bfdd

File tree

8 files changed

+39
-14
lines changed

8 files changed

+39
-14
lines changed

processes-api/src/main/java/org/exoplatform/processes/model/ProcessesFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ public class ProcessesFilter {
2828
private String query;
2929
private Boolean enabled;
3030
private Boolean manager;
31-
31+
private Boolean isProcessManager;
3232
}

processes-services/src/main/java/org/exoplatform/processes/dao/WorkFlowDAO.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,17 @@ private String buildWorkflowQuery(ProcessesFilter processesFilter, List<String>
5555
String q = processesFilter.getQuery();
5656
Boolean enabled = processesFilter.getEnabled();
5757
Boolean manager = processesFilter.getManager();
58-
boolean managerProcess = memberships.stream().anyMatch(m -> m.endsWith("platform/processes"));
58+
boolean isProcessManager = processesFilter.getIsProcessManager();
5959
String query = " ( workFlow.title like '%" + q + "%' OR workFlow.description like '%" + q + "%' OR workFlow.summary like '%" + q + "%' )";
6060
String queryString = "SELECT DISTINCT workFlow FROM WorkFlow workFlow";
61-
if (enabled != null || manager == true || managerProcess == false) {
62-
if(memberships != null) {
61+
if (enabled != null || Boolean.TRUE.equals(manager) || !isProcessManager) {
62+
if (memberships != null) {
6363
if ( Boolean.FALSE.equals(manager)) {
6464
queryString = queryString + " LEFT JOIN workFlow.manager manager";
6565
}
6666
queryString = queryString + " LEFT JOIN workFlow.participator participator";
6767
}
68-
if(StringUtils.isNotEmpty(q) || memberships != null || enabled != null){
68+
if (StringUtils.isNotEmpty(q) || memberships != null || enabled != null){
6969
queryString = queryString + " WHERE";
7070
if (StringUtils.isNotEmpty(q)){
7171
queryString = queryString + query;

processes-services/src/main/java/org/exoplatform/processes/rest/ProcessesRest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.exoplatform.services.rest.resource.ResourceContainer;
5151
import org.exoplatform.services.security.ConversationState;
5252
import org.exoplatform.services.security.Identity;
53+
import org.exoplatform.services.security.IdentityRegistry;
5354
import org.exoplatform.social.core.manager.IdentityManager;
5455

5556

@@ -63,6 +64,8 @@ public class ProcessesRest implements ResourceContainer {
6364

6465
private IdentityManager identityManager;
6566

67+
private IdentityRegistry identityRegistry;
68+
6669
private ProcessesAttachmentService processesAttachmentService;
6770

6871
private static final int CACHE_DURATION_SECONDS = 31536000;
@@ -71,15 +74,19 @@ public class ProcessesRest implements ResourceContainer {
7174

7275
private static final CacheControl ILLUSTRATION_CACHE_CONTROL = new CacheControl();
7376

77+
private static final String PROCESSES_GROUP = "/platform/processes";
78+
7479
static {
7580
ILLUSTRATION_CACHE_CONTROL.setMaxAge(CACHE_DURATION_SECONDS);
7681
}
7782

7883
public ProcessesRest(ProcessesService processesService,
7984
IdentityManager identityManager,
85+
IdentityRegistry identityRegistry,
8086
ProcessesAttachmentService processesAttachmentService) {
8187
this.processesService = processesService;
8288
this.identityManager = identityManager;
89+
this.identityRegistry = identityRegistry;
8390
this.processesAttachmentService = processesAttachmentService;
8491
}
8592

@@ -133,10 +140,12 @@ public Response getWorkFlows(@Parameter(name = "Identity technical identifier",
133140
if (query != null) {
134141
filter.setQuery(query);
135142
}
143+
136144
long userIdentityId = currentIdentityId;
137145
if (userId != null) {
138146
userIdentityId = userId;
139147
}
148+
filter.setIsProcessManager(RestUtils.isProcessesGroupMember(identityManager, identityRegistry, userIdentityId));
140149
List<WorkFlow> workFlows = processesService.getWorkFlows(filter, offset, limit, userIdentityId);
141150
return Response.ok(EntityBuilder.toRestEntities(workFlows, expand)).build();
142151
} catch (Exception e) {

processes-services/src/main/java/org/exoplatform/processes/rest/util/RestUtils.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.exoplatform.processes.rest.util;
1818

1919
import org.exoplatform.services.security.ConversationState;
20+
import org.exoplatform.services.security.IdentityRegistry;
2021
import org.exoplatform.social.core.identity.model.Identity;
2122
import org.exoplatform.social.core.manager.IdentityManager;
2223

@@ -45,4 +46,18 @@ public static final long getCurrentUserIdentityId(IdentityManager identityManage
4546
public static boolean isProcessesGroupMember(org.exoplatform.services.security.Identity identity) {
4647
return identity != null && identity.isMemberOf(PROCESSES_GROUP);
4748
}
49+
50+
public static boolean isProcessesGroupMember(IdentityManager identityManager, IdentityRegistry identityRegistry, long userId) {
51+
Identity identity = identityManager.getIdentity(userId);
52+
if (identity == null) {
53+
return false;
54+
}
55+
56+
String remoteId = identity.getRemoteId();
57+
if (remoteId == null) {
58+
return false;
59+
}
60+
61+
return isProcessesGroupMember(identityRegistry.getIdentity(remoteId));
62+
}
4863
}

processes-services/src/main/java/org/exoplatform/processes/storage/ProcessesStorageImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,6 @@ public List<WorkFlow> findWorkFlows(ProcessesFilter processesFilter, long userId
585585
Collection<Membership> ms = organizationService.getMembershipHandler().findMembershipsByUser(userName);
586586
if (ms != null) {
587587
for (Membership membership : ms) {
588-
isMemberProcessesGroup = false;
589588
if (membership.getGroupId().equals(PROCESSES_GROUP)) {
590589
isMemberProcessesGroup = true;
591590
}

processes-services/src/test/java/org/exoplatform/processes/rest/EntityBuilderTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public static void afterRunBare() throws Exception { // NOSONAR
7474
public void setUp() {
7575
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
7676
identityRegistry = mock(IdentityRegistry.class);
77-
this.processesRest = new ProcessesRest(processesService, identityManager, processesAttachmentService);
77+
this.processesRest = new ProcessesRest(processesService, identityManager, identityRegistry, processesAttachmentService);
7878
}
7979

8080
@Test

processes-services/src/test/java/org/exoplatform/processes/rest/ProcessesRestTest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package org.exoplatform.processes.rest;
22

33
import static org.junit.Assert.assertEquals;
4-
import static org.mockito.ArgumentMatchers.any;
5-
import static org.mockito.ArgumentMatchers.anyLong;
6-
import static org.mockito.ArgumentMatchers.anyString;
4+
import static org.mockito.ArgumentMatchers.*;
75
import static org.mockito.Mockito.doNothing;
86
import static org.mockito.Mockito.doThrow;
97
import static org.mockito.Mockito.mock;
@@ -25,6 +23,7 @@
2523
import javax.ws.rs.core.Response;
2624
import javax.ws.rs.ext.RuntimeDelegate;
2725

26+
import org.exoplatform.services.security.IdentityRegistry;
2827
import org.junit.AfterClass;
2928
import org.junit.Before;
3029
import org.junit.Test;
@@ -81,6 +80,9 @@ public class ProcessesRestTest {
8180
@Mock
8281
private ProcessesAttachmentService processesAttachmentService;
8382

83+
@Mock
84+
private IdentityRegistry identityRegistry;
85+
8486
private ProcessesRest processesRest;
8587

8688
@Mock
@@ -98,7 +100,7 @@ public static void afterRunBare() throws Exception { // NOSONAR
98100
@Before
99101
public void setUp() {
100102
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
101-
this.processesRest = new ProcessesRest(processesService, identityManager, processesAttachmentService);
103+
this.processesRest = new ProcessesRest(processesService, identityManager, identityRegistry, processesAttachmentService);
102104

103105
ConversationState conversationState = mock(ConversationState.class);
104106
CONVERSATION_STATE.when(() -> ConversationState.getCurrent()).thenReturn(conversationState);
@@ -123,7 +125,7 @@ public void getWorkFlows() throws Exception {
123125
ENTITY_BUILDER.when(() -> EntityBuilder.toRestEntities(workFlows, null)).thenReturn(workFlowEntities);
124126
Response response2 = processesRest.getWorkFlows(1L, true, null, "test", null, 0, 10);
125127
assertEquals(response2.getStatus(), Response.Status.OK.getStatusCode());
126-
when(processesService.getWorkFlows(processesFilter, 0, 10, 1L)).thenThrow(RuntimeException.class);
128+
when(processesService.getWorkFlows(any(ProcessesFilter.class), anyInt(), anyInt(), anyLong())).thenThrow(RuntimeException.class);
127129
Response response3 = processesRest.getWorkFlows(1L, null, null, null, null, 0, 10);
128130
assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response3.getStatus());
129131

processes-services/src/test/java/org/exoplatform/processes/storage/ProcessesStorageImplTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ public void findWorkflow() throws Exception {
653653
newWorkFlowEntity1.setId(1L);
654654
newWorkFlowEntity1.setProjectId(1L);
655655
when(workFlowDAO.create(workFlowEntity)).thenReturn(newWorkFlowEntity);
656-
ProcessesFilter filter = new ProcessesFilter("", null, null);
656+
ProcessesFilter filter = new ProcessesFilter("", null, null, true);
657657
List<WorkFlowEntity> workFlowEntities = new ArrayList<>();
658658
workFlowEntities.add(newWorkFlowEntity);
659659
memberships = new ArrayList<>();
@@ -756,7 +756,7 @@ public void countWorkflow() {
756756
newWorkFlowEntity.toString();
757757
newWorkFlowEntity.equals(workFlow);
758758
when(workFlowDAO.create(workFlowEntity)).thenReturn(newWorkFlowEntity);
759-
ProcessesFilter filter = new ProcessesFilter("", null, true);
759+
ProcessesFilter filter = new ProcessesFilter("", null, true, true);
760760
when(workFlowDAO.countWorkFlows(filter)).thenReturn(1);
761761
when(workFlow.getIllustrativeAttachment()).thenReturn(illustrativeAttachment);
762762
List<CreatorIdentityEntity> identityEntities = new ArrayList<>();

0 commit comments

Comments
 (0)