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