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