Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lps 193374 #5598

Open
wants to merge 29 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
0942562
LPS-193374 Add new configurantion
pedro-oliveira446 Aug 11, 2023
817420a
LPS-193374 Change configuration category to 'objects'
pedro-oliveira446 Aug 16, 2023
6633c63
LPS-193374 Add new languages keys
pedro-oliveira446 Aug 11, 2023
27b1f86
LPS-193374 Create new permission validation based in configuration to…
pedro-oliveira446 Aug 15, 2023
2cebc53
LPS-193374 Create new exception and mapper to new permission validati…
pedro-oliveira446 Aug 14, 2023
72fbcb0
LPS-193374 Create new permission validation based in configuration to…
pedro-oliveira446 Aug 15, 2023
8c72024
LPS-193374 Hide groovy egine from object validation frontend
pedro-oliveira446 Aug 15, 2023
30bcfc4
LPS-193374 Hide groovy action executor from object validation frontend
pedro-oliveira446 Aug 15, 2023
0ea05bd
LPS-193374 Put duplicate code in util file
pedro-oliveira446 Aug 15, 2023
50d3b37
LPS-193374 Add model listener to set all actives groovy scripts of th…
pedro-oliveira446 Aug 17, 2023
cdfba49
LPS-193374 Make the front display errors coming from the objects admi…
pedro-oliveira446 Aug 17, 2023
fbfa4ec
LPS-193374 Get configuration directly from util file
pedro-oliveira446 Aug 23, 2023
5425dd8
LPS-193374 Remove configuration from service layer
pedro-oliveira446 Aug 23, 2023
4fbb64d
LPS-193374 Remove configuration from web layer
pedro-oliveira446 Aug 23, 2023
74dd2e2
LPS-193374 Semver
pedro-oliveira446 Aug 28, 2023
381db8d
LPS-193374 Use singular
brianchandotcom Aug 30, 2023
3604362
LPS-193374 Match ObjectConfiguration
brianchandotcom Aug 30, 2023
e1e9c1e
LPS-193374 SF
brianchandotcom Aug 30, 2023
7e6d5c6
LPS-193374 Merge ObjectScriptConfiguration with ObjectConfiguration
pedro-oliveira446 Aug 30, 2023
082006c
LPS-193374 Rename
pedro-oliveira446 Aug 30, 2023
06f4ced
LPS-193374 Adapt model listener
pedro-oliveira446 Aug 30, 2023
28d6693
LPS-193374 Merge ObjectConfigurationUtil files
pedro-oliveira446 Aug 30, 2023
d73f837
LPS-193374 Prevent possible problem if the configuration method throw…
pedro-oliveira446 Aug 30, 2023
f2e70cb
LPS-193374 Remove unused key
pedro-oliveira446 Aug 30, 2023
4bf9bf3
LPS-193374 Remove deleted path
pedro-oliveira446 Aug 30, 2023
6175596
LPS-193374 Rename
pedro-oliveira446 Aug 30, 2023
c53b571
LPS-193374 Rename to match with configuration property name
guilhermedcamacho Aug 31, 2023
0a32160
LPS-193374 Baseline
guilhermedcamacho Aug 31, 2023
8fec3f9
LPS-193374 Build Lang
pedro-oliveira446 Aug 31, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,54 @@
/**
* SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com
* SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
*/

package com.liferay.object.admin.rest.internal.jaxrs.exception.mapper;

import com.liferay.object.exception.ObjectValidationRuleEngineException;
import com.liferay.portal.kernel.language.Language;
import com.liferay.portal.vulcan.accept.language.AcceptLanguage;
import com.liferay.portal.vulcan.jaxrs.exception.mapper.BaseExceptionMapper;
import com.liferay.portal.vulcan.jaxrs.exception.mapper.Problem;

import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

