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