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