All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.roles.admin.web.internal.display.context.RoleDisplayContext Maven / Gradle / Ivy

The newest version!
/**
 * SPDX-FileCopyrightText: (c) 2000 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.roles.admin.web.internal.display.context;

import com.liferay.application.list.constants.ApplicationListWebKeys;
import com.liferay.application.list.constants.PanelCategoryKeys;
import com.liferay.application.list.display.context.logic.PanelCategoryHelper;
import com.liferay.application.list.display.context.logic.PersonalMenuEntryHelper;
import com.liferay.frontend.taglib.clay.servlet.taglib.util.NavigationItem;
import com.liferay.frontend.taglib.clay.servlet.taglib.util.NavigationItemList;
import com.liferay.petra.string.StringBundler;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Permission;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.model.ResourceConstants;
import com.liferay.portal.kernel.model.Role;
import com.liferay.portal.kernel.model.role.RoleConstants;
import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
import com.liferay.portal.kernel.portlet.PortletURLUtil;
import com.liferay.portal.kernel.portlet.url.builder.PortletURLBuilder;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.security.permission.ResourceActionsUtil;
import com.liferay.portal.kernel.service.PortletLocalServiceUtil;
import com.liferay.portal.kernel.service.RoleLocalServiceUtil;
import com.liferay.portal.kernel.service.RoleServiceUtil;
import com.liferay.portal.kernel.service.permission.RolePermissionUtil;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HashMapBuilder;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortletKeys;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.roles.admin.role.type.contributor.RoleTypeContributor;
import com.liferay.roles.admin.web.internal.role.type.contributor.util.RoleTypeContributorRetrieverUtil;
import com.liferay.segments.service.SegmentsEntryRoleLocalServiceUtil;

import jakarta.portlet.PortletURL;
import jakarta.portlet.RenderResponse;

import jakarta.servlet.http.HttpServletRequest;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * @author Pei-Jung Lan
 */
public class RoleDisplayContext {

	public RoleDisplayContext(
		HttpServletRequest httpServletRequest, RenderResponse renderResponse) {

		_httpServletRequest = httpServletRequest;
		_renderResponse = renderResponse;

		_currentRoleTypeContributor =
			RoleTypeContributorRetrieverUtil.getCurrentRoleTypeContributor(
				httpServletRequest);
		_themeDisplay = (ThemeDisplay)httpServletRequest.getAttribute(
			WebKeys.THEME_DISPLAY);
	}

	public String getActionLabel(String resourceName, String actionId) {
		String actionLabel = null;

		if (actionId.equals(ActionKeys.ACCESS_IN_CONTROL_PANEL)) {
			PanelCategoryHelper panelCategoryHelper =
				(PanelCategoryHelper)_httpServletRequest.getAttribute(
					ApplicationListWebKeys.PANEL_CATEGORY_HELPER);
			PersonalMenuEntryHelper personalMenuEntryHelper =
				(PersonalMenuEntryHelper)_httpServletRequest.getAttribute(
					ApplicationListWebKeys.PERSONAL_MENU_ENTRY_HELPER);

			Portlet portlet = PortletLocalServiceUtil.getPortletById(
				_themeDisplay.getCompanyId(), resourceName);

			if (panelCategoryHelper.containsPortlet(
					portlet.getPortletId(),
					PanelCategoryKeys.SITE_ADMINISTRATION)) {

				actionLabel = LanguageUtil.get(
					_httpServletRequest, "access-in-site-administration");
			}
			else if (panelCategoryHelper.containsPortlet(
						portlet.getPortletId(), PanelCategoryKeys.USER)) {

				actionLabel = LanguageUtil.get(
					_httpServletRequest, "access-in-my-account");
			}
			else if (personalMenuEntryHelper.hasPersonalMenuEntry(
						portlet.getPortletId())) {

				actionLabel = LanguageUtil.get(
					_httpServletRequest, "access-in-personal-menu");
			}
		}

		if (actionId.equals("ADD_STRUCTURE") &&
			resourceName.equals("com.liferay.document.library")) {

			actionLabel = LanguageUtil.get(
				_httpServletRequest, "add-metadata-set");
		}

		if (actionLabel == null) {
			actionLabel = ResourceActionsUtil.getAction(
				_httpServletRequest, actionId);
		}

		return actionLabel;
	}

