Skip to content

Commit 50bf0f7

Browse files
committed
feat: Update calls to UserACL to avoid implicit usage of Conversation State in Service Layer - MEED-7555 - Meeds-io/MIPs#151 (#225)
This change will update UserACL usage to not implicitly use the current conversation state of authenticated user.
1 parent 4c5d042 commit 50bf0f7

File tree

14 files changed

+44
-185
lines changed

14 files changed

+44
-185
lines changed

layout-service/src/main/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public boolean hasAccessPermission(Identity userIdentity, String entityId) throw
7777
List<String> permissions = portletInstance.getPermissions();
7878
return CollectionUtils.isEmpty(permissions)
7979
|| (userIdentity != null
80-
&& permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(userIdentity.getUserId(), p)));
80+
&& permissions.stream().anyMatch(p -> layoutAclService.hasPermission(userIdentity.getUserId(), p)));
8181
}
8282

8383
@Override

layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public boolean hasAccessPermission(long id, String username) throws ObjectNotFou
7676
}
7777
List<String> permissions = category.getPermissions();
7878
return CollectionUtils.isEmpty(permissions)
79-
|| permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(username, p));
79+
|| permissions.stream().anyMatch(p -> layoutAclService.hasPermission(username, p));
8080
}
8181

8282
@Override

layout-service/src/main/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public boolean hasAccessPermission(long id, String username) throws ObjectNotFou
7878
}
7979
List<String> permissions = portletInstance.getPermissions();
8080
return CollectionUtils.isEmpty(permissions)
81-
|| permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(username, p));
81+
|| permissions.stream().anyMatch(p -> layoutAclService.hasPermission(username, p));
8282
}
8383

8484
@Override

