Skip to content

Commit 13562fd

Browse files
committed
fix: multiline service access policy handling
1 parent 85a1677 commit 13562fd

File tree

4 files changed

+94
-33
lines changed

4 files changed

+94
-33
lines changed

README.adoc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
= Liferay Portal DB setup core
22
:liferay-version: 7.3.6
3-
:current-db-setup-core-version: 7.3.604
3+
:current-db-setup-core-version: 7.3.605
44
:TOC:
55

66
image:https://maven-badges.herokuapp.com/maven-central/com.ableneo.liferay/com.ableneo.liferay.db.setup.core/badge.svg?color=blue[Maven Central,link=https://search.maven.org/search?q=g:com.ableneo.liferay%20AND%20a:com.ableneo.liferay.db.setup.core]
@@ -290,6 +290,10 @@ They are probably not perfect, please let me know if anything feels wrong or inc
290290

291291
== Changelog
292292

293+
=== Version 7.3.605
294+
==== Features & bug fixes
295+
* fixed bug when handling multiline link:https://learn.liferay.com/dxp/latest/en/installation-and-upgrades/securing-liferay/securing-web-services/setting-service-access-policies.html[service access policy]
296+
293297
=== Version 7.3.604
294298
==== Features & bug fixes
295299
* added an ability to create/update/delete link:https://learn.liferay.com/dxp/latest/en/installation-and-upgrades/securing-liferay/securing-web-services/setting-service-access-policies.html[Service Access Policies]

src/main/java/com/ableneo/liferay/portal/setup/core/SetupServiceAccessPolicies.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,19 @@
1010
import com.liferay.portal.security.service.access.policy.exception.NoSuchEntryException;
1111
import com.liferay.portal.security.service.access.policy.model.SAPEntry;
1212
import com.liferay.portal.security.service.access.policy.service.SAPEntryLocalServiceUtil;
13+
import java.io.BufferedReader;
14+
import java.io.StringReader;
1315
import java.util.HashMap;
1416
import java.util.List;
1517
import java.util.Locale;
1618
import java.util.Map;
19+
import java.util.regex.Pattern;
1720
import org.slf4j.Logger;
1821
import org.slf4j.LoggerFactory;
1922

