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