layout-service/src/main/java/io/meeds/layout/rest/model/LayoutModel.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,6 @@ public class LayoutModel {
165165
// Specific to container
166166
private String profiles;
167167

168-
private String[] moveAppsPermissions;
169-
170-
private String[] moveContainersPermissions;
171-
172168
private List<PortletInstancePreference> preferences;
173169

174170
private List<LayoutModel> children;
@@ -260,8 +256,6 @@ private void init(ModelObject model) { // NOSONAR
260256
this.cssClass = container.getCssClass();
261257
this.profiles = container.getProfiles();
262258
this.accessPermissions = container.getAccessPermissions();
263-
this.moveAppsPermissions = container.getMoveAppsPermissions();
264-
this.moveContainersPermissions = container.getMoveContainersPermissions();
265259
this.children = container.getChildren().stream().map(LayoutModel::new).toList();
266260

267261
ApplicationBackgroundStyle appCssStyle = container.getAppBackgroundStyle();
@@ -344,8 +338,6 @@ public static ModelObject toModelObject(LayoutModel layoutModel) { // NOSONAR
344338
container.setCssClass(layoutModel.getCssClass());
345339
container.setProfiles(layoutModel.getProfiles());
346340
container.setAccessPermissions(layoutModel.getAccessPermissions());
347-
container.setMoveAppsPermissions(layoutModel.getMoveAppsPermissions());
348-
container.setMoveContainersPermissions(layoutModel.getMoveContainersPermissions());
349341
container.setCssStyle(cssStyle);
350342
container.setAppBackgroundStyle(mapToAppStyle(layoutModel));
351343
if (layoutModel.getChildren() != null) {

layout-service/src/main/java/io/meeds/layout/service/LayoutAclService.java

Lines changed: 17 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -18,201 +18,94 @@
1818
*/
1919
package io.meeds.layout.service;
2020

21-
import org.apache.commons.lang3.StringUtils;
2221
import org.springframework.beans.factory.annotation.Autowired;
2322
import org.springframework.stereotype.Service;
2423

25-
import org.exoplatform.container.ExoContainerContext;
2624
import org.exoplatform.portal.config.UserACL;
2725
import org.exoplatform.portal.config.model.Page;
2826
import org.exoplatform.portal.config.model.PortalConfig;
2927
import org.exoplatform.portal.mop.SiteKey;
3028
import org.exoplatform.portal.mop.page.PageKey;
3129
import org.exoplatform.portal.mop.service.LayoutService;
32-
import org.exoplatform.services.security.Authenticator;
3330
import org.exoplatform.services.security.ConversationState;
34-
import org.exoplatform.services.security.Identity;
35-
import org.exoplatform.services.security.IdentityConstants;
36-
import org.exoplatform.services.security.IdentityRegistry;
31+
import org.exoplatform.social.core.identity.model.Identity;
3732
import org.exoplatform.social.core.manager.IdentityManager;
3833

39-
import jakarta.annotation.PostConstruct;
40-
import lombok.Setter;
41-
import lombok.SneakyThrows;
42-
4334
@Service
4435
public class LayoutAclService {
4536

4637
@Autowired
47-
private UserACL userAcl;
48-
49-
@Autowired
50-
private LayoutService layoutService;
38+
private LayoutService layoutService;
5139

5240
@Autowired
53-
private Authenticator authenticator;
41+
private IdentityManager identityManager;
5442

5543
@Autowired
56-
private IdentityManager identityManager;
57-
58-
@Setter
59-
private IdentityRegistry identityRegistry;
60-
61-
@PostConstruct
62-
public void init() {
63-
// Can't be autowired from Kernel IoC, thus inject it once Spring Bean
64-
// initialized
65-
setIdentityRegistry(ExoContainerContext.getService(IdentityRegistry.class));
66-
}
44+
private UserACL userAcl;
6745

6846
public boolean canAddSite(String username) {
69-
ConversationState currentConversationState = ConversationState.getCurrent();
70-
ConversationState.setCurrent(getConversationState(username));
71-
try {
72-
return userAcl.hasCreatePortalPermission();
73-
} finally {
74-
ConversationState.setCurrent(currentConversationState);
75-
}
47+
return userAcl.hasCreatePortalPermission(userAcl.getUserIdentity(username));
7648
}
7749

7850
public boolean canEditSite(SiteKey siteKey, String username) {
7951
PortalConfig portalConfig = layoutService.getPortalConfig(siteKey);
8052
if (portalConfig == null) {
8153
return false;
8254
}
83-
ConversationState currentConversationState = ConversationState.getCurrent();
84-
ConversationState.setCurrent(getConversationState(username));
85-
try {
86-
return userAcl.hasEditPermission(portalConfig);
87-
} finally {
88-
ConversationState.setCurrent(currentConversationState);
89-
}
55+
return userAcl.hasEditPermission(portalConfig, userAcl.getUserIdentity(username));
9056
}
9157

9258
public boolean canViewSite(SiteKey siteKey, String username) {
9359
PortalConfig portalConfig = layoutService.getPortalConfig(siteKey);
9460
if (portalConfig == null) {
9561
return false;
9662
}
97-
ConversationState currentConversationState = ConversationState.getCurrent();
98-
ConversationState.setCurrent(getConversationState(username));
99-
try {
100-
return userAcl.hasPermission(portalConfig);
101-
} finally {
102-
ConversationState.setCurrent(currentConversationState);
103-
}
63+
return userAcl.hasAccessPermission(portalConfig, userAcl.getUserIdentity(username));
10464
}
10565

10666
public boolean canEditNavigation(SiteKey siteKey, String username) {
107-
PortalConfig portalConfig = layoutService.getPortalConfig(siteKey);
108-
if (portalConfig == null) {
109-
return false;
110-
}
111-
112-
ConversationState currentConversationState = ConversationState.getCurrent();
113-
ConversationState.setCurrent(getConversationState(username));
114-
try {
115-
return userAcl.hasEditPermission(portalConfig) || userAcl.hasEditPermissionOnNavigation(siteKey);
116-
} finally {
117-
ConversationState.setCurrent(currentConversationState);
118-
}
67+
return canEditSite(siteKey, username);
11968
}
12069

12170
public boolean canViewNavigation(SiteKey siteKey, PageKey pageKey, String username) {
122-
PortalConfig portalConfig = layoutService.getPortalConfig(siteKey);
123-
if (portalConfig == null) {
124-
return false;
125-
}
126-
Page page = pageKey == null ? null : layoutService.getPage(pageKey);
127-
ConversationState currentConversationState = ConversationState.getCurrent();
128-
ConversationState.setCurrent(getConversationState(username));
129-
try {
130-
return userAcl.hasAccessPermission(portalConfig) && (page == null || userAcl.hasPermission(page));
131-
} finally {
132-
ConversationState.setCurrent(currentConversationState);
133-
}
71+
return canViewSite(siteKey, username) && (pageKey == null || canViewPage(pageKey, username));
13472
}
13573

13674
public boolean canViewPage(PageKey pageKey, String username) {
13775
Page page = layoutService.getPage(pageKey);
13876
if (page == null) {
13977
return false;
14078
}
141-
142-
ConversationState currentConversationState = ConversationState.getCurrent();
143-
ConversationState.setCurrent(getConversationState(username));
144-
try {
145-
return userAcl.hasPermission(page);
146-
} finally {
147-
ConversationState.setCurrent(currentConversationState);
148-
}
79+
return userAcl.hasAccessPermission(page, userAcl.getUserIdentity(username));
14980
}
15081

15182
public boolean canEditPage(PageKey pageKey, String username) {
15283
Page page = layoutService.getPage(pageKey);
15384
if (page == null) {
15485
return false;
15586
}
156-
157-
ConversationState currentConversationState = ConversationState.getCurrent();
158-
ConversationState.setCurrent(getConversationState(username));
159-
try {
160-
return userAcl.hasEditPermission(page);
161-
} finally {
162-
ConversationState.setCurrent(currentConversationState);
163-
}
87+
return userAcl.hasEditPermission(page, userAcl.getUserIdentity(username));
16488
}
16589

16690
public boolean isAdministrator(String username) {
167-
ConversationState currentConversationState = ConversationState.getCurrent();
168-
ConversationState.setCurrent(getConversationState(username));
169-
try {
170-
return userAcl.isSuperUser() || userAcl.isUserInGroup(getAdministratorsGroup());
171-
} finally {
172-
ConversationState.setCurrent(currentConversationState);
173-
}
91+
return userAcl.isAdministrator(userAcl.getUserIdentity(username));
17492
}
17593

176-
public boolean isMemberOf(String username, String expression) {
177-
ConversationState currentConversationState = ConversationState.getCurrent();
178-
ConversationState.setCurrent(getConversationState(username));
179-
try {
180-
return userAcl.hasPermission(expression);
181-
} finally {
182-
ConversationState.setCurrent(currentConversationState);
183-
}
94+
public boolean hasPermission(String username, String expression) {
95+
return userAcl.hasPermission(userAcl.getUserIdentity(username), expression);
18496
}
18597

18698
public String getAdministratorsGroup() {
18799
return userAcl.getAdminGroups();
188100
}
189101

190102
public ConversationState getSuperUserConversationState() {
191-
return new ConversationState(getUserIdentity(userAcl.getSuperUser()));
103+
return new ConversationState(userAcl.getUserIdentity(userAcl.getSuperUser()));
192104
}
193105

194106
public long getSuperUserIdentityId() {
195-
org.exoplatform.social.core.identity.model.Identity userIdentity =
196-
identityManager.getOrCreateUserIdentity(userAcl.getSuperUser());
197-
String id = userIdentity == null ? null : userIdentity.getId();
198-
return id == null ? 0 : Long.parseLong(id);
199-
}
200-
201-
private ConversationState getConversationState(String username) {
202-
return new ConversationState(getUserIdentity(username));
203-
}
204-
205-
@SneakyThrows
206-
private Identity getUserIdentity(String username) {
207-
if (StringUtils.isBlank(username) || IdentityConstants.ANONIM.equals(username)) {
208-
return null;
209-
}
210-
Identity identity = identityRegistry.getIdentity(username);
211-
if (identity != null) {
212-
return identity;
213-
} else {
214-
return authenticator.createIdentity(username);
215-
}
107+
Identity userIdentity = identityManager.getOrCreateUserIdentity(userAcl.getSuperUser());
108+
return userIdentity == null ? 0l : Long.parseLong(userIdentity.getId());
216109
}
217110

218111
}

layout-service/src/main/java/io/meeds/layout/service/PageLayoutService.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,6 @@ public void updatePageLink(PageKey pageKey,
296296
pageState.getFactoryId(),
297297
pageState.getAccessPermissions(),
298298
pageState.getEditPermission(),
299-
pageState.getMoveAppsPermissions(),
300-
pageState.getMoveContainersPermissions(),
301299
pageState.getType(),
302300
link));
303301
layoutService.save(pageContext);
@@ -323,8 +321,6 @@ public void updatePagePermissions(PageKey pageKey,
323321
pageState.getFactoryId(),
324322
accessPermissionsList,
325323
editPermission,
326-
pageState.getMoveAppsPermissions(),
327-
pageState.getMoveContainersPermissions(),
328324
pageState.getType(),
329325
pageState.getLink()));
330326
layoutService.save(pageContext);

layout-service/src/main/java/io/meeds/layout/service/PortletInstanceService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ public List<PortletInstancePreference> getApplicationPreferences(long applicatio
329329
}
330330
if (!layoutAclService.isAdministrator(username)
331331
&& Arrays.stream(application.getAccessPermissions())
332-
.noneMatch(permission -> layoutAclService.isMemberOf(username, permission))) {
332+
.noneMatch(permission -> layoutAclService.hasPermission(username, permission))) {
333333
throw new IllegalAccessException(String.format("Application with id %s access denied", applicationId));
334334
}
335335
return getApplicationPreferences(application);
@@ -453,13 +453,13 @@ private boolean hasPermission(PortletInstance portletInstance, String username)
453453
List<String> permissions = portletInstance.getPermissions();
454454
return CollectionUtils.isEmpty(permissions)
455455
|| permissions.equals(EVERYONE_PERMISSIONS_LIST)
456-
|| (StringUtils.isNotBlank(username) && permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(username, p)));
456+
|| (StringUtils.isNotBlank(username) && permissions.stream().anyMatch(p -> layoutAclService.hasPermission(username, p)));
457457
}
458458

459459
private boolean hasPermission(PortletInstanceCategory category, String username) {
460460
List<String> permissions = category.getPermissions();
461461
return CollectionUtils.isEmpty(permissions)
462462
|| permissions.equals(EVERYONE_PERMISSIONS_LIST)
463-
|| (StringUtils.isNotBlank(username) && permissions.stream().anyMatch(p -> layoutAclService.isMemberOf(username, p)));
463+
|| (StringUtils.isNotBlank(username) && permissions.stream().anyMatch(p -> layoutAclService.hasPermission(username, p)));
464464
}
465465
}

