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