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