layout-service/src/main/java/io/meeds/layout/storage/PortletInstanceLayoutStorage.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,7 @@ private Page getPortletInstanceSystemPage() {
207207
false,
208208
null,
209209
Arrays.asList(UserACL.EVERYONE),
210-
page.getEditPermission(),
211-
Arrays.asList(UserACL.EVERYONE),
212-
Arrays.asList(UserACL.EVERYONE));
210+
page.getEditPermission());
213211
layoutService.save(new PageContext(PORTLET_EDITOR_SYSTEM_PAGE_KEY, pageState), page);
214212
page = layoutService.getPage(PORTLET_EDITOR_SYSTEM_PAGE_KEY);
215213
}

layout-service/src/test/java/io/meeds/layout/plugin/attachment/PortletInstanceAttachmentPluginTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public void hasAccessPermission() {
9898
when(portletInstance.getPermissions()).thenReturn(Collections.singletonList(permissionExpression));
9999
assertFalse(attachmentPlugin.hasAccessPermission(userIdentity, "1"));
100100

101-
when(layoutAclService.isMemberOf(username, permissionExpression)).thenReturn(true);
101+
when(layoutAclService.hasPermission(username, permissionExpression)).thenReturn(true);
102102
assertTrue(attachmentPlugin.hasAccessPermission(userIdentity, "1"));
103103
}
104104

layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceCategoryTranslationPluginTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public void hasAccessPermission() {
9191
when(portletInstanceCategory.getPermissions()).thenReturn(Collections.singletonList(permissionExpression));
9292
assertFalse(translationPlugin.hasAccessPermission(1, username));
9393

94-
when(layoutAclService.isMemberOf(username, permissionExpression)).thenReturn(true);
94+
when(layoutAclService.hasPermission(username, permissionExpression)).thenReturn(true);
9595
assertTrue(translationPlugin.hasAccessPermission(1, username));
9696
}
9797

layout-service/src/test/java/io/meeds/layout/plugin/translation/PortletInstanceTranslationPluginTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public void hasAccessPermission() {
9191
when(portletInstance.getPermissions()).thenReturn(Collections.singletonList(permissionExpression));
9292
assertFalse(translationPlugin.hasAccessPermission(1, username));
9393

94-
when(layoutAclService.isMemberOf(username, permissionExpression)).thenReturn(true);
94+
when(layoutAclService.hasPermission(username, permissionExpression)).thenReturn(true);
9595
assertTrue(translationPlugin.hasAccessPermission(1, username));
9696
}
9797

0 commit comments

Comments
 (0)