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