/**
* @author Pedro Leite
*/
@Component(
property = {
"osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.Object.Admin.REST)",
"osgi.jaxrs.extension=true",
"osgi.jaxrs.name=Liferay.Object.Admin.REST.ObjectValidationRuleEngineExceptionMapper"
},
service = ExceptionMapper.class
)
public class ObjectValidationRuleEngineExceptionMapper
extends BaseExceptionMapper<ObjectValidationRuleEngineException> {

@Override
protected Problem getProblem(
ObjectValidationRuleEngineException
objectValidationRuleEngineException) {

return new Problem(
Response.Status.BAD_REQUEST,
_language.get(
_acceptLanguage.getPreferredLocale(),
objectValidationRuleEngineException.getMessageKey(),
objectValidationRuleEngineException.getMessage()));
}

@Context
private AcceptLanguage _acceptLanguage;

@Reference
private Language _language;

}
1 change: 1 addition & 0 deletions modules/apps/object/object-api/bnd.bnd
Expand Up @@ -6,6 +6,7 @@ Export-Package:\
com.liferay.object.action.executor,\
com.liferay.object.action.trigger,\
com.liferay.object.configuration,\
com.liferay.object.configuration.util,\
com.liferay.object.constants,\
com.liferay.object.definition.notification.term.util,\
com.liferay.object.definition.tree,\
Expand Down
Expand Up @@ -21,6 +21,13 @@
)
public interface ObjectConfiguration {

@Meta.AD(
deflt = "false",
description = "allow-administrators-execute-script-help",
name = "allow-administrators-execute-script", required = false
)
public boolean allowAdministratorsExecuteScript();

@Meta.AD(
deflt = "100",
description = "maximum-number-of-guest-user-object-entries-per-object-definition-help",
Expand Down
@@ -0,0 +1,44 @@
/**
* SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com
* SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
*/

package com.liferay.object.configuration.util;

import com.liferay.object.configuration.ObjectConfiguration;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.module.configuration.ConfigurationProviderUtil;
import com.liferay.portal.kernel.security.permission.PermissionChecker;

/**
* @author Pedro Leite
*/
public class ObjectConfigurationUtil {

public static boolean hasPermissionExecuteScript(
PermissionChecker permissionChecker)
throws PortalException {

ObjectConfiguration objectConfiguration =
ConfigurationProviderUtil.getSystemConfiguration(
ObjectConfiguration.class);

if (permissionChecker.isOmniadmin() ||
(objectConfiguration.allowAdministratorsExecuteScript() &&
permissionChecker.isCompanyAdmin())) {

return true;
}

return false;
}

public static int maximumFileSizeForGuestUsers() throws PortalException {
ObjectConfiguration objectConfiguration =
ConfigurationProviderUtil.getSystemConfiguration(
ObjectConfiguration.class);

return objectConfiguration.maximumFileSizeForGuestUsers();
}

}
Expand Up @@ -53,6 +53,15 @@ public InvalidScript() {

}

public static class MustHavePermissionEngineGroovy
extends ObjectValidationRuleEngineException {

public MustHavePermissionEngineGroovy() {
super("The user must have permission to choose engine Groovy.");
}

}

public static class MustNotBeNull
extends ObjectValidationRuleEngineException {

Expand Down
@@ -1 +1 @@
version 1.0.0
version 2.0.0
@@ -0,0 +1 @@
version 1.0.0
1 change: 1 addition & 0 deletions modules/apps/object/object-service/build.gradle
Expand Up @@ -49,6 +49,7 @@ dependencies {
compileOnly project(":apps:portal:portal-instance-lifecycle-api")
compileOnly project(":apps:static:osgi:osgi-util")
compileOnly project(":apps:static:portal-configuration:portal-configuration-metatype-api")
compileOnly project(":apps:static:portal-configuration:portal-configuration-persistence-api")
compileOnly project(":apps:static:portal:portal-upgrade-api")
compileOnly project(":apps:user-associated-data:user-associated-data-api")
compileOnly project(":core:osgi-service-tracker-collections")
Expand Down
@@ -0,0 +1,87 @@
/**
* SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com
* SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
*/

package com.liferay.object.internal.configuration.persistence.listener;

import com.liferay.object.constants.ObjectActionExecutorConstants;
import com.liferay.object.constants.ObjectValidationRuleConstants;
import com.liferay.object.model.ObjectAction;
import com.liferay.object.model.ObjectValidationRule;
import com.liferay.object.service.ObjectActionLocalService;
import com.liferay.object.service.ObjectValidationRuleLocalService;
import com.liferay.portal.configuration.persistence.listener.ConfigurationModelListener;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.util.StringUtil;

import java.util.Dictionary;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

/**
* @author Pedro Leite
*/
@Component(
property = "model.class.name=com.liferay.object.configuration.ObjectConfiguration",
service = ConfigurationModelListener.class
)
public class ObjectConfigurationModelListener
implements ConfigurationModelListener {

@Override
public void onAfterSave(String pid, Dictionary<String, Object> properties) {
boolean allowAdministratorsExecuteScript = GetterUtil.getBoolean(
properties.get("allowAdministratorsExecuteScript"));

if (!allowAdministratorsExecuteScript) {
long defaultCompanyId = _portal.getDefaultCompanyId();

for (ObjectAction objectAction :
_objectActionLocalService.getObjectActions(
QueryUtil.ALL_POS, QueryUtil.ALL_POS)) {

if ((objectAction.getCompanyId() != defaultCompanyId) &&
objectAction.isActive() &&
StringUtil.equals(
objectAction.getObjectActionExecutorKey(),
ObjectActionExecutorConstants.KEY_GROOVY)) {

objectAction.setActive(false);

_objectActionLocalService.updateObjectAction(objectAction);
}
}

for (ObjectValidationRule objectValidationRule :
_objectValidationRuleLocalService.getObjectValidationRules(
QueryUtil.ALL_POS, QueryUtil.ALL_POS)) {

if ((objectValidationRule.getCompanyId() != defaultCompanyId) &&
objectValidationRule.isActive() &&
StringUtil.equals(
objectValidationRule.getEngine(),
ObjectValidationRuleConstants.ENGINE_TYPE_GROOVY)) {

objectValidationRule.setActive(false);

_objectValidationRuleLocalService.
updateObjectValidationRule(objectValidationRule);
}
}
}
}

@Reference
private ObjectActionLocalService _objectActionLocalService;

@Reference
private ObjectValidationRuleLocalService _objectValidationRuleLocalService;

@Reference
private Portal _portal;

}
Expand Up @@ -5,17 +5,22 @@

package com.liferay.object.service.impl;

import com.liferay.object.configuration.util.ObjectConfigurationUtil;
import com.liferay.object.constants.ObjectActionExecutorConstants;
import com.liferay.object.exception.ObjectActionExecutorKeyException;
import com.liferay.object.model.ObjectAction;
import com.liferay.object.model.ObjectDefinition;
import com.liferay.object.service.base.ObjectActionServiceBaseImpl;
import com.liferay.portal.aop.AopService;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.security.permission.resource.ModelResourcePermission;
import com.liferay.portal.kernel.util.UnicodeProperties;

import java.util.Locale;
import java.util.Map;
import java.util.Objects;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
Expand Down Expand Up @@ -45,6 +50,9 @@ public ObjectAction addObjectAction(
_objectDefinitionModelResourcePermission.check(
getPermissionChecker(), objectDefinitionId, ActionKeys.UPDATE);

_validateConfigurationExecuteScript(
objectActionExecutorKey, getPermissionChecker());

return objectActionLocalService.addObjectAction(
externalReferenceCode, getUserId(), objectDefinitionId, active,
conditionExpression, description, errorMessageMap, labelMap, name,
Expand Down Expand Up @@ -97,13 +105,32 @@ public ObjectAction updateObjectAction(
getPermissionChecker(), objectAction.getObjectDefinitionId(),
ActionKeys.UPDATE);

_validateConfigurationExecuteScript(
objectActionExecutorKey, getPermissionChecker());

return objectActionLocalService.updateObjectAction(
externalReferenceCode, objectActionId, active, conditionExpression,
description, errorMessageMap, labelMap, name,
objectActionExecutorKey, objectActionTriggerKey,
parametersUnicodeProperties);
}

private void _validateConfigurationExecuteScript(
String objectActionExecutorKey, PermissionChecker permissionChecker)
throws PortalException {

if (Objects.equals(
objectActionExecutorKey,
ObjectActionExecutorConstants.KEY_GROOVY) &&
!ObjectConfigurationUtil.hasPermissionExecuteScript(
permissionChecker)) {

throw new ObjectActionExecutorKeyException(
"The user must have permission to choose object action " +
"executor key Groovy");
}
}

@Reference(
target = "(model.class.name=com.liferay.object.model.ObjectDefinition)"
)
Expand Down
Expand Up @@ -5,18 +5,23 @@

package com.liferay.object.service.impl;

import com.liferay.object.configuration.util.ObjectConfigurationUtil;
import com.liferay.object.constants.ObjectValidationRuleConstants;
import com.liferay.object.exception.ObjectValidationRuleEngineException;
import com.liferay.object.model.ObjectDefinition;
import com.liferay.object.model.ObjectValidationRule;
import com.liferay.object.model.ObjectValidationRuleSetting;
import com.liferay.object.service.base.ObjectValidationRuleServiceBaseImpl;
import com.liferay.portal.aop.AopService;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.security.permission.resource.ModelResourcePermission;

import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
Expand Down Expand Up @@ -45,6 +50,8 @@ public ObjectValidationRule addObjectValidationRule(
_objectDefinitionModelResourcePermission.check(
getPermissionChecker(), objectDefinitionId, ActionKeys.UPDATE);

_validateConfigurationExecuteScript(engine, getPermissionChecker());

return objectValidationRuleLocalService.addObjectValidationRule(
getUserId(), objectDefinitionId, active, engine, errorLabelMap,
nameMap, outputType, script, objectValidationRuleSettings);
Expand Down Expand Up @@ -100,11 +107,27 @@ public ObjectValidationRule updateObjectValidationRule(
getPermissionChecker(),
objectValidationRule.getObjectDefinitionId(), ActionKeys.UPDATE);

_validateConfigurationExecuteScript(engine, getPermissionChecker());

return objectValidationRuleLocalService.updateObjectValidationRule(
objectValidationRuleId, active, engine, errorLabelMap, nameMap,
outputType, script, objectValidationRuleSettings);
}

private void _validateConfigurationExecuteScript(
String engine, PermissionChecker permissionChecker)
throws PortalException {

if (Objects.equals(
engine, ObjectValidationRuleConstants.ENGINE_TYPE_GROOVY) &&
!ObjectConfigurationUtil.hasPermissionExecuteScript(
permissionChecker)) {

throw new ObjectValidationRuleEngineException.
MustHavePermissionEngineGroovy();
}
}

@Reference(
target = "(model.class.name=com.liferay.object.model.ObjectDefinition)"
)
Expand Down