	public String getAssigneesMessage(Role role) throws Exception {
		if (isAutomaticallyAssigned(role)) {
			return LanguageUtil.get(
				_httpServletRequest, "this-role-is-automatically-assigned");
		}

		int count = getAssigneesTotal(role.getRoleId());

		if (count == 1) {
			return LanguageUtil.get(_httpServletRequest, "one-assignee");
		}

		return LanguageUtil.format(_httpServletRequest, "x-assignees", count);
	}

	public int getAssigneesTotal(long roleId) throws Exception {
		int segmentsEntryRolesCountByRoleId =
			SegmentsEntryRoleLocalServiceUtil.
				getSegmentsEntryRolesCountByRoleId(roleId);

		return RoleLocalServiceUtil.getAssigneesTotal(roleId) +
			segmentsEntryRolesCountByRoleId;
	}

	public List getEditRoleNavigationItems() throws Exception {
		List tabsNames = _getTabsNames();
		Map tabsURLs = _getTabsURLs();

		String tabs1 = ParamUtil.getString(_httpServletRequest, "tabs1");

		return new NavigationItemList() {
			{
				for (String tabsName : tabsNames) {
					add(
						navigationItem -> {
							navigationItem.setActive(tabsName.equals(tabs1));
							navigationItem.setHref(tabsURLs.get(tabsName));
							navigationItem.setLabel(
								LanguageUtil.get(
									_httpServletRequest, tabsName));
						});
				}
			}
		};
	}

	public String getEditRolePermissionsTabs1() {
		if (isAccountRoleGroupScope()) {
			return "define-group-scope-permissions";
		}

		return "define-permissions";
	}

	public StringBundler getResourceHtmlId(String resource) {
		StringBundler sb = new StringBundler(2);

		sb.append("resource_");
		sb.append(StringUtil.replace(resource, '.', '_'));

		return sb;
	}

	public List getRoleAssignmentsNavigationItems(
			PortletURL portletURL)
		throws Exception {

		Role role = _getSelectedRole();

		if (role == null) {
			return Collections.emptyList();
		}

		String tabs2 = ParamUtil.getString(
			_httpServletRequest, "tabs2", "users");

		return new NavigationItemList() {
			{
				for (String assigneeTypeName :
						_getAssigneeTypeNamesByRoleId(portletURL)) {

					if (_isAssigneeTypeVisible(role, assigneeTypeName)) {
						add(
							navigationItem -> {
								navigationItem.setActive(
									assigneeTypeName.equals(tabs2));
								navigationItem.setHref(
									portletURL, "tabs2", assigneeTypeName);
								navigationItem.setLabel(
									LanguageUtil.get(
										_httpServletRequest, assigneeTypeName));
							});
					}
				}
			}
		};
	}

	public List getViewRoleNavigationItems(
			LiferayPortletResponse liferayPortletResponse,
			PortletURL portletURL)
		throws Exception {

		NavigationItemList navigationItemList = new NavigationItemList();

		for (RoleTypeContributor roleTypeContributor :
				RoleTypeContributorRetrieverUtil.getRoleTypeContributors(
					_httpServletRequest)) {

			navigationItemList.add(
				navigationItem -> {
					navigationItem.setActive(
						_currentRoleTypeContributor.getType() ==
							roleTypeContributor.getType());

					PortletURL viewRegularRoleNavigationURL =
						PortletURLUtil.clone(
							portletURL, liferayPortletResponse);

					navigationItem.setHref(
						viewRegularRoleNavigationURL, "roleType",
						roleTypeContributor.getType());

					navigationItem.setLabel(
						LanguageUtil.get(
							_httpServletRequest,
							roleTypeContributor.getTabTitle(
								_httpServletRequest.getLocale())));
				});
		}

		return navigationItemList;
	}

