1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.events;
24  
25  import com.liferay.portal.LayoutPermissionException;
26  import com.liferay.portal.NoSuchGroupException;
27  import com.liferay.portal.NoSuchLayoutException;
28  import com.liferay.portal.NoSuchUserException;
29  import com.liferay.portal.PortalException;
30  import com.liferay.portal.SystemException;
31  import com.liferay.portal.kernel.dao.orm.QueryUtil;
32  import com.liferay.portal.kernel.events.Action;
33  import com.liferay.portal.kernel.events.ActionException;
34  import com.liferay.portal.kernel.language.LanguageUtil;
35  import com.liferay.portal.kernel.log.Log;
36  import com.liferay.portal.kernel.log.LogFactoryUtil;
37  import com.liferay.portal.kernel.portlet.LiferayWindowState;
38  import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
39  import com.liferay.portal.kernel.servlet.ImageServletTokenUtil;
40  import com.liferay.portal.kernel.servlet.SessionErrors;
41  import com.liferay.portal.kernel.util.GetterUtil;
42  import com.liferay.portal.kernel.util.HttpUtil;
43  import com.liferay.portal.kernel.util.LocaleUtil;
44  import com.liferay.portal.kernel.util.ParamUtil;
45  import com.liferay.portal.kernel.util.ServerDetector;
46  import com.liferay.portal.kernel.util.StringPool;
47  import com.liferay.portal.kernel.util.StringUtil;
48  import com.liferay.portal.kernel.util.UnicodeProperties;
49  import com.liferay.portal.kernel.util.Validator;
50  import com.liferay.portal.lar.PortletDataHandlerKeys;
51  import com.liferay.portal.model.ColorScheme;
52  import com.liferay.portal.model.Company;
53  import com.liferay.portal.model.Group;
54  import com.liferay.portal.model.GroupConstants;
55  import com.liferay.portal.model.Image;
56  import com.liferay.portal.model.Layout;
57  import com.liferay.portal.model.LayoutConstants;
58  import com.liferay.portal.model.LayoutSet;
59  import com.liferay.portal.model.LayoutTypePortlet;
60  import com.liferay.portal.model.Organization;
61  import com.liferay.portal.model.Role;
62  import com.liferay.portal.model.RoleConstants;
63  import com.liferay.portal.model.Theme;
64  import com.liferay.portal.model.User;
65  import com.liferay.portal.model.impl.ColorSchemeImpl;
66  import com.liferay.portal.model.impl.LayoutImpl;
67  import com.liferay.portal.model.impl.LayoutTypePortletImpl;
68  import com.liferay.portal.model.impl.ThemeImpl;
69  import com.liferay.portal.security.auth.PrincipalException;
70  import com.liferay.portal.security.permission.ActionKeys;
71  import com.liferay.portal.security.permission.PermissionChecker;
72  import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil;
73  import com.liferay.portal.security.permission.PermissionThreadLocal;
74  import com.liferay.portal.service.GroupLocalServiceUtil;
75  import com.liferay.portal.service.ImageLocalServiceUtil;
76  import com.liferay.portal.service.LayoutLocalServiceUtil;
77  import com.liferay.portal.service.LayoutSetLocalServiceUtil;
78  import com.liferay.portal.service.OrganizationLocalServiceUtil;
79  import com.liferay.portal.service.RoleLocalServiceUtil;
80  import com.liferay.portal.service.ThemeLocalServiceUtil;
81  import com.liferay.portal.service.UserLocalServiceUtil;
82  import com.liferay.portal.service.permission.GroupPermissionUtil;
83  import com.liferay.portal.service.permission.LayoutPermissionUtil;
84  import com.liferay.portal.service.permission.OrganizationPermissionUtil;
85  import com.liferay.portal.service.permission.UserPermissionUtil;
86  import com.liferay.portal.theme.ThemeDisplay;
87  import com.liferay.portal.theme.ThemeDisplayFactory;
88  import com.liferay.portal.util.CookieKeys;
89  import com.liferay.portal.util.FriendlyURLNormalizer;
90  import com.liferay.portal.util.LayoutClone;
91  import com.liferay.portal.util.LayoutCloneFactory;
92  import com.liferay.portal.util.PortalUtil;
93  import com.liferay.portal.util.PortletKeys;
94  import com.liferay.portal.util.PropsKeys;
95  import com.liferay.portal.util.PropsUtil;
96  import com.liferay.portal.util.PropsValues;
97  import com.liferay.portal.util.WebKeys;
98  import com.liferay.portlet.PortletURLImpl;
99  
100 import java.io.File;
101 
102 import java.util.ArrayList;
103 import java.util.HashMap;
104 import java.util.LinkedHashMap;
105 import java.util.List;
106 import java.util.Locale;
107 import java.util.Map;
108 import java.util.TimeZone;
109 
110 import javax.portlet.PortletMode;
111 import javax.portlet.PortletRequest;
112 import javax.portlet.PortletURL;
113 import javax.portlet.WindowState;
114 
115 import javax.servlet.http.HttpServletRequest;
116 import javax.servlet.http.HttpServletResponse;
117 import javax.servlet.http.HttpSession;
118 
119 import org.apache.commons.lang.time.StopWatch;
120 import org.apache.struts.Globals;
121 
122 /**
123  * <a href="ServicePreAction.java.html"><b><i>View Source</i></b></a>
124  *
125  * @author Brian Wing Shun Chan
126  * @author Felix Ventero
127  *
128  */
129 public class ServicePreAction extends Action {
130 
131     public ServicePreAction() {
132         initImportLARFiles();
133     }
134 
135     public void run(HttpServletRequest request, HttpServletResponse response)
136         throws ActionException {
137 
138         StopWatch stopWatch = null;
139 
140         if (_log.isDebugEnabled()) {
141             stopWatch = new StopWatch();
142 
143             stopWatch.start();
144         }
145 
146         try {
147             servicePre(request, response);
148         }
149         catch (Exception e) {
150             throw new ActionException(e);
151         }
152 
153         if (_log.isDebugEnabled()) {
154             _log.debug("Running takes " + stopWatch.getTime() + " ms");
155         }
156     }
157 
158     protected void addDefaultLayoutsByLAR(
159             long userId, long groupId, boolean privateLayout, File larFile)
160         throws PortalException, SystemException {
161 
162         Map<String, String[]> parameterMap = new HashMap<String, String[]>();
163 
164         parameterMap.put(
165             PortletDataHandlerKeys.PERMISSIONS,
166             new String[] {Boolean.TRUE.toString()});
167         parameterMap.put(
168             PortletDataHandlerKeys.PORTLET_DATA,
169             new String[] {Boolean.TRUE.toString()});
170         parameterMap.put(
171             PortletDataHandlerKeys.PORTLET_DATA_CONTROL_DEFAULT,
172             new String[] {Boolean.TRUE.toString()});
173         parameterMap.put(
174             PortletDataHandlerKeys.PORTLET_SETUP,
175             new String[] {Boolean.TRUE.toString()});
176         parameterMap.put(
177             PortletDataHandlerKeys.USER_PERMISSIONS,
178             new String[] {Boolean.FALSE.toString()});
179 
180         LayoutLocalServiceUtil.importLayouts(
181             userId, groupId, privateLayout, parameterMap, larFile);
182     }
183 
184     protected void addDefaultUserPrivateLayoutByProperties(
185             long userId, long groupId)
186         throws PortalException, SystemException {
187 
188         String friendlyURL = getFriendlyURL(
189             PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_FRIENDLY_URL);
190 
191         Layout layout = LayoutLocalServiceUtil.addLayout(
192             userId, groupId, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID,
193             PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_NAME, StringPool.BLANK,
194             StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL);
195 
196         LayoutTypePortlet layoutTypePortlet =
197             (LayoutTypePortlet)layout.getLayoutType();
198 
199         layoutTypePortlet.setLayoutTemplateId(
200             0, PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_TEMPLATE_ID, false);
201 
202         for (int i = 0; i < 10; i++) {
203             String columnId = "column-" + i;
204             String portletIds = PropsUtil.get(
205                 PropsKeys.DEFAULT_USER_PRIVATE_LAYOUT_COLUMN + i);
206 
207             String[] portletIdsArray = StringUtil.split(portletIds);
208 
209             layoutTypePortlet.addPortletIds(
210                 0, portletIdsArray, columnId, false);
211         }
212 
213         LayoutLocalServiceUtil.updateLayout(
214             layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
215             layout.getTypeSettings());
216 
217         boolean updateLayoutSet = false;
218 
219         LayoutSet layoutSet = layout.getLayoutSet();
220 
221         if (Validator.isNotNull(
222                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID)) {
223 
224             layoutSet.setThemeId(
225                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID);
226 
227             updateLayoutSet = true;
228         }
229 
230         if (Validator.isNotNull(
231                 PropsValues.
232                     DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID)) {
233 
234             layoutSet.setColorSchemeId(
235                 PropsValues.
236                     DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID);
237 
238             updateLayoutSet = true;
239         }
240 
241         if (Validator.isNotNull(
242                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_THEME_ID)) {
243 
244             layoutSet.setWapThemeId(
245                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_THEME_ID);
246 
247             updateLayoutSet = true;
248         }
249 
250         if (Validator.isNotNull(
251                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_COLOR_SCHEME_ID)) {
252 
253             layoutSet.setWapColorSchemeId(
254                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_COLOR_SCHEME_ID);
255 
256             updateLayoutSet = true;
257         }
258 
259         if (updateLayoutSet) {
260             LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet);
261         }
262     }
263 
264     protected void addDefaultUserPrivateLayouts(User user)
265         throws PortalException, SystemException {
266 
267         Group userGroup = user.getGroup();
268 
269         if (privateLARFile != null) {
270             addDefaultLayoutsByLAR(
271                 user.getUserId(), userGroup.getGroupId(), true, privateLARFile);
272         }
273         else {
274             addDefaultUserPrivateLayoutByProperties(
275                 user.getUserId(), userGroup.getGroupId());
276         }
277     }
278 
279     protected void addDefaultUserPublicLayoutByProperties(
280             long userId, long groupId)
281         throws PortalException, SystemException {
282 
283         String friendlyURL = getFriendlyURL(
284             PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_FRIENDLY_URL);
285 
286         Layout layout = LayoutLocalServiceUtil.addLayout(
287             userId, groupId, false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID,
288             PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_NAME, StringPool.BLANK,
289             StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL);
290 
291         LayoutTypePortlet layoutTypePortlet =
292             (LayoutTypePortlet)layout.getLayoutType();
293 
294         layoutTypePortlet.setLayoutTemplateId(
295             0, PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_TEMPLATE_ID, false);
296 
297         for (int i = 0; i < 10; i++) {
298             String columnId = "column-" + i;
299             String portletIds = PropsUtil.get(
300                 PropsKeys.DEFAULT_USER_PUBLIC_LAYOUT_COLUMN + i);
301 
302             String[] portletIdsArray = StringUtil.split(portletIds);
303 
304             layoutTypePortlet.addPortletIds(
305                 0, portletIdsArray, columnId, false);
306         }
307 
308         LayoutLocalServiceUtil.updateLayout(
309             layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
310             layout.getTypeSettings());
311 
312         boolean updateLayoutSet = false;
313 
314         LayoutSet layoutSet = layout.getLayoutSet();
315 
316         if (Validator.isNotNull(
317                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID)) {
318 
319             layoutSet.setThemeId(
320                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID);
321 
322             updateLayoutSet = true;
323         }
324 
325         if (Validator.isNotNull(
326                 PropsValues.
327                     DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID)) {
328 
329             layoutSet.setColorSchemeId(
330                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID);
331 
332             updateLayoutSet = true;
333         }
334 
335         if (Validator.isNotNull(
336                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_THEME_ID)) {
337 
338             layoutSet.setWapThemeId(
339                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_THEME_ID);
340 
341             updateLayoutSet = true;
342         }
343 
344         if (Validator.isNotNull(
345                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_COLOR_SCHEME_ID)) {
346 
347             layoutSet.setWapColorSchemeId(
348                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_COLOR_SCHEME_ID);
349 
350             updateLayoutSet = true;
351         }
352 
353         if (updateLayoutSet) {
354             LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet);
355         }
356     }
357 
358     protected void addDefaultUserPublicLayouts(User user)
359         throws PortalException, SystemException {
360 
361         Group userGroup = user.getGroup();
362 
363         if (publicLARFile != null) {
364             addDefaultLayoutsByLAR(
365                 user.getUserId(), userGroup.getGroupId(), false, publicLARFile);
366         }
367         else {
368             addDefaultUserPublicLayoutByProperties(
369                 user.getUserId(), userGroup.getGroupId());
370         }
371     }
372 
373     protected void deleteDefaultUserPrivateLayouts(User user)
374         throws PortalException, SystemException {
375 
376         Group userGroup = user.getGroup();
377 
378         LayoutLocalServiceUtil.deleteLayouts(userGroup.getGroupId(), true);
379     }
380 
381     protected void deleteDefaultUserPublicLayouts(User user)
382         throws PortalException, SystemException {
383 
384         Group userGroup = user.getGroup();
385 
386         LayoutLocalServiceUtil.deleteLayouts(userGroup.getGroupId(), false);
387     }
388 
389     protected Object[] getDefaultLayout(
390             HttpServletRequest request, User user, boolean signedIn)
391         throws PortalException, SystemException {
392 
393         // Check the virtual host
394 
395         LayoutSet layoutSet = (LayoutSet)request.getAttribute(
396             WebKeys.VIRTUAL_HOST_LAYOUT_SET);
397 
398         if (layoutSet != null) {
399             List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(
400                 layoutSet.getGroupId(), layoutSet.isPrivateLayout(),
401                 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
402 
403             if (layouts.size() > 0) {
404                 Layout layout = layouts.get(0);
405 
406                 return new Object[] {layout, layouts};
407             }
408         }
409 
410         Layout layout = null;
411         List<Layout> layouts = null;
412 
413         if (signedIn) {
414 
415             // Check the user's personal layouts
416 
417             Group userGroup = user.getGroup();
418 
419             layouts = LayoutLocalServiceUtil.getLayouts(
420                 userGroup.getGroupId(), true,
421                 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
422 
423             if (layouts.size() == 0) {
424                 layouts = LayoutLocalServiceUtil.getLayouts(
425                     userGroup.getGroupId(), false,
426                     LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
427             }
428 
429             if (layouts.size() > 0) {
430                 layout = layouts.get(0);
431             }
432 
433             // Check the user's communities
434 
435             if (layout == null) {
436                 LinkedHashMap<String, Object> groupParams =
437                     new LinkedHashMap<String, Object>();
438 
439                 groupParams.put("usersGroups", new Long(user.getUserId()));
440 
441                 List<Group> groups = GroupLocalServiceUtil.search(
442                     user.getCompanyId(), null, null, groupParams,
443                     QueryUtil.ALL_POS, QueryUtil.ALL_POS);
444 
445                 for (Group group : groups) {
446                     layouts = LayoutLocalServiceUtil.getLayouts(
447                         group.getGroupId(), true,
448                         LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
449 
450                     if (layouts.size() == 0) {
451                         layouts = LayoutLocalServiceUtil.getLayouts(
452                             group.getGroupId(), false,
453                             LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
454                     }
455 
456                     if (layouts.size() > 0) {
457                         layout = layouts.get(0);
458 
459                         break;
460                     }
461                 }
462             }
463         }
464         else {
465 
466             // Check the guest community
467 
468             Group guestGroup = GroupLocalServiceUtil.getGroup(
469                 user.getCompanyId(), GroupConstants.GUEST);
470 
471             layouts = LayoutLocalServiceUtil.getLayouts(
472                 guestGroup.getGroupId(), false,
473                 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
474 
475             if (layouts.size() > 0) {
476                 layout = layouts.get(0);
477             }
478         }
479 
480         return new Object[] {layout, layouts};
481     }
482 
483     protected String getFriendlyURL(String friendlyURL) {
484         friendlyURL = GetterUtil.getString(friendlyURL);
485 
486         return FriendlyURLNormalizer.normalize(friendlyURL);
487     }
488 
489     protected Object[] getViewableLayouts(
490             HttpServletRequest request, User user,
491             PermissionChecker permissionChecker, Layout layout,
492             List<Layout> layouts)
493         throws PortalException, SystemException {
494 
495         if ((layouts == null) || (layouts.size() == 0)) {
496             return new Object[] {layout, layouts};
497         }
498 
499         boolean replaceLayout = true;
500 
501         if (LayoutPermissionUtil.contains(
502                 permissionChecker, layout, ActionKeys.VIEW)) {
503 
504             replaceLayout = false;
505         }
506 
507         List<Layout> accessibleLayouts = new ArrayList<Layout>();
508 
509         for (int i = 0; i < layouts.size(); i++) {
510             Layout curLayout = layouts.get(i);
511 
512             if (!curLayout.isHidden() &&
513                 LayoutPermissionUtil.contains(
514                     permissionChecker, curLayout, ActionKeys.VIEW)) {
515 
516                 if ((accessibleLayouts.size() == 0) && replaceLayout) {
517                     layout = curLayout;
518                 }
519 
520                 accessibleLayouts.add(curLayout);
521             }
522         }
523 
524         if (accessibleLayouts.size() == 0) {
525             layouts = null;
526 
527             SessionErrors.add(
528                 request, LayoutPermissionException.class.getName());
529         }
530         else {
531             layouts = accessibleLayouts;
532         }
533 
534         return new Object[] {layout, layouts};
535     }
536 
537     protected void initImportLARFiles() {
538         String privateLARFileName =
539             PropsValues.DEFAULT_USER_PRIVATE_LAYOUTS_LAR;
540 
541         if (_log.isDebugEnabled()) {
542             _log.debug("Reading private LAR file " + privateLARFileName);
543         }
544 
545         if (Validator.isNotNull(privateLARFileName)) {
546             privateLARFile = new File(privateLARFileName);
547 
548             if (!privateLARFile.exists()) {
549                 _log.error(
550                     "Private LAR file " + privateLARFile + " does not exist");
551 
552                 privateLARFile = null;
553             }
554             else {
555                 if (_log.isDebugEnabled()) {
556                     _log.debug("Using private LAR file " + privateLARFileName);
557                 }
558             }
559         }
560 
561         String publicLARFileName = PropsValues.DEFAULT_USER_PUBLIC_LAYOUTS_LAR;
562 
563         if (_log.isDebugEnabled()) {
564             _log.debug("Reading public LAR file " + publicLARFileName);
565         }
566 
567         if (Validator.isNotNull(publicLARFileName)) {
568             publicLARFile = new File(publicLARFileName);
569 
570             if (!publicLARFile.exists()) {
571                 _log.error(
572                     "Public LAR file " + publicLARFile + " does not exist");
573 
574                 publicLARFile = null;
575             }
576             else {
577                 if (_log.isDebugEnabled()) {
578                     _log.debug("Using public LAR file " + publicLARFileName);
579                 }
580             }
581         }
582     }
583 
584     /**
585      * @deprecated Use <code>isViewableGroup</code>.
586      */
587     protected boolean isViewableCommunity(
588             User user, long groupId, boolean privateLayout,
589             PermissionChecker permissionChecker)
590         throws PortalException, SystemException {
591 
592         return isViewableGroup(user, groupId, privateLayout, permissionChecker);
593     }
594 
595     protected boolean isViewableGroup(
596             User user, long groupId, boolean privateLayout,
597             PermissionChecker permissionChecker)
598         throws PortalException, SystemException {
599 
600         Group group = GroupLocalServiceUtil.getGroup(groupId);
601 
602         // Inactive communities are not viewable
603 
604         if (!group.isActive()) {
605             return false;
606         }
607         else if (group.isStagingGroup()) {
608             Group liveGroup = group.getLiveGroup();
609 
610             if (!liveGroup.isActive()) {
611                 return false;
612             }
613         }
614 
615         // User private layouts are only viewable by the user and anyone who can
616         // update the user. The user must also be active.
617 
618         if (group.isUser()) {
619             long groupUserId = group.getClassPK();
620 
621             if (groupUserId == user.getUserId()) {
622                 return true;
623             }
624             else {
625                 User groupUser = UserLocalServiceUtil.getUserById(groupUserId);
626 
627                 if (!groupUser.isActive()) {
628                     return false;
629                 }
630 
631                 if (privateLayout) {
632                     if (UserPermissionUtil.contains(
633                             permissionChecker, groupUserId,
634                             groupUser.getOrganizationIds(),
635                             ActionKeys.UPDATE)) {
636 
637                         return true;
638                     }
639                     else {
640                         return false;
641                     }
642                 }
643             }
644         }
645 
646         // If the current group is staging, only users with editorial rights
647         // can access it
648 
649         if (group.isStagingGroup()) {
650             if (user.isDefaultUser()) {
651                 return false;
652             }
653 
654             if (GroupPermissionUtil.contains(
655                     permissionChecker, groupId, ActionKeys.APPROVE_PROPOSAL) ||
656                 GroupPermissionUtil.contains(
657                     permissionChecker, groupId, ActionKeys.ASSIGN_REVIEWER) ||
658                 GroupPermissionUtil.contains(
659                     permissionChecker, groupId, ActionKeys.MANAGE_LAYOUTS) ||
660                 GroupPermissionUtil.contains(
661                     permissionChecker, groupId, ActionKeys.MANAGE_STAGING) ||
662                 GroupPermissionUtil.contains(
663                     permissionChecker, groupId, ActionKeys.PUBLISH_STAGING)) {
664 
665                 return true;
666             }
667 
668             return false;
669         }
670 
671         // Most public layouts are viewable
672 
673         if (!privateLayout) {
674             return true;
675         }
676 
677         // Control panel layouts are only viewable by authenticated users
678 
679         if (group.getName().equals(GroupConstants.CONTROL_PANEL)) {
680             if (user.isDefaultUser()) {
681                 return false;
682             }
683             else {
684                 return true;
685             }
686         }
687 
688         // Community or organization layouts are only viewable by users who
689         // belong to the community or organization, or by users who can update
690         // the community or organization
691 
692         if (group.isCommunity()) {
693             if (GroupLocalServiceUtil.hasUserGroup(user.getUserId(), groupId)) {
694                 return true;
695             }
696             else if (GroupPermissionUtil.contains(
697                         permissionChecker, groupId, ActionKeys.UPDATE)) {
698 
699                 return true;
700             }
701         }
702         else if (group.isOrganization()) {
703             long organizationId = group.getClassPK();
704 
705             if (OrganizationLocalServiceUtil.hasUserOrganization(
706                     user.getUserId(), organizationId)) {
707 
708                 return true;
709             }
710             else if (OrganizationPermissionUtil.contains(
711                         permissionChecker, organizationId, ActionKeys.UPDATE)) {
712 
713                 return true;
714             }
715 
716             if (!PropsValues.ORGANIZATIONS_MEMBERSHIP_STRICT) {
717                 for (Organization organization : user.getOrganizations()) {
718                     for (Organization ancestorOrganization :
719                             organization.getAncestors()) {
720 
721                         if (group.getClassPK() ==
722                                 ancestorOrganization.getOrganizationId()) {
723 
724                             return true;
725                         }
726                     }
727                 }
728             }
729         }
730         else if (group.isUserGroup()) {
731             if (GroupPermissionUtil.contains(
732                     permissionChecker, groupId, ActionKeys.MANAGE_LAYOUTS)) {
733 
734                 return true;
735             }
736         }
737 
738         return false;
739     }
740 
741     protected List<Layout> mergeAdditionalLayouts(
742             HttpServletRequest request, User user,
743             PermissionChecker permissionChecker, Layout layout,
744             List<Layout> layouts)
745         throws PortalException, SystemException {
746 
747         if ((layout == null) || layout.isPrivateLayout()) {
748             return layouts;
749         }
750 
751         long layoutGroupId = layout.getGroupId();
752 
753         Group guestGroup = GroupLocalServiceUtil.getGroup(
754             user.getCompanyId(), GroupConstants.GUEST);
755 
756         if (layoutGroupId != guestGroup.getGroupId()) {
757             Group layoutGroup = GroupLocalServiceUtil.getGroup(layoutGroupId);
758 
759             UnicodeProperties props = layoutGroup.getTypeSettingsProperties();
760 
761             boolean mergeGuestPublicPages = GetterUtil.getBoolean(
762                 props.getProperty("mergeGuestPublicPages"));
763 
764             if (!mergeGuestPublicPages) {
765                 return layouts;
766             }
767 
768             List<Layout> guestLayouts = LayoutLocalServiceUtil.getLayouts(
769                 guestGroup.getGroupId(), false,
770                 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
771 
772             Object[] viewableLayouts = getViewableLayouts(
773                 request, user, permissionChecker, layout, guestLayouts);
774 
775             guestLayouts = (List<Layout>)viewableLayouts[1];
776 
777             layouts.addAll(0, guestLayouts);
778         }
779         else {
780             HttpSession session = request.getSession();
781 
782             Long previousGroupId = (Long)session.getAttribute(
783                 WebKeys.VISITED_GROUP_ID_PREVIOUS);
784 
785             if ((previousGroupId != null) &&
786                 (previousGroupId.longValue() != layoutGroupId)) {
787 
788                 Group previousGroup = null;
789 
790                 try {
791                     previousGroup = GroupLocalServiceUtil.getGroup(
792                         previousGroupId.longValue());
793                 }
794                 catch (NoSuchGroupException nsge) {
795                     if (_log.isWarnEnabled()) {
796                         _log.warn(nsge);
797                     }
798 
799                     return layouts;
800                 }
801 
802                 UnicodeProperties props =
803                     previousGroup.getTypeSettingsProperties();
804 
805                 boolean mergeGuestPublicPages = GetterUtil.getBoolean(
806                     props.getProperty("mergeGuestPublicPages"));
807 
808                 if (!mergeGuestPublicPages) {
809                     return layouts;
810                 }
811 
812                 List<Layout> previousLayouts =
813                     LayoutLocalServiceUtil.getLayouts(
814                         previousGroupId.longValue(), false,
815                         LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
816 
817                 Object[] viewableLayouts = getViewableLayouts(
818                     request, user, permissionChecker, layout, previousLayouts);
819 
820                 previousLayouts = (List<Layout>)viewableLayouts[1];
821 
822                 layouts.addAll(previousLayouts);
823             }
824         }
825 
826         return layouts;
827     }
828 
829     protected void rememberVisitedGroupIds(
830         HttpServletRequest request, long currentGroupId) {
831 
832         String requestURI = GetterUtil.getString(request.getRequestURI());
833 
834         if (!requestURI.endsWith(_PATH_PORTAL_LAYOUT)) {
835             return;
836         }
837 
838         HttpSession session = request.getSession();
839 
840         Long recentGroupId = (Long)session.getAttribute(
841             WebKeys.VISITED_GROUP_ID_RECENT);
842 
843         Long previousGroupId = (Long)session.getAttribute(
844             WebKeys.VISITED_GROUP_ID_PREVIOUS);
845 
846         if (recentGroupId == null) {
847             recentGroupId = new Long(currentGroupId);
848 
849             session.setAttribute(
850                 WebKeys.VISITED_GROUP_ID_RECENT, recentGroupId);
851         }
852         else if (recentGroupId.longValue() != currentGroupId) {
853             previousGroupId = new Long(recentGroupId.longValue());
854 
855             recentGroupId = new Long(currentGroupId);
856 
857             session.setAttribute(
858                 WebKeys.VISITED_GROUP_ID_RECENT, recentGroupId);
859 
860             session.setAttribute(
861                 WebKeys.VISITED_GROUP_ID_PREVIOUS, previousGroupId);
862         }
863 
864         if (_log.isDebugEnabled()) {
865             _log.debug("Current group id " + currentGroupId);
866             _log.debug("Recent group id " + recentGroupId);
867             _log.debug("Previous group id " + previousGroupId);
868         }
869     }
870 
871     protected void servicePre(
872             HttpServletRequest request, HttpServletResponse response)
873         throws Exception {
874 
875         HttpSession session = request.getSession();
876 
877         // Company
878 
879         Company company = PortalUtil.getCompany(request);
880 
881         long companyId = company.getCompanyId();
882 
883         // CDN host
884 
885         String cdnHost = ParamUtil.getString(
886             request, "cdn_host", PortalUtil.getCDNHost());
887 
888         // Portal URL
889 
890         String portalURL = PortalUtil.getPortalURL(request);
891 
892         // Paths
893 
894         String contextPath = PortalUtil.getPathContext();
895         String friendlyURLPrivateGroupPath =
896             PortalUtil.getPathFriendlyURLPrivateGroup();
897         String friendlyURLPrivateUserPath =
898             PortalUtil.getPathFriendlyURLPrivateUser();
899         String friendlyURLPublicPath = PortalUtil.getPathFriendlyURLPublic();
900         String imagePath = PortalUtil.getPathImage();
901         String mainPath = PortalUtil.getPathMain();
902 
903         String i18nLanguageId = (String)request.getAttribute(
904             WebKeys.I18N_LANGUAGE_ID);
905 
906         if (Validator.isNotNull(i18nLanguageId)) {
907             if (Validator.isNotNull(contextPath)) {
908                 mainPath = StringUtil.replaceFirst(
909                     mainPath, contextPath,
910                     contextPath + StringPool.SLASH + i18nLanguageId);
911             }
912             else {
913                 mainPath = StringPool.SLASH + i18nLanguageId + mainPath;
914             }
915         }
916 
917         // Company logo
918 
919         String companyLogo =
920             imagePath + "/company_logo?img_id=" + company.getLogoId() + "&t=" +
921                 ImageServletTokenUtil.getToken(company.getLogoId());
922 
923         Image companyLogoImage = ImageLocalServiceUtil.getCompanyLogo(
924             company.getLogoId());
925 
926         int companyLogoHeight = companyLogoImage.getHeight();
927         int companyLogoWidth = companyLogoImage.getWidth();
928 
929         String realCompanyLogo = companyLogo;
930         int realCompanyLogoHeight = companyLogoHeight;
931         int realCompanyLogoWidth = companyLogoWidth;
932 
933         // User
934 
935         User user = null;
936 
937         try {
938             user = PortalUtil.getUser(request);
939         }
940         catch (NoSuchUserException nsue) {
941             if (_log.isWarnEnabled()) {
942                 _log.warn(nsue.getMessage());
943             }
944 
945             long userId = PortalUtil.getUserId(request);
946 
947             if (userId > 0) {
948                 session.invalidate();
949             }
950 
951             return;
952         }
953 
954         boolean signedIn = false;
955 
956         if (user == null) {
957             user = company.getDefaultUser();
958         }
959         else if (!user.isDefaultUser()) {
960             signedIn = true;
961         }
962 
963         User realUser = user;
964 
965         Long realUserId = (Long)session.getAttribute(WebKeys.USER_ID);
966 
967         if (realUserId != null) {
968             if (user.getUserId() != realUserId.longValue()) {
969                 realUser = UserLocalServiceUtil.getUserById(
970                     realUserId.longValue());
971             }
972         }
973 
974         String doAsUserId = ParamUtil.getString(request, "doAsUserId");
975         String doAsUserLanguageId = ParamUtil.getString(
976             request, "doAsUserLanguageId");
977         long doAsGroupId = ParamUtil.getLong(request, "doAsGroupId");
978         long refererPlid = ParamUtil.getLong(request, "refererPlid");
979 
980         // Permission checker
981 
982         PermissionChecker permissionChecker =
983             PermissionCheckerFactoryUtil.create(user, true);
984 
985         PermissionThreadLocal.setPermissionChecker(permissionChecker);
986 
987         // Locale
988 
989         Locale locale = (Locale)session.getAttribute(Globals.LOCALE_KEY);
990 
991         if (Validator.isNotNull(doAsUserLanguageId)) {
992             locale = LocaleUtil.fromLanguageId(doAsUserLanguageId);
993         }
994 
995         if (Validator.isNotNull(i18nLanguageId)) {
996             locale = LocaleUtil.fromLanguageId(i18nLanguageId);
997         }
998         else if (locale == null) {
999             if (signedIn) {
1000                locale = user.getLocale();
1001            }
1002            else {
1003
1004                // User previously set their preferred language
1005
1006                String languageId = CookieKeys.getCookie(
1007                    request, CookieKeys.GUEST_LANGUAGE_ID);
1008
1009                if (Validator.isNotNull(languageId)) {
1010                    locale = LocaleUtil.fromLanguageId(languageId);
1011                }
1012
1013                // Get locale from the request
1014
1015                if ((locale == null) && PropsValues.LOCALE_DEFAULT_REQUEST) {
1016                    locale = request.getLocale();
1017                }
1018
1019                // Get locale from the default user
1020
1021                if (locale == null) {
1022                    locale = user.getLocale();
1023                }
1024
1025                if (Validator.isNull(locale.getCountry())) {
1026
1027                    // Locales must contain the country code
1028
1029                    locale = LanguageUtil.getLocale(locale.getLanguage());
1030                }
1031
1032                if (!LanguageUtil.isAvailableLocale(locale)) {
1033                    locale = user.getLocale();
1034                }
1035            }
1036
1037            session.setAttribute(Globals.LOCALE_KEY, locale);
1038
1039            LanguageUtil.updateCookie(request, response, locale);
1040        }
1041
1042        // Cookie support
1043
1044        try {
1045
1046            // LEP-4069
1047
1048            CookieKeys.validateSupportCookie(request);
1049        }
1050        catch (Exception e) {
1051            CookieKeys.addSupportCookie(request, response);
1052        }
1053
1054        // Time zone
1055
1056        TimeZone timeZone = user.getTimeZone();
1057
1058        if (timeZone == null) {
1059            timeZone = company.getTimeZone();
1060        }
1061
1062        // Layouts
1063
1064        if (signedIn) {
1065            updateUserLayouts(user);
1066        }
1067
1068        Layout layout = null;
1069        List<Layout> layouts = null;
1070
1071        long plid = ParamUtil.getLong(request, "p_l_id");
1072
1073        if (plid > 0) {
1074            layout = LayoutLocalServiceUtil.getLayout(plid);
1075        }
1076        else {
1077            long groupId = ParamUtil.getLong(request, "groupId");
1078            boolean privateLayout = ParamUtil.getBoolean(
1079                request, "privateLayout");
1080            long layoutId = ParamUtil.getLong(request, "layoutId");
1081
1082            if ((groupId > 0) && layoutId > 0) {
1083                layout = LayoutLocalServiceUtil.getLayout(
1084                    groupId, privateLayout, layoutId);
1085            }
1086        }
1087
1088        if (layout != null) {
1089            try {
1090                if (!signedIn && PropsValues.AUTH_FORWARD_BY_REDIRECT) {
1091                    request.setAttribute(WebKeys.REQUESTED_LAYOUT, layout);
1092                }
1093
1094                boolean isViewableCommunity = isViewableGroup(
1095                    user, layout.getGroupId(), layout.isPrivateLayout(),
1096                    permissionChecker);
1097
1098                if (!isViewableCommunity) {
1099                    StringBuilder sb = new StringBuilder();
1100
1101                    sb.append("User ");
1102                    sb.append(user.getUserId());
1103                    sb.append(" is not allowed to access the ");
1104                    sb.append(layout.isPrivateLayout() ? "private": "public");
1105                    sb.append(" pages of group ");
1106                    sb.append(layout.getGroupId());
1107
1108                    if (_log.isWarnEnabled()) {
1109                        _log.warn(sb.toString());
1110                    }
1111
1112                    throw new PrincipalException(sb.toString());
1113                }
1114                else if (isViewableCommunity &&
1115                        !LayoutPermissionUtil.contains(
1116                            permissionChecker, layout, ActionKeys.VIEW)) {
1117
1118                    layout = null;
1119                }
1120                else {
1121                    layouts = LayoutLocalServiceUtil.getLayouts(
1122                        layout.getGroupId(), layout.isPrivateLayout(),
1123                        LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1124
1125                    if (!layout.getGroup().getName().equals(
1126                            GroupConstants.CONTROL_PANEL)) {
1127
1128                        doAsGroupId = 0;
1129                    }
1130                }
1131            }
1132            catch (NoSuchLayoutException nsle) {
1133            }
1134        }
1135
1136        if (layout == null) {
1137            Object[] defaultLayout = getDefaultLayout(request, user, signedIn);
1138
1139            layout = (Layout)defaultLayout[0];
1140            layouts = (List<Layout>)defaultLayout[1];
1141
1142            request.setAttribute(WebKeys.LAYOUT_DEFAULT, Boolean.TRUE);
1143        }
1144
1145        Object[] viewableLayouts = getViewableLayouts(
1146            request, user, permissionChecker, layout, layouts);
1147
1148        String layoutSetLogo = null;
1149
1150        layout = (Layout)viewableLayouts[0];
1151        layouts = (List<Layout>)viewableLayouts[1];
1152
1153        LayoutTypePortlet layoutTypePortlet = null;
1154
1155        layouts = mergeAdditionalLayouts(
1156            request, user, permissionChecker, layout, layouts);
1157
1158        if (layout != null) {
1159            if (company.isCommunityLogo()) {
1160                LayoutSet layoutSet = layout.getLayoutSet();
1161
1162                if (layoutSet.isLogo()) {
1163                    long logoId = layoutSet.getLogoId();
1164
1165                    layoutSetLogo =
1166                        imagePath + "/layout_set_logo?img_id=" + logoId +
1167                            "&t=" + ImageServletTokenUtil.getToken(logoId);
1168
1169                    Image layoutSetLogoImage =
1170                        ImageLocalServiceUtil.getCompanyLogo(logoId);
1171
1172                    companyLogo = layoutSetLogo;
1173                    companyLogoHeight = layoutSetLogoImage.getHeight();
1174                    companyLogoWidth = layoutSetLogoImage.getWidth();
1175                }
1176            }
1177
1178            plid = layout.getPlid();
1179
1180            // Updates to shared layouts are not reflected until the next time
1181            // the user logs in because group layouts are cached in the session
1182
1183            layout = (Layout)((LayoutImpl)layout).clone();
1184
1185            layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType();
1186
1187            LayoutClone layoutClone = LayoutCloneFactory.getInstance();
1188
1189            if (layoutClone != null) {
1190                String typeSettings = layoutClone.get(request, plid);
1191
1192                if (typeSettings != null) {
1193                    UnicodeProperties props = new UnicodeProperties(true);
1194
1195                    props.load(typeSettings);
1196
1197                    String stateMax = props.getProperty(
1198                        LayoutTypePortletImpl.STATE_MAX);
1199                    String stateMin = props.getProperty(
1200                        LayoutTypePortletImpl.STATE_MIN);
1201                    String modeAbout = props.getProperty(
1202                        LayoutTypePortletImpl.MODE_ABOUT);
1203                    String modeConfig = props.getProperty(
1204                        LayoutTypePortletImpl.MODE_CONFIG);
1205                    String modeEdit = props.getProperty(
1206                        LayoutTypePortletImpl.MODE_EDIT);
1207                    String modeEditDefaults = props.getProperty(
1208                        LayoutTypePortletImpl.MODE_EDIT_DEFAULTS);
1209                    String modeEditGuest = props.getProperty(
1210                        LayoutTypePortletImpl.MODE_EDIT_GUEST);
1211                    String modeHelp = props.getProperty(
1212                        LayoutTypePortletImpl.MODE_HELP);
1213                    String modePreview = props.getProperty(
1214                        LayoutTypePortletImpl.MODE_PREVIEW);
1215                    String modePrint = props.getProperty(
1216                        LayoutTypePortletImpl.MODE_PRINT);
1217
1218                    layoutTypePortlet.setStateMax(stateMax);
1219                    layoutTypePortlet.setStateMin(stateMin);
1220                    layoutTypePortlet.setModeAbout(modeAbout);
1221                    layoutTypePortlet.setModeConfig(modeConfig);
1222                    layoutTypePortlet.setModeEdit(modeEdit);
1223                    layoutTypePortlet.setModeEditDefaults(modeEditDefaults);
1224                    layoutTypePortlet.setModeEditGuest(modeEditGuest);
1225                    layoutTypePortlet.setModeHelp(modeHelp);
1226                    layoutTypePortlet.setModePreview(modePreview);
1227                    layoutTypePortlet.setModePrint(modePrint);
1228                }
1229            }
1230
1231            request.setAttribute(WebKeys.LAYOUT, layout);
1232            request.setAttribute(WebKeys.LAYOUTS, layouts);
1233
1234            if (layout.isPrivateLayout()) {
1235                permissionChecker.setCheckGuest(false);
1236            }
1237        }
1238
1239        // Scope
1240
1241        long scopeGroupId = PortalUtil.getScopeGroupId(request);
1242
1243        rememberVisitedGroupIds(request, scopeGroupId);
1244
1245        // Theme and color scheme
1246
1247        Theme theme = null;
1248        ColorScheme colorScheme = null;
1249
1250        boolean wapTheme = BrowserSnifferUtil.isWap(request);
1251
1252        Group group = null;
1253
1254        if (layout != null) {
1255            group = layout.getGroup();
1256        }
1257
1258        if ((layout != null) &&
1259            group.getName().equals(GroupConstants.CONTROL_PANEL)) {
1260
1261            String themeId = PropsValues.CONTROL_PANEL_LAYOUT_REGULAR_THEME_ID;
1262            String colorSchemeId =
1263                ColorSchemeImpl.getDefaultRegularColorSchemeId();
1264
1265            theme = ThemeLocalServiceUtil.getTheme(
1266                companyId, themeId, wapTheme);
1267            colorScheme = ThemeLocalServiceUtil.getColorScheme(
1268                companyId, theme.getThemeId(), colorSchemeId, wapTheme);
1269        }
1270        else if (layout != null) {
1271            if (wapTheme) {
1272                theme = layout.getWapTheme();
1273                colorScheme = layout.getWapColorScheme();
1274            }
1275            else {
1276                theme = layout.getTheme();
1277                colorScheme = layout.getColorScheme();
1278            }
1279        }
1280        else {
1281            String themeId = null;
1282            String colorSchemeId = null;
1283
1284            if (wapTheme) {
1285                themeId = ThemeImpl.getDefaultWapThemeId();
1286                colorSchemeId = ColorSchemeImpl.getDefaultWapColorSchemeId();
1287            }
1288            else {
1289                themeId = ThemeImpl.getDefaultRegularThemeId();
1290                colorSchemeId =
1291                    ColorSchemeImpl.getDefaultRegularColorSchemeId();
1292            }
1293
1294            theme = ThemeLocalServiceUtil.getTheme(
1295                companyId, themeId, wapTheme);
1296            colorScheme = ThemeLocalServiceUtil.getColorScheme(
1297                companyId, theme.getThemeId(), colorSchemeId, wapTheme);
1298        }
1299
1300        request.setAttribute(WebKeys.THEME, theme);
1301        request.setAttribute(WebKeys.COLOR_SCHEME, colorScheme);
1302
1303        boolean themeCssFastLoad = ParamUtil.getBoolean(
1304            request, "css_fast_load", PropsValues.THEME_CSS_FAST_LOAD);
1305        boolean themeImagesFastLoad = ParamUtil.getBoolean(
1306            request, "images_fast_load", PropsValues.THEME_IMAGES_FAST_LOAD);
1307
1308        boolean themeJsBarebone = PropsValues.JAVASCRIPT_BAREBONE_ENABLED;
1309
1310        if (themeJsBarebone) {
1311            if (signedIn) {
1312                themeJsBarebone = false;
1313            }
1314        }
1315
1316        boolean themeJsFastLoad = ParamUtil.getBoolean(
1317            request, "js_fast_load", PropsValues.JAVASCRIPT_FAST_LOAD);
1318
1319        if (ServerDetector.isWebSphere()) {
1320            themeJsFastLoad = false;
1321        }
1322
1323        String lifecycle = ParamUtil.getString(request, "p_p_lifecycle");
1324
1325        String facebookCanvasPageURL = (String)request.getAttribute(
1326            WebKeys.FACEBOOK_CANVAS_PAGE_URL);
1327
1328        boolean widget = false;
1329
1330        Boolean widgetObj = (Boolean)request.getAttribute(WebKeys.WIDGET);
1331
1332        if (widgetObj != null) {
1333            widget = widgetObj.booleanValue();
1334        }
1335
1336        // Theme display
1337
1338        ThemeDisplay themeDisplay = ThemeDisplayFactory.create();
1339
1340        // Set the CDN host, portal URL, and Facebook application ID first
1341        // because other methods (setLookAndFeel) depend on them being set
1342
1343        themeDisplay.setCDNHost(cdnHost);
1344        themeDisplay.setPortalURL(portalURL);
1345        themeDisplay.setFacebookCanvasPageURL(facebookCanvasPageURL);
1346        themeDisplay.setWidget(widget);
1347
1348        themeDisplay.setCompany(company);
1349        themeDisplay.setCompanyLogo(companyLogo);
1350        themeDisplay.setCompanyLogoHeight(companyLogoHeight);
1351        themeDisplay.setCompanyLogoWidth(companyLogoWidth);
1352        themeDisplay.setRealCompanyLogo(realCompanyLogo);
1353        themeDisplay.setRealCompanyLogoHeight(realCompanyLogoHeight);
1354        themeDisplay.setRealCompanyLogoWidth(realCompanyLogoWidth);
1355        themeDisplay.setUser(user);
1356        themeDisplay.setRealUser(realUser);
1357        themeDisplay.setDoAsUserId(doAsUserId);
1358        themeDisplay.setDoAsUserLanguageId(doAsUserLanguageId);
1359        themeDisplay.setDoAsGroupId(doAsGroupId);
1360        themeDisplay.setRefererPlid(refererPlid);
1361        themeDisplay.setLayoutSetLogo(layoutSetLogo);
1362        themeDisplay.setLayout(layout);
1363        themeDisplay.setLayouts(layouts);
1364        themeDisplay.setPlid(plid);
1365        themeDisplay.setLayoutTypePortlet(layoutTypePortlet);
1366        themeDisplay.setScopeGroupId(scopeGroupId);
1367        themeDisplay.setSignedIn(signedIn);
1368        themeDisplay.setPermissionChecker(permissionChecker);
1369        themeDisplay.setLocale(locale);
1370        themeDisplay.setLanguageId(LocaleUtil.toLanguageId(locale));
1371        themeDisplay.setI18nLanguageId(i18nLanguageId);
1372        themeDisplay.setTimeZone(timeZone);
1373        themeDisplay.setLookAndFeel(contextPath, theme, colorScheme);
1374        themeDisplay.setThemeCssFastLoad(themeCssFastLoad);
1375        themeDisplay.setThemeImagesFastLoad(themeImagesFastLoad);
1376        themeDisplay.setThemeJsBarebone(themeJsBarebone);
1377        themeDisplay.setThemeJsFastLoad(themeJsFastLoad);
1378        themeDisplay.setServerName(request.getServerName());
1379        themeDisplay.setServerPort(request.getServerPort());
1380        themeDisplay.setSecure(request.isSecure());
1381        themeDisplay.setLifecycle(lifecycle);
1382        themeDisplay.setLifecycleAction(lifecycle.equals("1"));
1383        themeDisplay.setLifecycleRender(lifecycle.equals("0"));
1384        themeDisplay.setLifecycleResource(lifecycle.equals("2"));
1385        themeDisplay.setStateExclusive(LiferayWindowState.isExclusive(request));
1386        themeDisplay.setStateMaximized(LiferayWindowState.isMaximized(request));
1387        themeDisplay.setStatePopUp(LiferayWindowState.isPopUp(request));
1388        themeDisplay.setPathApplet(contextPath + "/applets");
1389        themeDisplay.setPathCms(contextPath + "/cms");
1390        themeDisplay.setPathContext(contextPath);
1391        themeDisplay.setPathFlash(contextPath + "/flash");
1392        themeDisplay.setPathFriendlyURLPrivateGroup(
1393            friendlyURLPrivateGroupPath);
1394        themeDisplay.setPathFriendlyURLPrivateUser(friendlyURLPrivateUserPath);
1395        themeDisplay.setPathFriendlyURLPublic(friendlyURLPublicPath);
1396        themeDisplay.setPathImage(imagePath);
1397        themeDisplay.setPathJavaScript(cdnHost + contextPath + "/html/js");
1398        themeDisplay.setPathMain(mainPath);
1399        themeDisplay.setPathSound(contextPath + "/html/sound");
1400
1401        // URLs
1402
1403        themeDisplay.setShowAddContentIcon(false);
1404        themeDisplay.setShowControlPanelIcon(signedIn);
1405        themeDisplay.setShowHomeIcon(true);
1406        themeDisplay.setShowMyAccountIcon(signedIn);
1407        themeDisplay.setShowPageSettingsIcon(false);
1408        themeDisplay.setShowPortalIcon(true);
1409        themeDisplay.setShowSignInIcon(!signedIn);
1410        themeDisplay.setShowSignOutIcon(signedIn);
1411        themeDisplay.setShowStagingIcon(false);
1412
1413        String urlControlPanel = friendlyURLPrivateGroupPath + "/control_panel";
1414
1415        if (Validator.isNotNull(doAsUserId)) {
1416            urlControlPanel = HttpUtil.addParameter(
1417                urlControlPanel, "doAsUserId", doAsUserId);
1418        }
1419
1420        if (scopeGroupId > 0) {
1421            urlControlPanel = HttpUtil.addParameter(
1422                urlControlPanel, "doAsGroupId", scopeGroupId);
1423        }
1424
1425        if (refererPlid > 0) {
1426            urlControlPanel = HttpUtil.addParameter(
1427                urlControlPanel, "refererPlid", refererPlid);
1428        }
1429        else if (plid > 0) {
1430            urlControlPanel = HttpUtil.addParameter(
1431                urlControlPanel, "refererPlid", plid);
1432        }
1433
1434        themeDisplay.setURLControlPanel(urlControlPanel);
1435
1436        PortletURL createAccountURL = new PortletURLImpl(
1437            request, PortletKeys.LOGIN, plid, PortletRequest.ACTION_PHASE);
1438
1439        createAccountURL.setWindowState(WindowState.MAXIMIZED);
1440        createAccountURL.setPortletMode(PortletMode.VIEW);
1441
1442        createAccountURL.setParameter("saveLastPath", "0");
1443        createAccountURL.setParameter(
1444            "struts_action", "/login/create_account");
1445
1446        themeDisplay.setURLCreateAccount(createAccountURL);
1447
1448        String currentURL = PortalUtil.getCurrentURL(request);
1449
1450        themeDisplay.setURLCurrent(currentURL);
1451
1452        String urlHome = PortalUtil.getHomeURL(request);
1453
1454        themeDisplay.setURLHome(urlHome);
1455
1456        if (layout != null) {
1457            if (layout.getType().equals(LayoutConstants.TYPE_PORTLET)) {
1458                boolean freeformLayout =
1459                    layoutTypePortlet.getLayoutTemplateId().equals(
1460                        "freeform");
1461
1462                themeDisplay.setFreeformLayout(freeformLayout);
1463
1464                boolean hasUpdateLayoutPermission =
1465                    LayoutPermissionUtil.contains(
1466                        permissionChecker, layout, ActionKeys.UPDATE);
1467
1468                if (hasUpdateLayoutPermission) {
1469                    if (!LiferayWindowState.isMaximized(request)) {
1470                        themeDisplay.setShowAddContentIcon(true);
1471                    }
1472
1473                    themeDisplay.setShowLayoutTemplatesIcon(true);
1474
1475                    themeDisplay.setURLAddContent(
1476                        "LayoutConfiguration.toggle('" +
1477                            PortletKeys.LAYOUT_CONFIGURATION + "');");
1478
1479                    themeDisplay.setURLLayoutTemplates(
1480                        "Liferay.Layout.showTemplates();");
1481                }
1482            }
1483
1484            boolean hasManageLayoutsPermission =
1485                GroupPermissionUtil.contains(
1486                    permissionChecker, scopeGroupId, ActionKeys.MANAGE_LAYOUTS);
1487
1488            if (group.isUser()) {
1489                if ((layout.isPrivateLayout() &&
1490                     !PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_MODIFIABLE) ||
1491                    (layout.isPublicLayout() &&
1492                     !PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_MODIFIABLE)) {
1493
1494                    hasManageLayoutsPermission = false;
1495                }
1496            }
1497
1498            if (hasManageLayoutsPermission) {
1499                themeDisplay.setShowPageSettingsIcon(true);
1500
1501                PortletURL pageSettingsURL = new PortletURLImpl(
1502                    request, PortletKeys.LAYOUT_MANAGEMENT, plid,
1503                    PortletRequest.RENDER_PHASE);
1504
1505                pageSettingsURL.setWindowState(WindowState.MAXIMIZED);
1506                pageSettingsURL.setPortletMode(PortletMode.VIEW);
1507
1508                pageSettingsURL.setParameter(
1509                    "struts_action", "/layout_management/edit_pages");
1510
1511                if (layout.isPrivateLayout()) {
1512                    pageSettingsURL.setParameter("tabs1", "private-pages");
1513                }
1514                else {
1515                    pageSettingsURL.setParameter("tabs1", "public-pages");
1516                }
1517
1518                pageSettingsURL.setParameter("redirect", currentURL);
1519                pageSettingsURL.setParameter(
1520                    "groupId", String.valueOf(scopeGroupId));
1521                pageSettingsURL.setParameter("selPlid", String.valueOf(plid));
1522
1523                themeDisplay.setURLPageSettings(pageSettingsURL);
1524
1525                PortletURL publishToLiveURL = new PortletURLImpl(
1526                    request, PortletKeys.LAYOUT_MANAGEMENT, plid,
1527                    PortletRequest.RENDER_PHASE);
1528
1529                publishToLiveURL.setWindowState(LiferayWindowState.EXCLUSIVE);
1530                publishToLiveURL.setPortletMode(PortletMode.VIEW);
1531
1532                publishToLiveURL.setParameter(
1533                    "struts_action", "/layout_management/export_pages");
1534
1535                if (layout.isPrivateLayout()) {
1536                    publishToLiveURL.setParameter("tabs1", "private-pages");
1537                }
1538                else {
1539                    publishToLiveURL.setParameter("tabs1", "public-pages");
1540                }
1541
1542                publishToLiveURL.setParameter("pagesRedirect", currentURL);
1543                publishToLiveURL.setParameter(
1544                    "groupId", String.valueOf(scopeGroupId));
1545                publishToLiveURL.setParameter("selPlid", String.valueOf(plid));
1546
1547                themeDisplay.setURLPublishToLive(publishToLiveURL);
1548            }
1549
1550            if (group.hasStagingGroup() && !group.isStagingGroup()) {
1551                themeDisplay.setShowAddContentIcon(false);
1552                themeDisplay.setShowLayoutTemplatesIcon(false);
1553                themeDisplay.setShowPageSettingsIcon(false);
1554                themeDisplay.setURLPublishToLive(null);
1555            }
1556
1557            if (group.getName().equals(GroupConstants.CONTROL_PANEL)) {
1558                themeDisplay.setShowPageSettingsIcon(false);
1559                themeDisplay.setURLPublishToLive(null);
1560            }
1561
1562            // LEP-4987
1563
1564            if (group.hasStagingGroup() || group.isStagingGroup()) {
1565                boolean hasApproveProposalPermission =
1566                    GroupPermissionUtil.contains(
1567                        permissionChecker, scopeGroupId,
1568                        ActionKeys.APPROVE_PROPOSAL);
1569
1570                if (hasManageLayoutsPermission) {
1571                    themeDisplay.setShowStagingIcon(true);
1572                }
1573                else if (hasApproveProposalPermission) {
1574                    themeDisplay.setShowStagingIcon(true);
1575                }
1576            }
1577
1578            String myAccountNamespace = PortalUtil.getPortletNamespace(
1579                PortletKeys.MY_ACCOUNT);
1580
1581            String myAccountRedirect = ParamUtil.getString(
1582                request, myAccountNamespace + "backURL", currentURL);
1583
1584            Group controlPanelGroup = GroupLocalServiceUtil.getGroup(
1585                companyId, GroupConstants.CONTROL_PANEL);
1586
1587            long controlPanelPlid = LayoutLocalServiceUtil.getDefaultPlid(
1588                controlPanelGroup.getGroupId(), true);
1589
1590            PortletURLImpl myAccountURL = new PortletURLImpl(
1591                request, PortletKeys.MY_ACCOUNT, controlPanelPlid,
1592                PortletRequest.RENDER_PHASE);
1593
1594            myAccountURL.setWindowState(WindowState.MAXIMIZED);
1595            myAccountURL.setPortletMode(PortletMode.VIEW);
1596            myAccountURL.setRefererPlid(plid);
1597
1598            myAccountURL.setParameter("struts_action", "/my_account/edit_user");
1599            myAccountURL.setParameter("backURL", myAccountRedirect);
1600
1601            themeDisplay.setURLMyAccount(myAccountURL);
1602        }
1603
1604        if ((!user.isActive()) ||
1605            (PropsValues.TERMS_OF_USE_REQUIRED &&
1606             !user.isAgreedToTermsOfUse())) {
1607
1608            themeDisplay.setShowAddContentIcon(false);
1609            themeDisplay.setShowMyAccountIcon(false);
1610            themeDisplay.setShowPageSettingsIcon(false);
1611        }
1612
1613        themeDisplay.setURLPortal(portalURL + contextPath);
1614
1615        String urlSignIn = mainPath + "/portal/login";
1616
1617        if (layout != null) {
1618            urlSignIn = HttpUtil.addParameter(
1619                urlSignIn, "p_l_id", layout.getPlid());
1620        }
1621
1622        themeDisplay.setURLSignIn(urlSignIn);
1623
1624        themeDisplay.setURLSignOut(mainPath + "/portal/logout");
1625
1626        PortletURL updateManagerURL = new PortletURLImpl(
1627            request, PortletKeys.UPDATE_MANAGER, plid,
1628            PortletRequest.RENDER_PHASE);
1629
1630        updateManagerURL.setWindowState(WindowState.MAXIMIZED);
1631        updateManagerURL.setPortletMode(PortletMode.VIEW);
1632
1633        updateManagerURL.setParameter("struts_action", "/update_manager/view");
1634
1635        themeDisplay.setURLUpdateManager(updateManagerURL);
1636
1637        request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay);
1638
1639        // Parallel render
1640
1641        boolean parallelRenderEnable = true;
1642
1643        if (layout != null) {
1644            if (layoutTypePortlet.getPortletIds().size() == 1) {
1645                parallelRenderEnable = false;
1646            }
1647        }
1648
1649        Boolean parallelRenderEnableObj = Boolean.valueOf(ParamUtil.getBoolean(
1650            request, "p_p_parallel", parallelRenderEnable));
1651
1652        request.setAttribute(
1653            WebKeys.PORTLET_PARALLEL_RENDER, parallelRenderEnableObj);
1654    }
1655
1656    protected void updateUserLayouts(User user) throws Exception {
1657
1658        // Private layouts
1659
1660        boolean addDefaultUserPrivateLayouts = false;
1661
1662        if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED &&
1663            PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_AUTO_CREATE) {
1664
1665            addDefaultUserPrivateLayouts = true;
1666
1667            if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) {
1668                Role powerUserRole = RoleLocalServiceUtil.getRole(
1669                    user.getCompanyId(), RoleConstants.POWER_USER);
1670
1671                if (!UserLocalServiceUtil.hasRoleUser(
1672                        powerUserRole.getRoleId(), user.getUserId())) {
1673
1674                    addDefaultUserPrivateLayouts = false;
1675                }
1676            }
1677        }
1678
1679        if (addDefaultUserPrivateLayouts && !user.hasPrivateLayouts()) {
1680            addDefaultUserPrivateLayouts(user);
1681        }
1682
1683        boolean deleteDefaultUserPrivateLayouts = false;
1684
1685        if (!PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED) {
1686            deleteDefaultUserPrivateLayouts = true;
1687        }
1688        else if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) {
1689            Role powerUserRole = RoleLocalServiceUtil.getRole(
1690                user.getCompanyId(), RoleConstants.POWER_USER);
1691
1692            if (!UserLocalServiceUtil.hasRoleUser(
1693                    powerUserRole.getRoleId(), user.getUserId())) {
1694
1695                deleteDefaultUserPrivateLayouts = true;
1696            }
1697        }
1698
1699        if (deleteDefaultUserPrivateLayouts && user.hasPrivateLayouts()) {
1700            deleteDefaultUserPrivateLayouts(user);
1701        }
1702
1703        // Public pages
1704
1705        boolean addDefaultUserPublicLayouts = false;
1706
1707        if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED &&
1708            PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_AUTO_CREATE) {
1709
1710            addDefaultUserPublicLayouts = true;
1711
1712            if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) {
1713                Role powerUserRole = RoleLocalServiceUtil.getRole(
1714                    user.getCompanyId(), RoleConstants.POWER_USER);
1715
1716                if (!UserLocalServiceUtil.hasRoleUser(
1717                        powerUserRole.getRoleId(), user.getUserId())) {
1718
1719                    addDefaultUserPublicLayouts = false;
1720                }
1721            }
1722        }
1723
1724        if (addDefaultUserPublicLayouts && !user.hasPublicLayouts()) {
1725            addDefaultUserPublicLayouts(user);
1726        }
1727
1728        boolean deleteDefaultUserPublicLayouts = false;
1729
1730        if (!PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED) {
1731            deleteDefaultUserPublicLayouts = true;
1732        }
1733        else if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) {
1734            Role powerUserRole = RoleLocalServiceUtil.getRole(
1735                user.getCompanyId(), RoleConstants.POWER_USER);
1736
1737            if (!UserLocalServiceUtil.hasRoleUser(
1738                    powerUserRole.getRoleId(), user.getUserId())) {
1739
1740                deleteDefaultUserPublicLayouts = true;
1741            }
1742        }
1743
1744        if (deleteDefaultUserPublicLayouts && user.hasPublicLayouts()) {
1745            deleteDefaultUserPublicLayouts(user);
1746        }
1747    }
1748
1749    protected File privateLARFile;
1750    protected File publicLARFile;
1751
1752    private static final String _PATH_PORTAL_LAYOUT = "/portal/layout";
1753
1754    private static Log _log = LogFactoryUtil.getLog(ServicePreAction.class);
1755
1756}