/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.events; import com.liferay.exportimport.kernel.configuration.ExportImportConfigurationConstants; import com.liferay.exportimport.kernel.configuration.ExportImportConfigurationSettingsMapFactory; import com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys; import com.liferay.exportimport.kernel.model.ExportImportConfiguration; import com.liferay.exportimport.kernel.service.ExportImportConfigurationLocalServiceUtil; import com.liferay.exportimport.kernel.service.ExportImportLocalServiceUtil; import com.liferay.portal.kernel.events.Action; import com.liferay.portal.kernel.events.ActionException; import com.liferay.portal.kernel.exception.LayoutPermissionException; import com.liferay.portal.kernel.exception.NoSuchGroupException; import com.liferay.portal.kernel.exception.NoSuchLayoutException; import com.liferay.portal.kernel.exception.NoSuchUserException; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.interval.IntervalActionProcessor; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.ColorScheme; import com.liferay.portal.kernel.model.Company; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.GroupConstants; import com.liferay.portal.kernel.model.Image; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.model.LayoutConstants; import com.liferay.portal.kernel.model.LayoutSet; import com.liferay.portal.kernel.model.LayoutTemplate; import com.liferay.portal.kernel.model.LayoutTypeAccessPolicy; import com.liferay.portal.kernel.model.LayoutTypePortlet; import com.liferay.portal.kernel.model.LayoutTypePortletConstants; import com.liferay.portal.kernel.model.RoleConstants; import com.liferay.portal.kernel.model.Theme; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.model.impl.VirtualLayout; import com.liferay.portal.kernel.portlet.LiferayWindowState; import com.liferay.portal.kernel.portlet.PortalPreferences; import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil; import com.liferay.portal.kernel.portlet.PortletURLFactoryUtil; import com.liferay.portal.kernel.security.auth.PrincipalException; import com.liferay.portal.kernel.security.permission.ActionKeys; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.security.permission.PermissionCheckerFactoryUtil; import com.liferay.portal.kernel.security.permission.PermissionThreadLocal; import com.liferay.portal.kernel.service.GroupLocalServiceUtil; import com.liferay.portal.kernel.service.ImageLocalServiceUtil; import com.liferay.portal.kernel.service.LayoutLocalServiceUtil; import com.liferay.portal.kernel.service.LayoutSetLocalServiceUtil; import com.liferay.portal.kernel.service.RoleLocalServiceUtil; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.ServiceContextFactory; import com.liferay.portal.kernel.service.ServiceContextThreadLocal; import com.liferay.portal.kernel.service.ThemeLocalServiceUtil; import com.liferay.portal.kernel.service.UserLocalServiceUtil; import com.liferay.portal.kernel.service.permission.GroupPermissionUtil; import com.liferay.portal.kernel.service.permission.LayoutPermissionUtil; import com.liferay.portal.kernel.service.permission.PortalPermissionUtil; import com.liferay.portal.kernel.servlet.HttpHeaders; import com.liferay.portal.kernel.servlet.PortalWebResourceConstants; import com.liferay.portal.kernel.servlet.PortalWebResourcesUtil; import com.liferay.portal.kernel.servlet.SessionErrors; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.ColorSchemeFactoryUtil; import com.liferay.portal.kernel.util.CookieKeys; import com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.HttpUtil; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.PortletKeys; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.ServerDetector; import com.liferay.portal.kernel.util.SessionParamUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.UnicodeProperties; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.kernel.webserver.WebServerServletTokenUtil; import com.liferay.portal.theme.ThemeDisplayFactory; import com.liferay.portal.util.LayoutClone; import com.liferay.portal.util.LayoutCloneFactory; import com.liferay.portal.util.LayoutTypeAccessPolicyTracker; import com.liferay.portal.util.PrefsPropsUtil; import com.liferay.portal.util.PropsUtil; import com.liferay.portal.util.PropsValues; import com.liferay.sites.kernel.util.SitesUtil; import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import javax.portlet.PortletMode; import javax.portlet.PortletRequest; import javax.portlet.PortletURL; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang.time.StopWatch; /** * @author Brian Wing Shun Chan * @author Felix Ventero * @author Jorge Ferrer */ public class ServicePreAction extends Action { public ServicePreAction() { initImportLARFiles(); } public ThemeDisplay initThemeDisplay( HttpServletRequest request, HttpServletResponse response) throws Exception { HttpSession session = request.getSession(); // Company Company company = PortalUtil.getCompany(request); long companyId = company.getCompanyId(); // CDN host String cdnHost = PortalUtil.getCDNHost(request); String dynamicResourcesCDNHost = StringPool.BLANK; boolean cdnDynamicResourceEnabled = PortalUtil.isCDNDynamicResourcesEnabled(request); if (cdnDynamicResourceEnabled) { dynamicResourcesCDNHost = cdnHost; } // Portal URL String portalURL = PortalUtil.getPortalURL(request); // Paths String contextPath = PortalUtil.getPathContext(); String friendlyURLPrivateGroupPath = PortalUtil.getPathFriendlyURLPrivateGroup(); String friendlyURLPrivateUserPath = PortalUtil.getPathFriendlyURLPrivateUser(); String friendlyURLPublicPath = PortalUtil.getPathFriendlyURLPublic(); String imagePath = dynamicResourcesCDNHost.concat( PortalUtil.getPathImage()); String mainPath = _PATH_MAIN; String i18nPath = (String)request.getAttribute(WebKeys.I18N_PATH); if (Validator.isNotNull(i18nPath)) { if (Validator.isNotNull(contextPath)) { String i18nContextPath = contextPath.concat(i18nPath); friendlyURLPrivateGroupPath = StringUtil.replaceFirst( friendlyURLPrivateGroupPath, contextPath, i18nContextPath); friendlyURLPrivateUserPath = StringUtil.replaceFirst( friendlyURLPrivateUserPath, contextPath, i18nContextPath); friendlyURLPublicPath = StringUtil.replaceFirst( friendlyURLPublicPath, contextPath, i18nContextPath); mainPath = StringUtil.replaceFirst( mainPath, contextPath, i18nContextPath); } else { friendlyURLPrivateGroupPath = i18nPath.concat( friendlyURLPrivateGroupPath); friendlyURLPrivateUserPath = i18nPath.concat( friendlyURLPrivateUserPath); friendlyURLPublicPath = i18nPath.concat(friendlyURLPublicPath); mainPath = i18nPath.concat(mainPath); } } // Company logo StringBundler sb = new StringBundler(5); sb.append(imagePath); sb.append("/company_logo?img_id="); sb.append(company.getLogoId()); sb.append("&t="); sb.append(WebServerServletTokenUtil.getToken(company.getLogoId())); String companyLogo = sb.toString(); int companyLogoHeight = 0; int companyLogoWidth = 0; long companyLogoId = company.getLogoId(); if (companyLogoId > 0) { Image companyLogoImage = ImageLocalServiceUtil.getCompanyLogo( companyLogoId); if (companyLogoImage != null) { companyLogoHeight = companyLogoImage.getHeight(); companyLogoWidth = companyLogoImage.getWidth(); } } String realCompanyLogo = companyLogo; int realCompanyLogoHeight = companyLogoHeight; int realCompanyLogoWidth = companyLogoWidth; // User User user = null; try { user = PortalUtil.initUser(request); } catch (NoSuchUserException nsue) { // LPS-52675 if (_log.isDebugEnabled()) { _log.debug(nsue, nsue); } return null; } boolean signedIn = !user.isDefaultUser(); if (PropsValues.BROWSER_CACHE_DISABLED || (PropsValues.BROWSER_CACHE_SIGNED_IN_DISABLED && signedIn)) { response.setDateHeader(HttpHeaders.EXPIRES, 0); response.setHeader( HttpHeaders.CACHE_CONTROL, HttpHeaders.CACHE_CONTROL_NO_CACHE_VALUE); response.setHeader( HttpHeaders.PRAGMA, HttpHeaders.PRAGMA_NO_CACHE_VALUE); } User realUser = user; Long realUserId = (Long)session.getAttribute(WebKeys.USER_ID); if (realUserId != null) { if (user.getUserId() != realUserId.longValue()) { realUser = UserLocalServiceUtil.getUserById( realUserId.longValue()); } } String doAsUserId = ParamUtil.getString(request, "doAsUserId"); String doAsUserLanguageId = ParamUtil.getString( request, "doAsUserLanguageId"); long doAsGroupId = ParamUtil.getLong(request, "doAsGroupId"); long refererGroupId = ParamUtil.getLong(request, "refererGroupId"); long refererPlid = ParamUtil.getLong(request, "refererPlid"); if ((refererPlid != 0) && (LayoutLocalServiceUtil.fetchLayout(refererPlid) == null)) { refererPlid = 0; } // Permission checker PermissionChecker permissionChecker = PermissionThreadLocal.getPermissionChecker(); if ((permissionChecker == null) || (permissionChecker.getUserId() != user.getUserId())) { permissionChecker = PermissionCheckerFactoryUtil.create(user); PermissionThreadLocal.setPermissionChecker(permissionChecker); } // Cookie support try { // LEP-4069 CookieKeys.validateSupportCookie(request); } catch (Exception e) { CookieKeys.addSupportCookie(request, response); } // Time zone TimeZone timeZone = user.getTimeZone(); if (timeZone == null) { timeZone = company.getTimeZone(); } // Layouts if (signedIn) { updateUserLayouts(user); } Layout layout = null; List<Layout> layouts = null; long plid = ParamUtil.getLong(request, "p_l_id"); boolean viewableSourceGroup = true; if (plid > 0) { layout = LayoutLocalServiceUtil.getLayout(plid); } else { long groupId = ParamUtil.getLong(request, "groupId"); boolean privateLayout = ParamUtil.getBoolean( request, "privateLayout"); long layoutId = ParamUtil.getLong(request, "layoutId"); if ((groupId > 0) && (layoutId > 0)) { layout = LayoutLocalServiceUtil.getLayout( groupId, privateLayout, layoutId); } } if ((layout != null) && ((layout.isPrivateLayout() && !PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED) || (layout.isPublicLayout() && !PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED))) { Group layoutGroup = layout.getGroup(); if (layoutGroup.isUser()) { User layoutUser = UserLocalServiceUtil.getUserById( companyId, layoutGroup.getClassPK()); updateUserLayouts(layoutUser); layout = LayoutLocalServiceUtil.fetchLayout(layout.getPlid()); } } if (layout != null) { long sourceGroupId = ParamUtil.getLong(request, "p_v_l_s_g_id"); if ((sourceGroupId > 0) && (sourceGroupId != layout.getGroupId())) { Group sourceGroup = GroupLocalServiceUtil.getGroup( sourceGroupId); if (layout.isTypeControlPanel() || layout.isPublicLayout() || SitesUtil.isUserGroupLayoutSetViewable( permissionChecker, layout.getGroup())) { layout = new VirtualLayout(layout, sourceGroup); } else { viewableSourceGroup = false; } } } String ppid = ParamUtil.getString(request, "p_p_id"); Boolean redirectToDefaultLayout = (Boolean)request.getAttribute( WebKeys.REDIRECT_TO_DEFAULT_LAYOUT); if (redirectToDefaultLayout == null) { redirectToDefaultLayout = Boolean.FALSE; } if (layout != null) { Group group = layout.getGroup(); if (!signedIn && PropsValues.AUTH_FORWARD_BY_REDIRECT) { request.setAttribute(WebKeys.REQUESTED_LAYOUT, layout); } boolean viewableGroup = hasAccessPermission( permissionChecker, layout, doAsGroupId, true); boolean viewableStaging = !group.isControlPanel() && GroupPermissionUtil.contains( permissionChecker, group, ActionKeys.VIEW_STAGING); boolean loginRequest = isLoginRequest(request); if (viewableStaging) { layouts = LayoutLocalServiceUtil.getLayouts( layout.getGroupId(), layout.isPrivateLayout(), LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); } else if ((!viewableGroup || !viewableSourceGroup) && group.isStagingGroup()) { layout = null; } else if (!loginRequest && (!viewableGroup || !viewableSourceGroup || (!redirectToDefaultLayout && !hasAccessPermission( permissionChecker, layout, doAsGroupId, false)))) { if (user.isDefaultUser() && PropsValues.AUTH_LOGIN_PROMPT_ENABLED) { throw new PrincipalException.MustBeAuthenticated( user.getUserId()); } sb = new StringBundler(6); sb.append("User "); sb.append(user.getUserId()); sb.append(" is not allowed to access the "); sb.append(layout.isPrivateLayout() ? "private" : "public"); sb.append(" pages of group "); sb.append(layout.getGroupId()); if (_log.isWarnEnabled()) { _log.warn(sb.toString()); } throw new NoSuchLayoutException(sb.toString()); } else if (loginRequest && !viewableGroup) { layout = null; } else if (group.isLayoutPrototype()) { layouts = new ArrayList<>(); } else { layouts = LayoutLocalServiceUtil.getLayouts( layout.getGroupId(), layout.isPrivateLayout(), LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); if (!group.isControlPanel()) { doAsGroupId = 0; } } } List<Layout> unfilteredLayouts = layouts; LayoutComposite viewableLayoutComposite = null; if (layout == null) { viewableLayoutComposite = getDefaultViewableLayoutComposite( request, user, permissionChecker, doAsGroupId, signedIn); request.setAttribute(WebKeys.LAYOUT_DEFAULT, Boolean.TRUE); } else { viewableLayoutComposite = getViewableLayoutComposite( request, user, permissionChecker, layout, layouts, doAsGroupId); } String layoutSetLogo = null; layout = viewableLayoutComposite.getLayout(); layouts = viewableLayoutComposite.getLayouts(); Group group = null; if (layout != null) { group = layout.getGroup(); if (!group.isControlPanel()) { rememberVisitedGroupIds(request, group.getGroupId()); } } LayoutTypePortlet layoutTypePortlet = null; layouts = mergeAdditionalLayouts( request, user, permissionChecker, layout, layouts, doAsGroupId); LayoutSet layoutSet = null; boolean hasCustomizeLayoutPermission = false; boolean hasUpdateLayoutPermission = false; boolean customizedView = SessionParamUtil.getBoolean( request, "customized_view", true); if (layout != null) { LayoutTypeAccessPolicy layoutTypeAccessPolicy = LayoutTypeAccessPolicyTracker.getLayoutTypeAccessPolicy(layout); hasCustomizeLayoutPermission = layoutTypeAccessPolicy.isCustomizeLayoutAllowed( permissionChecker, layout); hasUpdateLayoutPermission = layoutTypeAccessPolicy.isUpdateLayoutAllowed( permissionChecker, layout); layoutSet = layout.getLayoutSet(); if (company.isSiteLogo()) { long logoId = 0; if (layoutSet.isLogo()) { logoId = layoutSet.getLogoId(); if (logoId == 0) { logoId = layoutSet.getLiveLogoId(); } } else { LayoutSet siblingLayoutSet = LayoutSetLocalServiceUtil.getLayoutSet( layout.getGroupId(), !layout.isPrivateLayout()); if (siblingLayoutSet.isLogo()) { logoId = siblingLayoutSet.getLogoId(); } } if (logoId > 0) { sb = new StringBundler(5); sb.append(imagePath); sb.append("/layout_set_logo?img_id="); sb.append(logoId); sb.append("&t="); sb.append(WebServerServletTokenUtil.getToken(logoId)); layoutSetLogo = sb.toString(); Image layoutSetLogoImage = ImageLocalServiceUtil.getCompanyLogo(logoId); companyLogo = layoutSetLogo; companyLogoHeight = layoutSetLogoImage.getHeight(); companyLogoWidth = layoutSetLogoImage.getWidth(); } } plid = layout.getPlid(); layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType(); boolean customizable = layoutTypePortlet.isCustomizable(); if (!customizable || group.isLayoutPrototype() || group.isLayoutSetPrototype() || group.isStagingGroup()) { customizedView = false; } layoutTypePortlet.setCustomizedView(customizedView); layoutTypePortlet.setUpdatePermission(hasUpdateLayoutPermission); if (signedIn && customizable && customizedView && hasCustomizeLayoutPermission) { PortalPreferences portalPreferences = PortletPreferencesFactoryUtil.getPortalPreferences( user.getUserId(), true); layoutTypePortlet.setPortalPreferences(portalPreferences); } LayoutClone layoutClone = LayoutCloneFactory.getInstance(); if (layoutClone != null) { String typeSettings = layoutClone.get(request, plid); if (typeSettings != null) { UnicodeProperties typeSettingsProperties = new UnicodeProperties(true); typeSettingsProperties.load(typeSettings); String stateMax = typeSettingsProperties.getProperty( LayoutTypePortletConstants.STATE_MAX); String stateMin = typeSettingsProperties.getProperty( LayoutTypePortletConstants.STATE_MIN); String modeAbout = typeSettingsProperties.getProperty( LayoutTypePortletConstants.MODE_ABOUT); String modeConfig = typeSettingsProperties.getProperty( LayoutTypePortletConstants.MODE_CONFIG); String modeEdit = typeSettingsProperties.getProperty( LayoutTypePortletConstants.MODE_EDIT); String modeEditDefaults = typeSettingsProperties.getProperty( LayoutTypePortletConstants.MODE_EDIT_DEFAULTS); String modeEditGuest = typeSettingsProperties.getProperty( LayoutTypePortletConstants.MODE_EDIT_GUEST); String modeHelp = typeSettingsProperties.getProperty( LayoutTypePortletConstants.MODE_HELP); String modePreview = typeSettingsProperties.getProperty( LayoutTypePortletConstants.MODE_PREVIEW); String modePrint = typeSettingsProperties.getProperty( LayoutTypePortletConstants.MODE_PRINT); layoutTypePortlet.setStateMax(stateMax); layoutTypePortlet.setStateMin(stateMin); layoutTypePortlet.setModeAbout(modeAbout); layoutTypePortlet.setModeConfig(modeConfig); layoutTypePortlet.setModeEdit(modeEdit); layoutTypePortlet.setModeEditDefaults(modeEditDefaults); layoutTypePortlet.setModeEditGuest(modeEditGuest); layoutTypePortlet.setModeHelp(modeHelp); layoutTypePortlet.setModePreview(modePreview); layoutTypePortlet.setModePrint(modePrint); } } request.setAttribute(WebKeys.LAYOUT, layout); request.setAttribute(WebKeys.LAYOUTS, layouts); } // Locale String i18nLanguageId = (String)request.getAttribute( WebKeys.I18N_LANGUAGE_ID); Locale locale = PortalUtil.getLocale(request, response, true); // Scope long scopeGroupId = PortalUtil.getScopeGroupId(request); if (group.isInheritContent()) { scopeGroupId = group.getParentGroupId(); } if ((scopeGroupId <= 0) && (doAsGroupId > 0)) { scopeGroupId = doAsGroupId; } long siteGroupId = 0; if (layout != null) { if (layout.isTypeControlPanel()) { siteGroupId = PortalUtil.getSiteGroupId(scopeGroupId); } else { siteGroupId = PortalUtil.getSiteGroupId(layout.getGroupId()); } } // Theme and color scheme Theme theme = null; ColorScheme colorScheme = null; if ((layout != null) && (layout.isTypeControlPanel() || group.isControlPanel())) { String themeId = PrefsPropsUtil.getString( companyId, PropsKeys.CONTROL_PANEL_LAYOUT_REGULAR_THEME_ID); String colorSchemeId = ColorSchemeFactoryUtil.getDefaultRegularColorSchemeId(); theme = ThemeLocalServiceUtil.getTheme(companyId, themeId); colorScheme = ThemeLocalServiceUtil.getColorScheme( companyId, theme.getThemeId(), colorSchemeId); request.setAttribute(WebKeys.COLOR_SCHEME, colorScheme); request.setAttribute(WebKeys.THEME, theme); } boolean themeCssFastLoad = PropsValues.THEME_CSS_FAST_LOAD; if (PropsValues.THEME_CSS_FAST_LOAD_CHECK_REQUEST_PARAMETER) { themeCssFastLoad = SessionParamUtil.getBoolean( request, "css_fast_load", PropsValues.THEME_CSS_FAST_LOAD); } boolean themeImagesFastLoad = PropsValues.THEME_IMAGES_FAST_LOAD; if (PropsValues.THEME_IMAGES_FAST_LOAD_CHECK_REQUEST_PARAMETER) { SessionParamUtil.getBoolean( request, "images_fast_load", PropsValues.THEME_IMAGES_FAST_LOAD); } boolean themeJsBarebone = PropsValues.JAVASCRIPT_BAREBONE_ENABLED; if (themeJsBarebone) { if (signedIn || PropsValues.JAVASCRIPT_SINGLE_PAGE_APPLICATION_ENABLED) { themeJsBarebone = false; } } boolean themeJsFastLoad = SessionParamUtil.getBoolean( request, "js_fast_load", PropsValues.JAVASCRIPT_FAST_LOAD); String lifecycle = ParamUtil.getString(request, "p_p_lifecycle", "0"); lifecycle = ParamUtil.getString(request, "p_t_lifecycle", lifecycle); boolean isolated = ParamUtil.getBoolean(request, "p_p_isolated"); boolean widget = false; Boolean widgetObj = (Boolean)request.getAttribute(WebKeys.WIDGET); if (widgetObj != null) { widget = widgetObj.booleanValue(); } // Theme display ThemeDisplay themeDisplay = ThemeDisplayFactory.create(); themeDisplay.setRequest(request); themeDisplay.setResponse(response); // Set attributes first that other methods (getCDNBaseURL and // setLookAndFeel) depend on boolean secure = PortalUtil.isForwardedSecure(request); themeDisplay.setCDNHost(cdnHost); themeDisplay.setCDNDynamicResourcesHost(dynamicResourcesCDNHost); themeDisplay.setPortalDomain(_getPortalDomain(portalURL)); themeDisplay.setPortalURL(portalURL); themeDisplay.setRefererPlid(refererPlid); themeDisplay.setSecure(secure); themeDisplay.setServerName(PortalUtil.getForwardedHost(request)); themeDisplay.setServerPort(PortalUtil.getForwardedPort(request)); themeDisplay.setWidget(widget); themeDisplay.setCompany(company); themeDisplay.setCompanyLogo(companyLogo); themeDisplay.setCompanyLogoHeight(companyLogoHeight); themeDisplay.setCompanyLogoWidth(companyLogoWidth); themeDisplay.setDoAsGroupId(doAsGroupId); themeDisplay.setDoAsUserId(doAsUserId); themeDisplay.setDoAsUserLanguageId(doAsUserLanguageId); themeDisplay.setI18nLanguageId(i18nLanguageId); themeDisplay.setI18nPath(i18nPath); themeDisplay.setIsolated(isolated); themeDisplay.setLanguageId(LocaleUtil.toLanguageId(locale)); themeDisplay.setLayout(layout); themeDisplay.setLayouts(layouts); themeDisplay.setLayoutSet(layoutSet); themeDisplay.setLayoutSetLogo(layoutSetLogo); themeDisplay.setLayoutTypePortlet(layoutTypePortlet); themeDisplay.setLifecycle(lifecycle); themeDisplay.setLifecycleAction(lifecycle.equals("1")); themeDisplay.setLifecycleEvent(lifecycle.equals("3")); themeDisplay.setLifecycleRender(lifecycle.equals("0")); themeDisplay.setLifecycleResource(lifecycle.equals("2")); themeDisplay.setLocale(locale); themeDisplay.setLookAndFeel(theme, colorScheme); themeDisplay.setPathApplet(contextPath.concat("/applets")); themeDisplay.setPathCms(contextPath.concat("/cms")); themeDisplay.setPathContext(contextPath); themeDisplay.setPathFlash(contextPath.concat("/flash")); themeDisplay.setPathFriendlyURLPrivateGroup( friendlyURLPrivateGroupPath); themeDisplay.setPathFriendlyURLPrivateUser(friendlyURLPrivateUserPath); themeDisplay.setPathFriendlyURLPublic(friendlyURLPublicPath); themeDisplay.setPathImage(imagePath); themeDisplay.setPathJavaScript( PortalWebResourcesUtil.getContextPath( PortalWebResourceConstants.RESOURCE_TYPE_JS)); themeDisplay.setPathMain(mainPath); themeDisplay.setPathSound(contextPath.concat("/html/sound")); themeDisplay.setPermissionChecker(permissionChecker); themeDisplay.setPlid(plid); themeDisplay.setPpid(ppid); themeDisplay.setRealCompanyLogo(realCompanyLogo); themeDisplay.setRealCompanyLogoHeight(realCompanyLogoHeight); themeDisplay.setRealCompanyLogoWidth(realCompanyLogoWidth); themeDisplay.setRealUser(realUser); themeDisplay.setRefererGroupId(refererGroupId); themeDisplay.setScopeGroupId(scopeGroupId); themeDisplay.setSignedIn(signedIn); themeDisplay.setSiteDefaultLocale( PortalUtil.getSiteDefaultLocale(siteGroupId)); themeDisplay.setSiteGroupId(siteGroupId); themeDisplay.setStateExclusive(LiferayWindowState.isExclusive(request)); themeDisplay.setStateMaximized(LiferayWindowState.isMaximized(request)); themeDisplay.setStatePopUp(LiferayWindowState.isPopUp(request)); themeDisplay.setThemeCssFastLoad(themeCssFastLoad); themeDisplay.setThemeImagesFastLoad(themeImagesFastLoad); themeDisplay.setThemeJsBarebone(themeJsBarebone); themeDisplay.setThemeJsFastLoad(themeJsFastLoad); themeDisplay.setTimeZone(timeZone); themeDisplay.setUnfilteredLayouts(unfilteredLayouts); themeDisplay.setUser(user); // Icons boolean showControlPanelIcon = false; if (signedIn && PortalPermissionUtil.contains( permissionChecker, ActionKeys.VIEW_CONTROL_PANEL)) { showControlPanelIcon = true; } themeDisplay.setShowControlPanelIcon(showControlPanelIcon); themeDisplay.setShowHomeIcon(true); themeDisplay.setShowMyAccountIcon(signedIn); themeDisplay.setShowPageSettingsIcon(hasUpdateLayoutPermission); themeDisplay.setShowPortalIcon(true); themeDisplay.setShowSignInIcon(!signedIn); boolean showSignOutIcon = signedIn; if (themeDisplay.isImpersonated()) { showSignOutIcon = false; } themeDisplay.setShowSignOutIcon(showSignOutIcon); themeDisplay.setShowStagingIcon(false); boolean showSiteAdministrationIcon = false; if (signedIn && GroupPermissionUtil.contains( permissionChecker, group, ActionKeys.VIEW_SITE_ADMINISTRATION)) { showSiteAdministrationIcon = true; } themeDisplay.setShowSiteAdministrationIcon(showSiteAdministrationIcon); // Session if (PropsValues.SESSION_ENABLE_URL_WITH_SESSION_ID && !CookieKeys.hasSessionId(request)) { themeDisplay.setAddSessionIdToURL(true); themeDisplay.setSessionId(session.getId()); } // URLs String urlControlPanel = friendlyURLPrivateGroupPath.concat( GroupConstants.CONTROL_PANEL_FRIENDLY_URL); if (Validator.isNotNull(doAsUserId)) { urlControlPanel = HttpUtil.addParameter( urlControlPanel, "doAsUserId", doAsUserId); } if (refererGroupId > 0) { urlControlPanel = HttpUtil.addParameter( urlControlPanel, "refererGroupId", refererGroupId); } else if (scopeGroupId > 0) { Layout refererLayout = LayoutLocalServiceUtil.fetchLayout(plid); if (refererLayout != null) { Group refererLayoutGroup = refererLayout.getGroup(); if (refererLayoutGroup.isUserGroup()) { urlControlPanel = HttpUtil.addParameter( urlControlPanel, "refererGroupId", scopeGroupId); } } } if (refererPlid > 0) { urlControlPanel = HttpUtil.addParameter( urlControlPanel, "refererPlid", refererPlid); } else if (plid > 0) { urlControlPanel = HttpUtil.addParameter( urlControlPanel, "refererPlid", plid); } if (themeDisplay.isAddSessionIdToURL()) { urlControlPanel = PortalUtil.getURLWithSessionId( urlControlPanel, session.getId()); } themeDisplay.setURLControlPanel(urlControlPanel); String currentURL = PortalUtil.getCurrentURL(request); themeDisplay.setURLCurrent(currentURL); String urlHome = PortalUtil.getHomeURL(request); themeDisplay.setURLHome(urlHome); if (layout != null) { if (layout.isTypePortlet()) { boolean freeformLayout = layoutTypePortlet.getLayoutTemplateId().equals("freeform"); themeDisplay.setFreeformLayout(freeformLayout); if (hasUpdateLayoutPermission) { themeDisplay.setShowLayoutTemplatesIcon(true); if (!group.isUser()) { themeDisplay.setShowPageCustomizationIcon(true); } } } if (hasUpdateLayoutPermission) { themeDisplay.setShowPageSettingsIcon(true); } if (group.hasStagingGroup()) { themeDisplay.setShowLayoutTemplatesIcon(false); themeDisplay.setURLPublishToLive(null); } if (group.isControlPanel()) { themeDisplay.setShowPageSettingsIcon(false); themeDisplay.setURLPublishToLive(null); } // LEP-4987 if (group.isStaged() || group.isStagingGroup()) { Group scopeGroup = GroupLocalServiceUtil.getGroup(scopeGroupId); boolean hasManageStagingPermission = GroupPermissionUtil.contains( permissionChecker, scopeGroup, ActionKeys.MANAGE_STAGING); boolean hasPublishStagingPermission = GroupPermissionUtil.contains( permissionChecker, scopeGroup, ActionKeys.PUBLISH_STAGING); boolean hasViewStagingPermission = GroupPermissionUtil.contains( permissionChecker, scopeGroup, ActionKeys.VIEW_STAGING); if (hasManageStagingPermission || hasPublishStagingPermission || hasUpdateLayoutPermission || hasViewStagingPermission) { themeDisplay.setShowStagingIcon(true); } if (hasPublishStagingPermission) { PortletURL publishToLiveURL = PortletURLFactoryUtil.create( request, PortletKeys.EXPORT_IMPORT, plid, PortletRequest.RENDER_PHASE); publishToLiveURL.setParameter( "mvcRenderCommandName", "publishLayouts"); if (layout.isPrivateLayout()) { publishToLiveURL.setParameter("tabs1", "private-pages"); } else { publishToLiveURL.setParameter("tabs1", "public-pages"); } publishToLiveURL.setParameter( "groupId", String.valueOf(scopeGroupId)); publishToLiveURL.setParameter( "selPlid", String.valueOf(plid)); publishToLiveURL.setPortletMode(PortletMode.VIEW); publishToLiveURL.setWindowState( LiferayWindowState.EXCLUSIVE); themeDisplay.setURLPublishToLive(publishToLiveURL); } } } if (!user.isActive() || (PrefsPropsUtil.getBoolean( companyId, PropsKeys.TERMS_OF_USE_REQUIRED) && !user.isAgreedToTermsOfUse())) { themeDisplay.setShowMyAccountIcon(false); themeDisplay.setShowPageSettingsIcon(false); } if ((layout != null) && layout.isLayoutPrototypeLinkActive()) { themeDisplay.setShowPageCustomizationIcon(false); } if (group.isLayoutPrototype()) { themeDisplay.setShowHomeIcon(false); themeDisplay.setShowMyAccountIcon(false); themeDisplay.setShowPageCustomizationIcon(false); themeDisplay.setShowPageSettingsIcon(true); themeDisplay.setShowPortalIcon(false); themeDisplay.setShowSignInIcon(false); themeDisplay.setShowSignOutIcon(false); themeDisplay.setShowSiteAdministrationIcon(false); themeDisplay.setShowStagingIcon(false); } if (group.isLayoutSetPrototype()) { themeDisplay.setShowPageCustomizationIcon(false); } if (group.hasStagingGroup()) { themeDisplay.setShowLayoutTemplatesIcon(false); themeDisplay.setShowPageCustomizationIcon(false); } themeDisplay.setURLPortal(portalURL.concat(contextPath)); if (!secure && PropsValues.COMPANY_SECURITY_AUTH_REQUIRES_HTTPS) { secure = true; } String securePortalURL = PortalUtil.getPortalURL(request, secure); String urlSignIn = securePortalURL.concat(mainPath).concat( _PATH_PORTAL_LOGIN); if (layout != null) { urlSignIn = HttpUtil.addParameter( urlSignIn, "p_l_id", layout.getPlid()); } themeDisplay.setURLSignIn(urlSignIn); themeDisplay.setURLSignOut(mainPath.concat(_PATH_PORTAL_LOGOUT)); return themeDisplay; } @Override public void run(HttpServletRequest request, HttpServletResponse response) throws ActionException { StopWatch stopWatch = new StopWatch(); stopWatch.start(); try { servicePre(request, response); } catch (Exception e) { throw new ActionException(e); } if (_log.isDebugEnabled()) { _log.debug("Running takes " + stopWatch.getTime() + " ms"); } } protected void addDefaultLayoutsByLAR( long userId, long groupId, boolean privateLayout, File larFile) throws PortalException { User user = UserLocalServiceUtil.getUser(userId); Map<String, String[]> parameterMap = new HashMap<>(); parameterMap.put( PortletDataHandlerKeys.PERMISSIONS, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.PORTLET_ARCHIVED_SETUPS_ALL, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.PORTLET_CONFIGURATION, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.PORTLET_CONFIGURATION_ALL, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.PORTLET_DATA, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.PORTLET_DATA_ALL, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.PORTLET_DATA_CONTROL_DEFAULT, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.PORTLET_SETUP_ALL, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.PORTLET_USER_PREFERENCES_ALL, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.THEME_REFERENCE, new String[] {Boolean.TRUE.toString()}); Map<String, Serializable> importLayoutSettingsMap = ExportImportConfigurationSettingsMapFactory. buildImportLayoutSettingsMap( user, groupId, privateLayout, null, parameterMap); ExportImportConfiguration exportImportConfiguration = ExportImportConfigurationLocalServiceUtil. addDraftExportImportConfiguration( user.getUserId(), ExportImportConfigurationConstants.TYPE_IMPORT_LAYOUT, importLayoutSettingsMap); ExportImportLocalServiceUtil.importLayouts( exportImportConfiguration, larFile); } protected void addDefaultUserPrivateLayoutByProperties( long userId, long groupId) throws PortalException { String friendlyURL = getFriendlyURL( PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_FRIENDLY_URL); ServiceContext serviceContext = new ServiceContext(); Layout layout = LayoutLocalServiceUtil.addLayout( userId, groupId, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_NAME, StringPool.BLANK, StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL, serviceContext); LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType(); layoutTypePortlet.setLayoutTemplateId( 0, PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_TEMPLATE_ID, false); LayoutTemplate layoutTemplate = layoutTypePortlet.getLayoutTemplate(); for (String columnId : layoutTemplate.getColumns()) { String keyPrefix = PropsKeys.DEFAULT_USER_PRIVATE_LAYOUT_PREFIX; String portletIds = PropsUtil.get(keyPrefix.concat(columnId)); layoutTypePortlet.addPortletIds( 0, StringUtil.split(portletIds), columnId, false); } LayoutLocalServiceUtil.updateLayout( layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(), layout.getTypeSettings()); boolean updateLayoutSet = false; LayoutSet layoutSet = layout.getLayoutSet(); if (Validator.isNotNull( PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID)) { layoutSet.setThemeId( PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID); updateLayoutSet = true; } if (Validator.isNotNull( PropsValues. DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID)) { layoutSet.setColorSchemeId( PropsValues. DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID); updateLayoutSet = true; } if (updateLayoutSet) { LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet); } } protected void addDefaultUserPrivateLayouts(User user) throws PortalException { Group group = user.getGroup(); if (privateLARFile != null) { addDefaultLayoutsByLAR( user.getUserId(), group.getGroupId(), true, privateLARFile); } else { addDefaultUserPrivateLayoutByProperties( user.getUserId(), group.getGroupId()); } } protected void addDefaultUserPublicLayoutByProperties( long userId, long groupId) throws PortalException { String friendlyURL = getFriendlyURL( PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_FRIENDLY_URL); ServiceContext serviceContext = new ServiceContext(); Layout layout = LayoutLocalServiceUtil.addLayout( userId, groupId, false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_NAME, StringPool.BLANK, StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL, serviceContext); LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType(); layoutTypePortlet.setLayoutTemplateId( 0, PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_TEMPLATE_ID, false); LayoutTemplate layoutTemplate = layoutTypePortlet.getLayoutTemplate(); for (String columnId : layoutTemplate.getColumns()) { String keyPrefix = PropsKeys.DEFAULT_USER_PUBLIC_LAYOUT_PREFIX; String portletIds = PropsUtil.get(keyPrefix.concat(columnId)); layoutTypePortlet.addPortletIds( 0, StringUtil.split(portletIds), columnId, false); } LayoutLocalServiceUtil.updateLayout( layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(), layout.getTypeSettings()); boolean updateLayoutSet = false; LayoutSet layoutSet = layout.getLayoutSet(); if (Validator.isNotNull( PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID)) { layoutSet.setThemeId( PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID); updateLayoutSet = true; } if (Validator.isNotNull( PropsValues. DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID)) { layoutSet.setColorSchemeId( PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID); updateLayoutSet = true; } if (updateLayoutSet) { LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet); } } protected void addDefaultUserPublicLayouts(User user) throws PortalException { Group userGroup = user.getGroup(); if (publicLARFile != null) { addDefaultLayoutsByLAR( user.getUserId(), userGroup.getGroupId(), false, publicLARFile); } else { addDefaultUserPublicLayoutByProperties( user.getUserId(), userGroup.getGroupId()); } } protected void deleteDefaultUserPrivateLayouts(User user) throws PortalException { Group group = user.getGroup(); ServiceContext serviceContext = new ServiceContext(); LayoutLocalServiceUtil.deleteLayouts( group.getGroupId(), true, serviceContext); } protected void deleteDefaultUserPublicLayouts(User user) throws PortalException { Group userGroup = user.getGroup(); ServiceContext serviceContext = new ServiceContext(); LayoutLocalServiceUtil.deleteLayouts( userGroup.getGroupId(), false, serviceContext); } protected LayoutComposite getDefaultUserPersonalSiteLayoutComposite( User user) { Layout layout = null; Group group = user.getGroup(); List<Layout> layouts = LayoutLocalServiceUtil.getLayouts( group.getGroupId(), true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); if (layouts.isEmpty()) { layouts = LayoutLocalServiceUtil.getLayouts( group.getGroupId(), false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); } if (!layouts.isEmpty()) { layout = layouts.get(0); } return new LayoutComposite(layout, layouts); } protected LayoutComposite getDefaultUserSitesLayoutComposite( final User user) throws PortalException { final LinkedHashMap<String, Object> groupParams = new LinkedHashMap<>(); groupParams.put("usersGroups", Long.valueOf(user.getUserId())); int count = GroupLocalServiceUtil.searchCount( user.getCompanyId(), null, null, groupParams); IntervalActionProcessor<LayoutComposite> intervalActionProcessor = new IntervalActionProcessor<>(count); intervalActionProcessor.setPerformIntervalActionMethod( new IntervalActionProcessor.PerformIntervalActionMethod <LayoutComposite>() { @Override public LayoutComposite performIntervalAction( int start, int end) { List<Group> groups = GroupLocalServiceUtil.search( user.getCompanyId(), null, null, groupParams, start, end); for (Group group : groups) { List<Layout> layouts = LayoutLocalServiceUtil.getLayouts( group.getGroupId(), true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); if (layouts.isEmpty()) { layouts = LayoutLocalServiceUtil.getLayouts( group.getGroupId(), false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); } if (!layouts.isEmpty()) { return new LayoutComposite(layouts.get(0), layouts); } } return null; } }); LayoutComposite layoutComposite = intervalActionProcessor.performIntervalActions(); if (layoutComposite == null) { return new LayoutComposite(null, new ArrayList<Layout>()); } return layoutComposite; } protected LayoutComposite getDefaultViewableLayoutComposite( HttpServletRequest request, User user, PermissionChecker permissionChecker, long doAsGroupId, boolean signedIn) throws PortalException { LayoutComposite defaultLayoutComposite = getDefaultVirtualHostLayoutComposite(request); defaultLayoutComposite = getViewableLayoutComposite( request, user, permissionChecker, defaultLayoutComposite, doAsGroupId); if (ListUtil.isNotEmpty(defaultLayoutComposite.getLayouts())) { return defaultLayoutComposite; } if (signedIn) { defaultLayoutComposite = getDefaultUserPersonalSiteLayoutComposite( user); if (defaultLayoutComposite.getLayout() == null) { defaultLayoutComposite = getDefaultUserSitesLayoutComposite( user); } defaultLayoutComposite = getViewableLayoutComposite( request, user, permissionChecker, defaultLayoutComposite, doAsGroupId); if (ListUtil.isNotEmpty(defaultLayoutComposite.getLayouts())) { return defaultLayoutComposite; } } defaultLayoutComposite = getGuestSiteLayoutComposite(user); return getViewableLayoutComposite( request, user, permissionChecker, defaultLayoutComposite, doAsGroupId); } protected LayoutComposite getDefaultVirtualHostLayoutComposite( HttpServletRequest request) throws PortalException { Layout layout = null; List<Layout> layouts = null; LayoutSet layoutSet = (LayoutSet)request.getAttribute( WebKeys.VIRTUAL_HOST_LAYOUT_SET); if (layoutSet != null) { layouts = LayoutLocalServiceUtil.getLayouts( layoutSet.getGroupId(), layoutSet.isPrivateLayout(), LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); Group group = null; if (!layouts.isEmpty()) { layout = layouts.get(0); group = layout.getGroup(); } if ((layout != null) && layout.isPrivateLayout()) { layouts = LayoutLocalServiceUtil.getLayouts( group.getGroupId(), false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); if (!layouts.isEmpty()) { layout = layouts.get(0); } else { group = null; layout = null; } } if ((group != null) && group.isStagingGroup()) { Group liveGroup = group.getLiveGroup(); layouts = LayoutLocalServiceUtil.getLayouts( liveGroup.getGroupId(), false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); if (!layouts.isEmpty()) { layout = layouts.get(0); } else { layout = null; } } } return new LayoutComposite(layout, layouts); } protected String getFriendlyURL(String friendlyURL) { friendlyURL = GetterUtil.getString(friendlyURL); return FriendlyURLNormalizerUtil.normalize(friendlyURL); } protected LayoutComposite getGuestSiteLayoutComposite(User user) throws PortalException { Layout layout = null; List<Layout> layouts = null; Group guestGroup = GroupLocalServiceUtil.getGroup( user.getCompanyId(), GroupConstants.GUEST); layouts = LayoutLocalServiceUtil.getLayouts( guestGroup.getGroupId(), false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); if (!layouts.isEmpty()) { layout = layouts.get(0); } return new LayoutComposite(layout, layouts); } protected LayoutComposite getViewableLayoutComposite( HttpServletRequest request, User user, PermissionChecker permissionChecker, Layout layout, List<Layout> layouts, long doAsGroupId) throws PortalException { if ((layouts == null) || layouts.isEmpty()) { return new LayoutComposite(layout, layouts); } Group group = layout.getGroup(); boolean hasViewLayoutPermission = false; boolean hasViewStagingPermission = (group.isStagingGroup() || group.isStagedRemotely()) && !group.isControlPanel() && GroupPermissionUtil.contains( permissionChecker, group, ActionKeys.VIEW_STAGING); if (hasAccessPermission( permissionChecker, layout, doAsGroupId, false) || hasViewStagingPermission) { hasViewLayoutPermission = true; } List<Layout> accessibleLayouts = new ArrayList<>(); for (int i = 0; i < layouts.size(); i++) { Layout curLayout = layouts.get(i); if (!curLayout.isHidden() && (hasAccessPermission( permissionChecker, curLayout, doAsGroupId, false) || hasViewStagingPermission)) { if (accessibleLayouts.isEmpty() && !hasViewLayoutPermission) { layout = curLayout; } accessibleLayouts.add(curLayout); } } if (accessibleLayouts.isEmpty()) { layouts = null; if (!isLoginRequest(request) && !hasViewLayoutPermission) { if (user.isDefaultUser() && PropsValues.AUTH_LOGIN_PROMPT_ENABLED) { throw new PrincipalException.MustBeAuthenticated( String.valueOf(user.getUserId())); } SessionErrors.add( request, LayoutPermissionException.class.getName()); } } else { layouts = accessibleLayouts; } return new LayoutComposite(layout, layouts); } protected LayoutComposite getViewableLayoutComposite( HttpServletRequest request, User user, PermissionChecker permissionChecker, LayoutComposite defaultLayoutComposite, long doAsGroupId) throws PortalException { Layout layout = defaultLayoutComposite.getLayout(); List<Layout> layouts = defaultLayoutComposite.getLayouts(); return getViewableLayoutComposite( request, user, permissionChecker, layout, layouts, doAsGroupId); } protected boolean hasAccessPermission( PermissionChecker permissionChecker, Layout layout, long doAsGroupId, boolean checkViewableGroup) throws PortalException { return LayoutPermissionUtil.contains( permissionChecker, layout, checkViewableGroup, ActionKeys.VIEW); } protected Boolean hasPowerUserRole(User user) throws Exception { return RoleLocalServiceUtil.hasUserRole( user.getUserId(), user.getCompanyId(), RoleConstants.POWER_USER, true); } protected void initImportLARFiles() { String privateLARFileName = PropsValues.DEFAULT_USER_PRIVATE_LAYOUTS_LAR; if (_log.isDebugEnabled()) { _log.debug("Reading private LAR file " + privateLARFileName); } if (Validator.isNotNull(privateLARFileName)) { privateLARFile = new File(privateLARFileName); if (!privateLARFile.exists()) { _log.error( "Private LAR file " + privateLARFile + " does not exist"); privateLARFile = null; } else { if (_log.isDebugEnabled()) { _log.debug("Using private LAR file " + privateLARFileName); } } } String publicLARFileName = PropsValues.DEFAULT_USER_PUBLIC_LAYOUTS_LAR; if (_log.isDebugEnabled()) { _log.debug("Reading public LAR file " + publicLARFileName); } if (Validator.isNotNull(publicLARFileName)) { publicLARFile = new File(publicLARFileName); if (!publicLARFile.exists()) { _log.error( "Public LAR file " + publicLARFile + " does not exist"); publicLARFile = null; } else { if (_log.isDebugEnabled()) { _log.debug("Using public LAR file " + publicLARFileName); } } } } /** * Returns <code>true</code> if the request URI's path starts with the * portal's default login path <code>c/portal/login</code>. * * @param request the servlet request for the page, which can be a result * of a redirect * @return <code>true</code> if the request is a login request; * <code>false</code> otherwise */ protected boolean isLoginRequest(HttpServletRequest request) { String requestURI = request.getRequestURI(); String mainPath = _PATH_MAIN; if (_PATH_PROXY != null) { if (!requestURI.startsWith(_PATH_PROXY)) { requestURI = _PATH_PROXY.concat(requestURI); } if (!mainPath.startsWith(_PATH_PROXY)) { mainPath = _PATH_PROXY.concat(mainPath); } } if (requestURI.startsWith(mainPath) && requestURI.startsWith(_PATH_PORTAL_LOGIN, mainPath.length())) { return true; } return false; } protected List<Layout> mergeAdditionalLayouts( HttpServletRequest request, User user, PermissionChecker permissionChecker, Layout layout, List<Layout> layouts, long doAsGroupId) throws PortalException { if ((layout == null) || layout.isPrivateLayout()) { return layouts; } long layoutGroupId = layout.getGroupId(); Group guestGroup = GroupLocalServiceUtil.getGroup( user.getCompanyId(), GroupConstants.GUEST); if (layoutGroupId != guestGroup.getGroupId()) { Group layoutGroup = GroupLocalServiceUtil.getGroup(layoutGroupId); UnicodeProperties typeSettingsProperties = layoutGroup.getTypeSettingsProperties(); boolean mergeGuestPublicPages = GetterUtil.getBoolean( typeSettingsProperties.getProperty("mergeGuestPublicPages")); if (!mergeGuestPublicPages) { return layouts; } List<Layout> guestLayouts = LayoutLocalServiceUtil.getLayouts( guestGroup.getGroupId(), false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); LayoutComposite viewableLayoutComposite = getViewableLayoutComposite( request, user, permissionChecker, layout, guestLayouts, doAsGroupId); guestLayouts = viewableLayoutComposite.getLayouts(); if (layouts == null) { return guestLayouts; } layouts.addAll(0, guestLayouts); } else { HttpSession session = request.getSession(); Long previousGroupId = (Long)session.getAttribute( WebKeys.VISITED_GROUP_ID_PREVIOUS); if ((previousGroupId != null) && (previousGroupId.longValue() != layoutGroupId)) { Group previousGroup = null; try { previousGroup = GroupLocalServiceUtil.getGroup( previousGroupId.longValue()); } catch (NoSuchGroupException nsge) { if (_log.isWarnEnabled()) { _log.warn(nsge); } return layouts; } UnicodeProperties typeSettingsProperties = previousGroup.getTypeSettingsProperties(); boolean mergeGuestPublicPages = GetterUtil.getBoolean( typeSettingsProperties.getProperty( "mergeGuestPublicPages")); if (!mergeGuestPublicPages) { return layouts; } List<Layout> previousLayouts = LayoutLocalServiceUtil.getLayouts( previousGroupId.longValue(), false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); LayoutComposite viewableLayoutComposite = getViewableLayoutComposite( request, user, permissionChecker, layout, previousLayouts, doAsGroupId); previousLayouts = viewableLayoutComposite.getLayouts(); if (previousLayouts != null) { layouts.addAll(previousLayouts); } } } return layouts; } protected void rememberVisitedGroupIds( HttpServletRequest request, long currentGroupId) { String requestURI = GetterUtil.getString(request.getRequestURI()); if (!requestURI.endsWith(_PATH_PORTAL_LAYOUT)) { return; } HttpSession session = request.getSession(); Long recentGroupId = (Long)session.getAttribute( WebKeys.VISITED_GROUP_ID_RECENT); Long previousGroupId = (Long)session.getAttribute( WebKeys.VISITED_GROUP_ID_PREVIOUS); if (recentGroupId == null) { recentGroupId = Long.valueOf(currentGroupId); session.setAttribute( WebKeys.VISITED_GROUP_ID_RECENT, recentGroupId); } else if (recentGroupId.longValue() != currentGroupId) { previousGroupId = Long.valueOf(recentGroupId.longValue()); recentGroupId = Long.valueOf(currentGroupId); session.setAttribute( WebKeys.VISITED_GROUP_ID_RECENT, recentGroupId); session.setAttribute( WebKeys.VISITED_GROUP_ID_PREVIOUS, previousGroupId); } if (_log.isDebugEnabled()) { _log.debug("Current group id " + currentGroupId); _log.debug("Recent group id " + recentGroupId); _log.debug("Previous group id " + previousGroupId); } } protected void servicePre( HttpServletRequest request, HttpServletResponse response) throws Exception { ThemeDisplay themeDisplay = initThemeDisplay(request, response); if (themeDisplay == null) { return; } request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay); // Service context ServiceContext serviceContext = ServiceContextFactory.getInstance( request); ServiceContextThreadLocal.pushServiceContext(serviceContext); // Ajaxable render if (PropsValues.LAYOUT_AJAX_RENDER_ENABLE) { boolean portletAjaxRender = ParamUtil.getBoolean( request, "p_p_ajax", true); request.setAttribute( WebKeys.PORTLET_AJAX_RENDER, portletAjaxRender); } // Parallel render if (PropsValues.LAYOUT_PARALLEL_RENDER_ENABLE && ServerDetector.isTomcat()) { boolean portletParallelRender = ParamUtil.getBoolean( request, "p_p_parallel", true); request.setAttribute( WebKeys.PORTLET_PARALLEL_RENDER, portletParallelRender); } } protected void updateUserLayouts(User user) throws Exception { Boolean hasPowerUserRole = null; // Private layouts boolean addDefaultUserPrivateLayouts = false; if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED && PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_AUTO_CREATE) { addDefaultUserPrivateLayouts = true; if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) { if (hasPowerUserRole == null) { hasPowerUserRole = hasPowerUserRole(user); } if (!hasPowerUserRole.booleanValue()) { addDefaultUserPrivateLayouts = false; } } } Boolean hasPrivateLayouts = null; if (addDefaultUserPrivateLayouts) { hasPrivateLayouts = LayoutLocalServiceUtil.hasLayouts( user, true, false); if (!hasPrivateLayouts) { addDefaultUserPrivateLayouts(user); } } boolean deleteDefaultUserPrivateLayouts = false; if (!PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED) { deleteDefaultUserPrivateLayouts = true; } else if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) { if (hasPowerUserRole == null) { hasPowerUserRole = hasPowerUserRole(user); } if (!hasPowerUserRole.booleanValue()) { deleteDefaultUserPrivateLayouts = true; } } if (deleteDefaultUserPrivateLayouts) { if (hasPrivateLayouts == null) { hasPrivateLayouts = LayoutLocalServiceUtil.hasLayouts( user, true, false); } if (hasPrivateLayouts) { deleteDefaultUserPrivateLayouts(user); } } // Public pages boolean addDefaultUserPublicLayouts = false; if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED && PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_AUTO_CREATE) { addDefaultUserPublicLayouts = true; if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) { if (hasPowerUserRole == null) { hasPowerUserRole = hasPowerUserRole(user); } if (!hasPowerUserRole.booleanValue()) { addDefaultUserPublicLayouts = false; } } } Boolean hasPublicLayouts = null; if (addDefaultUserPublicLayouts) { hasPublicLayouts = LayoutLocalServiceUtil.hasLayouts( user, false, false); if (!hasPublicLayouts) { addDefaultUserPublicLayouts(user); } } boolean deleteDefaultUserPublicLayouts = false; if (!PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED) { deleteDefaultUserPublicLayouts = true; } else if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) { if (hasPowerUserRole == null) { hasPowerUserRole = hasPowerUserRole(user); } if (!hasPowerUserRole.booleanValue()) { deleteDefaultUserPublicLayouts = true; } } if (deleteDefaultUserPublicLayouts) { if (hasPublicLayouts == null) { hasPublicLayouts = LayoutLocalServiceUtil.hasLayouts( user, false, false); } if (hasPublicLayouts) { deleteDefaultUserPublicLayouts(user); } } } protected File privateLARFile; protected File publicLARFile; protected class LayoutComposite { protected LayoutComposite(Layout layout, List<Layout> layouts) { _layout = layout; _layouts = layouts; } protected Layout getLayout() { return _layout; } protected List<Layout> getLayouts() { return _layouts; } private final Layout _layout; private final List<Layout> _layouts; } private static String _getPortalDomain(String portalURL) { String portalDomain = _portalDomains.get(portalURL); if (portalDomain == null) { portalDomain = HttpUtil.getDomain(portalURL); _portalDomains.put(portalURL, portalDomain); } return portalDomain; } private static final String _PATH_MAIN = PortalUtil.getPathMain(); private static final String _PATH_PORTAL_LAYOUT = "/portal/layout"; private static final String _PATH_PORTAL_LOGIN = "/portal/login"; private static final String _PATH_PORTAL_LOGOUT = "/portal/logout"; private static final String _PATH_PROXY; private static final Log _log = LogFactoryUtil.getLog( ServicePreAction.class); private static final Map<String, String> _portalDomains = new ConcurrentHashMap<>(); static { String pathProxy = PortalUtil.getPathProxy(); if (Validator.isBlank(pathProxy)) { _PATH_PROXY = null; } else { _PATH_PROXY = pathProxy; } } }