	public boolean isAccountRoleGroupScope() {
		if (_accountRoleGroupScope == null) {
			_accountRoleGroupScope = false;

			if ((_currentRoleTypeContributor.getType() ==
					RoleConstants.TYPE_ACCOUNT) &&
				ParamUtil.getBoolean(
					_httpServletRequest, "accountRoleGroupScope")) {

				_accountRoleGroupScope = true;
			}
		}

		return _accountRoleGroupScope;
	}

	public boolean isAllowGroupScope() {
		if (_allowGroupScope == null) {
			_allowGroupScope = false;

			if ((_currentRoleTypeContributor.getType() ==
					RoleConstants.TYPE_REGULAR) ||
				isAccountRoleGroupScope()) {

				_allowGroupScope = true;
			}
		}

		return _allowGroupScope;
	}

	public boolean isAutomaticallyAssigned(Role role) {
		List roleTypeContributors =
			RoleTypeContributorRetrieverUtil.getRoleTypeContributors(
				_httpServletRequest);

		for (RoleTypeContributor roleTypeContributor : roleTypeContributors) {
			if (roleTypeContributor.isAutomaticallyAssigned(role)) {
				return true;
			}
		}

		return false;
	}

	public boolean isShowScope(
		Role role, String currentModelResource, String currentPortletResource) {

		boolean showScope = true;

		if (currentPortletResource.equals(PortletKeys.PORTAL)) {
			showScope = false;
		}
		else if (!isAllowGroupScope()) {
			showScope = false;
		}
		else if (Validator.isNotNull(currentPortletResource)) {
			Portlet currentPortlet = PortletLocalServiceUtil.getPortletById(
				role.getCompanyId(), currentPortletResource);

			if (currentPortlet != null) {
				PanelCategoryHelper panelCategoryHelper =
					(PanelCategoryHelper)_httpServletRequest.getAttribute(
						ApplicationListWebKeys.PANEL_CATEGORY_HELPER);

				if (panelCategoryHelper.hasPanelApp(
						currentPortlet.getPortletId()) &&
					!panelCategoryHelper.containsPortlet(
						currentPortlet.getPortletId(),
						PanelCategoryKeys.SITE_ADMINISTRATION)) {

					showScope = false;
				}
			}
		}

		if (Validator.isNotNull(currentModelResource) &&
			currentModelResource.equals(Group.class.getName())) {

			showScope = true;
		}

		return showScope;
	}

	public boolean isValidPermission(Role role, Permission permission) {
		if (role.getType() != RoleConstants.TYPE_ACCOUNT) {
			return true;
		}

		if (isAccountRoleGroupScope()) {
			if ((permission.getScope() == ResourceConstants.SCOPE_COMPANY) ||
				(permission.getScope() == ResourceConstants.SCOPE_GROUP)) {

				return true;
			}
		}
		else if (permission.getScope() ==
					ResourceConstants.SCOPE_GROUP_TEMPLATE) {

			return true;
		}

		return false;
	}

	private String[] _getAssigneeTypeNamesByRoleId(PortletURL portletURL)
		throws Exception {

		String[] assigneeTypeNames = _ASSIGNEE_TYPE_NAMES;

		Map parameterMap = portletURL.getParameterMap();

		String[] roleIds = parameterMap.get("roleId");

		if (roleIds.length > 0) {
			long roleId = GetterUtil.getLong(roleIds[0]);

			Role role = RoleServiceUtil.fetchRole(roleId);

			if ((role != null) &&
				Objects.equals(RoleConstants.ADMINISTRATOR, role.getName())) {

				assigneeTypeNames = ArrayUtil.filter(
					assigneeTypeNames, name -> !name.equals("segments"));
			}
		}

		return assigneeTypeNames;
	}

	private Role _getSelectedRole() throws Exception {
		if (_role != null) {
			return _role;
		}

		_role = RoleServiceUtil.fetchRole(
			ParamUtil.getLong(_httpServletRequest, "roleId"));

		return _role;
	}