2023
public class SetupServiceAccessPolicies {
2124

25+
protected static final Pattern ALL_WHITE_SPACE_CHARACTERS = Pattern.compile("\\W");
2226
private static final Logger LOG = LoggerFactory.getLogger(SetupCategorization.class);
2327

2428
public static void setupServiceAccessPolicies(ServiceAccessPolicies serviceAccessPolicies) {
@@ -40,7 +44,11 @@ public static void setupServiceAccessPolicies(ServiceAccessPolicies serviceAcces
4044
} else {
4145
sapEntry.setEnabled(serviceAccessPolicyConfiguration.isEnabled());
4246
sapEntry.setDefaultSAPEntry(serviceAccessPolicyConfiguration.isUnauthenticated());
43-
sapEntry.setAllowedServiceSignatures(serviceAccessPolicyConfiguration.getAllowedServiceSignatures());
47+
48+
final String allowedServiceSignatures = cleanUpAllowedServiceSignatures(
49+
serviceAccessPolicyConfiguration.getAllowedServiceSignatures()
50+
);
51+
sapEntry.setAllowedServiceSignatures(allowedServiceSignatures);
4452
if (!titleMap.isEmpty()) {
4553
sapEntry.setTitleMap(titleMap);
4654
}
@@ -54,11 +62,29 @@ public static void setupServiceAccessPolicies(ServiceAccessPolicies serviceAcces
5462
if (sapEntry != null) {
5563
deleteSAPEntry(sapEntry);
5664
} else {
57-
LOG.warn("Tried to delete SAP Entry {} in company {} but the entry haven't been found.", deleteServiceAccessPolicy.getName(), runInCompanyId);
65+
LOG.warn(
66+
"Tried to delete SAP Entry {} in company {} but the entry haven't been found.",
67+
deleteServiceAccessPolicy.getName(),
68+
runInCompanyId
69+
);
5870
}
5971
});
6072
}
6173

74+
public static String cleanUpAllowedServiceSignatures(String allowedServiceSignatures) {
75+
if (
76+
allowedServiceSignatures == null ||
77+
ALL_WHITE_SPACE_CHARACTERS.matcher(allowedServiceSignatures).replaceAll("").isEmpty()
78+
) {
79+
return "";
80+
}
81+
final String normalizedMultilineConfiguration = new BufferedReader(new StringReader(allowedServiceSignatures))
82+
.lines()
83+
.filter(line -> !line.trim().isEmpty())
84+
.reduce("", (result, element) -> result.concat(element.trim() + "\n"));
85+
return normalizedMultilineConfiguration.substring(0, normalizedMultilineConfiguration.length() - 1);
86+
}
87+
6288
private static void deleteSAPEntry(SAPEntry sapEntry) {
6389
try {
6490
SAPEntryLocalServiceUtil.deleteSAPEntry(sapEntry);

src/test/java/com/ableneo/liferay/portal/setup/ValidSetupTestMocks.java

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package com.ableneo.liferay.portal.setup;
22

3+
import static org.mockito.ArgumentMatchers.any;
4+
import static org.mockito.ArgumentMatchers.anyLong;
5+
import static org.mockito.ArgumentMatchers.anyString;
6+
import static org.mockito.Mockito.when;
7+
38
import com.ableneo.liferay.portal.setup.core.SetupPermissions;
49
import com.ableneo.liferay.portal.setup.core.SetupServiceAccessPolicies;
510
import com.liferay.portal.kernel.exception.PortalException;
@@ -11,6 +16,8 @@
1116
import com.liferay.portal.kernel.service.RoleLocalServiceUtil;
1217
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
1318
import com.liferay.portal.kernel.util.LocaleUtil;
19+
import java.io.File;
20+
import java.net.URISyntaxException;
1421
import org.junit.jupiter.api.AfterAll;
1522
import org.junit.jupiter.api.BeforeAll;
1623
import org.junit.jupiter.api.BeforeEach;
@@ -20,15 +27,6 @@
2027
import org.slf4j.Logger;
2128
import org.slf4j.LoggerFactory;
2229

23-
import java.io.File;
24-
import java.net.URISyntaxException;
25-
26-
import static org.junit.jupiter.api.Assertions.assertTrue;
27-
import static org.mockito.ArgumentMatchers.any;
28-
import static org.mockito.ArgumentMatchers.anyLong;
29-
import static org.mockito.ArgumentMatchers.anyString;
30-
import static org.mockito.Mockito.when;
31-
3230
public abstract class ValidSetupTestMocks {
3331

3432
public static final Logger LOGGER = LoggerFactory.getLogger(BasicLiferaySetupTest.class);
@@ -38,23 +36,18 @@ public abstract class ValidSetupTestMocks {
3836
public static MockedStatic<UserLocalServiceUtil> userLocalServiceUtilMockedStatic;
3937
public static MockedStatic<LocaleUtil> localeUtilMockedStatic;
4038
public static MockedStatic<SetupServiceAccessPolicies> setupServiceAccessPoliciesMockedStatic;
41-
39+
public static MockedStatic<SetupConfigurationThreadLocal> setupConfigurationThreadLocalMockedStatic;
4240
@Mock
4341
public User liferayUser;
44-
45-
@Mock
42+
@Mock(lenient = true)
4643
public Group liferayGroup;
47-
4844
@Mock
4945
public PermissionChecker permissionChecker;
50-
5146
@Mock
5247
public PermissionCheckerFactory permissionCheckerFactory;
53-
5448
public File validConfiguration;
5549
public File invalidConfiguration;
5650
public File validConfigurationTwoCompanies;
57-
public static MockedStatic<SetupConfigurationThreadLocal> setupConfigurationThreadLocalMockedStatic;
5851

5952
@BeforeAll
6053
static void beforeAll() {
@@ -65,7 +58,12 @@ static void beforeAll() {
6558
userLocalServiceUtilMockedStatic = Mockito.mockStatic(UserLocalServiceUtil.class);
6659
localeUtilMockedStatic = Mockito.mockStatic(LocaleUtil.class);
6760
setupServiceAccessPoliciesMockedStatic = Mockito.mockStatic(SetupServiceAccessPolicies.class);
68-
setupConfigurationThreadLocalMockedStatic.when(() -> SetupServiceAccessPolicies.setupServiceAccessPolicies(any())).thenCallRealMethod();
61+
setupServiceAccessPoliciesMockedStatic
62+
.when(() -> SetupServiceAccessPolicies.cleanUpAllowedServiceSignatures(anyString()))
63+
.thenCallRealMethod();
64+
setupConfigurationThreadLocalMockedStatic
65+
.when(() -> SetupServiceAccessPolicies.setupServiceAccessPolicies(any()))
66+
.thenCallRealMethod();
6967
}
7068

7169
@AfterAll
@@ -84,7 +82,8 @@ void setup() {
8482
try {
8583
validConfiguration = new File(MarshallUtilTest.class.getResource("/valid-configuration.xml").toURI());
8684
invalidConfiguration = new File(MarshallUtilTest.class.getResource("/invalid-configuration.xml").toURI());
87-
validConfigurationTwoCompanies = new File(MarshallUtilTest.class.getResource("/valid-configuration-two-companies.xml").toURI());
85+
validConfigurationTwoCompanies =
86+
new File(MarshallUtilTest.class.getResource("/valid-configuration-two-companies.xml").toURI());
8887
} catch (URISyntaxException e) {
8988
LOGGER.error("Failed to parse configuration file", e);
9089
}
@@ -93,9 +92,8 @@ void setup() {
9392
when(UserLocalServiceUtil.getUserByEmailAddress(anyLong(), anyString())).thenReturn(liferayUser);
9493
when(GroupLocalServiceUtil.getGroup(anyLong(), anyString())).thenReturn(liferayGroup);
9594
} catch (PortalException e) {
96-
LOGGER.error("",e);
95+
LOGGER.error("", e);
9796
}
9897
when(liferayGroup.getGroupId()).thenReturn(20l);
9998
}
100-
10199
}
Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,60 @@
11
package com.ableneo.liferay.portal.setup.core;
22

3-
import com.ableneo.liferay.portal.setup.ValidSetupTestMocks;
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNull;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
import static org.mockito.ArgumentMatchers.any;
7+
import static org.mockito.Mockito.times;
8+
49
import com.ableneo.liferay.portal.setup.LiferaySetup;
10+
import com.ableneo.liferay.portal.setup.ValidSetupTestMocks;
511
import com.liferay.portal.kernel.exception.PortalException;
12+
import java.io.FileNotFoundException;
613
import org.junit.jupiter.api.Test;
714
import org.junit.jupiter.api.extension.ExtendWith;
815
import org.mockito.junit.jupiter.MockitoExtension;
916

10-
import java.io.FileNotFoundException;
11-
12-
import static org.junit.jupiter.api.Assertions.*;
13-
import static org.mockito.ArgumentMatchers.any;
14-
import static org.mockito.Mockito.times;
15-
16-
1717
@ExtendWith(MockitoExtension.class)
1818
class SetupServiceAccessPoliciesTest extends ValidSetupTestMocks {
1919

2020
@Test
2121
void testServiceAccessPolicyIsProcessed() throws FileNotFoundException, PortalException {
2222
assertTrue(LiferaySetup.setup(validConfiguration));
23-
setupServiceAccessPoliciesMockedStatic.verify(() -> SetupServiceAccessPolicies.addSAPEntry(any(), any()), times(1));
24-
setupServiceAccessPoliciesMockedStatic.clearInvocations();
23+
setupServiceAccessPoliciesMockedStatic.verify(
24+
() -> SetupServiceAccessPolicies.addSAPEntry(any(), any()),
25+
times(1)
26+
);
2527
setupConfigurationThreadLocalMockedStatic.clearInvocations();
28+
setupServiceAccessPoliciesMockedStatic.clearInvocations();
29+
}
30+
31+
@Test
32+
void cleanUpAllowedServiceSignatures_nullConfiguration() {
33+
assertNull(SetupServiceAccessPolicies.cleanUpAllowedServiceSignatures(null));
34+
setupServiceAccessPoliciesMockedStatic.clearInvocations();
35+
}
36+
37+
@Test
38+
void cleanUpAllowedServiceSignatures_emptyConfiguration() {
39+
assertEquals("", SetupServiceAccessPolicies.cleanUpAllowedServiceSignatures(""));
40+
assertEquals("", SetupServiceAccessPolicies.cleanUpAllowedServiceSignatures(" \n \n"));
41+
setupServiceAccessPoliciesMockedStatic.clearInvocations();
42+
}
43+
44+
@Test
45+
void cleanUpAllowedServiceSignatures_multiLineConfiguration() {
46+
assertEquals(
47+
"testClass\ntestClass2",
48+
SetupServiceAccessPolicies.cleanUpAllowedServiceSignatures(" testClass\n testClass2")
49+
);
50+
assertEquals(
51+
"testClass\ntestClass2",
52+
SetupServiceAccessPolicies.cleanUpAllowedServiceSignatures("testClass\n testClass2\n")
53+
);
54+
assertEquals(
55+
"testClass\ntestClass2",
56+
SetupServiceAccessPolicies.cleanUpAllowedServiceSignatures("testClass\n testClass2\n\n")
57+
);
58+
setupServiceAccessPoliciesMockedStatic.clearInvocations();
2659
}
2760
}

0 commit comments

Comments
 (0)