	private List _getTabsNames() throws Exception {
		List tabsNames = new ArrayList<>();

		ThemeDisplay themeDisplay =
			(ThemeDisplay)_httpServletRequest.getAttribute(
				WebKeys.THEME_DISPLAY);

		PermissionChecker permissionChecker =
			themeDisplay.getPermissionChecker();

		Role role = _getSelectedRole();

		if (RolePermissionUtil.contains(
				permissionChecker, role.getRoleId(), ActionKeys.UPDATE)) {

			tabsNames.add("details");
		}

		if (_currentRoleTypeContributor.isAllowDefinePermissions(role) &&
			RolePermissionUtil.contains(
				permissionChecker, role.getRoleId(),
				ActionKeys.DEFINE_PERMISSIONS)) {

			tabsNames.add("define-permissions");

			if (role.getType() == RoleConstants.TYPE_ACCOUNT) {
				tabsNames.add("define-group-scope-permissions");
			}
		}

		if (_currentRoleTypeContributor.isAllowAssignMembers(role) &&
			RolePermissionUtil.contains(
				permissionChecker, role.getRoleId(),
				ActionKeys.ASSIGN_MEMBERS)) {

			tabsNames.add("assignees");
		}

		return tabsNames;
	}

	private Map _getTabsURLs() throws Exception {
		String redirect = ParamUtil.getString(_httpServletRequest, "redirect");

		String backURL = ParamUtil.getString(
			_httpServletRequest, "backURL", redirect);

		Role role = _getSelectedRole();

		return HashMapBuilder.put(
			"assignees",
			() -> PortletURLBuilder.createRenderURL(
				_renderResponse
			).setMVCPath(
				"/edit_role_assignments.jsp"
			).setRedirect(
				redirect
			).setBackURL(
				backURL
			).setTabs1(
				"assignees"
			).setParameter(
				"roleId", role.getRoleId()
			).buildString()
		).put(
			"define-group-scope-permissions",
			() -> PortletURLBuilder.createRenderURL(
				_renderResponse
			).setMVCPath(
				"/edit_role_permissions.jsp"
			).setCMD(
				Constants.VIEW
			).setRedirect(
				redirect
			).setBackURL(
				backURL
			).setTabs1(
				"define-group-scope-permissions"
			).setParameter(
				"accountRoleGroupScope", true
			).setParameter(
				"roleId", role.getRoleId()
			).buildString()
		).put(
			"define-permissions",
			() -> PortletURLBuilder.createRenderURL(
				_renderResponse
			).setMVCPath(
				"/edit_role_permissions.jsp"
			).setCMD(
				Constants.VIEW
			).setRedirect(
				redirect
			).setBackURL(
				backURL
			).setTabs1(
				"define-permissions"
			).setParameter(
				"roleId", role.getRoleId()
			).buildString()
		).put(
			"details",
			() -> PortletURLBuilder.createRenderURL(
				_renderResponse
			).setMVCPath(
				"/edit_role.jsp"
			).setRedirect(
				redirect
			).setBackURL(
				backURL
			).setTabs1(
				"details"
			).setParameter(
				"roleId", role.getRoleId()
			).buildString()
		).build();
	}

	private boolean _isAssigneeTypeVisible(Role role, String assigneeTypeName) {
		if (StringUtil.equals("segments", assigneeTypeName) &&
			StringUtil.equals(RoleConstants.ADMINISTRATOR, role.getName())) {

			return false;
		}

		return true;
	}

	private static final String[] _ASSIGNEE_TYPE_NAMES = {
		"users", "sites", "organizations", "user-groups", "segments"
	};

	private Boolean _accountRoleGroupScope;
	private Boolean _allowGroupScope;
	private final RoleTypeContributor _currentRoleTypeContributor;
	private final HttpServletRequest _httpServletRequest;
	private final RenderResponse _renderResponse;
	private Role _role;
	private final ThemeDisplay _themeDisplay;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy